Bug 1424096 - Consolidate on a single version of each vendored Rust crate draft
authorMatt Brubeck <mbrubeck@mozilla.com>
Fri, 08 Dec 2017 10:24:40 -0800
changeset 710020 c130b4f279f268a888ae507b3ed6298c289ac279
parent 709637 a461fe03fdb07218b7f50e92c59dde64b8f8a5b0
child 743511 daf863980c56378d7acfd967f15c19c1aae34442
push id92746
push userbmo:mbrubeck@mozilla.com
push dateFri, 08 Dec 2017 18:24:53 +0000
bugs1424096
milestone59.0a1
Bug 1424096 - Consolidate on a single version of each vendored Rust crate MozReview-Commit-ID: GSGQpjXLuVR
js/rust/Cargo.lock
js/src/Cargo.lock
testing/geckodriver/Cargo.lock
third_party/rust/ansi_term/.cargo-checksum.json
third_party/rust/ansi_term/Cargo.toml
third_party/rust/ansi_term/README.md
third_party/rust/ansi_term/src/ansi.rs
third_party/rust/ansi_term/src/debug.rs
third_party/rust/ansi_term/src/difference.rs
third_party/rust/ansi_term/src/display.rs
third_party/rust/ansi_term/src/lib.rs
third_party/rust/ansi_term/src/style.rs
third_party/rust/ansi_term/src/windows.rs
third_party/rust/ansi_term/src/write.rs
third_party/rust/bitflags-1.0.0/.cargo-checksum.json
third_party/rust/bitflags-1.0.0/.travis.yml
third_party/rust/bitflags-1.0.0/Cargo.toml
third_party/rust/bitflags-1.0.0/LICENSE-APACHE
third_party/rust/bitflags-1.0.0/LICENSE-MIT
third_party/rust/bitflags-1.0.0/README.md
third_party/rust/bitflags-1.0.0/src/example_generated.rs
third_party/rust/bitflags-1.0.0/src/lib.rs
third_party/rust/bitflags-1.0.0/tests/conflicting_trait_impls.rs
third_party/rust/bitflags-1.0.0/tests/external.rs
third_party/rust/bitflags-1.0.0/tests/external_no_std.rs
third_party/rust/bitflags-1.0.0/tests/i128_bitflags.rs
third_party/rust/bitflags/.cargo-checksum.json
third_party/rust/bitflags/.travis.yml
third_party/rust/bitflags/CHANGELOG.md
third_party/rust/bitflags/Cargo.toml
third_party/rust/bitflags/README.md
third_party/rust/bitflags/src/example_generated.rs
third_party/rust/bitflags/src/lib.rs
third_party/rust/bitflags/tests/conflicting_trait_impls.rs
third_party/rust/bitflags/tests/external.rs
third_party/rust/bitflags/tests/external_no_std.rs
third_party/rust/bitflags/tests/i128_bitflags.rs
third_party/rust/byteorder-1.1.0/.cargo-checksum.json
third_party/rust/byteorder-1.1.0/.travis.yml
third_party/rust/byteorder-1.1.0/CHANGELOG.md
third_party/rust/byteorder-1.1.0/COPYING
third_party/rust/byteorder-1.1.0/Cargo.toml
third_party/rust/byteorder-1.1.0/LICENSE-MIT
third_party/rust/byteorder-1.1.0/README.md
third_party/rust/byteorder-1.1.0/UNLICENSE
third_party/rust/byteorder-1.1.0/benches/bench.rs
third_party/rust/byteorder-1.1.0/src/io.rs
third_party/rust/byteorder-1.1.0/src/lib.rs
third_party/rust/clap-2.25.0/.appveyor.yml
third_party/rust/clap-2.25.0/.cargo-checksum.json
third_party/rust/clap-2.25.0/.clog.toml
third_party/rust/clap-2.25.0/.github/CONTRIBUTING.md
third_party/rust/clap-2.25.0/.github/ISSUE_TEMPLATE.md
third_party/rust/clap-2.25.0/.mention-bot
third_party/rust/clap-2.25.0/.travis.yml
third_party/rust/clap-2.25.0/CHANGELOG.md
third_party/rust/clap-2.25.0/CONTRIBUTORS.md
third_party/rust/clap-2.25.0/Cargo.toml
third_party/rust/clap-2.25.0/LICENSE-MIT
third_party/rust/clap-2.25.0/README.md
third_party/rust/clap-2.25.0/clap-test.rs
third_party/rust/clap-2.25.0/index.html
third_party/rust/clap-2.25.0/justfile
third_party/rust/clap-2.25.0/rustfmt.toml
third_party/rust/clap-2.25.0/src/app/help.rs
third_party/rust/clap-2.25.0/src/app/macros.rs
third_party/rust/clap-2.25.0/src/app/meta.rs
third_party/rust/clap-2.25.0/src/app/mod.rs
third_party/rust/clap-2.25.0/src/app/parser.rs
third_party/rust/clap-2.25.0/src/app/settings.rs
third_party/rust/clap-2.25.0/src/app/usage.rs
third_party/rust/clap-2.25.0/src/app/validator.rs
third_party/rust/clap-2.25.0/src/args/any_arg.rs
third_party/rust/clap-2.25.0/src/args/arg.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/base.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/flag.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/mod.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/option.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/positional.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/switched.rs
third_party/rust/clap-2.25.0/src/args/arg_builder/valued.rs
third_party/rust/clap-2.25.0/src/args/arg_matcher.rs
third_party/rust/clap-2.25.0/src/args/arg_matches.rs
third_party/rust/clap-2.25.0/src/args/group.rs
third_party/rust/clap-2.25.0/src/args/macros.rs
third_party/rust/clap-2.25.0/src/args/matched_arg.rs
third_party/rust/clap-2.25.0/src/args/mod.rs
third_party/rust/clap-2.25.0/src/args/settings.rs
third_party/rust/clap-2.25.0/src/args/subcommand.rs
third_party/rust/clap-2.25.0/src/completions/bash.rs
third_party/rust/clap-2.25.0/src/completions/fish.rs
third_party/rust/clap-2.25.0/src/completions/macros.rs
third_party/rust/clap-2.25.0/src/completions/mod.rs
third_party/rust/clap-2.25.0/src/completions/powershell.rs
third_party/rust/clap-2.25.0/src/completions/shell.rs
third_party/rust/clap-2.25.0/src/completions/zsh.rs
third_party/rust/clap-2.25.0/src/errors.rs
third_party/rust/clap-2.25.0/src/fmt.rs
third_party/rust/clap-2.25.0/src/lib.rs
third_party/rust/clap-2.25.0/src/macros.rs
third_party/rust/clap-2.25.0/src/osstringext.rs
third_party/rust/clap-2.25.0/src/strext.rs
third_party/rust/clap-2.25.0/src/suggestions.rs
third_party/rust/clap-2.25.0/src/usage_parser.rs
third_party/rust/clap/.cargo-checksum.json
third_party/rust/clap/.github/CONTRIBUTING.md
third_party/rust/clap/.travis.yml
third_party/rust/clap/CHANGELOG.md
third_party/rust/clap/CONTRIBUTORS.md
third_party/rust/clap/Cargo.toml
third_party/rust/clap/README.md
third_party/rust/clap/src/app/help.rs
third_party/rust/clap/src/app/macros.rs
third_party/rust/clap/src/app/meta.rs
third_party/rust/clap/src/app/mod.rs
third_party/rust/clap/src/app/parser.rs
third_party/rust/clap/src/app/settings.rs
third_party/rust/clap/src/app/usage.rs
third_party/rust/clap/src/app/validator.rs
third_party/rust/clap/src/args/arg.rs
third_party/rust/clap/src/args/arg_builder/base.rs
third_party/rust/clap/src/args/arg_builder/switched.rs
third_party/rust/clap/src/args/arg_matcher.rs
third_party/rust/clap/src/args/arg_matches.rs
third_party/rust/clap/src/args/group.rs
third_party/rust/clap/src/args/matched_arg.rs
third_party/rust/clap/src/args/mod.rs
third_party/rust/clap/src/args/settings.rs
third_party/rust/clap/src/args/subcommand.rs
third_party/rust/clap/src/completions/bash.rs
third_party/rust/clap/src/completions/fish.rs
third_party/rust/clap/src/completions/macros.rs
third_party/rust/clap/src/completions/mod.rs
third_party/rust/clap/src/completions/powershell.rs
third_party/rust/clap/src/completions/shell.rs
third_party/rust/clap/src/completions/zsh.rs
third_party/rust/clap/src/errors.rs
third_party/rust/clap/src/fmt.rs
third_party/rust/clap/src/lib.rs
third_party/rust/clap/src/macros.rs
third_party/rust/clap/src/map.rs
third_party/rust/clap/src/osstringext.rs
third_party/rust/clap/src/suggestions.rs
third_party/rust/clap/src/usage_parser.rs
third_party/rust/gcc-0.3.42/.cargo-checksum.json
third_party/rust/gcc-0.3.42/.travis.yml
third_party/rust/gcc-0.3.42/Cargo.toml
third_party/rust/gcc-0.3.42/LICENSE-APACHE
third_party/rust/gcc-0.3.42/LICENSE-MIT
third_party/rust/gcc-0.3.42/README.md
third_party/rust/gcc-0.3.42/appveyor.yml
third_party/rust/gcc-0.3.42/src/bin/gcc-shim.rs
third_party/rust/gcc-0.3.42/src/lib.rs
third_party/rust/gcc-0.3.42/src/registry.rs
third_party/rust/gcc-0.3.42/src/windows_registry.rs
third_party/rust/gcc-0.3.42/tests/cc_env.rs
third_party/rust/gcc-0.3.42/tests/support/mod.rs
third_party/rust/gcc-0.3.42/tests/test.rs
third_party/rust/gcc/.cargo-checksum.json
third_party/rust/gcc/.travis.yml
third_party/rust/gcc/Cargo.toml
third_party/rust/gcc/README.md
third_party/rust/gcc/appveyor.yml
third_party/rust/gcc/src/lib.rs
third_party/rust/gcc/src/winapi.rs
third_party/rust/gcc/src/windows_registry.rs
third_party/rust/gcc/tests/support/mod.rs
third_party/rust/gcc/tests/test.rs
third_party/rust/lazy_static-0.2.11/.cargo-checksum.json
third_party/rust/lazy_static-0.2.11/.travis.yml
third_party/rust/lazy_static-0.2.11/Cargo.toml
third_party/rust/lazy_static-0.2.11/LICENSE-APACHE
third_party/rust/lazy_static-0.2.11/LICENSE-MIT
third_party/rust/lazy_static-0.2.11/README.md
third_party/rust/lazy_static-0.2.11/appveyor.yml
third_party/rust/lazy_static-0.2.11/src/core_lazy.rs
third_party/rust/lazy_static-0.2.11/src/lazy.rs
third_party/rust/lazy_static-0.2.11/src/lib.rs
third_party/rust/lazy_static-0.2.11/src/nightly_lazy.rs
third_party/rust/lazy_static-0.2.11/tests/compile-fail/README.md
third_party/rust/lazy_static-0.2.11/tests/compile-fail/incorrect_visibility_restriction.rs
third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_is_private.rs
third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_is_sized.rs
third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_never_used.rs
third_party/rust/lazy_static-0.2.11/tests/compile_tests.rs
third_party/rust/lazy_static-0.2.11/tests/no_std.rs
third_party/rust/lazy_static-0.2.11/tests/test.rs
third_party/rust/lazy_static-0.2.8/.cargo-checksum.json
third_party/rust/lazy_static-0.2.8/.travis.yml
third_party/rust/lazy_static-0.2.8/Cargo.toml
third_party/rust/lazy_static-0.2.8/LICENSE-APACHE
third_party/rust/lazy_static-0.2.8/LICENSE-MIT
third_party/rust/lazy_static-0.2.8/README.md
third_party/rust/lazy_static-0.2.8/src/core_lazy.rs
third_party/rust/lazy_static-0.2.8/src/lazy.rs
third_party/rust/lazy_static-0.2.8/src/lib.rs
third_party/rust/lazy_static-0.2.8/src/nightly_lazy.rs
third_party/rust/lazy_static-0.2.8/tests/no_std.rs
third_party/rust/lazy_static-0.2.8/tests/test.rs
third_party/rust/lazy_static-0.2.9/.cargo-checksum.json
third_party/rust/lazy_static-0.2.9/.travis.yml
third_party/rust/lazy_static-0.2.9/Cargo.toml
third_party/rust/lazy_static-0.2.9/LICENSE-APACHE
third_party/rust/lazy_static-0.2.9/LICENSE-MIT
third_party/rust/lazy_static-0.2.9/README.md
third_party/rust/lazy_static-0.2.9/appveyor.yml
third_party/rust/lazy_static-0.2.9/src/core_lazy.rs
third_party/rust/lazy_static-0.2.9/src/lazy.rs
third_party/rust/lazy_static-0.2.9/src/lib.rs
third_party/rust/lazy_static-0.2.9/src/nightly_lazy.rs
third_party/rust/lazy_static-0.2.9/tests/no_std.rs
third_party/rust/lazy_static-0.2.9/tests/test.rs
third_party/rust/libc-0.2.24/.cargo-checksum.json
third_party/rust/libc-0.2.24/.travis.yml
third_party/rust/libc-0.2.24/Cargo.toml
third_party/rust/libc-0.2.24/LICENSE-APACHE
third_party/rust/libc-0.2.24/LICENSE-MIT
third_party/rust/libc-0.2.24/README.md
third_party/rust/libc-0.2.24/appveyor.yml
third_party/rust/libc-0.2.24/ci/README.md
third_party/rust/libc-0.2.24/ci/android-accept-licenses.sh
third_party/rust/libc-0.2.24/ci/android-install-ndk.sh
third_party/rust/libc-0.2.24/ci/android-install-sdk.sh
third_party/rust/libc-0.2.24/ci/android-sysimage.sh
third_party/rust/libc-0.2.24/ci/docker/aarch64-linux-android/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/arm-linux-androideabi/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/i686-linux-android/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/i686-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/i686-unknown-linux-musl/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/mips-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/mips-unknown-linux-musl/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/mipsel-unknown-linux-musl/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-linux-android/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-rumprun-netbsd/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-freebsd/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-linux-musl/Dockerfile
third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-openbsd/Dockerfile
third_party/rust/libc-0.2.24/ci/dox.sh
third_party/rust/libc-0.2.24/ci/ios/deploy_and_run_on_ios_simulator.rs
third_party/rust/libc-0.2.24/ci/landing-page-footer.html
third_party/rust/libc-0.2.24/ci/landing-page-head.html
third_party/rust/libc-0.2.24/ci/run-docker.sh
third_party/rust/libc-0.2.24/ci/run-qemu.sh
third_party/rust/libc-0.2.24/ci/run.sh
third_party/rust/libc-0.2.24/ci/style.rs
third_party/rust/libc-0.2.24/src/dox.rs
third_party/rust/libc-0.2.24/src/lib.rs
third_party/rust/libc-0.2.24/src/macros.rs
third_party/rust/libc-0.2.24/src/redox.rs
third_party/rust/libc-0.2.24/src/unix/bsd/apple/b32.rs
third_party/rust/libc-0.2.24/src/unix/bsd/apple/b64.rs
third_party/rust/libc-0.2.24/src/unix/bsd/apple/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/dragonfly/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/x86.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/x86_64.rs
third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs
third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs
third_party/rust/libc-0.2.24/src/unix/haiku/b32.rs
third_party/rust/libc-0.2.24/src/unix/haiku/b64.rs
third_party/rust/libc-0.2.24/src/unix/haiku/mod.rs
third_party/rust/libc-0.2.24/src/unix/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/arm.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/x86.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/aarch64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/x86_64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/android/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mips32.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mips64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/arm.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/asmjs.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/mips.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/x86.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/aarch64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/powerpc64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/x86_64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/arm.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/powerpc.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/x86.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/aarch64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/powerpc64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/sparc64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/x86_64.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/mod.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/linux/s390x.rs
third_party/rust/libc-0.2.24/src/unix/notbsd/mod.rs
third_party/rust/libc-0.2.24/src/unix/solaris/mod.rs
third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mips32.rs
third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mips64.rs
third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mod.rs
third_party/rust/libc-0.2.24/src/unix/uclibc/mod.rs
third_party/rust/libc-0.2.24/src/unix/uclibc/x86_64/mod.rs
third_party/rust/libc-0.2.24/src/windows.rs
third_party/rust/matches-0.1.4/.cargo-checksum.json
third_party/rust/matches-0.1.4/Cargo.toml
third_party/rust/matches-0.1.4/LICENSE
third_party/rust/matches-0.1.4/lib.rs
third_party/rust/memchr-1.0.1/.cargo-checksum.json
third_party/rust/memchr-1.0.1/.travis.yml
third_party/rust/memchr-1.0.1/COPYING
third_party/rust/memchr-1.0.1/Cargo.toml
third_party/rust/memchr-1.0.1/LICENSE-MIT
third_party/rust/memchr-1.0.1/Makefile
third_party/rust/memchr-1.0.1/README.md
third_party/rust/memchr-1.0.1/UNLICENSE
third_party/rust/memchr-1.0.1/appveyor.yml
third_party/rust/memchr-1.0.1/benches/bench.rs
third_party/rust/memchr-1.0.1/ctags.rust
third_party/rust/memchr-1.0.1/session.vim
third_party/rust/memchr-1.0.1/src/lib.rs
third_party/rust/num-integer-0.1.33/.cargo-checksum.json
third_party/rust/num-integer-0.1.33/Cargo.toml
third_party/rust/num-integer-0.1.33/LICENSE-APACHE
third_party/rust/num-integer-0.1.33/LICENSE-MIT
third_party/rust/num-integer-0.1.33/src/lib.rs
third_party/rust/num-traits-0.1.39/.cargo-checksum.json
third_party/rust/num-traits-0.1.39/Cargo.toml
third_party/rust/num-traits-0.1.39/LICENSE-APACHE
third_party/rust/num-traits-0.1.39/LICENSE-MIT
third_party/rust/num-traits-0.1.39/src/bounds.rs
third_party/rust/num-traits-0.1.39/src/cast.rs
third_party/rust/num-traits-0.1.39/src/float.rs
third_party/rust/num-traits-0.1.39/src/identities.rs
third_party/rust/num-traits-0.1.39/src/int.rs
third_party/rust/num-traits-0.1.39/src/lib.rs
third_party/rust/num-traits-0.1.39/src/ops/checked.rs
third_party/rust/num-traits-0.1.39/src/ops/mod.rs
third_party/rust/num-traits-0.1.39/src/ops/saturating.rs
third_party/rust/num-traits-0.1.39/src/ops/wrapping.rs
third_party/rust/num-traits-0.1.39/src/pow.rs
third_party/rust/num-traits-0.1.39/src/sign.rs
third_party/rust/num-traits/.cargo-checksum.json
third_party/rust/num-traits/Cargo.toml
third_party/rust/num-traits/src/bounds.rs
third_party/rust/num-traits/src/cast.rs
third_party/rust/num-traits/src/identities.rs
third_party/rust/num-traits/src/lib.rs
third_party/rust/num_cpus-1.6.0/.appveyor.yml
third_party/rust/num_cpus-1.6.0/.cargo-checksum.json
third_party/rust/num_cpus-1.6.0/.travis.yml
third_party/rust/num_cpus-1.6.0/Cargo.toml
third_party/rust/num_cpus-1.6.0/LICENSE-APACHE
third_party/rust/num_cpus-1.6.0/LICENSE-MIT
third_party/rust/num_cpus-1.6.0/README.md
third_party/rust/num_cpus-1.6.0/src/lib.rs
third_party/rust/num_cpus-1.6.2/.appveyor.yml
third_party/rust/num_cpus-1.6.2/.cargo-checksum.json
third_party/rust/num_cpus-1.6.2/.travis.yml
third_party/rust/num_cpus-1.6.2/Cargo.toml
third_party/rust/num_cpus-1.6.2/LICENSE-APACHE
third_party/rust/num_cpus-1.6.2/LICENSE-MIT
third_party/rust/num_cpus-1.6.2/README.md
third_party/rust/num_cpus-1.6.2/src/lib.rs
third_party/rust/redox_syscall-0.1.16/.cargo-checksum.json
third_party/rust/redox_syscall-0.1.16/Cargo.toml
third_party/rust/redox_syscall-0.1.16/src/arch/arm.rs
third_party/rust/redox_syscall-0.1.16/src/arch/x86.rs
third_party/rust/redox_syscall-0.1.16/src/arch/x86_64.rs
third_party/rust/redox_syscall-0.1.16/src/call.rs
third_party/rust/redox_syscall-0.1.16/src/data.rs
third_party/rust/redox_syscall-0.1.16/src/error.rs
third_party/rust/redox_syscall-0.1.16/src/flag.rs
third_party/rust/redox_syscall-0.1.16/src/io/dma.rs
third_party/rust/redox_syscall-0.1.16/src/io/io.rs
third_party/rust/redox_syscall-0.1.16/src/io/mmio.rs
third_party/rust/redox_syscall-0.1.16/src/io/mod.rs
third_party/rust/redox_syscall-0.1.16/src/io/pio.rs
third_party/rust/redox_syscall-0.1.16/src/lib.rs
third_party/rust/redox_syscall-0.1.16/src/number.rs
third_party/rust/redox_syscall-0.1.16/src/scheme.rs
third_party/rust/redox_syscall/.cargo-checksum.json
third_party/rust/redox_syscall/Cargo.toml
third_party/rust/redox_syscall/src/call.rs
third_party/rust/redox_syscall/src/number.rs
third_party/rust/redox_syscall/src/scheme.rs
third_party/rust/textwrap-0.6.0/.appveyor.yml
third_party/rust/textwrap-0.6.0/.cargo-checksum.json
third_party/rust/textwrap-0.6.0/.travis.yml
third_party/rust/textwrap-0.6.0/Cargo.toml
third_party/rust/textwrap-0.6.0/LICENSE
third_party/rust/textwrap-0.6.0/README.md
third_party/rust/textwrap-0.6.0/benches/linear.rs
third_party/rust/textwrap-0.6.0/examples/layout.rs
third_party/rust/textwrap-0.6.0/examples/termwidth.rs
third_party/rust/textwrap-0.6.0/src/lib.rs
third_party/rust/time-0.1.36/.cargo-checksum.json
third_party/rust/time-0.1.36/.travis.yml
third_party/rust/time-0.1.36/Cargo.toml
third_party/rust/time-0.1.36/LICENSE-APACHE
third_party/rust/time-0.1.36/LICENSE-MIT
third_party/rust/time-0.1.36/README.md
third_party/rust/time-0.1.36/appveyor.yml
third_party/rust/time-0.1.36/benches/precise_time_ns.rs
third_party/rust/time-0.1.36/src/display.rs
third_party/rust/time-0.1.36/src/duration.rs
third_party/rust/time-0.1.36/src/lib.rs
third_party/rust/time-0.1.36/src/parse.rs
third_party/rust/time-0.1.36/src/sys.rs
third_party/rust/unicode-bidi-0.3.3/.cargo-checksum.json
third_party/rust/unicode-bidi-0.3.3/.rustfmt.toml
third_party/rust/unicode-bidi-0.3.3/.travis.yml
third_party/rust/unicode-bidi-0.3.3/AUTHORS
third_party/rust/unicode-bidi-0.3.3/COPYRIGHT
third_party/rust/unicode-bidi-0.3.3/Cargo.toml
third_party/rust/unicode-bidi-0.3.3/LICENSE-APACHE
third_party/rust/unicode-bidi-0.3.3/LICENSE-MIT
third_party/rust/unicode-bidi-0.3.3/README.md
third_party/rust/unicode-bidi-0.3.3/benches/basic.rs
third_party/rust/unicode-bidi-0.3.3/benches/udhr.rs
third_party/rust/unicode-bidi-0.3.3/benches/udhr_data/README.md
third_party/rust/unicode-bidi-0.3.3/src/char_data/mod.rs
third_party/rust/unicode-bidi-0.3.3/src/char_data/tables.rs
third_party/rust/unicode-bidi-0.3.3/src/deprecated.rs
third_party/rust/unicode-bidi-0.3.3/src/explicit.rs
third_party/rust/unicode-bidi-0.3.3/src/format_chars.rs
third_party/rust/unicode-bidi-0.3.3/src/implicit.rs
third_party/rust/unicode-bidi-0.3.3/src/level.rs
third_party/rust/unicode-bidi-0.3.3/src/lib.rs
third_party/rust/unicode-bidi-0.3.3/src/prepare.rs
third_party/rust/unicode-bidi-0.3.3/tests/conformance_tests.rs
third_party/rust/unicode-bidi-0.3.3/tools/generate.py
third_party/rust/url-1.5.1/.cargo-checksum.json
third_party/rust/url-1.5.1/.travis.yml
third_party/rust/url-1.5.1/Cargo.toml
third_party/rust/url-1.5.1/LICENSE-APACHE
third_party/rust/url-1.5.1/LICENSE-MIT
third_party/rust/url-1.5.1/Makefile
third_party/rust/url-1.5.1/README.md
third_party/rust/url-1.5.1/UPGRADING.md
third_party/rust/url-1.5.1/appveyor.yml
third_party/rust/url-1.5.1/docs/.nojekyll
third_party/rust/url-1.5.1/docs/404.html
third_party/rust/url-1.5.1/docs/index.html
third_party/rust/url-1.5.1/github.png
third_party/rust/url-1.5.1/rust-url-todo
third_party/rust/url-1.5.1/src/encoding.rs
third_party/rust/url-1.5.1/src/form_urlencoded.rs
third_party/rust/url-1.5.1/src/host.rs
third_party/rust/url-1.5.1/src/lib.rs
third_party/rust/url-1.5.1/src/origin.rs
third_party/rust/url-1.5.1/src/parser.rs
third_party/rust/url-1.5.1/src/path_segments.rs
third_party/rust/url-1.5.1/src/quirks.rs
third_party/rust/url-1.5.1/src/slicing.rs
third_party/rust/url-1.5.1/tests/data.rs
third_party/rust/url-1.5.1/tests/setters_tests.json
third_party/rust/url-1.5.1/tests/unit.rs
third_party/rust/url-1.5.1/tests/urltestdata.json
third_party/rust/which-1.0.2/.cargo-checksum.json
third_party/rust/which-1.0.2/Cargo.toml
third_party/rust/which-1.0.2/LICENSE.txt
third_party/rust/which-1.0.2/README.md
third_party/rust/which-1.0.2/src/lib.rs
toolkit/library/gtest/rust/Cargo.lock
toolkit/library/rust/Cargo.lock
--- a/js/rust/Cargo.lock
+++ b/js/rust/Cargo.lock
@@ -1,52 +1,52 @@
 [[package]]
 name = "aho-corasick"
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ansi_term"
-version = "0.9.0"
+version = "0.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atty"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bindgen"
 version = "0.31.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "which 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bitflags"
-version = "0.9.1"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "cexpr"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -58,56 +58,54 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "clang-sys"
 version = "0.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "clap"
-version = "2.25.0"
+version = "2.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cmake"
 version = "0.1.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "env_logger"
 version = "0.4.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gcc"
-version = "0.3.51"
+version = "0.3.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "glob"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -122,101 +120,101 @@ dependencies = [
 name = "js"
 version = "0.1.4"
 dependencies = [
  "bindgen 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "cmake 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozjs_sys 0.0.0",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "kernel32-sys"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "lazy_static"
-version = "0.2.8"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libc"
-version = "0.2.24"
+version = "0.2.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libloading"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libz-sys"
 version = "1.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "log"
 version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "memchr"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mozjs_sys"
 version = "0.0.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "nom"
 version = "1.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "num-traits"
-version = "0.1.39"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "num_cpus"
-version = "1.6.0"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "peeking_take_while"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -230,75 +228,59 @@ version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "regex"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "regex-syntax"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "strsim"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
-name = "term_size"
-version = "0.3.0"
+name = "textwrap"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread-id"
 version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread_local"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "unicode-segmentation"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[[package]]
 name = "unicode-width"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "unreachable"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -323,69 +305,67 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "void"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "which"
-version = "1.0.2"
+version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "winapi"
 version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "winapi-build"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [metadata]
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
-"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
+"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
 "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
 "checksum bindgen 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57253399c086f4f29e57ffd3b5cdbc23a806a00292619351aa4cfa39cb49d4ea"
-"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
+"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
 "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d"
 "checksum cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c47d456a36ebf0536a6705c83c1cbbcb9255fbc1d905a6ded104f479268a29"
 "checksum clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00048189ee171715296dfe3b2fcfd439563c7bfec0d98d3976ce3402d62c8f07"
-"checksum clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "867a885995b4184be051b70a592d4d70e32d7a188db6e8dff626af286a962771"
+"checksum clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"
 "checksum cmake 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "b8ebbb35d3dc9cd09497168f33de1acb79b265d350ab0ac34133b98f8509af1f"
 "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"
-"checksum gcc 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)" = "120d07f202dcc3f72859422563522b66fe6463a4c513df062874daad05f85f0a"
+"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
 "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
 "checksum heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7593b1522161003928c959c20a2ca421c68e940d63d75573316a009e48a6d4"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
-"checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"
-"checksum libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"
+"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
+"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd64ef8ee652185674455c1d450b83cbc8ad895625d543b5324d923f82e4d8"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
-"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
+"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
-"checksum num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "1708c0628602a98b52fad936cf3edb9a107af06e52e49fdf0707e884456a6af6"
-"checksum num_cpus 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83df569ffd47dbf87f36bead512632f89e90882b8e7a14286d0471daf6b72de9"
+"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
+"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
 "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
-"checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
-"checksum textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f86300c3e7416ee233abd7cda890c492007a3980f941f79185c753a701257167"
+"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
 "checksum thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"
 "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7"
-"checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3"
 "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
 "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"
 "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
 "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
-"checksum which 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d238435618c0f298d2d75596c2d4fa7d4ea469c0c1c3ff824737ed50ad5ab61c"
+"checksum which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4be6cfa54dab45266e98b5d7be2f8ce959ddd49abd141a05d52dce4b07f803bb"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
--- a/js/src/Cargo.lock
+++ b/js/src/Cargo.lock
@@ -1,55 +1,55 @@
 [[package]]
 name = "gcc"
-version = "0.3.42"
+version = "0.3.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libc"
-version = "0.2.24"
+version = "0.2.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libz-sys"
 version = "1.0.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "gcc 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mozjs_sys"
 version = "0.0.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num_cpus"
-version = "1.6.2"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "pkg-config"
 version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "vcpkg"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [metadata]
-"checksum gcc 0.3.42 (registry+https://github.com/rust-lang/crates.io-index)" = "291055c78f59ca3d84c99026c9501c469413d386bb46be1e1cf1d285cd1db3b0"
-"checksum libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"
+"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"
+"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd64ef8ee652185674455c1d450b83cbc8ad895625d543b5324d923f82e4d8"
-"checksum num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584"
+"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
--- a/testing/geckodriver/Cargo.lock
+++ b/testing/geckodriver/Cargo.lock
@@ -15,33 +15,33 @@ dependencies = [
  "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "base64"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bitflags"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bitflags"
-version = "0.9.1"
+version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "byteorder"
-version = "1.1.0"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bzip2"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -68,20 +68,20 @@ version = "0.2.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "clap"
-version = "2.27.1"
+version = "2.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cookie"
@@ -121,17 +121,17 @@ dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "geckodriver"
 version = "0.19.1"
 dependencies = [
  "chrono 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)",
- "clap 2.27.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozprofile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozrunner 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozversion 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -221,17 +221,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "lazy_static"
 version = "0.1.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
-version = "0.2.9"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libc"
 version = "0.2.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -309,39 +309,39 @@ dependencies = [
 
 [[package]]
 name = "num"
 version = "0.1.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-integer"
 version = "0.1.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-iter"
 version = "0.1.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-traits"
-version = "0.1.40"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "num_cpus"
 version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -363,17 +363,17 @@ version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.1.31"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "regex"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -443,17 +443,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "slog-stdlog"
 version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "slog 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "slog-term 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "slog-stream"
 version = "1.2.1"
@@ -508,28 +508,28 @@ dependencies = [
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread_local"
 version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "lazy_static 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "time"
 version = "0.1.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "traitobject"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -653,57 +653,57 @@ dependencies = [
  "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
 "checksum advapi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "307c92332867e586720c0222ee9d890bbe8431711efed8a1b06bc5b40fc66bd7"
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
 "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9"
 "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
-"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
-"checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d"
+"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
+"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
 "checksum bzip2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3eafc42c44e0d827de6b1c131175098fe7fb53b8ce8a47e65cb3ea94688be24"
 "checksum bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5162604199bbb17690ede847eaa6120a3f33d5ab4dcc8e7c25b16d849ae79b"
 "checksum cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b13a57efd6b30ecd6598ebdb302cca617930b5470647570468a65d12ef9719"
 "checksum chrono 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9213f7cd7c27e95c2b57c49f0e69b1ea65b27138da84a170133fd21b07659c00"
-"checksum clap 2.27.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b8c532887f1a292d17de05ae858a8fe50a301e196f9ef0ddb7ccd0d1d00f180"
+"checksum clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"
 "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb"
 "checksum crossbeam 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0c5ea215664ca264da8a9d9c3be80d2eaf30923c259d03e870388eb927508f97"
 "checksum flate2 0.2.20 (registry+https://github.com/rust-lang/crates.io-index)" = "e6234dd4468ae5d1e2dbb06fe2b058696fdc50a339c68a393aefbf00bc81e423"
 "checksum fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f6c0581a4e363262e52b87f59ee2afe3415361c6ec35e665924eb08afe8ff159"
 "checksum fuchsia-zircon-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "43f3795b4bae048dc6123a6b972cadde2e676f9ded08aef6bb77f5f157684a82"
 "checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07"
 "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2"
 "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
 "checksum isatty 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "00c9301a947a2eaee7ce2556b80285dcc89558d07088962e6e8b9c25730f9dc6"
 "checksum kernel32-sys 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e014dab1082fd9d80ea1fa6fcb261b47ed3eb511612a14198bb507701add083e"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
 "checksum ktmw32-sys 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f9313a869ff779ae08dd990b75a92dc06aa16d771f41305f7286649cd39a0ee"
 "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
 "checksum lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417"
-"checksum lazy_static 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c9e5e58fa1a4c3b915a561a78a22ee0cac6ab97dca2504428bc1cb074375f8d5"
+"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
 "checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
 "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
 "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
 "checksum miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4"
 "checksum mozprofile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a17b8bbde1dc0fbf1c8b073192d7c6f89baa932173ece7c1447de5e9cc7cd7e"
 "checksum mozrunner 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff037ca681fa465d01c863f8b16d4a008997b35468059c06f1a4b828369600b"
 "checksum mozversion 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9fb3a40135553611560d3eb4a49479beaf0c91c5a93f723338c5b0edddf08f26"
 "checksum msdos_time 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "65ba9d75bcea84e07812618fedf284a64776c2f2ea0cad6bca7f69739695a958"
 "checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
 "checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
 "checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"
-"checksum num-traits 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "99843c856d68d8b4313b03a17e33c4bb42ae8f6610ea81b28abe076ac721b9b0"
+"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
 "checksum podio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e5422a1ee1bc57cc47ae717b0137314258138f38fd5f3cea083f43a9725383a0"
 "checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd"
-"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"
+"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"
 "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
 "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum rust-ini 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "06d4e8b0b50e7e7f827d609fa9746e1cf6371a1fa15404a1a0a86152a801079f"
 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
 "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
 "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
 "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 "checksum slog 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b965551440d867da261b10d50871ae608537c56fbeb872a296b12add733acf1"
--- a/third_party/rust/ansi_term/.cargo-checksum.json
+++ b/third_party/rust/ansi_term/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"eb7113e5f5e36c2e00ae8e88a84dd5273505036520f2787133ba575d5fdd93c1","Cargo.toml":"ffe01d108855864ea3c975aad9da22d2a2324730022a5d4e119639f5850209db","LICENCE":"2762990c7fbba9d550802a2593c1d857dcd52596bb0f9f192a97e9a7ac5f4f9e","README.md":"ee22a0db93788e9bfe4c3cf4d7df5daf881a3105f941a915140a34018ff394e5","src/lib.rs":"867242d0699126af5a115709030888e958edfb835a0b3c15c4159a045f367e18"},"package":"23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"}
\ No newline at end of file
+{"files":{".travis.yml":"eb7113e5f5e36c2e00ae8e88a84dd5273505036520f2787133ba575d5fdd93c1","Cargo.toml":"7ee95481bc957d9c98cdb9e3ae6c9d982dd385a8276544445554b8321e604c97","LICENCE":"2762990c7fbba9d550802a2593c1d857dcd52596bb0f9f192a97e9a7ac5f4f9e","README.md":"8a00b2016ab0b1c41b110b7f6561d7c2d675fd2442ef10a1cce36b8b8f68235a","src/ansi.rs":"a404efab736839d65c49e147c1d037fb3f852341d445ad41cc43181462310a65","src/debug.rs":"c40ea0796167161dda30bfb4b8b2596101da42e98a81b1c7d0e04fe53befb1c3","src/difference.rs":"9b4b8f91c72932bfda262abdceff0ec124a5a8dd27d07bd4d2e5e7889135c6c9","src/display.rs":"507d120de80411c9b8b2a05ff68f2336137ef226de4b8c537c790d7ccdacc3e1","src/lib.rs":"4847d21681c323236068bbcbf5523e69cf69e79470a9fec0927f520bd0670967","src/style.rs":"003b9832c4381c455b6ddf2c37b7150b48c9a5649c0c14da923a80e9fd6d898f","src/windows.rs":"0f806e0d70d8b15fdb158cc5f9bbb88ffba2ea9d64b0d69b5adfb95a2e2cdbef","src/write.rs":"c9ec03764ad1ecea8b680243c9cafc5e70919fcea7500cc18246ffd8f6bb4b33"},"package":"6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"}
\ No newline at end of file
--- a/third_party/rust/ansi_term/Cargo.toml
+++ b/third_party/rust/ansi_term/Cargo.toml
@@ -1,13 +1,24 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
 [package]
 name = "ansi_term"
+version = "0.10.2"
+authors = ["ogham@bsago.me", "Ryan Scheel (Havvy) <ryan.havvy@gmail.com>", "Josh Triplett <josh@joshtriplett.org>"]
 description = "Library for ANSI terminal colours and styles (bold, underline)"
-
-authors = [ "ogham@bsago.me", "Ryan Scheel (Havvy) <ryan.havvy@gmail.com>" ]
-documentation = "https://docs.rs/ansi_term/0.9.0/ansi_term/"
 homepage = "https://github.com/ogham/rust-ansi-term"
-license = "MIT"
+documentation = "https://docs.rs/ansi_term"
 readme = "README.md"
-version = "0.9.0"
+license = "MIT"
 
 [lib]
 name = "ansi_term"
--- a/third_party/rust/ansi_term/README.md
+++ b/third_party/rust/ansi_term/README.md
@@ -1,22 +1,22 @@
 # rust-ansi-term [![ansi-term on crates.io](http://meritbadge.herokuapp.com/ansi-term)](https://crates.io/crates/ansi_term) [![Build status](https://travis-ci.org/ogham/rust-ansi-term.svg?branch=master)](https://travis-ci.org/ogham/rust-ansi-term) [![Coverage status](https://coveralls.io/repos/ogham/rust-ansi-term/badge.svg?branch=master&service=github)](https://coveralls.io/github/ogham/rust-ansi-term?branch=master)
 
 This is a library for controlling colours and formatting, such as red bold text or blue underlined text, on ANSI terminals.
 
-### [View the Rustdoc](http://ogham.rustdocs.org/ansi_term)
+### [View the Rustdoc](https://docs.rs/ansi_term/0.9.0/ansi_term/)
 
 
 # Installation
 
 This crate works with [Cargo](http://crates.io). Add the following to your `Cargo.toml` dependencies section:
 
 ```toml
 [dependencies]
-ansi_term = "0.8"
+ansi_term = "0.9"
 ```
 
 
 ## Basic usage
 
 There are two main data structures in this crate that you need to be concerned with: `ANSIString` and `Style`.
 A `Style` holds stylistic information: colours, whether the text should be bold, or blinking, or whatever.
 There are also `Colour` variants that represent simple foreground colour styles.
@@ -39,16 +39,21 @@ This allows strings to be printed with a
 If you *do* want to get at the escape codes, then you can convert the `ANSIString` to a string as you would any other `Display` value:
 
 ```rust
 use ansi_term::Colour::Red;
 use std::string::ToString;
 let red_string = Red.paint("a red string").to_string();
 ```
 
+**Note for Windows 10 users:** On Windows 10, the application must enable ANSI support first:
+
+```rust
+let enabled = ansi_term::enable_ansi_support();
+```
 
 ## Bold, underline, background, and other styles
 
 For anything more complex than plain foreground colour changes, you need to construct `Style` objects themselves, rather than beginning with a `Colour`.
 You can do this by chaining methods based on a new `Style`, created with `Style::new()`.
 Each method creates a new style that has that specific property set.
 For example:
 
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/ansi.rs
@@ -0,0 +1,258 @@
+use style::{Colour, Style};
+
+use std::fmt;
+
+use write::AnyWrite;
+
+
+// ---- generating ANSI codes ----
+
+impl Style {
+
+    /// Write any ANSI codes that go *before* a piece of text. These should be
+    /// the codes to set the terminal to a different colour or font style.
+    fn write_prefix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+
+        // If there are actually no styles here, then don’t write *any* codes
+        // as the prefix. An empty ANSI code may not affect the terminal
+        // output at all, but a user may just want a code-free string.
+        if self.is_plain() {
+            return Ok(());
+        }
+
+        // Write the codes’ prefix, then write numbers, separated by
+        // semicolons, for each text style we want to apply.
+        write!(f, "\x1B[")?;
+        let mut written_anything = false;
+
+        {
+            let mut write_char = |c| {
+                if written_anything { write!(f, ";")?; }
+                written_anything = true;
+                write!(f, "{}", c)?;
+                Ok(())
+            };
+
+            if self.is_bold           { write_char('1')? }
+            if self.is_dimmed         { write_char('2')? }
+            if self.is_italic         { write_char('3')? }
+            if self.is_underline      { write_char('4')? }
+            if self.is_blink          { write_char('5')? }
+            if self.is_reverse        { write_char('7')? }
+            if self.is_hidden         { write_char('8')? }
+            if self.is_strikethrough  { write_char('9')? }
+        }
+
+        // The foreground and background colours, if specified, need to be
+        // handled specially because the number codes are more complicated.
+        // (see `write_background_code` and `write_foreground_code`)
+        if let Some(bg) = self.background {
+            if written_anything { write!(f, ";")?; }
+            written_anything = true;
+            bg.write_background_code(f)?;
+        }
+
+        if let Some(fg) = self.foreground {
+            if written_anything { write!(f, ";")?; }
+            fg.write_foreground_code(f)?;
+        }
+
+        // All the codes end with an `m`, because reasons.
+        write!(f, "m")?;
+
+        Ok(())
+    }
+
+    /// Write any ANSI codes that go *after* a piece of text. These should be
+    /// the codes to *reset* the terminal back to its normal colour and style.
+    fn write_suffix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+        if self.is_plain() {
+            Ok(())
+        }
+        else {
+            write!(f, "{}", RESET)
+        }
+    }
+}
+
+
+/// The code to send to reset all styles and return to `Style::default()`.
+pub static RESET: &str = "\x1B[0m";
+
+
+
+impl Colour {
+    fn write_foreground_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+        match *self {
+            Colour::Black      => write!(f, "30"),
+            Colour::Red        => write!(f, "31"),
+            Colour::Green      => write!(f, "32"),
+            Colour::Yellow     => write!(f, "33"),
+            Colour::Blue       => write!(f, "34"),
+            Colour::Purple     => write!(f, "35"),
+            Colour::Cyan       => write!(f, "36"),
+            Colour::White      => write!(f, "37"),
+            Colour::Fixed(num) => write!(f, "38;5;{}", &num),
+            Colour::RGB(r,g,b) => write!(f, "38;2;{};{};{}", &r, &g, &b),
+        }
+    }
+
+    fn write_background_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
+        match *self {
+            Colour::Black      => write!(f, "40"),
+            Colour::Red        => write!(f, "41"),
+            Colour::Green      => write!(f, "42"),
+            Colour::Yellow     => write!(f, "43"),
+            Colour::Blue       => write!(f, "44"),
+            Colour::Purple     => write!(f, "45"),
+            Colour::Cyan       => write!(f, "46"),
+            Colour::White      => write!(f, "47"),
+            Colour::Fixed(num) => write!(f, "48;5;{}", &num),
+            Colour::RGB(r,g,b) => write!(f, "48;2;{};{};{}", &r, &g, &b),
+        }
+    }
+}
+
+
+/// Like `ANSIString`, but only displays the style prefix.
+#[derive(Clone, Copy, Debug)]
+pub struct Prefix(Style);
+
+/// Like `ANSIString`, but only displays the difference between two
+/// styles.
+#[derive(Clone, Copy, Debug)]
+pub struct Infix(Style, Style);
+
+/// Like `ANSIString`, but only displays the style suffix.
+#[derive(Clone, Copy, Debug)]
+pub struct Suffix(Style);
+
+
+impl Style {
+
+    /// The prefix for this style.
+    pub fn prefix(self) -> Prefix {
+        Prefix(self)
+    }
+
+    /// The infix between this style and another.
+    pub fn infix(self, other: Style) -> Infix {
+        Infix(self, other)
+    }
+
+    /// The suffix for this style.
+    pub fn suffix(self) -> Suffix {
+        Suffix(self)
+    }
+}
+
+
+impl Colour {
+
+    /// The prefix for this colour.
+    pub fn prefix(self) -> Prefix {
+        Prefix(self.normal())
+    }
+
+    /// The infix between this colour and another.
+    pub fn infix(self, other: Colour) -> Infix {
+        Infix(self.normal(), other.normal())
+    }
+
+    /// The suffix for this colour.
+    pub fn suffix(self) -> Suffix {
+        Suffix(self.normal())
+    }
+}
+
+
+impl fmt::Display for Prefix {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let f: &mut fmt::Write = f;
+        self.0.write_prefix(f)
+    }
+}
+
+
+impl fmt::Display for Infix {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        use difference::Difference;
+
+        match Difference::between(&self.0, &self.1) {
+            Difference::ExtraStyles(style) => {
+                let f: &mut fmt::Write = f;
+                style.write_prefix(f)
+            },
+            Difference::Reset => {
+                let f: &mut fmt::Write = f;
+                write!(f, "{}{}", RESET, self.0.prefix())
+            },
+            Difference::NoDifference => {
+                Ok(())   // nothing to write
+            },
+        }
+    }
+}
+
+
+impl fmt::Display for Suffix {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let f: &mut fmt::Write = f;
+        self.0.write_suffix(f)
+    }
+}
+
+
+
+#[cfg(test)]
+mod test {
+    use style::Style;
+    use style::Colour::*;
+
+    macro_rules! test {
+        ($name: ident: $style: expr; $input: expr => $result: expr) => {
+            #[test]
+            fn $name() {
+                assert_eq!($style.paint($input).to_string(), $result.to_string());
+
+                let mut v = Vec::new();
+                $style.paint($input.as_bytes()).write_to(&mut v).unwrap();
+                assert_eq!(v.as_slice(), $result.as_bytes());
+            }
+        };
+    }
+
+    test!(plain:                 Style::default();                  "text/plain" => "text/plain");
+    test!(red:                   Red;                               "hi" => "\x1B[31mhi\x1B[0m");
+    test!(black:                 Black.normal();                    "hi" => "\x1B[30mhi\x1B[0m");
+    test!(yellow_bold:           Yellow.bold();                     "hi" => "\x1B[1;33mhi\x1B[0m");
+    test!(yellow_bold_2:         Yellow.normal().bold();            "hi" => "\x1B[1;33mhi\x1B[0m");
+    test!(blue_underline:        Blue.underline();                  "hi" => "\x1B[4;34mhi\x1B[0m");
+    test!(green_bold_ul:         Green.bold().underline();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
+    test!(green_bold_ul_2:       Green.underline().bold();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
+    test!(purple_on_white:       Purple.on(White);                  "hi" => "\x1B[47;35mhi\x1B[0m");
+    test!(purple_on_white_2:     Purple.normal().on(White);         "hi" => "\x1B[47;35mhi\x1B[0m");
+    test!(yellow_on_blue:        Style::new().on(Blue).fg(Yellow);  "hi" => "\x1B[44;33mhi\x1B[0m");
+    test!(yellow_on_blue_2:      Cyan.on(Blue).fg(Yellow);          "hi" => "\x1B[44;33mhi\x1B[0m");
+    test!(cyan_bold_on_white:    Cyan.bold().on(White);             "hi" => "\x1B[1;47;36mhi\x1B[0m");
+    test!(cyan_ul_on_white:      Cyan.underline().on(White);        "hi" => "\x1B[4;47;36mhi\x1B[0m");
+    test!(cyan_bold_ul_on_white: Cyan.bold().underline().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
+    test!(cyan_ul_bold_on_white: Cyan.underline().bold().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
+    test!(fixed:                 Fixed(100);                        "hi" => "\x1B[38;5;100mhi\x1B[0m");
+    test!(fixed_on_purple:       Fixed(100).on(Purple);             "hi" => "\x1B[45;38;5;100mhi\x1B[0m");
+    test!(fixed_on_fixed:        Fixed(100).on(Fixed(200));         "hi" => "\x1B[48;5;200;38;5;100mhi\x1B[0m");
+    test!(rgb:                   RGB(70,130,180);                   "hi" => "\x1B[38;2;70;130;180mhi\x1B[0m");
+    test!(rgb_on_blue:           RGB(70,130,180).on(Blue);          "hi" => "\x1B[44;38;2;70;130;180mhi\x1B[0m");
+    test!(blue_on_rgb:           Blue.on(RGB(70,130,180));          "hi" => "\x1B[48;2;70;130;180;34mhi\x1B[0m");
+    test!(rgb_on_rgb:            RGB(70,130,180).on(RGB(5,10,15));  "hi" => "\x1B[48;2;5;10;15;38;2;70;130;180mhi\x1B[0m");
+    test!(bold:                  Style::new().bold();               "hi" => "\x1B[1mhi\x1B[0m");
+    test!(underline:             Style::new().underline();          "hi" => "\x1B[4mhi\x1B[0m");
+    test!(bunderline:            Style::new().bold().underline();   "hi" => "\x1B[1;4mhi\x1B[0m");
+    test!(dimmed:                Style::new().dimmed();             "hi" => "\x1B[2mhi\x1B[0m");
+    test!(italic:                Style::new().italic();             "hi" => "\x1B[3mhi\x1B[0m");
+    test!(blink:                 Style::new().blink();              "hi" => "\x1B[5mhi\x1B[0m");
+    test!(reverse:               Style::new().reverse();            "hi" => "\x1B[7mhi\x1B[0m");
+    test!(hidden:                Style::new().hidden();             "hi" => "\x1B[8mhi\x1B[0m");
+    test!(stricken:              Style::new().strikethrough();      "hi" => "\x1B[9mhi\x1B[0m");
+
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/debug.rs
@@ -0,0 +1,122 @@
+use std::fmt;
+
+use style::Style;
+
+
+/// Styles have a special `Debug` implementation that only shows the fields that
+/// are set. Fields that haven’t been touched aren’t included in the output.
+///
+/// This behaviour gets bypassed when using the alternate formatting mode
+/// `format!("{:#?}")`.
+///
+///     use ansi_term::Colour::{Red, Blue};
+///     assert_eq!("Style { fg(Red), on(Blue), bold, italic }",
+///                format!("{:?}", Red.on(Blue).bold().italic()));
+impl fmt::Debug for Style {
+    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
+        if fmt.alternate() {
+            fmt.debug_struct("Style")
+               .field("foreground",    &self.foreground)
+               .field("background",    &self.background)
+               .field("blink",         &self.is_blink)
+               .field("bold",          &self.is_bold)
+               .field("dimmed",        &self.is_dimmed)
+               .field("hidden",        &self.is_hidden)
+               .field("italic",        &self.is_italic)
+               .field("reverse",       &self.is_reverse)
+               .field("strikethrough", &self.is_strikethrough)
+               .field("underline",     &self.is_underline)
+               .finish()
+        }
+        else if self.is_plain() {
+            fmt.write_str("Style {}")
+        }
+        else {
+            fmt.write_str("Style { ")?;
+
+            let mut written_anything = false;
+
+            if let Some(fg) = self.foreground {
+                if written_anything { fmt.write_str(", ")? }
+                written_anything = true;
+                write!(fmt, "fg({:?})", fg)?
+            }
+
+            if let Some(bg) = self.background {
+                if written_anything { fmt.write_str(", ")? }
+                written_anything = true;
+                write!(fmt, "on({:?})", bg)?
+            }
+
+            {
+                let mut write_flag = |name| {
+                    if written_anything { fmt.write_str(", ")? }
+                    written_anything = true;
+                    fmt.write_str(name)
+                };
+
+                if self.is_blink          { write_flag("blink")? }
+                if self.is_bold           { write_flag("bold")? }
+                if self.is_dimmed         { write_flag("dimmed")? }
+                if self.is_hidden         { write_flag("hidden")? }
+                if self.is_italic         { write_flag("italic")? }
+                if self.is_reverse        { write_flag("reverse")? }
+                if self.is_strikethrough  { write_flag("strikethrough")? }
+                if self.is_underline      { write_flag("underline")? }
+            }
+
+            write!(fmt, " }}")
+        }
+    }
+}
+
+
+#[cfg(test)]
+mod test {
+    use style::Colour::*;
+    use style::Style;
+
+    fn style() -> Style {
+        Style::new()
+    }
+
+    macro_rules! test {
+        ($name: ident: $obj: expr => $result: expr) => {
+            #[test]
+            fn $name() {
+                assert_eq!($result, format!("{:?}", $obj));
+            }
+        };
+    }
+
+    test!(empty:   style()                  => "Style {}");
+    test!(bold:    style().bold()           => "Style { bold }");
+    test!(italic:  style().italic()         => "Style { italic }");
+    test!(both:    style().bold().italic()  => "Style { bold, italic }");
+
+    test!(red:     Red.normal()                     => "Style { fg(Red) }");
+    test!(redblue: Red.normal().on(RGB(3, 2, 4))    => "Style { fg(Red), on(RGB(3, 2, 4)) }");
+
+    test!(everything:
+            Red.on(Blue).blink().bold().dimmed().hidden().italic().reverse().strikethrough().underline() =>
+            "Style { fg(Red), on(Blue), blink, bold, dimmed, hidden, italic, reverse, strikethrough, underline }");
+
+    #[test]
+    fn long_and_detailed() {
+        let debug = r##"Style {
+    foreground: Some(
+        Blue
+    ),
+    background: None,
+    blink: false,
+    bold: true,
+    dimmed: false,
+    hidden: false,
+    italic: false,
+    reverse: false,
+    strikethrough: false,
+    underline: false
+}"##;
+        assert_eq!(debug, format!("{:#?}", Blue.bold()));
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/difference.rs
@@ -0,0 +1,179 @@
+use super::Style;
+
+
+/// When printing out one coloured string followed by another, use one of
+/// these rules to figure out which *extra* control codes need to be sent.
+#[derive(PartialEq, Clone, Copy, Debug)]
+pub enum Difference {
+
+    /// Print out the control codes specified by this style to end up looking
+    /// like the second string's styles.
+    ExtraStyles(Style),
+
+    /// Converting between these two is impossible, so just send a reset
+    /// command and then the second string's styles.
+    Reset,
+
+    /// The before style is exactly the same as the after style, so no further
+    /// control codes need to be printed.
+    NoDifference,
+}
+
+
+impl Difference {
+
+    /// Compute the 'style difference' required to turn an existing style into
+    /// the given, second style.
+    ///
+    /// For example, to turn green text into green bold text, it's redundant
+    /// to write a reset command then a second green+bold command, instead of
+    /// just writing one bold command. This method should see that both styles
+    /// use the foreground colour green, and reduce it to a single command.
+    ///
+    /// This method returns an enum value because it's not actually always
+    /// possible to turn one style into another: for example, text could be
+    /// made bold and underlined, but you can't remove the bold property
+    /// without also removing the underline property. So when this has to
+    /// happen, this function returns None, meaning that the entire set of
+    /// styles should be reset and begun again.
+    pub fn between(first: &Style, next: &Style) -> Difference {
+        use self::Difference::*;
+
+        // XXX(Havvy): This algorithm is kind of hard to replicate without
+        // having the Plain/Foreground enum variants, so I'm just leaving
+        // it commented out for now, and defaulting to Reset.
+
+        if first == next {
+            return NoDifference;
+        }
+
+        // Cannot un-bold, so must Reset.
+        if first.is_bold && !next.is_bold {
+            return Reset;
+        }
+
+        if first.is_dimmed && !next.is_dimmed {
+            return Reset;
+        }
+
+        if first.is_italic && !next.is_italic {
+            return Reset;
+        }
+
+        // Cannot un-underline, so must Reset.
+        if first.is_underline && !next.is_underline {
+            return Reset;
+        }
+
+        if first.is_blink && !next.is_blink {
+            return Reset;
+        }
+
+        if first.is_reverse && !next.is_reverse {
+            return Reset;
+        }
+
+        if first.is_hidden && !next.is_hidden {
+            return Reset;
+        }
+
+        if first.is_strikethrough && !next.is_strikethrough {
+            return Reset;
+        }
+
+        // Cannot go from foreground to no foreground, so must Reset.
+        if first.foreground.is_some() && next.foreground.is_none() {
+            return Reset;
+        }
+
+        // Cannot go from background to no background, so must Reset.
+        if first.background.is_some() && next.background.is_none() {
+            return Reset;
+        }
+
+        let mut extra_styles = Style::default();
+
+        if first.is_bold != next.is_bold {
+            extra_styles.is_bold = true;
+        }
+
+        if first.is_dimmed != next.is_dimmed {
+            extra_styles.is_dimmed = true;
+        }
+
+        if first.is_italic != next.is_italic {
+            extra_styles.is_italic = true;
+        }
+
+        if first.is_underline != next.is_underline {
+            extra_styles.is_underline = true;
+        }
+
+        if first.is_blink != next.is_blink {
+            extra_styles.is_blink = true;
+        }
+
+        if first.is_reverse != next.is_reverse {
+            extra_styles.is_reverse = true;
+        }
+
+        if first.is_hidden != next.is_hidden {
+            extra_styles.is_hidden = true;
+        }
+
+        if first.is_strikethrough != next.is_strikethrough {
+            extra_styles.is_strikethrough = true;
+        }
+
+        if first.foreground != next.foreground {
+            extra_styles.foreground = next.foreground;
+        }
+
+        if first.background != next.background {
+            extra_styles.background = next.background;
+        }
+
+        ExtraStyles(extra_styles)
+    }
+}
+
+
+#[cfg(test)]
+mod test {
+    use super::*;
+    use super::Difference::*;
+    use style::Colour::*;
+    use style::Style;
+
+    fn style() -> Style {
+        Style::new()
+    }
+
+    macro_rules! test {
+        ($name: ident: $first: expr; $next: expr => $result: expr) => {
+            #[test]
+            fn $name() {
+                assert_eq!($result, Difference::between(&$first, &$next));
+            }
+        };
+    }
+
+    test!(nothing:    Green.normal(); Green.normal()  => NoDifference);
+    test!(uppercase:  Green.normal(); Green.bold()    => ExtraStyles(style().bold()));
+    test!(lowercase:  Green.bold();   Green.normal()  => Reset);
+    test!(nothing2:   Green.bold();   Green.bold()    => NoDifference);
+
+    test!(colour_change: Red.normal(); Blue.normal() => ExtraStyles(Blue.normal()));
+
+    test!(addition_of_blink:          style(); style().blink()          => ExtraStyles(style().blink()));
+    test!(addition_of_dimmed:         style(); style().dimmed()         => ExtraStyles(style().dimmed()));
+    test!(addition_of_hidden:         style(); style().hidden()         => ExtraStyles(style().hidden()));
+    test!(addition_of_reverse:        style(); style().reverse()        => ExtraStyles(style().reverse()));
+    test!(addition_of_strikethrough:  style(); style().strikethrough()  => ExtraStyles(style().strikethrough()));
+
+    test!(removal_of_strikethrough:   style().strikethrough(); style()  => Reset);
+    test!(removal_of_reverse:         style().reverse();       style()  => Reset);
+    test!(removal_of_hidden:          style().hidden();        style()  => Reset);
+    test!(removal_of_dimmed:          style().dimmed();        style()  => Reset);
+    test!(removal_of_blink:           style().blink();         style()  => Reset);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/display.rs
@@ -0,0 +1,279 @@
+use std::borrow::Cow;
+use std::fmt;
+use std::io;
+use std::ops::Deref;
+
+use ansi::RESET;
+use difference::Difference;
+use style::{Style, Colour};
+use write::AnyWrite;
+
+
+/// An ANSIGenericString includes a generic string type and a Style to
+/// display that string.  ANSIString and ANSIByteString are aliases for
+/// this type on str and [u8], respectively.
+#[derive(PartialEq, Debug)]
+pub struct ANSIGenericString<'a, S: 'a + ToOwned + ?Sized>
+where <S as ToOwned>::Owned: fmt::Debug {
+    style: Style,
+    string: Cow<'a, S>,
+}
+
+
+/// Cloning an ANSIGenericString will clone its underlying string.
+///
+/// ### Examples
+///
+/// ```
+/// use ansi_term::ANSIString;
+///
+/// let plain_string = ANSIString::from("a plain string");
+/// let clone_string = plain_string.clone();
+/// assert_eq!(clone_string, plain_string);
+/// ```
+impl<'a, S: 'a + ToOwned + ?Sized> Clone for ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug {
+    fn clone(&self) -> ANSIGenericString<'a, S> {
+        ANSIGenericString {
+            style: self.style.clone(),
+            string: self.string.clone(),
+        }
+    }
+}
+
+// You might think that the hand-written Clone impl above is the same as the
+// one that gets generated with #[derive]. But it’s not *quite* the same!
+//
+// `str` is not Clone, and the derived Clone implementation puts a Clone
+// constraint on the S type parameter (generated using --pretty=expanded):
+//
+//                  ↓_________________↓
+//     impl <'a, S: ::std::clone::Clone + 'a + ToOwned + ?Sized> ::std::clone::Clone
+//     for ANSIGenericString<'a, S> where
+//     <S as ToOwned>::Owned: fmt::Debug { ... }
+//
+// This resulted in compile errors when you tried to derive Clone on a type
+// that used it:
+//
+//     #[derive(PartialEq, Debug, Clone, Default)]
+//     pub struct TextCellContents(Vec<ANSIString<'static>>);
+//                                 ^^^^^^^^^^^^^^^^^^^^^^^^^
+//     error[E0277]: the trait `std::clone::Clone` is not implemented for `str`
+//
+// The hand-written impl above can ignore that constraint and still compile.
+
+
+
+/// An ANSI String is a string coupled with the Style to display it
+/// in a terminal.
+///
+/// Although not technically a string itself, it can be turned into
+/// one with the `to_string` method.
+///
+/// ### Examples
+///
+/// ```no_run
+/// use ansi_term::ANSIString;
+/// use ansi_term::Colour::Red;
+///
+/// let red_string = Red.paint("a red string");
+/// println!("{}", red_string);
+/// ```
+///
+/// ```
+/// use ansi_term::ANSIString;
+///
+/// let plain_string = ANSIString::from("a plain string");
+/// assert_eq!(&*plain_string, "a plain string");
+/// ```
+pub type ANSIString<'a> = ANSIGenericString<'a, str>;
+
+/// An ANSIByteString represents a formatted series of bytes.  Use
+/// ANSIByteString when styling text with an unknown encoding.
+pub type ANSIByteString<'a> = ANSIGenericString<'a, [u8]>;
+
+impl<'a, I, S: 'a + ToOwned + ?Sized> From<I> for ANSIGenericString<'a, S>
+where I: Into<Cow<'a, S>>,
+      <S as ToOwned>::Owned: fmt::Debug {
+    fn from(input: I) -> ANSIGenericString<'a, S> {
+        ANSIGenericString {
+            string: input.into(),
+            style:  Style::default(),
+        }
+    }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> Deref for ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug {
+    type Target = S;
+
+    fn deref(&self) -> &S {
+        self.string.deref()
+    }
+}
+
+
+/// A set of `ANSIGenericString`s collected together, in order to be
+/// written with a minimum of control characters.
+pub struct ANSIGenericStrings<'a, S: 'a + ToOwned + ?Sized>
+    (pub &'a [ANSIGenericString<'a, S>])
+    where <S as ToOwned>::Owned: fmt::Debug;
+
+/// A set of `ANSIString`s collected together, in order to be written with a
+/// minimum of control characters.
+pub type ANSIStrings<'a> = ANSIGenericStrings<'a, str>;
+
+/// A function to construct an ANSIStrings instance.
+#[allow(non_snake_case)]
+pub fn ANSIStrings<'a>(arg: &'a [ANSIString<'a>]) -> ANSIStrings<'a> {
+    ANSIGenericStrings(arg)
+}
+
+/// A set of `ANSIByteString`s collected together, in order to be
+/// written with a minimum of control characters.
+pub type ANSIByteStrings<'a> = ANSIGenericStrings<'a, [u8]>;
+
+/// A function to construct an ANSIByteStrings instance.
+#[allow(non_snake_case)]
+pub fn ANSIByteStrings<'a>(arg: &'a [ANSIByteString<'a>]) -> ANSIByteStrings<'a> {
+    ANSIGenericStrings(arg)
+}
+
+
+// ---- paint functions ----
+
+impl Style {
+
+    /// Paints the given text with this colour, returning an ANSI string.
+    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
+    where I: Into<Cow<'a, S>>,
+          <S as ToOwned>::Owned: fmt::Debug {
+        ANSIGenericString {
+            string: input.into(),
+            style:  self,
+        }
+    }
+}
+
+
+impl Colour {
+
+    /// Paints the given text with this colour, returning an ANSI string.
+    /// This is a short-cut so you don’t have to use `Blue.normal()` just
+    /// to get blue text.
+    ///
+    /// ```
+    /// use ansi_term::Colour::Blue;
+    /// println!("{}", Blue.paint("da ba dee"));
+    /// ```
+    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
+    where I: Into<Cow<'a, S>>,
+          <S as ToOwned>::Owned: fmt::Debug {
+        ANSIGenericString {
+            string: input.into(),
+            style:  self.normal(),
+        }
+    }
+}
+
+
+// ---- writers for individual ANSI strings ----
+
+impl<'a> fmt::Display for ANSIString<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let w: &mut fmt::Write = f;
+        self.write_to_any(w)
+    }
+}
+
+impl<'a> ANSIByteString<'a> {
+    /// Write an ANSIByteString to an io::Write.  This writes the escape
+    /// sequences for the associated Style around the bytes.
+    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
+        let w: &mut io::Write = w;
+        self.write_to_any(w)
+    }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericString<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
+    fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
+        write!(w, "{}", self.style.prefix())?;
+        w.write_str(self.string.as_ref())?;
+        write!(w, "{}", self.style.suffix())
+    }
+}
+
+
+// ---- writers for combined ANSI strings ----
+
+impl<'a> fmt::Display for ANSIStrings<'a> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        let f: &mut fmt::Write = f;
+        self.write_to_any(f)
+    }
+}
+
+impl<'a> ANSIByteStrings<'a> {
+    /// Write ANSIByteStrings to an io::Write.  This writes the minimal
+    /// escape sequences for the associated Styles around each set of
+    /// bytes.
+    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
+        let w: &mut io::Write = w;
+        self.write_to_any(w)
+    }
+}
+
+impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericStrings<'a, S>
+where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
+    fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
+        use self::Difference::*;
+
+        let first = match self.0.first() {
+            None => return Ok(()),
+            Some(f) => f,
+        };
+
+        write!(w, "{}", first.style.prefix())?;
+        w.write_str(first.string.as_ref())?;
+
+        for window in self.0.windows(2) {
+            match Difference::between(&window[0].style, &window[1].style) {
+                ExtraStyles(style) => write!(w, "{}", style.prefix())?,
+                Reset              => write!(w, "{}{}", RESET, window[1].style.prefix())?,
+                NoDifference       => {/* Do nothing! */},
+            }
+
+            w.write_str(&window[1].string)?;
+        }
+
+        // Write the final reset string after all of the ANSIStrings have been
+        // written, *except* if the last one has no styles, because it would
+        // have already been written by this point.
+        if let Some(last) = self.0.last() {
+            if !last.style.is_plain() {
+                write!(w, "{}", RESET)?;
+            }
+        }
+
+        Ok(())
+    }
+}
+
+
+// ---- tests ----
+
+#[cfg(test)]
+mod tests {
+    pub use super::super::ANSIStrings;
+    pub use style::Style;
+    pub use style::Colour::*;
+
+    #[test]
+    fn no_control_codes_for_plain() {
+        let one = Style::default().paint("one");
+        let two = Style::default().paint("two");
+        let output = format!("{}", ANSIStrings( &[ one, two ] ));
+        assert_eq!(&*output, "onetwo");
+    }
+}
--- a/third_party/rust/ansi_term/src/lib.rs
+++ b/third_party/rust/ansi_term/src/lib.rs
@@ -170,930 +170,33 @@
 #![crate_type = "rlib"]
 #![crate_type = "dylib"]
 
 #![warn(missing_copy_implementations)]
 #![warn(missing_docs)]
 #![warn(trivial_casts, trivial_numeric_casts)]
 #![warn(unused_extern_crates, unused_qualifications)]
 
-
-use std::borrow::Cow;
-use std::default::Default;
-use std::fmt;
-use std::io;
-use std::ops::Deref;
-
-use Colour::*;
-use Difference::*;
-
-trait AnyWrite {
-    type str : ?Sized;
-    type Error;
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error>;
-    fn write_str(&mut self, s: &Self::str) -> Result<(), Self::Error>;
-}
-
-impl<'a> AnyWrite for fmt::Write + 'a {
-    type str = str;
-    type Error = fmt::Error;
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
-        fmt::Write::write_fmt(self, fmt)
-    }
-    fn write_str(&mut self, s: &Self::str) -> Result<(), Self::Error> {
-        fmt::Write::write_str(self, s)
-    }
-}
-
-impl<'a> AnyWrite for io::Write + 'a {
-    type str = [u8];
-    type Error = io::Error;
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
-        io::Write::write_fmt(self, fmt)
-    }
-    fn write_str(&mut self, s: &Self::str) -> Result<(), Self::Error> {
-        io::Write::write_all(self, s)
-    }
-}
-
-/// An ANSIGenericString includes a generic string type and a Style to
-/// display that string.  ANSIString and ANSIByteString are aliases for
-/// this type on str and [u8], respectively.
-#[derive(PartialEq, Debug, Clone)]
-pub struct ANSIGenericString<'a, S: 'a + ToOwned + ?Sized>
-where <S as ToOwned>::Owned: std::fmt::Debug {
-    style: Style,
-    string: Cow<'a, S>,
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericString<'a, S>
-where <S as ToOwned>::Owned: std::fmt::Debug {
-    fn write_to_any<W: AnyWrite<str=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
-        try!(self.style.write_prefix(w));
-        try!(w.write_str(&self.string));
-        self.style.write_suffix(w)
-    }
-}
-
-/// An ANSI String is a string coupled with the Style to display it
-/// in a terminal.
-///
-/// Although not technically a string itself, it can be turned into
-/// one with the `to_string` method.
-///
-/// ### Examples
-///
-/// ```no_run
-/// use ansi_term::ANSIString;
-/// use ansi_term::Colour::Red;
-///
-/// let red_string = Red.paint("a red string");
-/// println!("{}", red_string);
-/// ```
-///
-/// ```
-/// use ansi_term::ANSIString;
-///
-/// let plain_string = ANSIString::from("a plain string");
-/// assert_eq!(&*plain_string, "a plain string");
-/// ```
-pub type ANSIString<'a> = ANSIGenericString<'a, str>;
-
-/// An ANSIByteString represents a formatted series of bytes.  Use
-/// ANSIByteString when styling text with an unknown encoding.
-pub type ANSIByteString<'a> = ANSIGenericString<'a, [u8]>;
-
-/// Like `ANSIString`, but only displays the style prefix.
-#[derive(Clone, Copy, Debug)]
-pub struct Prefix(Style);
-
-/// Like `ANSIString`, but only displays the style suffix.
-#[derive(Clone, Copy, Debug)]
-pub struct Suffix(Style);
-
-/// Like `ANSIString`, but only displays the difference between two
-/// styles.
-#[derive(Clone, Copy, Debug)]
-pub struct Infix(Style, Style);
-
-impl<'a> fmt::Display for ANSIString<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let w: &mut fmt::Write = f;
-        self.write_to_any(w)
-    }
-}
-
-impl<'a> ANSIByteString<'a> {
-    /// Write an ANSIByteString to an io::Write.  This writes the escape
-    /// sequences for the associated Style around the bytes.
-    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
-        let w: &mut io::Write = w;
-        self.write_to_any(w)
-    }
-}
+mod ansi;
+pub use ansi::{Prefix, Infix, Suffix};
 
-
-impl<'a, I, S: 'a + ToOwned + ?Sized> From<I> for ANSIGenericString<'a, S>
-where I: Into<Cow<'a, S>>,
-      <S as ToOwned>::Owned: std::fmt::Debug {
-    fn from(input: I) -> ANSIGenericString<'a, S> {
-        ANSIGenericString {
-            string: input.into(),
-            style:  Style::default(),
-        }
-    }
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> Deref for ANSIGenericString<'a, S>
-where <S as ToOwned>::Owned: std::fmt::Debug {
-    type Target = S;
-
-    fn deref(&self) -> &S {
-        self.string.deref()
-    }
-}
-
-
-impl fmt::Display for Prefix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        try!(self.0.write_prefix(f));
-        Ok(())
-    }
-}
-
-impl fmt::Display for Suffix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        try!(self.0.write_suffix(f));
-        Ok(())
-    }
-}
-
-impl fmt::Display for Infix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self.0.difference(&self.1) {
-            ExtraStyles(style) => {
-                let f: &mut fmt::Write = f;
-                try!(style.write_prefix(f))
-            },
-            Reset => {
-                let f: &mut fmt::Write = f;
-                try!(f.write_str("\x1B[0m"));
-                try!(self.0.write_prefix(f));
-            },
-            NoDifference => { /* Do nothing! */ },
-        }
-        Ok(())
-    }
-}
-
-
-/// A colour is one specific type of ANSI escape code, and can refer
-/// to either the foreground or background colour.
-///
-/// These use the standard numeric sequences.
-/// See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
-#[derive(PartialEq, Clone, Copy, Debug)]
-pub enum Colour {
-
-    /// Colour #0 (foreground code `30`, background code `40`).
-    ///
-    /// This is not necessarily the background colour, and using it as one may
-    /// render the text hard to read on terminals with dark backgrounds.
-    Black,
-
-    /// Colour #1 (foreground code `31`, background code `41`).
-    Red,
-
-    /// Colour #2 (foreground code `32`, background code `42`).
-    Green,
-
-    /// Colour #3 (foreground code `33`, background code `43`).
-    Yellow,
-
-    /// Colour #4 (foreground code `34`, background code `44`).
-    Blue,
-
-    /// Colour #5 (foreground code `35`, background code `45`).
-    Purple,
-
-    /// Colour #6 (foreground code `36`, background code `46`).
-    Cyan,
-
-    /// Colour #7 (foreground code `37`, background code `47`).
-    ///
-    /// As above, this is not necessarily the foreground colour, and may be
-    /// hard to read on terminals with light backgrounds.
-    White,
-
-    /// A colour number from 0 to 255, for use in 256-colour terminal
-    /// environments.
-    ///
-    /// - Colours 0 to 7 are the `Black` to `White` variants respectively.
-    ///   These colours can usually be changed in the terminal emulator.
-    /// - Colours 8 to 15 are brighter versions of the eight colours above.
-    ///   These can also usually be changed in the terminal emulator, or it
-    ///   could be configured to use the original colours and show the text in
-    ///   bold instead. It varies depending on the program.
-    /// - Colours 16 to 231 contain several palettes of bright colours,
-    ///   arranged in six squares measuring six by six each.
-    /// - Colours 232 to 255 are shades of grey from black to white.
-    ///
-    /// It might make more sense to look at a [colour chart][cc].
-    /// [cc]: https://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg
-    Fixed(u8),
-
-    /// A 24-bit RGB color, as specified by ISO-8613-3.
-    RGB(u8, u8, u8),
-}
+mod style;
+pub use style::{Colour, Style};
 
 /// Color is a type alias for Colour for those who can't be bothered.
 pub use Colour as Color;
 
 // I'm not beyond calling Colour Colour, rather than Color, but I did
 // purposefully name this crate 'ansi-term' so people wouldn't get
 // confused when they tried to install it.
 //
 // Only *after* they'd installed it.
 
-impl Colour {
-    fn write_foreground_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        match *self {
-            Black      => write!(f, "30"),
-            Red        => write!(f, "31"),
-            Green      => write!(f, "32"),
-            Yellow     => write!(f, "33"),
-            Blue       => write!(f, "34"),
-            Purple     => write!(f, "35"),
-            Cyan       => write!(f, "36"),
-            White      => write!(f, "37"),
-            Fixed(num) => write!(f, "38;5;{}", &num),
-            RGB(r,g,b) => write!(f, "38;2;{};{};{}", &r, &g, &b),
-        }
-    }
-
-    fn write_background_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        match *self {
-            Black      => write!(f, "40"),
-            Red        => write!(f, "41"),
-            Green      => write!(f, "42"),
-            Yellow     => write!(f, "43"),
-            Blue       => write!(f, "44"),
-            Purple     => write!(f, "45"),
-            Cyan       => write!(f, "46"),
-            White      => write!(f, "47"),
-            Fixed(num) => write!(f, "48;5;{}", &num),
-            RGB(r,g,b) => write!(f, "48;2;{};{};{}", &r, &g, &b),
-        }
-    }
-
-    /// Return a Style with the foreground colour set to this colour.
-    pub fn normal(self) -> Style {
-        Style { foreground: Some(self), .. Style::default() }
-    }
-
-    /// Paints the given text with this colour, returning an ANSI string.
-    /// This is a short-cut so you don't have to use Blue.normal() just
-    /// to get blue text.
-    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
-    where I: Into<Cow<'a, S>>,
-          <S as ToOwned>::Owned: std::fmt::Debug {
-        ANSIGenericString {
-            string: input.into(),
-            style:  self.normal(),
-        }
-    }
-
-    /// The prefix for this colour.
-    pub fn prefix(self) -> Prefix {
-        Prefix(self.normal())
-    }
-
-    /// The suffix for this colour.
-    pub fn suffix(self) -> Suffix {
-        Suffix(self.normal())
-    }
-
-    /// The infix between this colour and another.
-    pub fn infix(self, other: Colour) -> Infix {
-        Infix(self.normal(), other.normal())
-    }
-
-    /// Returns a Style with the bold property set.
-    pub fn bold(self) -> Style {
-        Style { foreground: Some(self), is_bold: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the dimmed property set.
-    pub fn dimmed(self) -> Style {
-        Style { foreground: Some(self), is_dimmed: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the italic property set.
-    pub fn italic(self) -> Style {
-        Style { foreground: Some(self), is_italic: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the underline property set.
-    pub fn underline(self) -> Style {
-        Style { foreground: Some(self), is_underline: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the blink property set.
-    pub fn blink(self) -> Style {
-        Style { foreground: Some(self), is_blink: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the reverse property set.
-    pub fn reverse(self) -> Style {
-        Style { foreground: Some(self), is_reverse: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the hidden property set.
-    pub fn hidden(self) -> Style {
-        Style { foreground: Some(self), is_hidden: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the strikethrough property set.
-    pub fn strikethrough(self) -> Style {
-        Style { foreground: Some(self), is_strikethrough: true, .. Style::default() }
-    }
-
-    /// Returns a Style with the background colour property set.
-    pub fn on(self, background: Colour) -> Style {
-        Style { foreground: Some(self), background: Some(background), .. Style::default() }
-    }
-}
-
-/// A style is a collection of properties that can format a string
-/// using ANSI escape codes.
-#[derive(PartialEq, Clone, Copy, Debug)]
-pub struct Style {
-    foreground: Option<Colour>,
-    background: Option<Colour>,
-    is_bold: bool,
-    is_dimmed: bool,
-    is_italic: bool,
-    is_underline: bool,
-    is_blink: bool,
-    is_reverse: bool,
-    is_hidden: bool,
-    is_strikethrough: bool
-}
-
-impl Style {
-    /// Creates a new Style with no differences.
-    pub fn new() -> Style {
-        Style::default()
-    }
-
-    /// Paints the given text with this colour, returning an ANSI string.
-    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
-    where I: Into<Cow<'a, S>>,
-          <S as ToOwned>::Owned: std::fmt::Debug {
-        ANSIGenericString {
-            string: input.into(),
-            style:  self,
-        }
-    }
-
-    /// The prefix for this style.
-    pub fn prefix(self) -> Prefix {
-        Prefix(self)
-    }
-
-    /// The suffix for this style.
-    pub fn suffix(self) -> Suffix {
-        Suffix(self)
-    }
-
-    /// The infix between this style and another.
-    pub fn infix(self, other: Style) -> Infix {
-        Infix(self, other)
-    }
-
-    /// Returns a Style with the bold property set.
-    pub fn bold(&self) -> Style {
-        Style { is_bold: true, .. *self }
-    }
-
-    /// Returns a Style with the dimmed property set.
-    pub fn dimmed(&self) -> Style {
-        Style { is_dimmed: true, .. *self }
-    }
-
-    /// Returns a Style with the italic property set.
-    pub fn italic(&self) -> Style {
-        Style { is_italic: true, .. *self }
-    }
-
-    /// Returns a Style with the underline property set.
-    pub fn underline(&self) -> Style {
-        Style { is_underline: true, .. *self }
-    }
-
-    /// Returns a Style with the blink property set.
-    pub fn blink(&self) -> Style {
-        Style { is_blink: true, .. *self }
-    }
-
-    /// Returns a Style with the reverse property set.
-    pub fn reverse(&self) -> Style {
-        Style { is_reverse: true, .. *self }
-    }
-
-    /// Returns a Style with the hidden property set.
-    pub fn hidden(&self) -> Style {
-        Style { is_hidden: true, .. *self }
-    }
-
-    /// Returns a Style with the hidden property set.
-    pub fn strikethrough(&self) -> Style {
-        Style { is_strikethrough: true, .. *self }
-    }
-
-    /// Returns a Style with the foreground colour property set.
-    pub fn fg(&self, foreground: Colour) -> Style {
-        Style { foreground: Some(foreground), .. *self }
-    }
-
-    /// Returns a Style with the background colour property set.
-    pub fn on(&self, background: Colour) -> Style {
-        Style { background: Some(background), .. *self }
-    }
-
-    /// Write any ANSI codes that go *before* a piece of text. These should be
-    /// the codes to set the terminal to a different colour or font style.
-    fn write_prefix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        // If there are actually no styles here, then don’t write *any* codes
-        // as the prefix. An empty ANSI code may not affect the terminal
-        // output at all, but a user may just want a code-free string.
-        if self.is_plain() {
-            return Ok(());
-        }
-
-        // Write the codes’ prefix, then write numbers, separated by
-        // semicolons, for each text style we want to apply.
-        try!(write!(f, "\x1B["));
-        let mut written_anything = false;
-
-        {
-            let mut write_char = |c| {
-                if written_anything { try!(write!(f, ";")); }
-                written_anything = true;
-                try!(write!(f, "{}", c));
-                Ok(())
-            };
-
-            if self.is_bold           { try!(write_char('1')); }
-            if self.is_dimmed         { try!(write_char('2')); }
-            if self.is_italic         { try!(write_char('3')); }
-            if self.is_underline      { try!(write_char('4')); }
-            if self.is_blink          { try!(write_char('5')); }
-            if self.is_reverse        { try!(write_char('7')); }
-            if self.is_hidden         { try!(write_char('8')); }
-            if self.is_strikethrough  { try!(write_char('9')); }
-        }
-
-        // The foreground and background colours, if specified, need to be
-        // handled specially because the number codes are more complicated.
-        // (see `write_background_code` and `write_foreground_code`)
-        if let Some(bg) = self.background {
-            if written_anything { try!(write!(f, ";")); }
-            written_anything = true;
-
-            try!(bg.write_background_code(f));
-        }
-
-        if let Some(fg) = self.foreground {
-            if written_anything { try!(write!(f, ";")); }
-
-            try!(fg.write_foreground_code(f));
-        }
-
-        // All the codes end with an `m`, because reasons.
-        try!(write!(f, "m"));
-        Ok(())
-    }
-
-    /// Write any ANSI codes that go *after* a piece of text. These should be
-    /// the codes to *reset* the terminal back to its normal colour and style.
-    fn write_suffix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        if self.is_plain() {
-            Ok(())
-        }
-        else {
-            write!(f, "\x1B[0m")
-        }
-    }
-
-    /// Compute the 'style difference' required to turn an existing style into
-    /// the given, second style.
-    ///
-    /// For example, to turn green text into green bold text, it's redundant
-    /// to write a reset command then a second green+bold command, instead of
-    /// just writing one bold command. This method should see that both styles
-    /// use the foreground colour green, and reduce it to a single command.
-    ///
-    /// This method returns an enum value because it's not actually always
-    /// possible to turn one style into another: for example, text could be
-    /// made bold and underlined, but you can't remove the bold property
-    /// without also removing the underline property. So when this has to
-    /// happen, this function returns None, meaning that the entire set of
-    /// styles should be reset and begun again.
-    fn difference(&self, next: &Style) -> Difference {
-        // XXX(Havvy): This algorithm is kind of hard to replicate without
-        // having the Plain/Foreground enum variants, so I'm just leaving
-        // it commented out for now, and defaulting to Reset.
-
-        if self == next {
-            return NoDifference;
-        }
-
-        // Cannot un-bold, so must Reset.
-        if self.is_bold && !next.is_bold {
-            return Reset;
-        }
-
-        if self.is_dimmed && !next.is_dimmed {
-            return Reset;
-        }
-
-        if self.is_italic && !next.is_italic {
-            return Reset;
-        }
-
-        // Cannot un-underline, so must Reset.
-        if self.is_underline && !next.is_underline {
-            return Reset;
-        }
-
-        if self.is_blink && !next.is_blink {
-            return Reset;
-        }
-
-        if self.is_reverse && !next.is_reverse {
-            return Reset;
-        }
-
-        if self.is_hidden && !next.is_hidden {
-            return Reset;
-        }
-
-        if self.is_strikethrough && !next.is_strikethrough {
-            return Reset;
-        }
-
-        // Cannot go from foreground to no foreground, so must Reset.
-        if self.foreground.is_some() && next.foreground.is_none() {
-            return Reset;
-        }
-
-        // Cannot go from background to no background, so must Reset.
-        if self.background.is_some() && next.background.is_none() {
-            return Reset;
-        }
-
-        let mut extra_styles = Style::default();
+mod difference;
+mod display;
+pub use display::*;
 
-        if self.is_bold != next.is_bold {
-            extra_styles.is_bold = true;
-        }
-
-        if self.is_dimmed != next.is_dimmed {
-            extra_styles.is_dimmed = true;
-        }
-
-        if self.is_italic != next.is_italic {
-            extra_styles.is_italic = true;
-        }
-
-        if self.is_underline != next.is_underline {
-            extra_styles.is_underline = true;
-        }
-
-        if self.is_blink != next.is_blink {
-            extra_styles.is_blink = true;
-        }
-
-        if self.is_reverse != next.is_reverse {
-            extra_styles.is_reverse = true;
-        }
-
-        if self.is_hidden != next.is_hidden {
-            extra_styles.is_hidden = true;
-        }
-
-        if self.is_strikethrough != next.is_strikethrough {
-            extra_styles.is_strikethrough = true;
-        }
-
-        if self.foreground != next.foreground {
-            extra_styles.foreground = next.foreground;
-        }
-
-        if self.background != next.background {
-            extra_styles.background = next.background;
-        }
-
-        ExtraStyles(extra_styles)
-    }
-
-    /// Return true if this `Style` has no actual styles, and can be written
-    /// without any control characters.
-    fn is_plain(self) -> bool {
-        self == Style::default()
-    }
-}
-
-impl Default for Style {
-    fn default() -> Style {
-        Style {
-            foreground: None,
-            background: None,
-            is_bold: false,
-            is_dimmed: false,
-            is_italic: false,
-            is_underline: false,
-            is_blink: false,
-            is_reverse: false,
-            is_hidden: false,
-            is_strikethrough: false,
-        }
-    }
-}
-
-/// When printing out one coloured string followed by another, use one of
-/// these rules to figure out which *extra* control codes need to be sent.
-#[derive(PartialEq, Clone, Copy, Debug)]
-enum Difference {
-
-    /// Print out the control codes specified by this style to end up looking
-    /// like the second string's styles.
-    ExtraStyles(Style),
-
-    /// Converting between these two is impossible, so just send a reset
-    /// command and then the second string's styles.
-    Reset,
-
-    /// The before style is exactly the same as the after style, so no further
-    /// control codes need to be printed.
-    NoDifference,
-}
-
-/// A set of `ANSIGenericString`s collected together, in order to be
-/// written with a minimum of control characters.
-pub struct ANSIGenericStrings<'a, S: 'a + ToOwned + ?Sized>
-    (pub &'a [ANSIGenericString<'a, S>])
-    where <S as ToOwned>::Owned: std::fmt::Debug;
-
-/// A set of `ANSIString`s collected together, in order to be written with a
-/// minimum of control characters.
-pub type ANSIStrings<'a> = ANSIGenericStrings<'a, str>;
-
-/// A function to construct an ANSIStrings instance.
-#[allow(non_snake_case)]
-pub fn ANSIStrings<'a>(arg: &'a [ANSIString<'a>]) -> ANSIStrings<'a> {
-    ANSIGenericStrings(arg)
-}
-
-/// A set of `ANSIByteString`s collected together, in order to be
-/// written with a minimum of control characters.
-pub type ANSIByteStrings<'a> = ANSIGenericStrings<'a, [u8]>;
-
-/// A function to construct an ANSIByteStrings instance.
-#[allow(non_snake_case)]
-pub fn ANSIByteStrings<'a>(arg: &'a [ANSIByteString<'a>]) -> ANSIByteStrings<'a> {
-    ANSIGenericStrings(arg)
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericStrings<'a, S>
-where <S as ToOwned>::Owned: std::fmt::Debug {
-    fn write_to_any<W: AnyWrite<str=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
-        let first = match self.0.first() {
-            None => return Ok(()),
-            Some(f) => f,
-        };
-
-        try!(first.style.write_prefix(w));
-        try!(w.write_str(&first.string));
-
-        for window in self.0.windows(2) {
-            match window[0].style.difference(&window[1].style) {
-                ExtraStyles(style) => try!(style.write_prefix(w)),
-                Reset => {
-                    try!(write!(w, "\x1B[0m"));
-                    try!(window[1].style.write_prefix(w));
-                },
-                NoDifference => { /* Do nothing! */ },
-            }
-
-            try!(w.write_str(&window[1].string));
-        }
-
-        // Write the final reset string after all of the ANSIStrings have been
-        // written, *except* if the last one has no styles, because it would
-        // have already been written by this point.
-        if let Some(last) = self.0.last() {
-            if !last.style.is_plain() {
-                try!(write!(w, "\x1B[0m"));
-            }
-        }
-
-        Ok(())
-    }
-}
-
-impl<'a> fmt::Display for ANSIStrings<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        self.write_to_any(f)
-    }
-}
-
-impl<'a> ANSIByteStrings<'a> {
-    /// Write ANSIByteStrings to an io::Write.  This writes the minimal
-    /// escape sequences for the associated Styles around each set of
-    /// bytes.
-    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
-        let w: &mut io::Write = w;
-        self.write_to_any(w)
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    pub use super::{Style, ANSIStrings};
-    pub use super::Colour::*;
+mod write;
 
-    macro_rules! test {
-        ($name: ident: $style: expr; $input: expr => $result: expr) => {
-            #[test]
-            fn $name() {
-                assert_eq!($style.paint($input).to_string(), $result.to_string());
-
-                let mut v = Vec::new();
-                $style.paint($input.as_bytes()).write_to(&mut v).unwrap();
-                assert_eq!(v.as_slice(), $result.as_bytes());
-            }
-        };
-    }
-
-    test!(plain:                 Style::default();                  "text/plain" => "text/plain");
-    test!(red:                   Red;                               "hi" => "\x1B[31mhi\x1B[0m");
-    test!(black:                 Black.normal();                    "hi" => "\x1B[30mhi\x1B[0m");
-    test!(yellow_bold:           Yellow.bold();                     "hi" => "\x1B[1;33mhi\x1B[0m");
-    test!(yellow_bold_2:         Yellow.normal().bold();            "hi" => "\x1B[1;33mhi\x1B[0m");
-    test!(blue_underline:        Blue.underline();                  "hi" => "\x1B[4;34mhi\x1B[0m");
-    test!(green_bold_ul:         Green.bold().underline();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
-    test!(green_bold_ul_2:       Green.underline().bold();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
-    test!(purple_on_white:       Purple.on(White);                  "hi" => "\x1B[47;35mhi\x1B[0m");
-    test!(purple_on_white_2:     Purple.normal().on(White);         "hi" => "\x1B[47;35mhi\x1B[0m");
-    test!(yellow_on_blue:        Style::new().on(Blue).fg(Yellow);  "hi" => "\x1B[44;33mhi\x1B[0m");
-    test!(yellow_on_blue_2:      Cyan.on(Blue).fg(Yellow);          "hi" => "\x1B[44;33mhi\x1B[0m");
-    test!(cyan_bold_on_white:    Cyan.bold().on(White);             "hi" => "\x1B[1;47;36mhi\x1B[0m");
-    test!(cyan_ul_on_white:      Cyan.underline().on(White);        "hi" => "\x1B[4;47;36mhi\x1B[0m");
-    test!(cyan_bold_ul_on_white: Cyan.bold().underline().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
-    test!(cyan_ul_bold_on_white: Cyan.underline().bold().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
-    test!(fixed:                 Fixed(100);                        "hi" => "\x1B[38;5;100mhi\x1B[0m");
-    test!(fixed_on_purple:       Fixed(100).on(Purple);             "hi" => "\x1B[45;38;5;100mhi\x1B[0m");
-    test!(fixed_on_fixed:        Fixed(100).on(Fixed(200));         "hi" => "\x1B[48;5;200;38;5;100mhi\x1B[0m");
-    test!(rgb:                   RGB(70,130,180);                   "hi" => "\x1B[38;2;70;130;180mhi\x1B[0m");
-    test!(rgb_on_blue:           RGB(70,130,180).on(Blue);          "hi" => "\x1B[44;38;2;70;130;180mhi\x1B[0m");
-    test!(blue_on_rgb:           Blue.on(RGB(70,130,180));          "hi" => "\x1B[48;2;70;130;180;34mhi\x1B[0m");
-    test!(rgb_on_rgb:            RGB(70,130,180).on(RGB(5,10,15));  "hi" => "\x1B[48;2;5;10;15;38;2;70;130;180mhi\x1B[0m");
-    test!(bold:                  Style::new().bold();               "hi" => "\x1B[1mhi\x1B[0m");
-    test!(underline:             Style::new().underline();          "hi" => "\x1B[4mhi\x1B[0m");
-    test!(bunderline:            Style::new().bold().underline();   "hi" => "\x1B[1;4mhi\x1B[0m");
-    test!(dimmed:                Style::new().dimmed();             "hi" => "\x1B[2mhi\x1B[0m");
-    test!(italic:                Style::new().italic();             "hi" => "\x1B[3mhi\x1B[0m");
-    test!(blink:                 Style::new().blink();              "hi" => "\x1B[5mhi\x1B[0m");
-    test!(reverse:               Style::new().reverse();            "hi" => "\x1B[7mhi\x1B[0m");
-    test!(hidden:                Style::new().hidden();             "hi" => "\x1B[8mhi\x1B[0m");
-    test!(stricken:              Style::new().strikethrough();      "hi" => "\x1B[9mhi\x1B[0m");
-
-    mod difference {
-        use super::*;
-        use super::super::Difference::*;
-
-        #[test]
-        fn diff() {
-            let expected = ExtraStyles(Style::new().bold());
-            let got = Green.normal().difference(&Green.bold());
-            assert_eq!(expected, got)
-        }
-
-        #[test]
-        fn dlb() {
-            let got = Green.bold().difference(&Green.normal());
-            assert_eq!(Reset, got)
-        }
-
-        #[test]
-        fn nothing() {
-            assert_eq!(NoDifference, Green.bold().difference(&Green.bold()));
-        }
-
-        #[test]
-        fn nothing_2() {
-            assert_eq!(NoDifference, Green.normal().difference(&Green.normal()));
-        }
-
-        #[test]
-        fn colour_change() {
-            assert_eq!(ExtraStyles(Blue.normal()), Red.normal().difference(&Blue.normal()))
-        }
-
-        #[test]
-        fn removal_of_dimmed() {
-            let dimmed = Style::new().dimmed();
-            let normal = Style::default();
-
-            assert_eq!(Reset, dimmed.difference(&normal));
-        }
+mod windows;
+pub use windows::*;
 
-        #[test]
-        fn addition_of_dimmed() {
-            let dimmed = Style::new().dimmed();
-            let normal = Style::default();
-            let extra_styles = ExtraStyles(dimmed);
-
-            assert_eq!(extra_styles, normal.difference(&dimmed));
-        }
-
-        #[test]
-        fn removal_of_blink() {
-            let blink = Style::new().blink();
-            let normal = Style::default();
-
-            assert_eq!(Reset, blink.difference(&normal));
-        }
-
-        #[test]
-        fn addition_of_blink() {
-            let blink = Style::new().blink();
-            let normal = Style::default();
-            let extra_styles = ExtraStyles(blink);
-
-            assert_eq!(extra_styles, normal.difference(&blink));
-        }
-
-        #[test]
-        fn removal_of_reverse() {
-            let reverse = Style::new().reverse();
-            let normal = Style::default();
-
-            assert_eq!(Reset, reverse.difference(&normal));
-        }
-
-        #[test]
-        fn addition_of_reverse() {
-            let reverse = Style::new().reverse();
-            let normal = Style::default();
-            let extra_styles = ExtraStyles(reverse);
-
-            assert_eq!(extra_styles, normal.difference(&reverse));
-        }
-
-        #[test]
-        fn removal_of_hidden() {
-            let hidden = Style::new().hidden();
-            let normal = Style::default();
-
-            assert_eq!(Reset, hidden.difference(&normal));
-        }
-
-        #[test]
-        fn addition_of_hidden() {
-            let hidden = Style::new().hidden();
-            let normal = Style::default();
-            let extra_styles = ExtraStyles(hidden);
-
-            assert_eq!(extra_styles, normal.difference(&hidden));
-        }
-
-        #[test]
-        fn removal_of_strikethrough() {
-            let strikethrough = Style::new().strikethrough();
-            let normal = Style::default();
-
-            assert_eq!(Reset, strikethrough.difference(&normal));
-        }
-
-        #[test]
-        fn addition_of_strikethrough() {
-            let strikethrough = Style::new().strikethrough();
-            let normal = Style::default();
-            let extra_styles = ExtraStyles(strikethrough);
-
-            assert_eq!(extra_styles, normal.difference(&strikethrough));
-        }
-
-        #[test]
-        fn no_control_codes_for_plain() {
-            let one = Style::default().paint("one");
-            let two = Style::default().paint("two");
-            let output = format!("{}", ANSIStrings( &[ one, two ] ));
-            assert_eq!(&*output, "onetwo");
-        }
-    }
-}
+mod debug;
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/style.rs
@@ -0,0 +1,258 @@
+/// A style is a collection of properties that can format a string
+/// using ANSI escape codes.
+#[derive(PartialEq, Clone, Copy)]
+pub struct Style {
+
+    /// The style's foreground colour, if it has one.
+    pub foreground: Option<Colour>,
+
+    /// The style's background colour, if it has one.
+    pub background: Option<Colour>,
+
+    /// Whether this style is bold.
+    pub is_bold: bool,
+
+    /// Whether this style is dimmed.
+    pub is_dimmed: bool,
+
+    /// Whether this style is italic.
+    pub is_italic: bool,
+
+    /// Whether this style is underlined.
+    pub is_underline: bool,
+
+    /// Whether this style is blinking.
+    pub is_blink: bool,
+
+    /// Whether this style has reverse colours.
+    pub is_reverse: bool,
+
+    /// Whether this style is hidden.
+    pub is_hidden: bool,
+
+    /// Whether this style is struckthrough.
+    pub is_strikethrough: bool
+}
+
+impl Style {
+    /// Creates a new Style with no differences.
+    pub fn new() -> Style {
+        Style::default()
+    }
+
+    /// Returns a Style with the bold property set.
+    pub fn bold(&self) -> Style {
+        Style { is_bold: true, .. *self }
+    }
+
+    /// Returns a Style with the dimmed property set.
+    pub fn dimmed(&self) -> Style {
+        Style { is_dimmed: true, .. *self }
+    }
+
+    /// Returns a Style with the italic property set.
+    pub fn italic(&self) -> Style {
+        Style { is_italic: true, .. *self }
+    }
+
+    /// Returns a Style with the underline property set.
+    pub fn underline(&self) -> Style {
+        Style { is_underline: true, .. *self }
+    }
+
+    /// Returns a Style with the blink property set.
+    pub fn blink(&self) -> Style {
+        Style { is_blink: true, .. *self }
+    }
+
+    /// Returns a Style with the reverse property set.
+    pub fn reverse(&self) -> Style {
+        Style { is_reverse: true, .. *self }
+    }
+
+    /// Returns a Style with the hidden property set.
+    pub fn hidden(&self) -> Style {
+        Style { is_hidden: true, .. *self }
+    }
+
+    /// Returns a Style with the hidden property set.
+    pub fn strikethrough(&self) -> Style {
+        Style { is_strikethrough: true, .. *self }
+    }
+
+    /// Returns a Style with the foreground colour property set.
+    pub fn fg(&self, foreground: Colour) -> Style {
+        Style { foreground: Some(foreground), .. *self }
+    }
+
+    /// Returns a Style with the background colour property set.
+    pub fn on(&self, background: Colour) -> Style {
+        Style { background: Some(background), .. *self }
+    }
+
+    /// Return true if this `Style` has no actual styles, and can be written
+    /// without any control characters.
+    pub fn is_plain(self) -> bool {
+        self == Style::default()
+    }
+}
+
+impl Default for Style {
+
+    /// Returns a style with *no* properties set. Formatting text using this
+    /// style returns the exact same text.
+    ///
+    /// ```
+    /// use ansi_term::Style;
+    /// assert_eq!(None,  Style::default().foreground);
+    /// assert_eq!(None,  Style::default().background);
+    /// assert_eq!(false, Style::default().is_bold);
+    /// assert_eq!("txt", Style::default().paint("txt").to_string());
+    /// ```
+    fn default() -> Style {
+        Style {
+            foreground: None,
+            background: None,
+            is_bold: false,
+            is_dimmed: false,
+            is_italic: false,
+            is_underline: false,
+            is_blink: false,
+            is_reverse: false,
+            is_hidden: false,
+            is_strikethrough: false,
+        }
+    }
+}
+
+
+// ---- colours ----
+
+/// A colour is one specific type of ANSI escape code, and can refer
+/// to either the foreground or background colour.
+///
+/// These use the standard numeric sequences.
+/// See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
+#[derive(PartialEq, Clone, Copy, Debug)]
+pub enum Colour {
+
+    /// Colour #0 (foreground code `30`, background code `40`).
+    ///
+    /// This is not necessarily the background colour, and using it as one may
+    /// render the text hard to read on terminals with dark backgrounds.
+    Black,
+
+    /// Colour #1 (foreground code `31`, background code `41`).
+    Red,
+
+    /// Colour #2 (foreground code `32`, background code `42`).
+    Green,
+
+    /// Colour #3 (foreground code `33`, background code `43`).
+    Yellow,
+
+    /// Colour #4 (foreground code `34`, background code `44`).
+    Blue,
+
+    /// Colour #5 (foreground code `35`, background code `45`).
+    Purple,
+
+    /// Colour #6 (foreground code `36`, background code `46`).
+    Cyan,
+
+    /// Colour #7 (foreground code `37`, background code `47`).
+    ///
+    /// As above, this is not necessarily the foreground colour, and may be
+    /// hard to read on terminals with light backgrounds.
+    White,
+
+    /// A colour number from 0 to 255, for use in 256-colour terminal
+    /// environments.
+    ///
+    /// - Colours 0 to 7 are the `Black` to `White` variants respectively.
+    ///   These colours can usually be changed in the terminal emulator.
+    /// - Colours 8 to 15 are brighter versions of the eight colours above.
+    ///   These can also usually be changed in the terminal emulator, or it
+    ///   could be configured to use the original colours and show the text in
+    ///   bold instead. It varies depending on the program.
+    /// - Colours 16 to 231 contain several palettes of bright colours,
+    ///   arranged in six squares measuring six by six each.
+    /// - Colours 232 to 255 are shades of grey from black to white.
+    ///
+    /// It might make more sense to look at a [colour chart][cc].
+    /// [cc]: https://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg
+    Fixed(u8),
+
+    /// A 24-bit RGB color, as specified by ISO-8613-3.
+    RGB(u8, u8, u8),
+}
+
+
+impl Colour {
+    /// Return a Style with the foreground colour set to this colour.
+    pub fn normal(self) -> Style {
+        Style { foreground: Some(self), .. Style::default() }
+    }
+
+    /// Returns a Style with the bold property set.
+    pub fn bold(self) -> Style {
+        Style { foreground: Some(self), is_bold: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the dimmed property set.
+    pub fn dimmed(self) -> Style {
+        Style { foreground: Some(self), is_dimmed: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the italic property set.
+    pub fn italic(self) -> Style {
+        Style { foreground: Some(self), is_italic: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the underline property set.
+    pub fn underline(self) -> Style {
+        Style { foreground: Some(self), is_underline: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the blink property set.
+    pub fn blink(self) -> Style {
+        Style { foreground: Some(self), is_blink: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the reverse property set.
+    pub fn reverse(self) -> Style {
+        Style { foreground: Some(self), is_reverse: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the hidden property set.
+    pub fn hidden(self) -> Style {
+        Style { foreground: Some(self), is_hidden: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the strikethrough property set.
+    pub fn strikethrough(self) -> Style {
+        Style { foreground: Some(self), is_strikethrough: true, .. Style::default() }
+    }
+
+    /// Returns a Style with the background colour property set.
+    pub fn on(self, background: Colour) -> Style {
+        Style { foreground: Some(self), background: Some(background), .. Style::default() }
+    }
+}
+
+impl From<Colour> for Style {
+
+    /// You can turn a `Colour` into a `Style` with the foreground colour set
+    /// with the `From` trait.
+    ///
+    /// ```
+    /// use ansi_term::{Style, Colour};
+    /// let green_foreground = Style::default().fg(Colour::Green);
+    /// assert_eq!(green_foreground, Colour::Green.normal());
+    /// assert_eq!(green_foreground, Colour::Green.into());
+    /// assert_eq!(green_foreground, Style::from(Colour::Green));
+    /// ```
+    fn from(colour: Colour) -> Style {
+        colour.normal()
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/windows.rs
@@ -0,0 +1,35 @@
+/// Enables ANSI code support on Windows 10.
+///
+/// This uses Windows API calls to alter the properties of the console that
+/// the program is running in.
+///
+/// https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
+///
+/// Returns a `Result` with the Windows error code if unsuccessful.
+#[cfg(windows)]
+pub fn enable_ansi_support() -> Result<(), u64> {
+
+    #[link(name = "kernel32")]
+    extern {
+        fn GetStdHandle(handle: u64) -> *const i32;
+        fn SetConsoleMode(handle: *const i32, mode: u32) -> bool;
+        fn GetLastError() -> u64;
+    }
+
+    unsafe {
+        const STD_OUT_HANDLE: u64 = -11i32 as u64;
+        const ENABLE_ANSI_CODES: u32 = 7;
+
+        // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683231(v=vs.85).aspx
+        let std_out_handle = GetStdHandle(STD_OUT_HANDLE);
+        let error_code = GetLastError();
+        if error_code != 0 { return Err(error_code); }
+
+        // https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx
+        SetConsoleMode(std_out_handle, ENABLE_ANSI_CODES);
+        let error_code = GetLastError();
+        if error_code != 0 { return Err(error_code); }
+    }
+
+    return Ok(());
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/ansi_term/src/write.rs
@@ -0,0 +1,40 @@
+use std::fmt;
+use std::io;
+
+
+pub trait AnyWrite {
+    type wstr: ?Sized;
+    type Error;
+
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error>;
+
+    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error>;
+}
+
+
+impl<'a> AnyWrite for fmt::Write + 'a {
+    type wstr = str;
+    type Error = fmt::Error;
+
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
+        fmt::Write::write_fmt(self, fmt)
+    }
+
+    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
+        fmt::Write::write_str(self, s)
+    }
+}
+
+
+impl<'a> AnyWrite for io::Write + 'a {
+    type wstr = [u8];
+    type Error = io::Error;
+
+    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
+        io::Write::write_fmt(self, fmt)
+    }
+
+    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
+        io::Write::write_all(self, s)
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"d0da6f63d93a5cfb6536e3be8714239386a79fbfdfe3e6ec92a78c8ddde62010","Cargo.toml":"5a87b6a8e0411a560659a73163f9a222b4b6fa46c6d3ef7bb4dc1e5152807b4a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"aedcbbbefde11d7d8df61645aa93324695e7035d847e934a92e0250920287072","src/example_generated.rs":"8e8f188edaaefb8cc75064bd9e6dfdb8d776132ad838cff377a1acf08216186f","src/lib.rs":"d66cedd360642fcaf89a84408ea6b336f9d89948800e0a8149465cc3a022a621","tests/conflicting_trait_impls.rs":"a2a2e28dee83ead220bbc76653ae203242d9024e05aa47217049c91dd66e3b91","tests/external.rs":"1ec3fb8681056383397f34a9ae87c3d24f031715f88602cab19fa3c820e021b0","tests/external_no_std.rs":"75e0e2d6257b67d4ab9d975a9851f0a874ca7d2cdb0940df6212eafbb0fc2d88","tests/i128_bitflags.rs":"e55fbd7529839bffb8e3a8bf00516b7aca9f4a51cfda5177da17aece8328ad55"},"package":"f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/.travis.yml
@@ -0,0 +1,31 @@
+os:
+  - linux
+  - osx
+language: rust
+rust:
+  # This version is tested to avoid unintentional bumping of the minimum supported Rust version
+  - 1.20.0
+  - stable
+  - beta
+  - nightly
+sudo: false
+before_script:
+  - pip install -v 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
+  - if [[ -e ~/Library/Python/2.7/bin ]]; then export PATH=~/Library/Python/2.7/bin:$PATH; fi
+script:
+  - cargo build --verbose
+  - cargo test --verbose
+  - travis-cargo --only nightly test
+  - cargo doc --no-deps
+after_success:
+  - travis-cargo --only nightly doc-upload
+env:
+  global:
+    - TRAVIS_CARGO_NIGHTLY_FEATURE=unstable_testing
+    - secure: "DoZ8g8iPs+X3xEEucke0Ae02JbkQ1qd1SSv/L2aQqxULmREtRcbzRauhiT+ToQO5Ft1Lul8uck14nPfs4gMr/O3jFFBhEBVpSlbkJx7eNL3kwUdp95UNroA8I43xPN/nccJaHDN6TMTD3+uajTQTje2SyzOQP+1gvdKg17kguvE="
+
+
+
+notifications:
+  email:
+    on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/Cargo.toml
@@ -0,0 +1,31 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "bitflags"
+version = "1.0.0"
+authors = ["The Rust Project Developers"]
+description = "A macro to generate structures which behave like bitflags.\n"
+homepage = "https://github.com/rust-lang-nursery/bitflags"
+documentation = "https://docs.rs/bitflags"
+readme = "README.md"
+keywords = ["bit", "bitmask", "bitflags"]
+categories = ["no-std"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rust-lang-nursery/bitflags"
+
+[features]
+unstable_testing = []
+default = ["example_generated"]
+example_generated = []
+[badges.travis-ci]
+repository = "rust-lang-nursery/bitflags"
rename from third_party/rust/gcc-0.3.42/LICENSE-APACHE
rename to third_party/rust/bitflags-1.0.0/LICENSE-APACHE
rename from third_party/rust/libc-0.2.24/LICENSE-MIT
rename to third_party/rust/bitflags-1.0.0/LICENSE-MIT
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/README.md
@@ -0,0 +1,31 @@
+bitflags
+========
+
+A Rust macro to generate structures which behave like a set of bitflags
+
+[![Build Status](https://travis-ci.org/rust-lang-nursery/bitflags.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/bitflags)
+
+- [Documentation](https://docs.rs/bitflags)
+- [Release notes](https://github.com/rust-lang-nursery/bitflags/releases)
+
+## Usage
+
+Add this to your `Cargo.toml`:
+
+```toml
+[dependencies]
+bitflags = "1.0"
+```
+
+and this to your crate root:
+
+```rust
+#[macro_use]
+extern crate bitflags;
+```
+
+## Rust Version Support
+
+The minimum supported* Rust version is 1.20 due to use of associated constants.
+
+_* As of the current master branch (unreleased)_
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/src/example_generated.rs
@@ -0,0 +1,16 @@
+//! This module shows an example of code generated by the macro. **IT MUST NOT BE USED OUTSIDE THIS
+//! CRATE**.
+
+bitflags! {
+    /// This is the same `Flags` struct defined in the [crate level example](../index.html#example).
+    /// Note that this struct is just for documentation purposes only, it must not be used outside
+    /// this crate.
+    pub struct Flags: u32 {
+        const FLAG_A       = 0b00000001;
+        const FLAG_B       = 0b00000010;
+        const FLAG_C       = 0b00000100;
+        const FLAG_ABC     = Self::FLAG_A.bits
+                           | Self::FLAG_B.bits
+                           | Self::FLAG_C.bits;
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags-1.0.0/src/lib.rs
@@ -0,0 +1,1085 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+//! A typesafe bitmask flag generator useful for sets of C-style bitmask flags.
+//! It can be used for creating typesafe wrappers around C APIs.
+//!
+//! The `bitflags!` macro generates a `struct` that manages a set of flags. The
+//! flags should only be defined for integer types, otherwise unexpected type
+//! errors may occur at compile time.
+//!
+//! # Example
+//!
+//! ```
+//! #[macro_use]
+//! extern crate bitflags;
+//!
+//! bitflags! {
+//!     struct Flags: u32 {
+//!         const FLAG_A       = 0b00000001;
+//!         const FLAG_B       = 0b00000010;
+//!         const FLAG_C       = 0b00000100;
+//!         const FLAG_ABC     = Self::FLAG_A.bits
+//!                            | Self::FLAG_B.bits
+//!                            | Self::FLAG_C.bits;
+//!     }
+//! }
+//!
+//! fn main() {
+//!     let e1 = Flags::FLAG_A | Flags::FLAG_C;
+//!     let e2 = Flags::FLAG_B | Flags::FLAG_C;
+//!     assert_eq!((e1 | e2), Flags::FLAG_ABC);   // union
+//!     assert_eq!((e1 & e2), Flags::FLAG_C);     // intersection
+//!     assert_eq!((e1 - e2), Flags::FLAG_A);     // set difference
+//!     assert_eq!(!e2, Flags::FLAG_A);           // set complement
+//! }
+//! ```
+//!
+//! See [`example_generated::Flags`](./example_generated/struct.Flags.html) for documentation of code
+//! generated by the above `bitflags!` expansion.
+//!
+//! The generated `struct`s can also be extended with type and trait
+//! implementations:
+//!
+//! ```
+//! #[macro_use]
+//! extern crate bitflags;
+//!
+//! use std::fmt;
+//!
+//! bitflags! {
+//!     struct Flags: u32 {
+//!         const FLAG_A   = 0b00000001;
+//!         const FLAG_B   = 0b00000010;
+//!     }
+//! }
+//!
+//! impl Flags {
+//!     pub fn clear(&mut self) {
+//!         self.bits = 0;  // The `bits` field can be accessed from within the
+//!                         // same module where the `bitflags!` macro was invoked.
+//!     }
+//! }
+//!
+//! impl fmt::Display for Flags {
+//!     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+//!         write!(f, "hi!")
+//!     }
+//! }
+//!
+//! fn main() {
+//!     let mut flags = Flags::FLAG_A | Flags::FLAG_B;
+//!     flags.clear();
+//!     assert!(flags.is_empty());
+//!     assert_eq!(format!("{}", flags), "hi!");
+//!     assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
+//!     assert_eq!(format!("{:?}", Flags::FLAG_B), "FLAG_B");
+//! }
+//! ```
+//!
+//! # Visibility
+//!
+//! The generated struct and its associated flag constants are not exported
+//! out of the current module by default. A definition can be exported out of
+//! the current module by adding `pub` before `flags`:
+//!
+//! ```ignore
+//! #[macro_use]
+//! extern crate bitflags;
+//!
+//! mod example {
+//!     bitflags! {
+//!         pub struct Flags1: u32 {
+//!             const FLAG_A   = 0b00000001;
+//!         }
+//!     }
+//!     bitflags! {
+//!         struct Flags2: u32 {
+//!             const FLAG_B   = 0b00000010;
+//!         }
+//!     }
+//! }
+//!
+//! fn main() {
+//!     let flag1 = example::Flags1::FLAG_A;
+//!     let flag2 = example::Flags2::FLAG_B; // error: const `FLAG_B` is private
+//! }
+//! ```
+//!
+//! # Attributes
+//!
+//! Attributes can be attached to the generated `struct` by placing them
+//! before the `flags` keyword.
+//!
+//! # Trait implementations
+//!
+//! The `Copy`, `Clone`, `PartialEq`, `Eq`, `PartialOrd`, `Ord` and `Hash`
+//! traits automatically derived for the `struct` using the `derive` attribute.
+//! Additional traits can be derived by providing an explicit `derive`
+//! attribute on `flags`.
+//!
+//! The `Extend` and `FromIterator` traits are implemented for the `struct`,
+//! too: `Extend` adds the union of the instances of the `struct` iterated over,
+//! while `FromIterator` calculates the union.
+//!
+//! The `Binary`, `Debug`, `LowerExp`, `Octal` and `UpperExp` trait is also
+//! implemented by displaying the bits value of the internal struct.
+//!
+//! ## Operators
+//!
+//! The following operator traits are implemented for the generated `struct`:
+//!
+//! - `BitOr` and `BitOrAssign`: union
+//! - `BitAnd` and `BitAndAssign`: intersection
+//! - `BitXor` and `BitXorAssign`: toggle
+//! - `Sub` and `SubAssign`: set difference
+//! - `Not`: set complement
+//!
+//! # Methods
+//!
+//! The following methods are defined for the generated `struct`:
+//!
+//! - `empty`: an empty set of flags
+//! - `all`: the set of all flags
+//! - `bits`: the raw value of the flags currently stored
+//! - `from_bits`: convert from underlying bit representation, unless that
+//!                representation contains bits that do not correspond to a flag
+//! - `from_bits_truncate`: convert from underlying bit representation, dropping
+//!                         any bits that do not correspond to flags
+//! - `is_empty`: `true` if no flags are currently stored
+//! - `is_all`: `true` if all flags are currently set
+//! - `intersects`: `true` if there are flags common to both `self` and `other`
+//! - `contains`: `true` all of the flags in `other` are contained within `self`
+//! - `insert`: inserts the specified flags in-place
+//! - `remove`: removes the specified flags in-place
+//! - `toggle`: the specified flags will be inserted if not present, and removed
+//!             if they are.
+//! - `set`: inserts or removes the specified flags depending on the passed value
+//!
+//! ## Default
+//!
+//! The `Default` trait is not automatically implemented for the generated struct.
+//!
+//! If your default value is equal to `0` (which is the same value as calling `empty()`
+//! on the generated struct), you can simply derive `Default`:
+//!
+//! ```
+//! #[macro_use]
+//! extern crate bitflags;
+//!
+//! bitflags! {
+//!     // Results in default value with bits: 0
+//!     #[derive(Default)]
+//!     struct Flags: u32 {
+//!         const FLAG_A       = 0b00000001;
+//!         const FLAG_B       = 0b00000010;
+//!         const FLAG_C       = 0b00000100;
+//!     }
+//! }
+//!
+//! fn main() {
+//!     let derived_default: Flags = Default::default();
+//!     assert_eq!(derived_default.bits(), 0);
+//! }
+//! ```
+//!
+//! If your default value is not equal to `0` you need to implement `Default` yourself:
+//!
+//! ```
+//! #[macro_use]
+//! extern crate bitflags;
+//!
+//! bitflags! {
+//!     struct Flags: u32 {
+//!         const FLAG_A       = 0b00000001;
+//!         const FLAG_B       = 0b00000010;
+//!         const FLAG_C       = 0b00000100;
+//!     }
+//! }
+//!
+//! // explicit `Default` implementation
+//! impl Default for Flags {
+//!     fn default() -> Flags {
+//!         Flags::FLAG_A | Flags::FLAG_C
+//!     }
+//! }
+//!
+//! fn main() {
+//!     let implemented_default: Flags = Default::default();
+//!     assert_eq!(implemented_default, (Flags::FLAG_A | Flags::FLAG_C));
+//! }
+//! ```
+
+#![no_std]
+
+#![doc(html_root_url = "https://docs.rs/bitflags/1.0.0")]
+// When compiled for the rustc compiler itself we want to make sure that this is
+// an unstable crate.
+#![cfg_attr(rustbuild, feature(staged_api))]
+#![cfg_attr(rustbuild, unstable(feature = "rustc_private", issue = "27812"))]
+
+#[cfg(test)]
+#[macro_use]
+extern crate std;
+
+// Re-export libstd/libcore using an alias so that the macros can work in no_std
+// crates while remaining compatible with normal crates.
+#[doc(hidden)]
+pub extern crate core as _core;
+
+/// The macro used to generate the flag structure.
+///
+/// See the [crate level docs](../bitflags/index.html) for complete documentation.
+///
+/// # Example
+///
+/// ```
+/// #[macro_use]
+/// extern crate bitflags;
+///
+/// bitflags! {
+///     struct Flags: u32 {
+///         const FLAG_A       = 0b00000001;
+///         const FLAG_B       = 0b00000010;
+///         const FLAG_C       = 0b00000100;
+///         const FLAG_ABC     = Self::FLAG_A.bits
+///                            | Self::FLAG_B.bits
+///                            | Self::FLAG_C.bits;
+///     }
+/// }
+///
+/// fn main() {
+///     let e1 = Flags::FLAG_A | Flags::FLAG_C;
+///     let e2 = Flags::FLAG_B | Flags::FLAG_C;
+///     assert_eq!((e1 | e2), Flags::FLAG_ABC);   // union
+///     assert_eq!((e1 & e2), Flags::FLAG_C);     // intersection
+///     assert_eq!((e1 - e2), Flags::FLAG_A);     // set difference
+///     assert_eq!(!e2, Flags::FLAG_A);           // set complement
+/// }
+/// ```
+///
+/// The generated `struct`s can also be extended with type and trait
+/// implementations:
+///
+/// ```
+/// #[macro_use]
+/// extern crate bitflags;
+///
+/// use std::fmt;
+///
+/// bitflags! {
+///     struct Flags: u32 {
+///         const FLAG_A   = 0b00000001;
+///         const FLAG_B   = 0b00000010;
+///     }
+/// }
+///
+/// impl Flags {
+///     pub fn clear(&mut self) {
+///         self.bits = 0;  // The `bits` field can be accessed from within the
+///                         // same module where the `bitflags!` macro was invoked.
+///     }
+/// }
+///
+/// impl fmt::Display for Flags {
+///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+///         write!(f, "hi!")
+///     }
+/// }
+///
+/// fn main() {
+///     let mut flags = Flags::FLAG_A | Flags::FLAG_B;
+///     flags.clear();
+///     assert!(flags.is_empty());
+///     assert_eq!(format!("{}", flags), "hi!");
+///     assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
+///     assert_eq!(format!("{:?}", Flags::FLAG_B), "FLAG_B");
+/// }
+/// ```
+#[macro_export]
+macro_rules! bitflags {
+    (
+        $(#[$outer:meta])*
+        pub struct $BitFlags:ident: $T:ty {
+            $(
+                $(#[$inner:ident $($args:tt)*])*
+                const $Flag:ident = $value:expr;
+            )+
+        }
+    ) => {
+        #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
+        $(#[$outer])*
+        pub struct $BitFlags {
+            bits: $T,
+        }
+
+        __impl_bitflags! {
+            struct $BitFlags: $T {
+                $(
+                    $(#[$inner $($args)*])*
+                    const $Flag = $value;
+                )+
+            }
+        }
+    };
+    (
+        $(#[$outer:meta])*
+        struct $BitFlags:ident: $T:ty {
+            $(
+                $(#[$inner:ident $($args:tt)*])*
+                const $Flag:ident = $value:expr;
+            )+
+        }
+    ) => {
+        #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
+        $(#[$outer])*
+        struct $BitFlags {
+            bits: $T,
+        }
+
+        __impl_bitflags! {
+            struct $BitFlags: $T {
+                $(
+                    $(#[$inner $($args)*])*
+                    const $Flag = $value;
+                )+
+            }
+        }
+    };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __impl_bitflags {
+    (
+        struct $BitFlags:ident: $T:ty {
+            $(
+                $(#[$attr:ident $($args:tt)*])*
+                const $Flag:ident = $value:expr;
+            )+
+        }
+    ) => {
+        impl $crate::_core::fmt::Debug for $BitFlags {
+            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
+                // This convoluted approach is to handle #[cfg]-based flag
+                // omission correctly. For example it needs to support:
+                //
+                //    #[cfg(unix)] const A: Flag = /* ... */;
+                //    #[cfg(windows)] const B: Flag = /* ... */;
+
+                // Unconditionally define a check for every flag, even disabled
+                // ones.
+                #[allow(non_snake_case)]
+                trait __BitFlags {
+                    $(
+                        fn $Flag(&self) -> bool { false }
+                    )+
+                }
+
+                // Conditionally override the check for just those flags that
+                // are not #[cfg]ed away.
+                impl __BitFlags for $BitFlags {
+                    $(
+                        __impl_bitflags! {
+                            #[allow(deprecated)]
+                            $(? #[$attr $($args)*])*
+                            fn $Flag(&self) -> bool {
+                                self.bits & Self::$Flag.bits == Self::$Flag.bits
+                            }
+                        }
+                    )+
+                }
+
+                let mut first = true;
+                $(
+                    if <$BitFlags as __BitFlags>::$Flag(self) {
+                        if !first {
+                            try!(f.write_str(" | "));
+                        }
+                        first = false;
+                        try!(f.write_str(stringify!($Flag)));
+                    }
+                )+
+                if first {
+                    try!(f.write_str("(empty)"));
+                }
+                Ok(())
+            }
+        }
+        impl $crate::_core::fmt::Binary for $BitFlags {
+            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
+                $crate::_core::fmt::Binary::fmt(&self.bits, f)
+            }
+        }
+        impl $crate::_core::fmt::Octal for $BitFlags {
+            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
+                $crate::_core::fmt::Octal::fmt(&self.bits, f)
+            }
+        }
+        impl $crate::_core::fmt::LowerHex for $BitFlags {
+            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
+                $crate::_core::fmt::LowerHex::fmt(&self.bits, f)
+            }
+        }
+        impl $crate::_core::fmt::UpperHex for $BitFlags {
+            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
+                $crate::_core::fmt::UpperHex::fmt(&self.bits, f)
+            }
+        }
+
+        #[allow(dead_code)]
+        impl $BitFlags {
+            $(
+                $(#[$attr $($args)*])*
+                pub const $Flag: $BitFlags = $BitFlags { bits: $value };
+            )+
+
+            /// Returns an empty set of flags.
+            #[inline]
+            pub fn empty() -> $BitFlags {
+                $BitFlags { bits: 0 }
+            }
+
+            /// Returns the set containing all flags.
+            #[inline]
+            pub fn all() -> $BitFlags {
+                // See `Debug::fmt` for why this approach is taken.
+                #[allow(non_snake_case)]
+                trait __BitFlags {
+                    $(
+                        fn $Flag() -> $T { 0 }
+                    )+
+                }
+                impl __BitFlags for $BitFlags {
+                    $(
+                        __impl_bitflags! {
+                            #[allow(deprecated)]
+                            $(? #[$attr $($args)*])*
+                            fn $Flag() -> $T { Self::$Flag.bits }
+                        }
+                    )+
+                }
+                $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag())|+ }
+            }
+
+            /// Returns the raw value of the flags currently stored.
+            #[inline]
+            pub fn bits(&self) -> $T {
+                self.bits
+            }
+
+            /// Convert from underlying bit representation, unless that
+            /// representation contains bits that do not correspond to a flag.
+            #[inline]
+            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
+                if (bits & !$BitFlags::all().bits()) == 0 {
+                    $crate::_core::option::Option::Some($BitFlags { bits: bits })
+                } else {
+                    $crate::_core::option::Option::None
+                }
+            }
+
+            /// Convert from underlying bit representation, dropping any bits
+            /// that do not correspond to flags.
+            #[inline]
+            pub fn from_bits_truncate(bits: $T) -> $BitFlags {
+                $BitFlags { bits: bits } & $BitFlags::all()
+            }
+
+            /// Returns `true` if no flags are currently stored.
+            #[inline]
+            pub fn is_empty(&self) -> bool {
+                *self == $BitFlags::empty()
+            }
+
+            /// Returns `true` if all flags are currently set.
+            #[inline]
+            pub fn is_all(&self) -> bool {
+                *self == $BitFlags::all()
+            }
+
+            /// Returns `true` if there are flags common to both `self` and `other`.
+            #[inline]
+            pub fn intersects(&self, other: $BitFlags) -> bool {
+                !(*self & other).is_empty()
+            }
+
+            /// Returns `true` all of the flags in `other` are contained within `self`.
+            #[inline]
+            pub fn contains(&self, other: $BitFlags) -> bool {
+                (*self & other) == other
+            }
+
+            /// Inserts the specified flags in-place.
+            #[inline]
+            pub fn insert(&mut self, other: $BitFlags) {
+                self.bits |= other.bits;
+            }
+
+            /// Removes the specified flags in-place.
+            #[inline]
+            pub fn remove(&mut self, other: $BitFlags) {
+                self.bits &= !other.bits;
+            }
+
+            /// Toggles the specified flags in-place.
+            #[inline]
+            pub fn toggle(&mut self, other: $BitFlags) {
+                self.bits ^= other.bits;
+            }
+
+            /// Inserts or removes the specified flags depending on the passed value.
+            #[inline]
+            pub fn set(&mut self, other: $BitFlags, value: bool) {
+                if value {
+                    self.insert(other);
+                } else {
+                    self.remove(other);
+                }
+            }
+        }
+
+        impl $crate::_core::ops::BitOr for $BitFlags {
+            type Output = $BitFlags;
+
+            /// Returns the union of the two sets of flags.
+            #[inline]
+            fn bitor(self, other: $BitFlags) -> $BitFlags {
+                $BitFlags { bits: self.bits | other.bits }
+            }
+        }
+
+        impl $crate::_core::ops::BitOrAssign for $BitFlags {
+
+            /// Adds the set of flags.
+            #[inline]
+            fn bitor_assign(&mut self, other: $BitFlags) {
+                self.bits |= other.bits;
+            }
+        }
+
+        impl $crate::_core::ops::BitXor for $BitFlags {
+            type Output = $BitFlags;
+
+            /// Returns the left flags, but with all the right flags toggled.
+            #[inline]
+            fn bitxor(self, other: $BitFlags) -> $BitFlags {
+                $BitFlags { bits: self.bits ^ other.bits }
+            }
+        }
+
+        impl $crate::_core::ops::BitXorAssign for $BitFlags {
+
+            /// Toggles the set of flags.
+            #[inline]
+            fn bitxor_assign(&mut self, other: $BitFlags) {
+                self.bits ^= other.bits;
+            }
+        }
+
+        impl $crate::_core::ops::BitAnd for $BitFlags {
+            type Output = $BitFlags;
+
+            /// Returns the intersection between the two sets of flags.
+            #[inline]
+            fn bitand(self, other: $BitFlags) -> $BitFlags {
+                $BitFlags { bits: self.bits & other.bits }
+            }
+        }
+
+        impl $crate::_core::ops::BitAndAssign for $BitFlags {
+
+            /// Disables all flags disabled in the set.
+            #[inline]
+            fn bitand_assign(&mut self, other: $BitFlags) {
+                self.bits &= other.bits;
+            }
+        }
+
+        impl $crate::_core::ops::Sub for $BitFlags {
+            type Output = $BitFlags;
+
+            /// Returns the set difference of the two sets of flags.
+            #[inline]
+            fn sub(self, other: $BitFlags) -> $BitFlags {
+                $BitFlags { bits: self.bits & !other.bits }
+            }
+        }
+
+        impl $crate::_core::ops::SubAssign for $BitFlags {
+
+            /// Disables all flags enabled in the set.
+            #[inline]
+            fn sub_assign(&mut self, other: $BitFlags) {
+                self.bits &= !other.bits;
+            }
+        }
+
+        impl $crate::_core::ops::Not for $BitFlags {
+            type Output = $BitFlags;
+
+            /// Returns the complement of this set of flags.
+            #[inline]
+            fn not(self) -> $BitFlags {
+                $BitFlags { bits: !self.bits } & $BitFlags::all()
+            }
+        }
+
+        impl $crate::_core::iter::Extend<$BitFlags> for $BitFlags {
+            fn extend<T: $crate::_core::iter::IntoIterator<Item=$BitFlags>>(&mut self, iterator: T) {
+                for item in iterator {
+                    self.insert(item)
+                }
+            }
+        }
+
+        impl $crate::_core::iter::FromIterator<$BitFlags> for $BitFlags {
+            fn from_iter<T: $crate::_core::iter::IntoIterator<Item=$BitFlags>>(iterator: T) -> $BitFlags {
+                let mut result = Self::empty();
+                result.extend(iterator);
+                result
+            }
+        }
+    };
+
+    // Every attribute that the user writes on a const is applied to the
+    // corresponding const that we generate, but within the implementation of
+    // Debug and all() we want to ignore everything but #[cfg] attributes. In
+    // particular, including a #[deprecated] attribute on those items would fail
+    // to compile.
+    // https://github.com/rust-lang-nursery/bitflags/issues/109
+    //
+    // Input:
+    //
+    //     ? #[cfg(feature = "advanced")]
+    //     ? #[deprecated(note = "Use somthing else.")]
+    //     ? #[doc = r"High quality documentation."]
+    //     fn f() -> i32 { /* ... */ }
+    //
+    // Output:
+    //
+    //     #[cfg(feature = "advanced")]
+    //     fn f() -> i32 { /* ... */ }
+    (
+        $(#[$filtered:meta])*
+        ? #[cfg $($cfgargs:tt)*]
+        $(? #[$rest:ident $($restargs:tt)*])*
+        fn $($item:tt)*
+    ) => {
+        __impl_bitflags! {
+            $(#[$filtered])*
+            #[cfg $($cfgargs)*]
+            $(? #[$rest $($restargs)*])*
+            fn $($item)*
+        }
+    };
+    (
+        $(#[$filtered:meta])*
+        // $next != `cfg`
+        ? #[$next:ident $($nextargs:tt)*]
+        $(? #[$rest:ident $($restargs:tt)*])*
+        fn $($item:tt)*
+    ) => {
+        __impl_bitflags! {
+            $(#[$filtered])*
+            // $next filtered out
+            $(? #[$rest $($restargs)*])*
+            fn $($item)*
+        }
+    };
+    (
+        $(#[$filtered:meta])*
+        fn $($item:tt)*
+    ) => {
+        $(#[$filtered])*
+        fn $($item)*
+    };
+}
+
+#[cfg(feature = "example_generated")]
+pub mod example_generated;
+
+#[cfg(test)]
+mod tests {
+    use std::hash::{Hash, Hasher};
+    use std::collections::hash_map::DefaultHasher;
+
+    bitflags! {
+        #[doc = "> The first principle is that you must not fool yourself — and"]
+        #[doc = "> you are the easiest person to fool."]
+        #[doc = "> "]
+        #[doc = "> - Richard Feynman"]
+        struct Flags: u32 {
+            const FLAG_A       = 0b00000001;
+            #[doc = "<pcwalton> macros are way better at generating code than trans is"]
+            const FLAG_B       = 0b00000010;
+            const FLAG_C       = 0b00000100;
+            #[doc = "* cmr bed"]
+            #[doc = "* strcat table"]
+            #[doc = "<strcat> wait what?"]
+            const FLAG_ABC     = Self::FLAG_A.bits
+                               | Self::FLAG_B.bits
+                               | Self::FLAG_C.bits;
+        }
+    }
+
+    bitflags! {
+        struct _CfgFlags: u32 {
+            #[cfg(windows)]
+            const _CFG_A = 0b01;
+            #[cfg(unix)]
+            const _CFG_B = 0b01;
+            #[cfg(windows)]
+            const _CFG_C = _CFG_A.bits | 0b10;
+        }
+    }
+
+    bitflags! {
+        struct AnotherSetOfFlags: i8 {
+            const ANOTHER_FLAG = -1_i8;
+        }
+    }
+
+    bitflags! {
+        struct LongFlags: u32 {
+            const LONG_FLAG_A = 0b1111111111111111;
+        }
+    }
+
+    #[test]
+    fn test_bits(){
+        assert_eq!(Flags::empty().bits(), 0b00000000);
+        assert_eq!(Flags::FLAG_A.bits(), 0b00000001);
+        assert_eq!(Flags::FLAG_ABC.bits(), 0b00000111);
+
+        assert_eq!(AnotherSetOfFlags::empty().bits(), 0b00);
+        assert_eq!(AnotherSetOfFlags::ANOTHER_FLAG.bits(), !0_i8);
+    }
+
+    #[test]
+    fn test_from_bits() {
+        assert_eq!(Flags::from_bits(0), Some(Flags::empty()));
+        assert_eq!(Flags::from_bits(0b1), Some(Flags::FLAG_A));
+        assert_eq!(Flags::from_bits(0b10), Some(Flags::FLAG_B));
+        assert_eq!(Flags::from_bits(0b11), Some(Flags::FLAG_A | Flags::FLAG_B));
+        assert_eq!(Flags::from_bits(0b1000), None);
+
+        assert_eq!(AnotherSetOfFlags::from_bits(!0_i8), Some(AnotherSetOfFlags::ANOTHER_FLAG));
+    }
+
+    #[test]
+    fn test_from_bits_truncate() {
+        assert_eq!(Flags::from_bits_truncate(0), Flags::empty());
+        assert_eq!(Flags::from_bits_truncate(0b1), Flags::FLAG_A);
+        assert_eq!(Flags::from_bits_truncate(0b10), Flags::FLAG_B);
+        assert_eq!(Flags::from_bits_truncate(0b11), (Flags::FLAG_A | Flags::FLAG_B));
+        assert_eq!(Flags::from_bits_truncate(0b1000), Flags::empty());
+        assert_eq!(Flags::from_bits_truncate(0b1001), Flags::FLAG_A);
+
+        assert_eq!(AnotherSetOfFlags::from_bits_truncate(0_i8), AnotherSetOfFlags::empty());
+    }
+
+    #[test]
+    fn test_is_empty(){
+        assert!(Flags::empty().is_empty());
+        assert!(!Flags::FLAG_A.is_empty());
+        assert!(!Flags::FLAG_ABC.is_empty());
+
+        assert!(!AnotherSetOfFlags::ANOTHER_FLAG.is_empty());
+    }
+
+    #[test]
+    fn test_is_all() {
+        assert!(Flags::all().is_all());
+        assert!(!Flags::FLAG_A.is_all());
+        assert!(Flags::FLAG_ABC.is_all());
+
+        assert!(AnotherSetOfFlags::ANOTHER_FLAG.is_all());
+    }
+
+    #[test]
+    fn test_two_empties_do_not_intersect() {
+        let e1 = Flags::empty();
+        let e2 = Flags::empty();
+        assert!(!e1.intersects(e2));
+
+        assert!(AnotherSetOfFlags::ANOTHER_FLAG.intersects(AnotherSetOfFlags::ANOTHER_FLAG));
+    }
+
+    #[test]
+    fn test_empty_does_not_intersect_with_full() {
+        let e1 = Flags::empty();
+        let e2 = Flags::FLAG_ABC;
+        assert!(!e1.intersects(e2));
+    }
+
+    #[test]
+    fn test_disjoint_intersects() {
+        let e1 = Flags::FLAG_A;
+        let e2 = Flags::FLAG_B;
+        assert!(!e1.intersects(e2));
+    }
+
+    #[test]
+    fn test_overlapping_intersects() {
+        let e1 = Flags::FLAG_A;
+        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        assert!(e1.intersects(e2));
+    }
+
+    #[test]
+    fn test_contains() {
+        let e1 = Flags::FLAG_A;
+        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        assert!(!e1.contains(e2));
+        assert!(e2.contains(e1));
+        assert!(Flags::FLAG_ABC.contains(e2));
+
+        assert!(AnotherSetOfFlags::ANOTHER_FLAG.contains(AnotherSetOfFlags::ANOTHER_FLAG));
+    }
+
+    #[test]
+    fn test_insert(){
+        let mut e1 = Flags::FLAG_A;
+        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        e1.insert(e2);
+        assert_eq!(e1, e2);
+
+        let mut e3 = AnotherSetOfFlags::empty();
+        e3.insert(AnotherSetOfFlags::ANOTHER_FLAG);
+        assert_eq!(e3, AnotherSetOfFlags::ANOTHER_FLAG);
+    }
+
+    #[test]
+    fn test_remove(){
+        let mut e1 = Flags::FLAG_A | Flags::FLAG_B;
+        let e2 = Flags::FLAG_A | Flags::FLAG_C;
+        e1.remove(e2);
+        assert_eq!(e1, Flags::FLAG_B);
+
+        let mut e3 = AnotherSetOfFlags::ANOTHER_FLAG;
+        e3.remove(AnotherSetOfFlags::ANOTHER_FLAG);
+        assert_eq!(e3, AnotherSetOfFlags::empty());
+    }
+
+    #[test]
+    fn test_operators() {
+        let e1 = Flags::FLAG_A | Flags::FLAG_C;
+        let e2 = Flags::FLAG_B | Flags::FLAG_C;
+        assert_eq!((e1 | e2), Flags::FLAG_ABC);     // union
+        assert_eq!((e1 & e2), Flags::FLAG_C);       // intersection
+        assert_eq!((e1 - e2), Flags::FLAG_A);       // set difference
+        assert_eq!(!e2, Flags::FLAG_A);             // set complement
+        assert_eq!(e1 ^ e2, Flags::FLAG_A | Flags::FLAG_B); // toggle
+        let mut e3 = e1;
+        e3.toggle(e2);
+        assert_eq!(e3, Flags::FLAG_A | Flags::FLAG_B);
+
+        let mut m4 = AnotherSetOfFlags::empty();
+        m4.toggle(AnotherSetOfFlags::empty());
+        assert_eq!(m4, AnotherSetOfFlags::empty());
+    }
+
+    #[test]
+    fn test_set() {
+        let mut e1 = Flags::FLAG_A | Flags::FLAG_C;
+        e1.set(Flags::FLAG_B, true);
+        e1.set(Flags::FLAG_C, false);
+
+        assert_eq!(e1, Flags::FLAG_A | Flags::FLAG_B);
+    }
+
+    #[test]
+    fn test_assignment_operators() {
+        let mut m1 = Flags::empty();
+        let e1 = Flags::FLAG_A | Flags::FLAG_C;
+        // union
+        m1 |= Flags::FLAG_A;
+        assert_eq!(m1, Flags::FLAG_A);
+        // intersection
+        m1 &= e1;
+        assert_eq!(m1, Flags::FLAG_A);
+        // set difference
+        m1 -= m1;
+        assert_eq!(m1, Flags::empty());
+        // toggle
+        m1 ^= e1;
+        assert_eq!(m1, e1);
+    }
+
+    #[test]
+    fn test_extend() {
+        let mut flags;
+
+        flags = Flags::empty();
+        flags.extend([].iter().cloned());
+        assert_eq!(flags, Flags::empty());
+
+        flags = Flags::empty();
+        flags.extend([Flags::FLAG_A, Flags::FLAG_B].iter().cloned());
+        assert_eq!(flags, Flags::FLAG_A | Flags::FLAG_B);
+
+        flags = Flags::FLAG_A;
+        flags.extend([Flags::FLAG_A, Flags::FLAG_B].iter().cloned());
+        assert_eq!(flags, Flags::FLAG_A | Flags::FLAG_B);
+
+        flags = Flags::FLAG_B;
+        flags.extend([Flags::FLAG_A, Flags::FLAG_ABC].iter().cloned());
+        assert_eq!(flags, Flags::FLAG_ABC);
+    }
+
+    #[test]
+    fn test_from_iterator() {
+        assert_eq!([].iter().cloned().collect::<Flags>(), Flags::empty());
+        assert_eq!([Flags::FLAG_A, Flags::FLAG_B].iter().cloned().collect::<Flags>(),
+                   Flags::FLAG_A | Flags::FLAG_B);
+        assert_eq!([Flags::FLAG_A, Flags::FLAG_ABC].iter().cloned().collect::<Flags>(),
+                   Flags::FLAG_ABC);
+    }
+
+    #[test]
+    fn test_lt() {
+        let mut a = Flags::empty();
+        let mut b = Flags::empty();
+
+        assert!(!(a < b) && !(b < a));
+        b = Flags::FLAG_B;
+        assert!(a < b);
+        a = Flags::FLAG_C;
+        assert!(!(a < b) && b < a);
+        b = Flags::FLAG_C | Flags::FLAG_B;
+        assert!(a < b);
+    }
+
+    #[test]
+    fn test_ord() {
+        let mut a = Flags::empty();
+        let mut b = Flags::empty();
+
+        assert!(a <= b && a >= b);
+        a = Flags::FLAG_A;
+        assert!(a > b && a >= b);
+        assert!(b < a && b <= a);
+        b = Flags::FLAG_B;
+        assert!(b > a && b >= a);
+        assert!(a < b && a <= b);
+    }
+
+    fn hash<T: Hash>(t: &T) -> u64 {
+        let mut s = DefaultHasher::new();
+        t.hash(&mut s);
+        s.finish()
+    }
+
+    #[test]
+    fn test_hash() {
+        let mut x = Flags::empty();
+        let mut y = Flags::empty();
+        assert_eq!(hash(&x), hash(&y));
+        x = Flags::all();
+        y = Flags::FLAG_ABC;
+        assert_eq!(hash(&x), hash(&y));
+    }
+
+    #[test]
+    fn test_debug() {
+        assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
+        assert_eq!(format!("{:?}", Flags::empty()), "(empty)");
+        assert_eq!(format!("{:?}", Flags::FLAG_ABC), "FLAG_A | FLAG_B | FLAG_C | FLAG_ABC");
+    }
+
+    #[test]
+    fn test_binary() {
+        assert_eq!(format!("{:b}", Flags::FLAG_ABC), "111");
+        assert_eq!(format!("{:#b}", Flags::FLAG_ABC), "0b111");
+    }
+
+    #[test]
+    fn test_octal() {
+        assert_eq!(format!("{:o}", LongFlags::LONG_FLAG_A), "177777");
+        assert_eq!(format!("{:#o}", LongFlags::LONG_FLAG_A), "0o177777");
+    }
+
+    #[test]
+    fn test_lowerhex() {
+        assert_eq!(format!("{:x}", LongFlags::LONG_FLAG_A), "ffff");
+        assert_eq!(format!("{:#x}", LongFlags::LONG_FLAG_A), "0xffff");
+    }
+
+    #[test]
+    fn test_upperhex() {
+        assert_eq!(format!("{:X}", LongFlags::LONG_FLAG_A), "FFFF");
+        assert_eq!(format!("{:#X}", LongFlags::LONG_FLAG_A), "0xFFFF");
+    }
+
+    mod submodule {
+        bitflags! {
+            pub struct PublicFlags: i8 {
+                const FLAG_X = 0;
+            }
+        }
+        bitflags! {
+            struct PrivateFlags: i8 {
+                const FLAG_Y = 0;
+            }
+        }
+
+        #[test]
+        fn test_private() {
+
+            let _ = PrivateFlags::FLAG_Y;
+        }
+    }
+
+    #[test]
+    fn test_public() {
+        let _ = submodule::PublicFlags::FLAG_X;
+    }
+
+    mod t1 {
+        mod foo {
+            pub type Bar = i32;
+        }
+
+        bitflags! {
+            /// baz
+            struct Flags: foo::Bar {
+                const A       = 0b00000001;
+                #[cfg(foo)]
+                const B       = 0b00000010;
+                #[cfg(foo)]
+                const C       = 0b00000010;
+            }
+        }
+    }
+
+    #[test]
+    fn test_in_function() {
+        bitflags! {
+           struct Flags: u8 {
+                const A = 1;
+                #[cfg(any())] // false
+                const B = 2;
+            }
+        }
+        assert_eq!(Flags::all(), Flags::A);
+        assert_eq!(format!("{:?}", Flags::A), "A");
+    }
+
+    #[test]
+    fn test_deprecated() {
+        bitflags! {
+            pub struct TestFlags: u32 {
+                #[deprecated(note = "Use something else.")]
+                const FLAG_ONE = 1;
+            }
+        }
+    }
+}
rename from third_party/rust/bitflags/tests/conflicting_trait_impls.rs
rename to third_party/rust/bitflags-1.0.0/tests/conflicting_trait_impls.rs
rename from third_party/rust/bitflags/tests/external.rs
rename to third_party/rust/bitflags-1.0.0/tests/external.rs
rename from third_party/rust/bitflags/tests/external_no_std.rs
rename to third_party/rust/bitflags-1.0.0/tests/external_no_std.rs
rename from third_party/rust/bitflags/tests/i128_bitflags.rs
rename to third_party/rust/bitflags-1.0.0/tests/i128_bitflags.rs
--- a/third_party/rust/bitflags/.cargo-checksum.json
+++ b/third_party/rust/bitflags/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"d0da6f63d93a5cfb6536e3be8714239386a79fbfdfe3e6ec92a78c8ddde62010","Cargo.toml":"5a87b6a8e0411a560659a73163f9a222b4b6fa46c6d3ef7bb4dc1e5152807b4a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"aedcbbbefde11d7d8df61645aa93324695e7035d847e934a92e0250920287072","src/example_generated.rs":"8e8f188edaaefb8cc75064bd9e6dfdb8d776132ad838cff377a1acf08216186f","src/lib.rs":"d66cedd360642fcaf89a84408ea6b336f9d89948800e0a8149465cc3a022a621","tests/conflicting_trait_impls.rs":"a2a2e28dee83ead220bbc76653ae203242d9024e05aa47217049c91dd66e3b91","tests/external.rs":"1ec3fb8681056383397f34a9ae87c3d24f031715f88602cab19fa3c820e021b0","tests/external_no_std.rs":"75e0e2d6257b67d4ab9d975a9851f0a874ca7d2cdb0940df6212eafbb0fc2d88","tests/i128_bitflags.rs":"e55fbd7529839bffb8e3a8bf00516b7aca9f4a51cfda5177da17aece8328ad55"},"package":"f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989"}
\ No newline at end of file
+{"files":{".travis.yml":"a383040d8e85fbadf7766e478c624272ce5c88cfaa89df2573ab15ab33ff6b37","CHANGELOG.md":"146d3f8e0bddda641f28792e12eb5d1df7d51d172a621eb2fe1e3216ee84ce71","Cargo.toml":"ad2147f2e8ec88196f561b9fbe23c349a12471b3a0f1a70e88e1d0c2544e968a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"38ce554bfa6b90db0a443b8215070729d35e85c330141321d4aa2a363844ed23","src/example_generated.rs":"20c455b70183ddaaeb287d62a002ff93e98f089fb6c7d9b1137a60c1118ef31a","src/lib.rs":"2a97f98dfff77da2e6503cb06c263df1837a549fe3757803ad655644ecbda205"},"package":"b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"}
\ No newline at end of file
--- a/third_party/rust/bitflags/.travis.yml
+++ b/third_party/rust/bitflags/.travis.yml
@@ -1,31 +1,23 @@
 os:
   - linux
   - osx
 language: rust
+cache: cargo
 rust:
   # This version is tested to avoid unintentional bumping of the minimum supported Rust version
   - 1.20.0
   - stable
   - beta
   - nightly
 sudo: false
-before_script:
-  - pip install -v 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
-  - if [[ -e ~/Library/Python/2.7/bin ]]; then export PATH=~/Library/Python/2.7/bin:$PATH; fi
 script:
-  - cargo build --verbose
-  - cargo test --verbose
-  - travis-cargo --only nightly test
-  - cargo doc --no-deps
-after_success:
-  - travis-cargo --only nightly doc-upload
+  - cargo test
+  - (cd ./test_suite && cargo test $([ "$TRAVIS_RUST_VERSION" = nightly ] && echo '--features unstable'))
 env:
   global:
-    - TRAVIS_CARGO_NIGHTLY_FEATURE=unstable_testing
     - secure: "DoZ8g8iPs+X3xEEucke0Ae02JbkQ1qd1SSv/L2aQqxULmREtRcbzRauhiT+ToQO5Ft1Lul8uck14nPfs4gMr/O3jFFBhEBVpSlbkJx7eNL3kwUdp95UNroA8I43xPN/nccJaHDN6TMTD3+uajTQTje2SyzOQP+1gvdKg17kguvE="
 
 
-
 notifications:
   email:
     on_success: never
new file mode 100644
--- /dev/null
+++ b/third_party/rust/bitflags/CHANGELOG.md
@@ -0,0 +1,64 @@
+# 1.0.0
+- **[breaking change]** Macro now generates [associated constants](https://doc.rust-lang.org/reference/items.html#associated-constants) (#24)
+
+- **[breaking change]** Minimum supported version is Rust **1.20**, due to usage of associated constants
+
+- After being broken in 0.9, the `#[deprecated]` attribute is now supported again (#112)
+
+- Other improvements to unit tests and documentation (#106 and #115)
+
+## How to update your code to use associated constants
+Assuming the following structure definition:
+```rust
+bitflags! {
+  struct Something: u8 {
+     const FOO = 0b01,
+     const BAR = 0b10
+  }
+}
+```
+In 0.9 and older you could do:
+```rust
+let x = FOO.bits | BAR.bits;
+```
+Now you must use:
+```rust
+let x = Something::FOO.bits | Something::BAR.bits;
+```
+
+# 0.9.1
+- Fix the implementation of `Formatting` traits when other formatting traits were present in scope (#105)
+
+# 0.9.0
+- **[breaking change]** Use struct keyword instead of flags to define bitflag types (#84)
+
+- **[breaking change]** Terminate const items with semicolons instead of commas (#87)
+
+- Implement the `Hex`, `Octal`, and `Binary` formatting traits (#86)
+
+- Printing an empty flag value with the `Debug` trait now prints "(empty)" instead of nothing (#85)
+
+- The `bitflags!` macro can now be used inside of a fn body, to define a type local to that function (#74)
+
+# 0.8.2
+- Update feature flag used when building bitflags as a dependency of the Rust toolchain
+
+# 0.8.1
+- Allow bitflags to be used as a dependency of the Rust toolchain
+
+# 0.8.0
+- Add support for the experimental `i128` and `u128` integer types (#57)
+- Add set method: `flags.set(SOME_FLAG, true)` or `flags.set(SOME_FLAG, false)` (#55)
+  This may break code that defines its own set method
+
+# 0.7.1
+*(yanked)*
+
+# 0.7.0
+- Implement the Extend trait (#49)
+- Allow definitions inside the `bitflags!` macro to refer to items imported from other modules (#51)
+
+# 0.6.0
+- The `no_std` feature was removed as it is now the default
+- The `assignment_operators` feature was remove as it is now enabled by default
+- Some clippy suggestions have been applied
--- a/third_party/rust/bitflags/Cargo.toml
+++ b/third_party/rust/bitflags/Cargo.toml
@@ -7,25 +7,24 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "bitflags"
-version = "1.0.0"
+version = "1.0.1"
 authors = ["The Rust Project Developers"]
 description = "A macro to generate structures which behave like bitflags.\n"
 homepage = "https://github.com/rust-lang-nursery/bitflags"
 documentation = "https://docs.rs/bitflags"
 readme = "README.md"
-keywords = ["bit", "bitmask", "bitflags"]
+keywords = ["bit", "bitmask", "bitflags", "flags"]
 categories = ["no-std"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/rust-lang-nursery/bitflags"
 
 [features]
-unstable_testing = []
 default = ["example_generated"]
 example_generated = []
 [badges.travis-ci]
 repository = "rust-lang-nursery/bitflags"
--- a/third_party/rust/bitflags/README.md
+++ b/third_party/rust/bitflags/README.md
@@ -21,11 +21,9 @@ and this to your crate root:
 
 ```rust
 #[macro_use]
 extern crate bitflags;
 ```
 
 ## Rust Version Support
 
-The minimum supported* Rust version is 1.20 due to use of associated constants.
-
-_* As of the current master branch (unreleased)_
+The minimum supported Rust version is 1.20 due to use of associated constants.
--- a/third_party/rust/bitflags/src/example_generated.rs
+++ b/third_party/rust/bitflags/src/example_generated.rs
@@ -1,16 +1,14 @@
 //! This module shows an example of code generated by the macro. **IT MUST NOT BE USED OUTSIDE THIS
 //! CRATE**.
 
 bitflags! {
     /// This is the same `Flags` struct defined in the [crate level example](../index.html#example).
     /// Note that this struct is just for documentation purposes only, it must not be used outside
     /// this crate.
     pub struct Flags: u32 {
-        const FLAG_A       = 0b00000001;
-        const FLAG_B       = 0b00000010;
-        const FLAG_C       = 0b00000100;
-        const FLAG_ABC     = Self::FLAG_A.bits
-                           | Self::FLAG_B.bits
-                           | Self::FLAG_C.bits;
+        const FLAG_A = 0b00000001;
+        const FLAG_B = 0b00000010;
+        const FLAG_C = 0b00000100;
+        const FLAG_ABC = Self::FLAG_A.bits | Self::FLAG_B.bits | Self::FLAG_C.bits;
     }
 }
--- a/third_party/rust/bitflags/src/lib.rs
+++ b/third_party/rust/bitflags/src/lib.rs
@@ -18,32 +18,30 @@
 //! # Example
 //!
 //! ```
 //! #[macro_use]
 //! extern crate bitflags;
 //!
 //! bitflags! {
 //!     struct Flags: u32 {
-//!         const FLAG_A       = 0b00000001;
-//!         const FLAG_B       = 0b00000010;
-//!         const FLAG_C       = 0b00000100;
-//!         const FLAG_ABC     = Self::FLAG_A.bits
-//!                            | Self::FLAG_B.bits
-//!                            | Self::FLAG_C.bits;
+//!         const A = 0b00000001;
+//!         const B = 0b00000010;
+//!         const C = 0b00000100;
+//!         const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
 //!     }
 //! }
 //!
 //! fn main() {
-//!     let e1 = Flags::FLAG_A | Flags::FLAG_C;
-//!     let e2 = Flags::FLAG_B | Flags::FLAG_C;
-//!     assert_eq!((e1 | e2), Flags::FLAG_ABC);   // union
-//!     assert_eq!((e1 & e2), Flags::FLAG_C);     // intersection
-//!     assert_eq!((e1 - e2), Flags::FLAG_A);     // set difference
-//!     assert_eq!(!e2, Flags::FLAG_A);           // set complement
+//!     let e1 = Flags::A | Flags::C;
+//!     let e2 = Flags::B | Flags::C;
+//!     assert_eq!((e1 | e2), Flags::ABC);   // union
+//!     assert_eq!((e1 & e2), Flags::C);     // intersection
+//!     assert_eq!((e1 - e2), Flags::A);     // set difference
+//!     assert_eq!(!e2, Flags::A);           // set complement
 //! }
 //! ```
 //!
 //! See [`example_generated::Flags`](./example_generated/struct.Flags.html) for documentation of code
 //! generated by the above `bitflags!` expansion.
 //!
 //! The generated `struct`s can also be extended with type and trait
 //! implementations:
@@ -51,18 +49,18 @@
 //! ```
 //! #[macro_use]
 //! extern crate bitflags;
 //!
 //! use std::fmt;
 //!
 //! bitflags! {
 //!     struct Flags: u32 {
-//!         const FLAG_A   = 0b00000001;
-//!         const FLAG_B   = 0b00000010;
+//!         const A = 0b00000001;
+//!         const B = 0b00000010;
 //!     }
 //! }
 //!
 //! impl Flags {
 //!     pub fn clear(&mut self) {
 //!         self.bits = 0;  // The `bits` field can be accessed from within the
 //!                         // same module where the `bitflags!` macro was invoked.
 //!     }
@@ -70,51 +68,52 @@
 //!
 //! impl fmt::Display for Flags {
 //!     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 //!         write!(f, "hi!")
 //!     }
 //! }
 //!
 //! fn main() {
-//!     let mut flags = Flags::FLAG_A | Flags::FLAG_B;
+//!     let mut flags = Flags::A | Flags::B;
 //!     flags.clear();
 //!     assert!(flags.is_empty());
 //!     assert_eq!(format!("{}", flags), "hi!");
-//!     assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
-//!     assert_eq!(format!("{:?}", Flags::FLAG_B), "FLAG_B");
+//!     assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
+//!     assert_eq!(format!("{:?}", Flags::B), "B");
 //! }
 //! ```
 //!
 //! # Visibility
 //!
 //! The generated struct and its associated flag constants are not exported
 //! out of the current module by default. A definition can be exported out of
 //! the current module by adding `pub` before `flags`:
 //!
-//! ```ignore
+//! ```
 //! #[macro_use]
 //! extern crate bitflags;
 //!
 //! mod example {
 //!     bitflags! {
 //!         pub struct Flags1: u32 {
-//!             const FLAG_A   = 0b00000001;
+//!             const A = 0b00000001;
 //!         }
 //!     }
 //!     bitflags! {
+//! #       pub
 //!         struct Flags2: u32 {
-//!             const FLAG_B   = 0b00000010;
+//!             const B = 0b00000010;
 //!         }
 //!     }
 //! }
 //!
 //! fn main() {
-//!     let flag1 = example::Flags1::FLAG_A;
-//!     let flag2 = example::Flags2::FLAG_B; // error: const `FLAG_B` is private
+//!     let flag1 = example::Flags1::A;
+//!     let flag2 = example::Flags2::B; // error: const `B` is private
 //! }
 //! ```
 //!
 //! # Attributes
 //!
 //! Attributes can be attached to the generated `struct` by placing them
 //! before the `flags` keyword.
 //!
@@ -173,19 +172,19 @@
 //! ```
 //! #[macro_use]
 //! extern crate bitflags;
 //!
 //! bitflags! {
 //!     // Results in default value with bits: 0
 //!     #[derive(Default)]
 //!     struct Flags: u32 {
-//!         const FLAG_A       = 0b00000001;
-//!         const FLAG_B       = 0b00000010;
-//!         const FLAG_C       = 0b00000100;
+//!         const A = 0b00000001;
+//!         const B = 0b00000010;
+//!         const C = 0b00000100;
 //!     }
 //! }
 //!
 //! fn main() {
 //!     let derived_default: Flags = Default::default();
 //!     assert_eq!(derived_default.bits(), 0);
 //! }
 //! ```
@@ -193,96 +192,90 @@
 //! If your default value is not equal to `0` you need to implement `Default` yourself:
 //!
 //! ```
 //! #[macro_use]
 //! extern crate bitflags;
 //!
 //! bitflags! {
 //!     struct Flags: u32 {
-//!         const FLAG_A       = 0b00000001;
-//!         const FLAG_B       = 0b00000010;
-//!         const FLAG_C       = 0b00000100;
+//!         const A = 0b00000001;
+//!         const B = 0b00000010;
+//!         const C = 0b00000100;
 //!     }
 //! }
 //!
 //! // explicit `Default` implementation
 //! impl Default for Flags {
 //!     fn default() -> Flags {
-//!         Flags::FLAG_A | Flags::FLAG_C
+//!         Flags::A | Flags::C
 //!     }
 //! }
 //!
 //! fn main() {
 //!     let implemented_default: Flags = Default::default();
-//!     assert_eq!(implemented_default, (Flags::FLAG_A | Flags::FLAG_C));
+//!     assert_eq!(implemented_default, (Flags::A | Flags::C));
 //! }
 //! ```
 
 #![no_std]
 
-#![doc(html_root_url = "https://docs.rs/bitflags/1.0.0")]
-// When compiled for the rustc compiler itself we want to make sure that this is
-// an unstable crate.
-#![cfg_attr(rustbuild, feature(staged_api))]
-#![cfg_attr(rustbuild, unstable(feature = "rustc_private", issue = "27812"))]
+#![doc(html_root_url = "https://docs.rs/bitflags/1.0.1")]
 
 #[cfg(test)]
 #[macro_use]
 extern crate std;
 
-// Re-export libstd/libcore using an alias so that the macros can work in no_std
-// crates while remaining compatible with normal crates.
+// Re-export libcore using an alias so that the macros can work without
+// requiring `extern crate core` downstream.
 #[doc(hidden)]
 pub extern crate core as _core;
 
 /// The macro used to generate the flag structure.
 ///
 /// See the [crate level docs](../bitflags/index.html) for complete documentation.
 ///
 /// # Example
 ///
 /// ```
 /// #[macro_use]
 /// extern crate bitflags;
 ///
 /// bitflags! {
 ///     struct Flags: u32 {
-///         const FLAG_A       = 0b00000001;
-///         const FLAG_B       = 0b00000010;
-///         const FLAG_C       = 0b00000100;
-///         const FLAG_ABC     = Self::FLAG_A.bits
-///                            | Self::FLAG_B.bits
-///                            | Self::FLAG_C.bits;
+///         const A = 0b00000001;
+///         const B = 0b00000010;
+///         const C = 0b00000100;
+///         const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
 ///     }
 /// }
 ///
 /// fn main() {
-///     let e1 = Flags::FLAG_A | Flags::FLAG_C;
-///     let e2 = Flags::FLAG_B | Flags::FLAG_C;
-///     assert_eq!((e1 | e2), Flags::FLAG_ABC);   // union
-///     assert_eq!((e1 & e2), Flags::FLAG_C);     // intersection
-///     assert_eq!((e1 - e2), Flags::FLAG_A);     // set difference
-///     assert_eq!(!e2, Flags::FLAG_A);           // set complement
+///     let e1 = Flags::A | Flags::C;
+///     let e2 = Flags::B | Flags::C;
+///     assert_eq!((e1 | e2), Flags::ABC);   // union
+///     assert_eq!((e1 & e2), Flags::C);     // intersection
+///     assert_eq!((e1 - e2), Flags::A);     // set difference
+///     assert_eq!(!e2, Flags::A);           // set complement
 /// }
 /// ```
 ///
 /// The generated `struct`s can also be extended with type and trait
 /// implementations:
 ///
 /// ```
 /// #[macro_use]
 /// extern crate bitflags;
 ///
 /// use std::fmt;
 ///
 /// bitflags! {
 ///     struct Flags: u32 {
-///         const FLAG_A   = 0b00000001;
-///         const FLAG_B   = 0b00000010;
+///         const A = 0b00000001;
+///         const B = 0b00000010;
 ///     }
 /// }
 ///
 /// impl Flags {
 ///     pub fn clear(&mut self) {
 ///         self.bits = 0;  // The `bits` field can be accessed from within the
 ///                         // same module where the `bitflags!` macro was invoked.
 ///     }
@@ -290,110 +283,150 @@ pub extern crate core as _core;
 ///
 /// impl fmt::Display for Flags {
 ///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 ///         write!(f, "hi!")
 ///     }
 /// }
 ///
 /// fn main() {
-///     let mut flags = Flags::FLAG_A | Flags::FLAG_B;
+///     let mut flags = Flags::A | Flags::B;
 ///     flags.clear();
 ///     assert!(flags.is_empty());
 ///     assert_eq!(format!("{}", flags), "hi!");
-///     assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
-///     assert_eq!(format!("{:?}", Flags::FLAG_B), "FLAG_B");
+///     assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
+///     assert_eq!(format!("{:?}", Flags::B), "B");
 /// }
 /// ```
 #[macro_export]
 macro_rules! bitflags {
     (
         $(#[$outer:meta])*
         pub struct $BitFlags:ident: $T:ty {
             $(
                 $(#[$inner:ident $($args:tt)*])*
                 const $Flag:ident = $value:expr;
             )+
         }
     ) => {
-        #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
-        $(#[$outer])*
-        pub struct $BitFlags {
-            bits: $T,
-        }
-
-        __impl_bitflags! {
-            struct $BitFlags: $T {
+        __bitflags! {
+            $(#[$outer])*
+            (pub) $BitFlags: $T {
                 $(
                     $(#[$inner $($args)*])*
-                    const $Flag = $value;
+                    $Flag = $value;
                 )+
             }
         }
     };
     (
         $(#[$outer:meta])*
         struct $BitFlags:ident: $T:ty {
             $(
                 $(#[$inner:ident $($args:tt)*])*
                 const $Flag:ident = $value:expr;
             )+
         }
     ) => {
+        __bitflags! {
+            $(#[$outer])*
+            () $BitFlags: $T {
+                $(
+                    $(#[$inner $($args)*])*
+                    $Flag = $value;
+                )+
+            }
+        }
+    };
+    (
+        $(#[$outer:meta])*
+        pub ($($vis:tt)+) struct $BitFlags:ident: $T:ty {
+            $(
+                $(#[$inner:ident $($args:tt)*])*
+                const $Flag:ident = $value:expr;
+            )+
+        }
+    ) => {
+        __bitflags! {
+            $(#[$outer])*
+            (pub ($($vis)+)) $BitFlags: $T {
+                $(
+                    $(#[$inner $($args)*])*
+                    $Flag = $value;
+                )+
+            }
+        }
+    };
+}
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __bitflags {
+    (
+        $(#[$outer:meta])*
+        ($($vis:tt)*) $BitFlags:ident: $T:ty {
+            $(
+                $(#[$inner:ident $($args:tt)*])*
+                $Flag:ident = $value:expr;
+            )+
+        }
+    ) => {
         #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
         $(#[$outer])*
-        struct $BitFlags {
+        $($vis)* struct $BitFlags {
             bits: $T,
         }
 
         __impl_bitflags! {
-            struct $BitFlags: $T {
+            $BitFlags: $T {
                 $(
                     $(#[$inner $($args)*])*
-                    const $Flag = $value;
+                    $Flag = $value;
                 )+
             }
         }
     };
 }
 
 #[macro_export]
 #[doc(hidden)]
 macro_rules! __impl_bitflags {
     (
-        struct $BitFlags:ident: $T:ty {
+        $BitFlags:ident: $T:ty {
             $(
                 $(#[$attr:ident $($args:tt)*])*
-                const $Flag:ident = $value:expr;
+                $Flag:ident = $value:expr;
             )+
         }
     ) => {
         impl $crate::_core::fmt::Debug for $BitFlags {
             fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
                 // This convoluted approach is to handle #[cfg]-based flag
                 // omission correctly. For example it needs to support:
                 //
                 //    #[cfg(unix)] const A: Flag = /* ... */;
                 //    #[cfg(windows)] const B: Flag = /* ... */;
 
                 // Unconditionally define a check for every flag, even disabled
                 // ones.
                 #[allow(non_snake_case)]
                 trait __BitFlags {
                     $(
+                        #[inline]
                         fn $Flag(&self) -> bool { false }
                     )+
                 }
 
                 // Conditionally override the check for just those flags that
                 // are not #[cfg]ed away.
                 impl __BitFlags for $BitFlags {
                     $(
                         __impl_bitflags! {
                             #[allow(deprecated)]
+                            #[inline]
                             $(? #[$attr $($args)*])*
                             fn $Flag(&self) -> bool {
                                 self.bits & Self::$Flag.bits == Self::$Flag.bits
                             }
                         }
                     )+
                 }
 
@@ -449,23 +482,25 @@ macro_rules! __impl_bitflags {
 
             /// Returns the set containing all flags.
             #[inline]
             pub fn all() -> $BitFlags {
                 // See `Debug::fmt` for why this approach is taken.
                 #[allow(non_snake_case)]
                 trait __BitFlags {
                     $(
+                        #[inline]
                         fn $Flag() -> $T { 0 }
                     )+
                 }
                 impl __BitFlags for $BitFlags {
                     $(
                         __impl_bitflags! {
                             #[allow(deprecated)]
+                            #[inline]
                             $(? #[$attr $($args)*])*
                             fn $Flag() -> $T { Self::$Flag.bits }
                         }
                     )+
                 }
                 $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag())|+ }
             }
 
@@ -712,26 +747,24 @@ mod tests {
     use std::collections::hash_map::DefaultHasher;
 
     bitflags! {
         #[doc = "> The first principle is that you must not fool yourself — and"]
         #[doc = "> you are the easiest person to fool."]
         #[doc = "> "]
         #[doc = "> - Richard Feynman"]
         struct Flags: u32 {
-            const FLAG_A       = 0b00000001;
+            const A = 0b00000001;
             #[doc = "<pcwalton> macros are way better at generating code than trans is"]
-            const FLAG_B       = 0b00000010;
-            const FLAG_C       = 0b00000100;
+            const B = 0b00000010;
+            const C = 0b00000100;
             #[doc = "* cmr bed"]
             #[doc = "* strcat table"]
             #[doc = "<strcat> wait what?"]
-            const FLAG_ABC     = Self::FLAG_A.bits
-                               | Self::FLAG_B.bits
-                               | Self::FLAG_C.bits;
+            const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
         }
     }
 
     bitflags! {
         struct _CfgFlags: u32 {
             #[cfg(windows)]
             const _CFG_A = 0b01;
             #[cfg(unix)]
@@ -744,173 +777,173 @@ mod tests {
     bitflags! {
         struct AnotherSetOfFlags: i8 {
             const ANOTHER_FLAG = -1_i8;
         }
     }
 
     bitflags! {
         struct LongFlags: u32 {
-            const LONG_FLAG_A = 0b1111111111111111;
+            const LONG_A = 0b1111111111111111;
         }
     }
 
     #[test]
     fn test_bits(){
         assert_eq!(Flags::empty().bits(), 0b00000000);
-        assert_eq!(Flags::FLAG_A.bits(), 0b00000001);
-        assert_eq!(Flags::FLAG_ABC.bits(), 0b00000111);
+        assert_eq!(Flags::A.bits(), 0b00000001);
+        assert_eq!(Flags::ABC.bits(), 0b00000111);
 
         assert_eq!(AnotherSetOfFlags::empty().bits(), 0b00);
         assert_eq!(AnotherSetOfFlags::ANOTHER_FLAG.bits(), !0_i8);
     }
 
     #[test]
     fn test_from_bits() {
         assert_eq!(Flags::from_bits(0), Some(Flags::empty()));
-        assert_eq!(Flags::from_bits(0b1), Some(Flags::FLAG_A));
-        assert_eq!(Flags::from_bits(0b10), Some(Flags::FLAG_B));
-        assert_eq!(Flags::from_bits(0b11), Some(Flags::FLAG_A | Flags::FLAG_B));
+        assert_eq!(Flags::from_bits(0b1), Some(Flags::A));
+        assert_eq!(Flags::from_bits(0b10), Some(Flags::B));
+        assert_eq!(Flags::from_bits(0b11), Some(Flags::A | Flags::B));
         assert_eq!(Flags::from_bits(0b1000), None);
 
         assert_eq!(AnotherSetOfFlags::from_bits(!0_i8), Some(AnotherSetOfFlags::ANOTHER_FLAG));
     }
 
     #[test]
     fn test_from_bits_truncate() {
         assert_eq!(Flags::from_bits_truncate(0), Flags::empty());
-        assert_eq!(Flags::from_bits_truncate(0b1), Flags::FLAG_A);
-        assert_eq!(Flags::from_bits_truncate(0b10), Flags::FLAG_B);
-        assert_eq!(Flags::from_bits_truncate(0b11), (Flags::FLAG_A | Flags::FLAG_B));
+        assert_eq!(Flags::from_bits_truncate(0b1), Flags::A);
+        assert_eq!(Flags::from_bits_truncate(0b10), Flags::B);
+        assert_eq!(Flags::from_bits_truncate(0b11), (Flags::A | Flags::B));
         assert_eq!(Flags::from_bits_truncate(0b1000), Flags::empty());
-        assert_eq!(Flags::from_bits_truncate(0b1001), Flags::FLAG_A);
+        assert_eq!(Flags::from_bits_truncate(0b1001), Flags::A);
 
         assert_eq!(AnotherSetOfFlags::from_bits_truncate(0_i8), AnotherSetOfFlags::empty());
     }
 
     #[test]
     fn test_is_empty(){
         assert!(Flags::empty().is_empty());
-        assert!(!Flags::FLAG_A.is_empty());
-        assert!(!Flags::FLAG_ABC.is_empty());
+        assert!(!Flags::A.is_empty());
+        assert!(!Flags::ABC.is_empty());
 
         assert!(!AnotherSetOfFlags::ANOTHER_FLAG.is_empty());
     }
 
     #[test]
     fn test_is_all() {
         assert!(Flags::all().is_all());
-        assert!(!Flags::FLAG_A.is_all());
-        assert!(Flags::FLAG_ABC.is_all());
+        assert!(!Flags::A.is_all());
+        assert!(Flags::ABC.is_all());
 
         assert!(AnotherSetOfFlags::ANOTHER_FLAG.is_all());
     }
 
     #[test]
     fn test_two_empties_do_not_intersect() {
         let e1 = Flags::empty();
         let e2 = Flags::empty();
         assert!(!e1.intersects(e2));
 
         assert!(AnotherSetOfFlags::ANOTHER_FLAG.intersects(AnotherSetOfFlags::ANOTHER_FLAG));
     }
 
     #[test]
     fn test_empty_does_not_intersect_with_full() {
         let e1 = Flags::empty();
-        let e2 = Flags::FLAG_ABC;
+        let e2 = Flags::ABC;
         assert!(!e1.intersects(e2));
     }
 
     #[test]
     fn test_disjoint_intersects() {
-        let e1 = Flags::FLAG_A;
-        let e2 = Flags::FLAG_B;
+        let e1 = Flags::A;
+        let e2 = Flags::B;
         assert!(!e1.intersects(e2));
     }
 
     #[test]
     fn test_overlapping_intersects() {
-        let e1 = Flags::FLAG_A;
-        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        let e1 = Flags::A;
+        let e2 = Flags::A | Flags::B;
         assert!(e1.intersects(e2));
     }
 
     #[test]
     fn test_contains() {
-        let e1 = Flags::FLAG_A;
-        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        let e1 = Flags::A;
+        let e2 = Flags::A | Flags::B;
         assert!(!e1.contains(e2));
         assert!(e2.contains(e1));
-        assert!(Flags::FLAG_ABC.contains(e2));
+        assert!(Flags::ABC.contains(e2));
 
         assert!(AnotherSetOfFlags::ANOTHER_FLAG.contains(AnotherSetOfFlags::ANOTHER_FLAG));
     }
 
     #[test]
     fn test_insert(){
-        let mut e1 = Flags::FLAG_A;
-        let e2 = Flags::FLAG_A | Flags::FLAG_B;
+        let mut e1 = Flags::A;
+        let e2 = Flags::A | Flags::B;
         e1.insert(e2);
         assert_eq!(e1, e2);
 
         let mut e3 = AnotherSetOfFlags::empty();
         e3.insert(AnotherSetOfFlags::ANOTHER_FLAG);
         assert_eq!(e3, AnotherSetOfFlags::ANOTHER_FLAG);
     }
 
     #[test]
     fn test_remove(){
-        let mut e1 = Flags::FLAG_A | Flags::FLAG_B;
-        let e2 = Flags::FLAG_A | Flags::FLAG_C;
+        let mut e1 = Flags::A | Flags::B;
+        let e2 = Flags::A | Flags::C;
         e1.remove(e2);
-        assert_eq!(e1, Flags::FLAG_B);
+        assert_eq!(e1, Flags::B);
 
         let mut e3 = AnotherSetOfFlags::ANOTHER_FLAG;
         e3.remove(AnotherSetOfFlags::ANOTHER_FLAG);
         assert_eq!(e3, AnotherSetOfFlags::empty());
     }
 
     #[test]
     fn test_operators() {
-        let e1 = Flags::FLAG_A | Flags::FLAG_C;
-        let e2 = Flags::FLAG_B | Flags::FLAG_C;
-        assert_eq!((e1 | e2), Flags::FLAG_ABC);     // union
-        assert_eq!((e1 & e2), Flags::FLAG_C);       // intersection
-        assert_eq!((e1 - e2), Flags::FLAG_A);       // set difference
-        assert_eq!(!e2, Flags::FLAG_A);             // set complement
-        assert_eq!(e1 ^ e2, Flags::FLAG_A | Flags::FLAG_B); // toggle
+        let e1 = Flags::A | Flags::C;
+        let e2 = Flags::B | Flags::C;
+        assert_eq!((e1 | e2), Flags::ABC);     // union
+        assert_eq!((e1 & e2), Flags::C);       // intersection
+        assert_eq!((e1 - e2), Flags::A);       // set difference
+        assert_eq!(!e2, Flags::A);             // set complement
+        assert_eq!(e1 ^ e2, Flags::A | Flags::B); // toggle
         let mut e3 = e1;
         e3.toggle(e2);
-        assert_eq!(e3, Flags::FLAG_A | Flags::FLAG_B);
+        assert_eq!(e3, Flags::A | Flags::B);
 
         let mut m4 = AnotherSetOfFlags::empty();
         m4.toggle(AnotherSetOfFlags::empty());
         assert_eq!(m4, AnotherSetOfFlags::empty());
     }
 
     #[test]
     fn test_set() {
-        let mut e1 = Flags::FLAG_A | Flags::FLAG_C;
-        e1.set(Flags::FLAG_B, true);
-        e1.set(Flags::FLAG_C, false);
+        let mut e1 = Flags::A | Flags::C;
+        e1.set(Flags::B, true);
+        e1.set(Flags::C, false);
 
-        assert_eq!(e1, Flags::FLAG_A | Flags::FLAG_B);
+        assert_eq!(e1, Flags::A | Flags::B);
     }
 
     #[test]
     fn test_assignment_operators() {
         let mut m1 = Flags::empty();
-        let e1 = Flags::FLAG_A | Flags::FLAG_C;
+        let e1 = Flags::A | Flags::C;
         // union
-        m1 |= Flags::FLAG_A;
-        assert_eq!(m1, Flags::FLAG_A);
+        m1 |= Flags::A;
+        assert_eq!(m1, Flags::A);
         // intersection
         m1 &= e1;
-        assert_eq!(m1, Flags::FLAG_A);
+        assert_eq!(m1, Flags::A);
         // set difference
         m1 -= m1;
         assert_eq!(m1, Flags::empty());
         // toggle
         m1 ^= e1;
         assert_eq!(m1, e1);
     }
 
@@ -918,149 +951,149 @@ mod tests {
     fn test_extend() {
         let mut flags;
 
         flags = Flags::empty();
         flags.extend([].iter().cloned());
         assert_eq!(flags, Flags::empty());
 
         flags = Flags::empty();
-        flags.extend([Flags::FLAG_A, Flags::FLAG_B].iter().cloned());
-        assert_eq!(flags, Flags::FLAG_A | Flags::FLAG_B);
+        flags.extend([Flags::A, Flags::B].iter().cloned());
+        assert_eq!(flags, Flags::A | Flags::B);
 
-        flags = Flags::FLAG_A;
-        flags.extend([Flags::FLAG_A, Flags::FLAG_B].iter().cloned());
-        assert_eq!(flags, Flags::FLAG_A | Flags::FLAG_B);
+        flags = Flags::A;
+        flags.extend([Flags::A, Flags::B].iter().cloned());
+        assert_eq!(flags, Flags::A | Flags::B);
 
-        flags = Flags::FLAG_B;
-        flags.extend([Flags::FLAG_A, Flags::FLAG_ABC].iter().cloned());
-        assert_eq!(flags, Flags::FLAG_ABC);
+        flags = Flags::B;
+        flags.extend([Flags::A, Flags::ABC].iter().cloned());
+        assert_eq!(flags, Flags::ABC);
     }
 
     #[test]
     fn test_from_iterator() {
         assert_eq!([].iter().cloned().collect::<Flags>(), Flags::empty());
-        assert_eq!([Flags::FLAG_A, Flags::FLAG_B].iter().cloned().collect::<Flags>(),
-                   Flags::FLAG_A | Flags::FLAG_B);
-        assert_eq!([Flags::FLAG_A, Flags::FLAG_ABC].iter().cloned().collect::<Flags>(),
-                   Flags::FLAG_ABC);
+        assert_eq!([Flags::A, Flags::B].iter().cloned().collect::<Flags>(),
+                   Flags::A | Flags::B);
+        assert_eq!([Flags::A, Flags::ABC].iter().cloned().collect::<Flags>(),
+                   Flags::ABC);
     }
 
     #[test]
     fn test_lt() {
         let mut a = Flags::empty();
         let mut b = Flags::empty();
 
         assert!(!(a < b) && !(b < a));
-        b = Flags::FLAG_B;
+        b = Flags::B;
         assert!(a < b);
-        a = Flags::FLAG_C;
+        a = Flags::C;
         assert!(!(a < b) && b < a);
-        b = Flags::FLAG_C | Flags::FLAG_B;
+        b = Flags::C | Flags::B;
         assert!(a < b);
     }
 
     #[test]
     fn test_ord() {
         let mut a = Flags::empty();
         let mut b = Flags::empty();
 
         assert!(a <= b && a >= b);
-        a = Flags::FLAG_A;
+        a = Flags::A;
         assert!(a > b && a >= b);
         assert!(b < a && b <= a);
-        b = Flags::FLAG_B;
+        b = Flags::B;
         assert!(b > a && b >= a);
         assert!(a < b && a <= b);
     }
 
     fn hash<T: Hash>(t: &T) -> u64 {
         let mut s = DefaultHasher::new();
         t.hash(&mut s);
         s.finish()
     }
 
     #[test]
     fn test_hash() {
         let mut x = Flags::empty();
         let mut y = Flags::empty();
         assert_eq!(hash(&x), hash(&y));
         x = Flags::all();
-        y = Flags::FLAG_ABC;
+        y = Flags::ABC;
         assert_eq!(hash(&x), hash(&y));
     }
 
     #[test]
     fn test_debug() {
-        assert_eq!(format!("{:?}", Flags::FLAG_A | Flags::FLAG_B), "FLAG_A | FLAG_B");
+        assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
         assert_eq!(format!("{:?}", Flags::empty()), "(empty)");
-        assert_eq!(format!("{:?}", Flags::FLAG_ABC), "FLAG_A | FLAG_B | FLAG_C | FLAG_ABC");
+        assert_eq!(format!("{:?}", Flags::ABC), "A | B | C | ABC");
     }
 
     #[test]
     fn test_binary() {
-        assert_eq!(format!("{:b}", Flags::FLAG_ABC), "111");
-        assert_eq!(format!("{:#b}", Flags::FLAG_ABC), "0b111");
+        assert_eq!(format!("{:b}", Flags::ABC), "111");
+        assert_eq!(format!("{:#b}", Flags::ABC), "0b111");
     }
 
     #[test]
     fn test_octal() {
-        assert_eq!(format!("{:o}", LongFlags::LONG_FLAG_A), "177777");
-        assert_eq!(format!("{:#o}", LongFlags::LONG_FLAG_A), "0o177777");
+        assert_eq!(format!("{:o}", LongFlags::LONG_A), "177777");
+        assert_eq!(format!("{:#o}", LongFlags::LONG_A), "0o177777");
     }
 
     #[test]
     fn test_lowerhex() {
-        assert_eq!(format!("{:x}", LongFlags::LONG_FLAG_A), "ffff");
-        assert_eq!(format!("{:#x}", LongFlags::LONG_FLAG_A), "0xffff");
+        assert_eq!(format!("{:x}", LongFlags::LONG_A), "ffff");
+        assert_eq!(format!("{:#x}", LongFlags::LONG_A), "0xffff");
     }
 
     #[test]
     fn test_upperhex() {
-        assert_eq!(format!("{:X}", LongFlags::LONG_FLAG_A), "FFFF");
-        assert_eq!(format!("{:#X}", LongFlags::LONG_FLAG_A), "0xFFFF");
+        assert_eq!(format!("{:X}", LongFlags::LONG_A), "FFFF");
+        assert_eq!(format!("{:#X}", LongFlags::LONG_A), "0xFFFF");
     }
 
     mod submodule {
         bitflags! {
             pub struct PublicFlags: i8 {
-                const FLAG_X = 0;
+                const X = 0;
             }
         }
         bitflags! {
             struct PrivateFlags: i8 {
-                const FLAG_Y = 0;
+                const Y = 0;
             }
         }
 
         #[test]
         fn test_private() {
 
-            let _ = PrivateFlags::FLAG_Y;
+            let _ = PrivateFlags::Y;
         }
     }
 
     #[test]
     fn test_public() {
-        let _ = submodule::PublicFlags::FLAG_X;
+        let _ = submodule::PublicFlags::X;
     }
 
     mod t1 {
         mod foo {
             pub type Bar = i32;
         }
 
         bitflags! {
             /// baz
             struct Flags: foo::Bar {
-                const A       = 0b00000001;
+                const A = 0b00000001;
                 #[cfg(foo)]
-                const B       = 0b00000010;
+                const B = 0b00000010;
                 #[cfg(foo)]
-                const C       = 0b00000010;
+                const C = 0b00000010;
             }
         }
     }
 
     #[test]
     fn test_in_function() {
         bitflags! {
            struct Flags: u8 {
@@ -1073,13 +1106,55 @@ mod tests {
         assert_eq!(format!("{:?}", Flags::A), "A");
     }
 
     #[test]
     fn test_deprecated() {
         bitflags! {
             pub struct TestFlags: u32 {
                 #[deprecated(note = "Use something else.")]
-                const FLAG_ONE = 1;
+                const ONE = 1;
             }
         }
     }
+
+    #[test]
+    fn test_pub_crate() {
+        mod module {
+            bitflags! {
+                pub (crate) struct Test: u8 {
+                    const FOO = 1;
+                }
+            }
+        }
+
+        assert_eq!(module::Test::FOO.bits(), 1);
+    }
+
+    #[test]
+    fn test_pub_in_module() {
+        mod module {
+            mod submodule {
+                bitflags! {
+                    // `pub (in super)` means only the module `module` will
+                    // be able to access this.
+                    pub (in super) struct Test: u8 {
+                        const FOO = 1;
+                    }
+                }
+            }
+
+            mod test {
+                // Note: due to `pub (in super)`,
+                // this cannot be accessed directly by the testing code.
+                pub (in super) fn value() -> u8 {
+                    super::submodule::Test::FOO.bits()
+                }
+            }
+
+            pub fn value() -> u8 {
+                test::value()
+            }
+        }
+
+        assert_eq!(module::value(), 1)
+    }
 }
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"a798200a7a2a7b499b4c44f0e516cd8975dc5f4b933144d1e2b1523087330b95","CHANGELOG.md":"caa17ca58eafcd282ed7b8bd47ef0670ce30a20aad339bf2758469f09fa4559d","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"0e636678a02b111d1ebdfdc8ac5a835a2a41370028eeadf6d5fbfd3239f531f8","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"0559514b9d7488e96fb7a2f3c043a62fadf3495a1e10602d109ce79ee67da998","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"250d46461a0529a856d76a6421fd45c499bccba2c532e05dbf438c94582a8eac","src/io.rs":"5429f522221b3cce8a5c90fba7ad98b0ddad4fab44acc39763e6adabd511c021","src/lib.rs":"d31f218ca1892bea2812dd575ceb700779de704dc8bf1b9a778315ab75343c5d"},"package":"ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: rust
-rust:
-  - 1.12.0
-  - stable
-  - beta
-  - nightly
-script:
-  - cargo build --verbose
-  - cargo doc
-  - cargo test --verbose
-  - cargo test --verbose --no-default-features --lib
-  - if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then
-      cargo test --verbose --features i128;
-      cargo test --verbose --no-default-features --features i128 --lib;
-      cargo bench --verbose --no-run;
-      cargo bench --verbose --no-run --no-default-features;
-      cargo bench --verbose --no-run --features i128;
-      cargo bench --verbose --no-run --no-default-features --features i128;
-    fi
-branches:
-  only:
-    - master
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/CHANGELOG.md
+++ /dev/null
@@ -1,36 +0,0 @@
-1.1.0
-=====
-This release of `byteorder` features a number of fixes and improvements, mostly
-as a result of the
-[Litz Blitz evaluation](https://public.etherpad-mozilla.org/p/rust-crate-eval-byteorder).
-
-Feature enhancements:
-
-* [FEATURE #63](https://github.com/BurntSushi/byteorder/issues/63):
-  Add methods for reading/writing slices of numbers for a specific
-  endianness.
-* [FEATURE #65](https://github.com/BurntSushi/byteorder/issues/65):
-  Add support for `u128`/`i128` types. (Behind the nightly only `i128`
-  feature.)
-* [FEATURE #72](https://github.com/BurntSushi/byteorder/issues/72):
-  Add "panics" and "errors" sections for each relevant public API item.
-* [FEATURE #74](https://github.com/BurntSushi/byteorder/issues/74):
-  Add CI badges to Cargo.toml.
-* [FEATURE #75](https://github.com/BurntSushi/byteorder/issues/75):
-  Add more examples to public API items.
-* Add 24-bit read/write methods.
-* Add `BE` and `LE` type aliases for `BigEndian` and `LittleEndian`,
-  respectively.
-
-Bug fixes:
-
-* [BUG #68](https://github.com/BurntSushi/byteorder/issues/68):
-  Panic in {BigEndian,LittleEndian}::default.
-* [BUG #69](https://github.com/BurntSushi/byteorder/issues/69):
-  Seal the `ByteOrder` trait to prevent out-of-crate implementations.
-* [BUG #71](https://github.com/BurntSushi/byteorder/issues/71):
-  Guarantee that the results of `read_f32`/`read_f64` are always defined.
-* [BUG #73](https://github.com/BurntSushi/byteorder/issues/73):
-  Add crates.io categories.
-* [BUG #77](https://github.com/BurntSushi/byteorder/issues/77):
-  Add `html_root` doc attribute.
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/COPYING
+++ /dev/null
@@ -1,3 +0,0 @@
-This project is dual-licensed under the Unlicense and MIT licenses.
-
-You may use this code under the terms of either license.
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/Cargo.toml
+++ /dev/null
@@ -1,44 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "byteorder"
-version = "1.1.0"
-authors = ["Andrew Gallant <jamslam@gmail.com>"]
-description = "Library for reading/writing numbers in big-endian and little-endian."
-homepage = "https://github.com/BurntSushi/byteorder"
-documentation = "https://docs.rs/byteorder"
-readme = "README.md"
-keywords = ["byte", "endian", "big-endian", "little-endian", "binary"]
-categories = ["encoding", "parsing"]
-license = "Unlicense/MIT"
-repository = "https://github.com/BurntSushi/byteorder"
-[profile.bench]
-opt-level = 3
-
-[lib]
-name = "byteorder"
-bench = false
-[dev-dependencies.rand]
-version = "0.3"
-
-[dev-dependencies.quickcheck]
-version = "0.4"
-default-features = false
-
-[features]
-default = ["std"]
-i128 = []
-std = []
-[badges.travis-ci]
-branch = "master"
-repository = "https://github.com/BurntSushi/byteorder"
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/LICENSE-MIT
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Andrew Gallant
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/README.md
+++ /dev/null
@@ -1,56 +0,0 @@
-This crate provides convenience methods for encoding and decoding numbers in
-either big-endian or little-endian order.
-
-[![Build status](https://api.travis-ci.org/BurntSushi/byteorder.png)](https://travis-ci.org/BurntSushi/byteorder)
-[![](http://meritbadge.herokuapp.com/byteorder)](https://crates.io/crates/byteorder)
-
-Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
-
-
-### Documentation
-
-https://docs.rs/byteorder
-
-
-### Installation
-
-This crate works with Cargo and is on
-[crates.io](https://crates.io/crates/byteorder). Add it to your `Cargo.toml`
-like so:
-
-```toml
-[dependencies]
-byteorder = "1"
-```
-
-If you want to augment existing `Read` and `Write` traits, then import the
-extension methods like so:
-
-```rust
-extern crate byteorder;
-
-use byteorder::{ReadBytesExt, WriteBytesExt, BigEndian, LittleEndian};
-```
-
-For example:
-
-```rust
-use std::io::Cursor;
-use byteorder::{BigEndian, ReadBytesExt};
-
-let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-// Note that we use type parameters to indicate which kind of byte order
-// we want!
-assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
-assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
-```
-
-### `no_std` crates
-
-This crate has a feature, `std`, that is enabled by default. To use this crate
-in a `no_std` context, add the following to your `Cargo.toml`:
-
-```toml
-[dependencies]
-byteorder = { version = "1", default-features = false }
-```
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/UNLICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <http://unlicense.org/>
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/benches/bench.rs
+++ /dev/null
@@ -1,320 +0,0 @@
-#![cfg_attr(feature = "i128", feature(i128))]
-#![feature(test)]
-
-extern crate byteorder;
-extern crate rand;
-extern crate test;
-
-macro_rules! bench_num {
-    ($name:ident, $read:ident, $bytes:expr, $data:expr) => (
-        mod $name {
-            use byteorder::{ByteOrder, BigEndian, NativeEndian, LittleEndian};
-            use super::test::Bencher;
-            use super::test::black_box as bb;
-
-            const NITER: usize = 100_000;
-
-            #[bench]
-            fn read_big_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(BigEndian::$read(&buf, $bytes));
-                    }
-                });
-            }
-
-            #[bench]
-            fn read_little_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(LittleEndian::$read(&buf, $bytes));
-                    }
-                });
-            }
-
-            #[bench]
-            fn read_native_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(NativeEndian::$read(&buf, $bytes));
-                    }
-                });
-            }
-        }
-    );
-    ($ty:ident, $max:ident,
-     $read:ident, $write:ident, $size:expr, $data:expr) => (
-        mod $ty {
-            use std::$ty;
-            use byteorder::{ByteOrder, BigEndian, NativeEndian, LittleEndian};
-            use super::test::Bencher;
-            use super::test::black_box as bb;
-
-            const NITER: usize = 100_000;
-
-            #[bench]
-            fn read_big_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(BigEndian::$read(&buf));
-                    }
-                });
-            }
-
-            #[bench]
-            fn read_little_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(LittleEndian::$read(&buf));
-                    }
-                });
-            }
-
-            #[bench]
-            fn read_native_endian(b: &mut Bencher) {
-                let buf = $data;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(NativeEndian::$read(&buf));
-                    }
-                });
-            }
-
-            #[bench]
-            fn write_big_endian(b: &mut Bencher) {
-                let mut buf = $data;
-                let n = $ty::$max;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(BigEndian::$write(&mut buf, n));
-                    }
-                });
-            }
-
-            #[bench]
-            fn write_little_endian(b: &mut Bencher) {
-                let mut buf = $data;
-                let n = $ty::$max;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(LittleEndian::$write(&mut buf, n));
-                    }
-                });
-            }
-
-            #[bench]
-            fn write_native_endian(b: &mut Bencher) {
-                let mut buf = $data;
-                let n = $ty::$max;
-                b.iter(|| {
-                    for _ in 0..NITER {
-                        bb(NativeEndian::$write(&mut buf, n));
-                    }
-                });
-            }
-        }
-    );
-}
-
-bench_num!(u16, MAX, read_u16, write_u16, 2, [1, 2]);
-bench_num!(i16, MAX, read_i16, write_i16, 2, [1, 2]);
-bench_num!(u32, MAX, read_u32, write_u32, 4, [1, 2, 3, 4]);
-bench_num!(i32, MAX, read_i32, write_i32, 4, [1, 2, 3, 4]);
-bench_num!(u64, MAX, read_u64, write_u64, 8, [1, 2, 3, 4, 5, 6, 7, 8]);
-bench_num!(i64, MAX, read_i64, write_i64, 8, [1, 2, 3, 4, 5, 6, 7, 8]);
-bench_num!(f32, MAX, read_f32, write_f32, 4, [1, 2, 3, 4]);
-bench_num!(f64, MAX, read_f64, write_f64, 8,
-           [1, 2, 3, 4, 5, 6, 7, 8]);
-
-bench_num!(uint_1, read_uint, 1, [1]);
-bench_num!(uint_2, read_uint, 2, [1, 2]);
-bench_num!(uint_3, read_uint, 3, [1, 2, 3]);
-bench_num!(uint_4, read_uint, 4, [1, 2, 3, 4]);
-bench_num!(uint_5, read_uint, 5, [1, 2, 3, 4, 5]);
-bench_num!(uint_6, read_uint, 6, [1, 2, 3, 4, 5, 6]);
-bench_num!(uint_7, read_uint, 7, [1, 2, 3, 4, 5, 6, 7]);
-bench_num!(uint_8, read_uint, 8, [1, 2, 3, 4, 5, 6, 7, 8]);
-
-bench_num!(int_1, read_int, 1, [1]);
-bench_num!(int_2, read_int, 2, [1, 2]);
-bench_num!(int_3, read_int, 3, [1, 2, 3]);
-bench_num!(int_4, read_int, 4, [1, 2, 3, 4]);
-bench_num!(int_5, read_int, 5, [1, 2, 3, 4, 5]);
-bench_num!(int_6, read_int, 6, [1, 2, 3, 4, 5, 6]);
-bench_num!(int_7, read_int, 7, [1, 2, 3, 4, 5, 6, 7]);
-bench_num!(int_8, read_int, 8, [1, 2, 3, 4, 5, 6, 7, 8]);
-
-#[cfg(feature = "i128")]
-bench_num!(u128, MAX, read_u128, write_u128,
-    16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-#[cfg(feature = "i128")]
-bench_num!(i128, MAX, read_i128, write_i128,
-    16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-
-#[cfg(feature = "i128")]
-bench_num!(uint128_1, read_uint128,
-    1, [1]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_2, read_uint128,
-    2, [1, 2]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_3, read_uint128,
-    3, [1, 2, 3]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_4, read_uint128,
-    4, [1, 2, 3, 4]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_5, read_uint128,
-    5, [1, 2, 3, 4, 5]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_6, read_uint128,
-    6, [1, 2, 3, 4, 5, 6]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_7, read_uint128,
-    7, [1, 2, 3, 4, 5, 6, 7]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_8, read_uint128,
-    8, [1, 2, 3, 4, 5, 6, 7, 8]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_9, read_uint128,
-    9, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_10, read_uint128,
-    10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_11, read_uint128,
-    11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_12, read_uint128,
-    12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_13, read_uint128,
-    13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_14, read_uint128,
-    14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_15, read_uint128,
-    15, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
-#[cfg(feature = "i128")]
-bench_num!(uint128_16, read_uint128,
-    16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-
-#[cfg(feature = "i128")]
-bench_num!(int128_1, read_int128,
-    1, [1]);
-#[cfg(feature = "i128")]
-bench_num!(int128_2, read_int128,
-    2, [1, 2]);
-#[cfg(feature = "i128")]
-bench_num!(int128_3, read_int128,
-    3, [1, 2, 3]);
-#[cfg(feature = "i128")]
-bench_num!(int128_4, read_int128,
-    4, [1, 2, 3, 4]);
-#[cfg(feature = "i128")]
-bench_num!(int128_5, read_int128,
-    5, [1, 2, 3, 4, 5]);
-#[cfg(feature = "i128")]
-bench_num!(int128_6, read_int128,
-    6, [1, 2, 3, 4, 5, 6]);
-#[cfg(feature = "i128")]
-bench_num!(int128_7, read_int128,
-    7, [1, 2, 3, 4, 5, 6, 7]);
-#[cfg(feature = "i128")]
-bench_num!(int128_8, read_int128,
-    8, [1, 2, 3, 4, 5, 6, 7, 8]);
-#[cfg(feature = "i128")]
-bench_num!(int128_9, read_int128,
-    9, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
-#[cfg(feature = "i128")]
-bench_num!(int128_10, read_int128,
-    10, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
-#[cfg(feature = "i128")]
-bench_num!(int128_11, read_int128,
-    11, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);
-#[cfg(feature = "i128")]
-bench_num!(int128_12, read_int128,
-    12, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
-#[cfg(feature = "i128")]
-bench_num!(int128_13, read_int128,
-    13, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
-#[cfg(feature = "i128")]
-bench_num!(int128_14, read_int128,
-    14, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
-#[cfg(feature = "i128")]
-bench_num!(int128_15, read_int128,
-    15, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
-#[cfg(feature = "i128")]
-bench_num!(int128_16, read_int128,
-    16, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
-
-
-macro_rules! bench_slice {
-    ($name:ident, $numty:ty, $read:ident, $write:ident) => {
-        mod $name {
-            use std::mem::size_of;
-
-            use byteorder::{ByteOrder, BigEndian, LittleEndian};
-            use rand::{self, Rng};
-            use test::Bencher;
-
-            #[bench]
-            fn read_big_endian(b: &mut Bencher) {
-                let mut numbers: Vec<$numty> =
-                    rand::thread_rng().gen_iter().take(100000).collect();
-                let mut bytes = vec![0; numbers.len() * size_of::<$numty>()];
-                BigEndian::$write(&numbers, &mut bytes);
-
-                b.bytes = bytes.len() as u64;
-                b.iter(|| {
-                    BigEndian::$read(&bytes, &mut numbers);
-                });
-            }
-
-            #[bench]
-            fn read_little_endian(b: &mut Bencher) {
-                let mut numbers: Vec<$numty> =
-                    rand::thread_rng().gen_iter().take(100000).collect();
-                let mut bytes = vec![0; numbers.len() * size_of::<$numty>()];
-                LittleEndian::$write(&numbers, &mut bytes);
-
-                b.bytes = bytes.len() as u64;
-                b.iter(|| {
-                    LittleEndian::$read(&bytes, &mut numbers);
-                });
-            }
-
-            #[bench]
-            fn write_big_endian(b: &mut Bencher) {
-                let numbers: Vec<$numty> =
-                    rand::thread_rng().gen_iter().take(100000).collect();
-                let mut bytes = vec![0; numbers.len() * size_of::<$numty>()];
-
-                b.bytes = bytes.len() as u64;
-                b.iter(|| {
-                    BigEndian::$write(&numbers, &mut bytes);
-                });
-            }
-
-            #[bench]
-            fn write_little_endian(b: &mut Bencher) {
-                let numbers: Vec<$numty> =
-                    rand::thread_rng().gen_iter().take(100000).collect();
-                let mut bytes = vec![0; numbers.len() * size_of::<$numty>()];
-
-                b.bytes = bytes.len() as u64;
-                b.iter(|| {
-                    LittleEndian::$write(&numbers, &mut bytes);
-                });
-            }
-        }
-    }
-}
-
-bench_slice!(slice_u64, u64, read_u64_into, write_u64_into);
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/src/io.rs
+++ /dev/null
@@ -1,1189 +0,0 @@
-use std::io::{self, Result};
-use std::slice;
-// use std::mem::transmute;
-
-use ByteOrder;
-
-/// Extends `Read` with methods for reading numbers. (For `std::io`.)
-///
-/// Most of the methods defined here have an unconstrained type parameter that
-/// must be explicitly instantiated. Typically, it is instantiated with either
-/// the `BigEndian` or `LittleEndian` types defined in this crate.
-///
-/// # Examples
-///
-/// Read unsigned 16 bit big-endian integers from a `Read`:
-///
-/// ```rust
-/// use std::io::Cursor;
-/// use byteorder::{BigEndian, ReadBytesExt};
-///
-/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-/// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
-/// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
-/// ```
-pub trait ReadBytesExt: io::Read {
-    /// Reads an unsigned 8 bit integer from the underlying reader.
-    ///
-    /// Note that since this reads a single byte, no byte order conversions
-    /// are used. It is included for completeness.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read unsigned 8 bit integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![2, 5]);
-    /// assert_eq!(2, rdr.read_u8().unwrap());
-    /// assert_eq!(5, rdr.read_u8().unwrap());
-    /// ```
-    #[inline]
-    fn read_u8(&mut self) -> Result<u8> {
-        let mut buf = [0; 1];
-        try!(self.read_exact(&mut buf));
-        Ok(buf[0])
-    }
-
-    /// Reads a signed 8 bit integer from the underlying reader.
-    ///
-    /// Note that since this reads a single byte, no byte order conversions
-    /// are used. It is included for completeness.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read unsigned 8 bit integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x02, 0xfb]);
-    /// assert_eq!(2, rdr.read_i8().unwrap());
-    /// assert_eq!(-5, rdr.read_i8().unwrap());
-    /// ```
-    #[inline]
-    fn read_i8(&mut self) -> Result<i8> {
-        let mut buf = [0; 1];
-        try!(self.read_exact(&mut buf));
-        Ok(buf[0] as i8)
-    }
-
-    /// Reads an unsigned 16 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read unsigned 16 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-    /// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
-    /// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_u16<T: ByteOrder>(&mut self) -> Result<u16> {
-        let mut buf = [0; 2];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_u16(&buf))
-    }
-
-    /// Reads a signed 16 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read signed 16 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x00, 0xc1, 0xff, 0x7c]);
-    /// assert_eq!(193, rdr.read_i16::<BigEndian>().unwrap());
-    /// assert_eq!(-132, rdr.read_i16::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_i16<T: ByteOrder>(&mut self) -> Result<i16> {
-        let mut buf = [0; 2];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_i16(&buf))
-    }
-
-    /// Reads an unsigned 24 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read unsigned 24 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x00, 0x01, 0x0b]);
-    /// assert_eq!(267, rdr.read_u24::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_u24<T: ByteOrder>(&mut self) -> Result<u32> {
-        let mut buf = [0; 3];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_u24(&buf))
-    }
-
-    /// Reads a signed 24 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read signed 24 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0xff, 0x7a, 0x33]);
-    /// assert_eq!(-34253, rdr.read_i24::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_i24<T: ByteOrder>(&mut self) -> Result<i32> {
-        let mut buf = [0; 3];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_i24(&buf))
-    }
-
-    /// Reads an unsigned 32 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read unsigned 32 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x00, 0x00, 0x01, 0x0b]);
-    /// assert_eq!(267, rdr.read_u32::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_u32<T: ByteOrder>(&mut self) -> Result<u32> {
-        let mut buf = [0; 4];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_u32(&buf))
-    }
-
-    /// Reads a signed 32 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read signed 32 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0xff, 0xff, 0x7a, 0x33]);
-    /// assert_eq!(-34253, rdr.read_i32::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_i32<T: ByteOrder>(&mut self) -> Result<i32> {
-        let mut buf = [0; 4];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_i32(&buf))
-    }
-
-    /// Reads an unsigned 64 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read an unsigned 64 bit big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83]);
-    /// assert_eq!(918733457491587, rdr.read_u64::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_u64<T: ByteOrder>(&mut self) -> Result<u64> {
-        let mut buf = [0; 8];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_u64(&buf))
-    }
-
-    /// Reads a signed 64 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a signed 64 bit big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0]);
-    /// assert_eq!(i64::min_value(), rdr.read_i64::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_i64<T: ByteOrder>(&mut self) -> Result<i64> {
-        let mut buf = [0; 8];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_i64(&buf))
-    }
-
-    /// Reads an unsigned 128 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read an unsigned 128 bit big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83,
-    ///     0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
-    /// ]);
-    /// assert_eq!(16947640962301618749969007319746179, rdr.read_u128::<BigEndian>().unwrap());
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128<T: ByteOrder>(&mut self) -> Result<u128> {
-        let mut buf = [0; 16];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_u128(&buf))
-    }
-
-    /// Reads a signed 128 bit integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a signed 128 bit big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// #![feature(i128_type)]
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
-    /// assert_eq!(i128::min_value(), rdr.read_i128::<BigEndian>().unwrap());
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_i128<T: ByteOrder>(&mut self) -> Result<i128> {
-        let mut buf = [0; 16];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_i128(&buf))
-    }
-
-    /// Reads an unsigned n-bytes integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read an unsigned n-byte big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0x80, 0x74, 0xfa]);
-    /// assert_eq!(8418554, rdr.read_uint::<BigEndian>(3).unwrap());
-    #[inline]
-    fn read_uint<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u64> {
-        let mut buf = [0; 8];
-        try!(self.read_exact(&mut buf[..nbytes]));
-        Ok(T::read_uint(&buf[..nbytes], nbytes))
-    }
-
-    /// Reads a signed n-bytes integer from the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read an unsigned n-byte big-endian integer from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0xc1, 0xff, 0x7c]);
-    /// assert_eq!(-4063364, rdr.read_int::<BigEndian>(3).unwrap());
-    #[inline]
-    fn read_int<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i64> {
-        let mut buf = [0; 8];
-        try!(self.read_exact(&mut buf[..nbytes]));
-        Ok(T::read_int(&buf[..nbytes], nbytes))
-    }
-
-    /// Reads an unsigned n-bytes integer from the underlying reader.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_uint128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u128> {
-        let mut buf = [0; 16];
-        try!(self.read_exact(&mut buf[..nbytes]));
-        Ok(T::read_uint128(&buf[..nbytes], nbytes))
-    }
-
-    /// Reads a signed n-bytes integer from the underlying reader.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_int128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i128> {
-        let mut buf = [0; 16];
-        try!(self.read_exact(&mut buf[..nbytes]));
-        Ok(T::read_int128(&buf[..nbytes], nbytes))
-    }
-
-    /// Reads a IEEE754 single-precision (4 bytes) floating point number from
-    /// the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a big-endian single-precision floating point number from a `Read`:
-    ///
-    /// ```rust
-    /// use std::f32;
-    /// use std::io::Cursor;
-    ///
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0x40, 0x49, 0x0f, 0xdb,
-    /// ]);
-    /// assert_eq!(f32::consts::PI, rdr.read_f32::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_f32<T: ByteOrder>(&mut self) -> Result<f32> {
-        let mut buf = [0; 4];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_f32(&buf))
-    }
-
-    /// Reads a IEEE754 double-precision (8 bytes) floating point number from
-    /// the underlying reader.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a big-endian double-precision floating point number from a `Read`:
-    ///
-    /// ```rust
-    /// use std::f64;
-    /// use std::io::Cursor;
-    ///
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18,
-    /// ]);
-    /// assert_eq!(f64::consts::PI, rdr.read_f64::<BigEndian>().unwrap());
-    /// ```
-    #[inline]
-    fn read_f64<T: ByteOrder>(&mut self) -> Result<f64> {
-        let mut buf = [0; 8];
-        try!(self.read_exact(&mut buf));
-        Ok(T::read_f64(&buf))
-    }
-
-    /// Reads a sequence of unsigned 16 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of unsigned 16 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_u16_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_u16_into<T: ByteOrder>(&mut self, dst: &mut [u16]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_u16(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of unsigned 32 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of unsigned 32 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0, 0, 2, 5, 0, 0, 3, 0]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_u32_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_u32_into<T: ByteOrder>(&mut self, dst: &mut [u32]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_u32(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of unsigned 64 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of unsigned 64 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0, 0, 0, 0, 0, 0, 2, 5,
-    ///     0, 0, 0, 0, 0, 0, 3, 0,
-    /// ]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_u64_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_u64_into<T: ByteOrder>(&mut self, dst: &mut [u64]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_u64(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of unsigned 128 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of unsigned 128 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,
-    ///     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
-    /// ]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_u128_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128_into<T: ByteOrder>(
-        &mut self,
-        dst: &mut [u128],
-    ) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_u128(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of signed 16 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of signed 16 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_i16_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_i16_into<T: ByteOrder>(&mut self, dst: &mut [i16]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_i16(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of signed 32 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of signed 32 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![0, 0, 2, 5, 0, 0, 3, 0]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_i32_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_i32_into<T: ByteOrder>(&mut self, dst: &mut [i32]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_i32(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of signed 64 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of signed 64 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0, 0, 0, 0, 0, 0, 2, 5,
-    ///     0, 0, 0, 0, 0, 0, 3, 0,
-    /// ]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_i64_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[inline]
-    fn read_i64_into<T: ByteOrder>(&mut self, dst: &mut [i64]) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_i64(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of signed 128 bit integers from the underlying
-    /// reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of signed 128 bit big-endian integers from a `Read`:
-    ///
-    /// ```rust
-    /// use std::io::Cursor;
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,
-    ///     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,
-    /// ]);
-    /// let mut dst = [0; 2];
-    /// rdr.read_i128_into::<BigEndian>(&mut dst).unwrap();
-    /// assert_eq!([517, 768], dst);
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_i128_into<T: ByteOrder>(
-        &mut self,
-        dst: &mut [i128],
-    ) -> Result<()> {
-        {
-            let mut buf = unsafe { slice_to_u8_mut(dst) };
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_i128(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of IEEE754 single-precision (4 bytes) floating
-    /// point numbers from the underlying reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Safety
-    ///
-    /// This method is unsafe because there are no guarantees made about the
-    /// floating point values. In particular, this method does not check for
-    /// signaling NaNs, which may result in undefined behavior.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of big-endian single-precision floating point number
-    /// from a `Read`:
-    ///
-    /// ```rust
-    /// use std::f32;
-    /// use std::io::Cursor;
-    ///
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0x40, 0x49, 0x0f, 0xdb,
-    ///     0x3f, 0x80, 0x00, 0x00,
-    /// ]);
-    /// let mut dst = [0.0; 2];
-    /// unsafe {
-    ///     rdr.read_f32_into_unchecked::<BigEndian>(&mut dst).unwrap();
-    /// }
-    /// assert_eq!([f32::consts::PI, 1.0], dst);
-    /// ```
-    #[inline]
-    unsafe fn read_f32_into_unchecked<T: ByteOrder>(
-        &mut self,
-        dst: &mut [f32],
-    ) -> Result<()> {
-        {
-            let mut buf = slice_to_u8_mut(dst);
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_f32(dst);
-        Ok(())
-    }
-
-    /// Reads a sequence of IEEE754 double-precision (8 bytes) floating
-    /// point numbers from the underlying reader.
-    ///
-    /// The given buffer is either filled completely or an error is returned.
-    /// If an error is returned, the contents of `dst` are unspecified.
-    ///
-    /// # Safety
-    ///
-    /// This method is unsafe because there are no guarantees made about the
-    /// floating point values. In particular, this method does not check for
-    /// signaling NaNs, which may result in undefined behavior.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Read::read_exact`].
-    ///
-    /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
-    ///
-    /// # Examples
-    ///
-    /// Read a sequence of big-endian single-precision floating point number
-    /// from a `Read`:
-    ///
-    /// ```rust
-    /// use std::f64;
-    /// use std::io::Cursor;
-    ///
-    /// use byteorder::{BigEndian, ReadBytesExt};
-    ///
-    /// let mut rdr = Cursor::new(vec![
-    ///     0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18,
-    ///     0x3f, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    /// ]);
-    /// let mut dst = [0.0; 2];
-    /// unsafe {
-    ///     rdr.read_f64_into_unchecked::<BigEndian>(&mut dst).unwrap();
-    /// }
-    /// assert_eq!([f64::consts::PI, 1.0], dst);
-    /// ```
-    #[inline]
-    unsafe fn read_f64_into_unchecked<T: ByteOrder>(
-        &mut self,
-        dst: &mut [f64],
-    ) -> Result<()> {
-        {
-            let mut buf = slice_to_u8_mut(dst);
-            try!(self.read_exact(buf));
-        }
-        T::from_slice_f64(dst);
-        Ok(())
-    }
-}
-
-/// All types that implement `Read` get methods defined in `ReadBytesExt`
-/// for free.
-impl<R: io::Read + ?Sized> ReadBytesExt for R {}
-
-/// Extends `Write` with methods for writing numbers. (For `std::io`.)
-///
-/// Most of the methods defined here have an unconstrained type parameter that
-/// must be explicitly instantiated. Typically, it is instantiated with either
-/// the `BigEndian` or `LittleEndian` types defined in this crate.
-///
-/// # Examples
-///
-/// Write unsigned 16 bit big-endian integers to a `Write`:
-///
-/// ```rust
-/// use byteorder::{BigEndian, WriteBytesExt};
-///
-/// let mut wtr = vec![];
-/// wtr.write_u16::<BigEndian>(517).unwrap();
-/// wtr.write_u16::<BigEndian>(768).unwrap();
-/// assert_eq!(wtr, vec![2, 5, 3, 0]);
-/// ```
-pub trait WriteBytesExt: io::Write {
-    /// Writes an unsigned 8 bit integer to the underlying writer.
-    ///
-    /// Note that since this writes a single byte, no byte order conversions
-    /// are used. It is included for completeness.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_u8(&mut self, n: u8) -> Result<()> {
-        self.write_all(&[n])
-    }
-
-    /// Writes a signed 8 bit integer to the underlying writer.
-    ///
-    /// Note that since this writes a single byte, no byte order conversions
-    /// are used. It is included for completeness.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_i8(&mut self, n: i8) -> Result<()> {
-        self.write_all(&[n as u8])
-    }
-
-    /// Writes an unsigned 16 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_u16<T: ByteOrder>(&mut self, n: u16) -> Result<()> {
-        let mut buf = [0; 2];
-        T::write_u16(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a signed 16 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_i16<T: ByteOrder>(&mut self, n: i16) -> Result<()> {
-        let mut buf = [0; 2];
-        T::write_i16(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes an unsigned 24 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_u24<T: ByteOrder>(&mut self, n: u32) -> Result<()> {
-        let mut buf = [0; 3];
-        T::write_u24(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a signed 24 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_i24<T: ByteOrder>(&mut self, n: i32) -> Result<()> {
-        let mut buf = [0; 3];
-        T::write_i24(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes an unsigned 32 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_u32<T: ByteOrder>(&mut self, n: u32) -> Result<()> {
-        let mut buf = [0; 4];
-        T::write_u32(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a signed 32 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_i32<T: ByteOrder>(&mut self, n: i32) -> Result<()> {
-        let mut buf = [0; 4];
-        T::write_i32(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes an unsigned 64 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_u64<T: ByteOrder>(&mut self, n: u64) -> Result<()> {
-        let mut buf = [0; 8];
-        T::write_u64(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a signed 64 bit integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_i64<T: ByteOrder>(&mut self, n: i64) -> Result<()> {
-        let mut buf = [0; 8];
-        T::write_i64(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes an unsigned 128 bit integer to the underlying writer.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_u128<T: ByteOrder>(&mut self, n: u128) -> Result<()> {
-        let mut buf = [0; 16];
-        T::write_u128(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a signed 128 bit integer to the underlying writer.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_i128<T: ByteOrder>(&mut self, n: i128) -> Result<()> {
-        let mut buf = [0; 16];
-        T::write_i128(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes an unsigned n-bytes integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    ///
-    /// # Panics
-    ///
-    /// If the given integer is not representable in the given number of bytes,
-    /// this method panics. If `nbytes > 8`, this method panics.
-    #[inline]
-    fn write_uint<T: ByteOrder>(
-        &mut self,
-        n: u64,
-        nbytes: usize,
-    ) -> Result<()> {
-        let mut buf = [0; 8];
-        T::write_uint(&mut buf, n, nbytes);
-        self.write_all(&buf[0..nbytes])
-    }
-
-    /// Writes a signed n-bytes integer to the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    ///
-    /// # Panics
-    ///
-    /// If the given integer is not representable in the given number of bytes,
-    /// this method panics. If `nbytes > 8`, this method panics.
-    #[inline]
-    fn write_int<T: ByteOrder>(
-        &mut self,
-        n: i64,
-        nbytes: usize,
-    ) -> Result<()> {
-        let mut buf = [0; 8];
-        T::write_int(&mut buf, n, nbytes);
-        self.write_all(&buf[0..nbytes])
-    }
-
-    /// Writes an unsigned n-bytes integer to the underlying writer.
-    ///
-    /// If the given integer is not representable in the given number of bytes,
-    /// this method panics. If `nbytes > 16`, this method panics.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_uint128<T: ByteOrder>(
-        &mut self,
-        n: u128,
-        nbytes: usize,
-    ) -> Result<()> {
-        let mut buf = [0; 16];
-        T::write_uint128(&mut buf, n, nbytes);
-        self.write_all(&buf[0..nbytes])
-    }
-
-    /// Writes a signed n-bytes integer to the underlying writer.
-    ///
-    /// If the given integer is not representable in the given number of bytes,
-    /// this method panics. If `nbytes > 16`, this method panics.
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_int128<T: ByteOrder>(
-        &mut self,
-        n: i128,
-        nbytes: usize,
-    ) -> Result<()> {
-        let mut buf = [0; 16];
-        T::write_int128(&mut buf, n, nbytes);
-        self.write_all(&buf[0..nbytes])
-    }
-
-    /// Writes a IEEE754 single-precision (4 bytes) floating point number to
-    /// the underlying writer.
-    ///
-    /// # Errors
-    ///
-    /// This method returns the same errors as [`Write::write_all`].
-    ///
-    /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
-    #[inline]
-    fn write_f32<T: ByteOrder>(&mut self, n: f32) -> Result<()> {
-        let mut buf = [0; 4];
-        T::write_f32(&mut buf, n);
-        self.write_all(&buf)
-    }
-
-    /// Writes a IEEE754 double-precision (8 bytes) floating point number to
-    /// the underlying writer.
-    #[inline]
-    fn write_f64<T: ByteOrder>(&mut self, n: f64) -> Result<()> {
-        let mut buf = [0; 8];
-        T::write_f64(&mut buf, n);
-        self.write_all(&buf)
-    }
-}
-
-/// All types that implement `Write` get methods defined in `WriteBytesExt`
-/// for free.
-impl<W: io::Write + ?Sized> WriteBytesExt for W {}
-
-/// Convert a slice of T (where T is plain old data) to its mutable binary
-/// representation.
-///
-/// This function is wildly unsafe because it permits arbitrary modification of
-/// the binary representation of any `Copy` type. Use with care.
-unsafe fn slice_to_u8_mut<T: Copy>(slice: &mut [T]) -> &mut [u8] {
-    use std::mem::size_of;
-
-    let len = size_of::<T>() * slice.len();
-    slice::from_raw_parts_mut(slice.as_mut_ptr() as *mut u8, len)
-}
deleted file mode 100644
--- a/third_party/rust/byteorder-1.1.0/src/lib.rs
+++ /dev/null
@@ -1,3191 +0,0 @@
-/*!
-This crate provides convenience methods for encoding and decoding numbers
-in either big-endian or little-endian order.
-
-The organization of the crate is pretty simple. A trait, `ByteOrder`, specifies
-byte conversion methods for each type of number in Rust (sans numbers that have
-a platform dependent size like `usize` and `isize`). Two types, `BigEndian`
-and `LittleEndian` implement these methods. Finally, `ReadBytesExt` and
-`WriteBytesExt` provide convenience methods available to all types that
-implement `Read` and `Write`.
-
-# Examples
-
-Read unsigned 16 bit big-endian integers from a `Read` type:
-
-```rust
-use std::io::Cursor;
-use byteorder::{BigEndian, ReadBytesExt};
-
-let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
-// Note that we use type parameters to indicate which kind of byte order
-// we want!
-assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
-assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
-```
-
-Write unsigned 16 bit little-endian integers to a `Write` type:
-
-```rust
-use byteorder::{LittleEndian, WriteBytesExt};
-
-let mut wtr = vec![];
-wtr.write_u16::<LittleEndian>(517).unwrap();
-wtr.write_u16::<LittleEndian>(768).unwrap();
-assert_eq!(wtr, vec![5, 2, 0, 3]);
-```
-*/
-
-#![deny(missing_docs)]
-#![cfg_attr(not(feature = "std"), no_std)]
-#![cfg_attr(feature = "i128", feature(i128_type))]
-#![cfg_attr(all(feature = "i128", test), feature(i128))]
-#![doc(html_root_url = "https://docs.rs/byteorder/1.0.0")]
-
-#[cfg(feature = "std")]
-extern crate core;
-
-use core::fmt::Debug;
-use core::hash::Hash;
-use core::mem::transmute;
-use core::ptr::copy_nonoverlapping;
-
-#[cfg(feature = "std")]
-pub use io::{ReadBytesExt, WriteBytesExt};
-
-#[cfg(feature = "std")]
-mod io;
-
-#[inline]
-fn extend_sign(val: u64, nbytes: usize) -> i64 {
-    let shift = (8 - nbytes) * 8;
-    (val << shift) as i64 >> shift
-}
-
-#[cfg(feature = "i128")]
-#[inline]
-fn extend_sign128(val: u128, nbytes: usize) -> i128 {
-    let shift = (16 - nbytes) * 8;
-    (val << shift) as i128 >> shift
-}
-
-#[inline]
-fn unextend_sign(val: i64, nbytes: usize) -> u64 {
-    let shift = (8 - nbytes) * 8;
-    (val << shift) as u64 >> shift
-}
-
-#[cfg(feature = "i128")]
-#[inline]
-fn unextend_sign128(val: i128, nbytes: usize) -> u128 {
-    let shift = (16 - nbytes) * 8;
-    (val << shift) as u128 >> shift
-}
-
-#[inline]
-fn pack_size(n: u64) -> usize {
-    if n < 1 << 8 {
-        1
-    } else if n < 1 << 16 {
-        2
-    } else if n < 1 << 24 {
-        3
-    } else if n < 1 << 32 {
-        4
-    } else if n < 1 << 40 {
-        5
-    } else if n < 1 << 48 {
-        6
-    } else if n < 1 << 56 {
-        7
-    } else {
-        8
-    }
-}
-
-#[cfg(feature = "i128")]
-#[inline]
-fn pack_size128(n: u128) -> usize {
-    if n < 1 << 8 {
-        1
-    } else if n < 1 << 16 {
-        2
-    } else if n < 1 << 24 {
-        3
-    } else if n < 1 << 32 {
-        4
-    } else if n < 1 << 40 {
-        5
-    } else if n < 1 << 48 {
-        6
-    } else if n < 1 << 56 {
-        7
-    } else if n < 1 << 64 {
-        8
-    } else if n < 1 << 72 {
-        9
-    } else if n < 1 << 80 {
-        10
-    } else if n < 1 << 88 {
-        11
-    } else if n < 1 << 96 {
-        12
-    } else if n < 1 << 104 {
-        13
-    } else if n < 1 << 112 {
-        14
-    } else if n < 1 << 120 {
-        15
-    } else {
-        16
-    }
-}
-
-mod private {
-    /// Sealed stops crates other than byteorder from implementing any traits
-    /// that use it.
-    pub trait Sealed{}
-    impl Sealed for super::LittleEndian {}
-    impl Sealed for super::BigEndian {}
-}
-
-/// ByteOrder describes types that can serialize integers as bytes.
-///
-/// Note that `Self` does not appear anywhere in this trait's definition!
-/// Therefore, in order to use it, you'll need to use syntax like
-/// `T::read_u16(&[0, 1])` where `T` implements `ByteOrder`.
-///
-/// This crate provides two types that implement `ByteOrder`: `BigEndian`
-/// and `LittleEndian`.
-/// This trait is sealed and cannot be implemented for callers to avoid
-/// breaking backwards compatibility when adding new derived traits.
-///
-/// # Examples
-///
-/// Write and read `u32` numbers in little endian order:
-///
-/// ```rust
-/// use byteorder::{ByteOrder, LittleEndian};
-///
-/// let mut buf = [0; 4];
-/// LittleEndian::write_u32(&mut buf, 1_000_000);
-/// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
-/// ```
-///
-/// Write and read `i16` numbers in big endian order:
-///
-/// ```rust
-/// use byteorder::{ByteOrder, BigEndian};
-///
-/// let mut buf = [0; 2];
-/// BigEndian::write_i16(&mut buf, -50_000);
-/// assert_eq!(-50_000, BigEndian::read_i16(&buf));
-/// ```
-pub trait ByteOrder
-    : Clone + Copy + Debug + Default + Eq + Hash + Ord + PartialEq + PartialOrd
-    + private::Sealed
-{
-    /// Reads an unsigned 16 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 2`.
-    fn read_u16(buf: &[u8]) -> u16;
-
-    /// Reads an unsigned 24 bit integer from `buf`, stored in u32.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 3`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read 24 bit `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_u24(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u24(&buf));
-    /// ```
-    fn read_u24(buf: &[u8]) -> u32 {
-        Self::read_uint(buf, 3) as u32
-    }
-
-    /// Reads an unsigned 32 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_u32(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
-    /// ```
-    fn read_u32(buf: &[u8]) -> u32;
-
-    /// Reads an unsigned 64 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_u64(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u64(&buf));
-    /// ```
-    fn read_u64(buf: &[u8]) -> u64;
-
-    /// Reads an unsigned 128 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 16`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 16];
-    /// LittleEndian::write_u128(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
-    /// ```
-    #[cfg(feature = "i128")]
-    fn read_u128(buf: &[u8]) -> u128;
-
-    /// Reads an unsigned n-bytes integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `nbytes < 1` or `nbytes > 8` or
-    /// `buf.len() < nbytes`
-    ///
-    /// # Examples
-    ///
-    /// Write and read an n-byte number in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_uint(&mut buf, 1_000_000, 3);
-    /// assert_eq!(1_000_000, LittleEndian::read_uint(&buf, 3));
-    /// ```
-    fn read_uint(buf: &[u8], nbytes: usize) -> u64;
-
-    /// Reads an unsigned n-bytes integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `nbytes < 1` or `nbytes > 16` or
-    /// `buf.len() < nbytes`
-    ///
-    /// # Examples
-    ///
-    /// Write and read an n-byte number in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
-    /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
-    /// ```
-    #[cfg(feature = "i128")]
-    fn read_uint128(buf: &[u8], nbytes: usize) -> u128;
-
-    /// Writes an unsigned 16 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 2`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 2];
-    /// LittleEndian::write_u16(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u16(&buf));
-    /// ```
-    fn write_u16(buf: &mut [u8], n: u16);
-
-    /// Writes an unsigned 24 bit integer `n` to `buf`, stored in u32.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 3`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read 24 bit `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_u24(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u24(&buf));
-    /// ```
-    fn write_u24(buf: &mut [u8], n: u32) {
-        Self::write_uint(buf, n as u64, 3)
-    }
-
-    /// Writes an unsigned 32 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_u32(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
-    /// ```
-    fn write_u32(buf: &mut [u8], n: u32);
-
-    /// Writes an unsigned 64 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_u64(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u64(&buf));
-    /// ```
-    fn write_u64(buf: &mut [u8], n: u64);
-
-    /// Writes an unsigned 128 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 16`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 16];
-    /// LittleEndian::write_u128(&mut buf, 1_000_000);
-    /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
-    /// ```
-    #[cfg(feature = "i128")]
-    fn write_u128(buf: &mut [u8], n: u128);
-
-    /// Writes an unsigned integer `n` to `buf` using only `nbytes`.
-    ///
-    /// # Panics
-    ///
-    /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 8`, then
-    /// this method panics.
-    ///
-    /// # Examples
-    ///
-    /// Write and read an n-byte number in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_uint(&mut buf, 1_000_000, 3);
-    /// assert_eq!(1_000_000, LittleEndian::read_uint(&buf, 3));
-    /// ```
-    fn write_uint(buf: &mut [u8], n: u64, nbytes: usize);
-
-    /// Writes an unsigned integer `n` to `buf` using only `nbytes`.
-    ///
-    /// # Panics
-    ///
-    /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 16`, then
-    /// this method panics.
-    ///
-    /// # Examples
-    ///
-    /// Write and read an n-byte number in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
-    /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
-    /// ```
-    #[cfg(feature = "i128")]
-    fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize);
-
-    /// Reads a signed 16 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 2`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 2];
-    /// LittleEndian::write_i16(&mut buf, -1_000);
-    /// assert_eq!(-1_000, LittleEndian::read_i16(&buf));
-    /// ```
-    #[inline]
-    fn read_i16(buf: &[u8]) -> i16 {
-        Self::read_u16(buf) as i16
-    }
-
-    /// Reads a signed 24 bit integer from `buf`, stored in i32.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 3`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read 24 bit `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_i24(&mut buf, -1_000_000);
-    /// assert_eq!(-1_000_000, LittleEndian::read_i24(&buf));
-    /// ```
-    #[inline]
-    fn read_i24(buf: &[u8]) -> i32 {
-        Self::read_int(buf, 3) as i32
-    }
-
-    /// Reads a signed 32 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_i32(&mut buf, -1_000_000);
-    /// assert_eq!(-1_000_000, LittleEndian::read_i32(&buf));
-    /// ```
-    #[inline]
-    fn read_i32(buf: &[u8]) -> i32 {
-        Self::read_u32(buf) as i32
-    }
-
-    /// Reads a signed 64 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_i64(&mut buf, -1_000_000_000);
-    /// assert_eq!(-1_000_000_000, LittleEndian::read_i64(&buf));
-    /// ```
-    #[inline]
-    fn read_i64(buf: &[u8]) -> i64 {
-        Self::read_u64(buf) as i64
-    }
-
-    /// Reads a signed 128 bit integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 16`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 16];
-    /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
-    /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_i128(buf: &[u8]) -> i128 {
-        Self::read_u128(buf) as i128
-    }
-
-    /// Reads a signed n-bytes integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `nbytes < 1` or `nbytes > 8` or
-    /// `buf.len() < nbytes`
-    ///
-    /// # Examples
-    ///
-    /// Write and read n-length signed numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_int(&mut buf, -1_000, 3);
-    /// assert_eq!(-1_000, LittleEndian::read_int(&buf, 3));
-    /// ```
-    #[inline]
-    fn read_int(buf: &[u8], nbytes: usize) -> i64 {
-        extend_sign(Self::read_uint(buf, nbytes), nbytes)
-    }
-
-    /// Reads a signed n-bytes integer from `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `nbytes < 1` or `nbytes > 16` or
-    /// `buf.len() < nbytes`
-    ///
-    /// # Examples
-    ///
-    /// Write and read n-length signed numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_int128(&mut buf, -1_000, 3);
-    /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_int128(buf: &[u8], nbytes: usize) -> i128 {
-        extend_sign128(Self::read_uint128(buf, nbytes), nbytes)
-    }
-
-    /// Reads a IEEE754 single-precision (4 bytes) floating point number.
-    ///
-    /// The return value is always defined; signaling NaN's may be turned into
-    /// quiet NaN's.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let e = 2.71828;
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_f32(&mut buf, e);
-    /// assert_eq!(e, LittleEndian::read_f32(&buf));
-    /// ```
-    #[inline]
-    fn read_f32(buf: &[u8]) -> f32 {
-        safe_u32_bits_to_f32(Self::read_u32(buf))
-    }
-
-    /// Reads a IEEE754 double-precision (8 bytes) floating point number.
-    ///
-    /// The return value is always defined; signaling NaN's may be turned into
-    /// quiet NaN's.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let phi = 1.6180339887;
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_f64(&mut buf, phi);
-    /// assert_eq!(phi, LittleEndian::read_f64(&buf));
-    /// ```
-    #[inline]
-    fn read_f64(buf: &[u8]) -> f64 {
-        safe_u64_bits_to_f64(Self::read_u64(buf))
-    }
-
-    /// Writes a signed 16 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 2`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 2];
-    /// LittleEndian::write_i16(&mut buf, -1_000);
-    /// assert_eq!(-1_000, LittleEndian::read_i16(&buf));
-    /// ```
-    #[inline]
-    fn write_i16(buf: &mut [u8], n: i16) {
-        Self::write_u16(buf, n as u16)
-    }
-
-    /// Writes a signed 24 bit integer `n` to `buf`, stored in i32.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 3`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read 24 bit `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_i24(&mut buf, -1_000_000);
-    /// assert_eq!(-1_000_000, LittleEndian::read_i24(&buf));
-    /// ```
-    #[inline]
-    fn write_i24(buf: &mut [u8], n: i32) {
-        Self::write_int(buf, n as i64, 3)
-    }
-
-    /// Writes a signed 32 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_i32(&mut buf, -1_000_000);
-    /// assert_eq!(-1_000_000, LittleEndian::read_i32(&buf));
-    /// ```
-    #[inline]
-    fn write_i32(buf: &mut [u8], n: i32) {
-        Self::write_u32(buf, n as u32)
-    }
-
-    /// Writes a signed 64 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_i64(&mut buf, -1_000_000_000);
-    /// assert_eq!(-1_000_000_000, LittleEndian::read_i64(&buf));
-    /// ```
-    #[inline]
-    fn write_i64(buf: &mut [u8], n: i64) {
-        Self::write_u64(buf, n as u64)
-    }
-
-    /// Writes a signed 128 bit integer `n` to `buf`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 16`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read n-byte `i128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 16];
-    /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
-    /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_i128(buf: &mut [u8], n: i128) {
-        Self::write_u128(buf, n as u128)
-    }
-
-    /// Writes a signed integer `n` to `buf` using only `nbytes`.
-    ///
-    /// # Panics
-    ///
-    /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 8`, then
-    /// this method panics.
-    ///
-    /// # Examples
-    ///
-    /// Write and read an n-byte number in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_int(&mut buf, -1_000, 3);
-    /// assert_eq!(-1_000, LittleEndian::read_int(&buf, 3));
-    /// ```
-    #[inline]
-    fn write_int(buf: &mut [u8], n: i64, nbytes: usize) {
-        Self::write_uint(buf, unextend_sign(n, nbytes), nbytes)
-    }
-
-    /// Writes a signed integer `n` to `buf` using only `nbytes`.
-    ///
-    /// # Panics
-    ///
-    /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 16`, then
-    /// this method panics.
-    ///
-    /// # Examples
-    ///
-    /// Write and read n-length signed numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut buf = [0; 3];
-    /// LittleEndian::write_int128(&mut buf, -1_000, 3);
-    /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_int128(buf: &mut [u8], n: i128, nbytes: usize) {
-        Self::write_uint128(buf, unextend_sign128(n, nbytes), nbytes)
-    }
-
-    /// Writes a IEEE754 single-precision (4 bytes) floating point number.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 4`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let e = 2.71828;
-    /// let mut buf = [0; 4];
-    /// LittleEndian::write_f32(&mut buf, e);
-    /// assert_eq!(e, LittleEndian::read_f32(&buf));
-    /// ```
-    #[inline]
-    fn write_f32(buf: &mut [u8], n: f32) {
-        Self::write_u32(buf, unsafe { transmute(n) })
-    }
-
-    /// Writes a IEEE754 double-precision (8 bytes) floating point number.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() < 8`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let phi = 1.6180339887;
-    /// let mut buf = [0; 8];
-    /// LittleEndian::write_f64(&mut buf, phi);
-    /// assert_eq!(phi, LittleEndian::read_f64(&buf));
-    /// ```
-    #[inline]
-    fn write_f64(buf: &mut [u8], n: f64) {
-        Self::write_u64(buf, unsafe { transmute(n) })
-    }
-
-    /// Reads unsigned 16 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 2*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 8];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u16_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u16_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn read_u16_into(src: &[u8], dst: &mut [u16]);
-
-    /// Reads unsigned 32 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 4*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u32_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn read_u32_into(src: &[u8], dst: &mut [u32]);
-
-    /// Reads unsigned 64 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 8*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u64_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn read_u64_into(src: &[u8], dst: &mut [u64]);
-
-    /// Reads unsigned 128 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 16*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 64];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u128_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[cfg(feature = "i128")]
-    fn read_u128_into(src: &[u8], dst: &mut [u128]);
-
-    /// Reads signed 16 bit integers from `src` to `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() != 2*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 8];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i16_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i16_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[inline]
-    fn read_i16_into(src: &[u8], dst: &mut [i16]) {
-        Self::read_u16_into(src, unsafe { transmute(dst) });
-    }
-
-    /// Reads signed 32 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 4*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i32_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[inline]
-    fn read_i32_into(src: &[u8], dst: &mut [i32]) {
-        Self::read_u32_into(src, unsafe { transmute(dst) });
-    }
-
-    /// Reads signed 64 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 8*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i64_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[inline]
-    fn read_i64_into(src: &[u8], dst: &mut [i64]) {
-        Self::read_u64_into(src, unsafe { transmute(dst) });
-    }
-
-    /// Reads signed 128 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 16*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 64];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i128_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_i128_into(src: &[u8], dst: &mut [i128]) {
-        Self::read_u128_into(src, unsafe { transmute(dst) });
-    }
-
-    /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
-    /// `src` into `dst`.
-    ///
-    /// Note that this does not perform any checks on the floating point
-    /// conversion. In particular, if the `src` data encodes an undefined
-    /// floating point value for your environment, then the result may be
-    /// undefined behavior. For example, this function may produce signaling
-    /// NaN floating point values.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 4*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
-    /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0.0; 4];
-    /// unsafe {
-    ///     LittleEndian::read_f32_into_unchecked(&bytes, &mut numbers_got);
-    /// }
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[inline]
-    unsafe fn read_f32_into_unchecked(src: &[u8], dst: &mut [f32]) {
-        Self::read_u32_into(src, transmute(dst));
-    }
-
-    /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
-    /// `src` into `dst`.
-    ///
-    /// Note that this does not perform any checks on the floating point
-    /// conversion. In particular, if the `src` data encodes an undefined
-    /// floating point value for your environment, then the result may be
-    /// undefined behavior. For example, this function may produce signaling
-    /// NaN floating point values.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 8*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
-    /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0.0; 4];
-    /// unsafe {
-    ///     LittleEndian::read_f64_into_unchecked(&bytes, &mut numbers_got);
-    /// }
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[inline]
-    unsafe fn read_f64_into_unchecked(src: &[u8], dst: &mut [f64]) {
-        Self::read_u64_into(src, transmute(dst));
-    }
-
-    /// Writes unsigned 16 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 2*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 8];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u16_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u16_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_u16_into(src: &[u16], dst: &mut [u8]);
-
-    /// Writes unsigned 32 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 4*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u32_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_u32_into(src: &[u32], dst: &mut [u8]);
-
-    /// Writes unsigned 64 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 8*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u64_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_u64_into(src: &[u64], dst: &mut [u8]);
-
-    /// Writes unsigned 128 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 16*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `u128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 64];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_u128_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[cfg(feature = "i128")]
-    fn write_u128_into(src: &[u128], dst: &mut [u8]);
-
-    /// Writes signed 16 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `buf.len() != 2*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i16` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 8];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i16_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i16_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_i16_into(src: &[i16], dst: &mut [u8]) {
-        Self::write_u16_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Writes signed 32 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 4*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i32_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_i32_into(src: &[i32], dst: &mut [u8]) {
-        Self::write_u32_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Writes signed 64 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 8*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i64_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_i64_into(src: &[i64], dst: &mut [u8]) {
-        Self::write_u64_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Writes signed 128 bit integers from `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `dst.len() != 16*src.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `i128` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 64];
-    /// let numbers_given = [1, 2, 0xf00f, 0xffee];
-    /// LittleEndian::write_i128_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0; 4];
-    /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    #[cfg(feature = "i128")]
-    fn write_i128_into(src: &[i128], dst: &mut [u8]) {
-        Self::write_u128_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Writes IEEE754 single-precision (4 bytes) floating point numbers from
-    /// `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 4*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f32` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 16];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
-    /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0.0; 4];
-    /// unsafe {
-    ///     LittleEndian::read_f32_into_unchecked(&bytes, &mut numbers_got);
-    /// }
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_f32_into(src: &[f32], dst: &mut [u8]) {
-        Self::write_u32_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Writes IEEE754 double-precision (8 bytes) floating point numbers from
-    /// `src` into `dst`.
-    ///
-    /// # Panics
-    ///
-    /// Panics when `src.len() != 8*dst.len()`.
-    ///
-    /// # Examples
-    ///
-    /// Write and read `f64` numbers in little endian order:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, LittleEndian};
-    ///
-    /// let mut bytes = [0; 32];
-    /// let numbers_given = [1.0, 2.0, 31.312e311, -11.32e91];
-    /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
-    ///
-    /// let mut numbers_got = [0.0; 4];
-    /// unsafe {
-    ///     LittleEndian::read_f64_into_unchecked(&bytes, &mut numbers_got);
-    /// }
-    /// assert_eq!(numbers_given, numbers_got);
-    /// ```
-    fn write_f64_into(src: &[f64], dst: &mut [u8]) {
-        Self::write_u64_into(unsafe { transmute(src) }, dst);
-    }
-
-    /// Converts the given slice of unsigned 16 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_u16(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5u16.swap_bytes(), 65000u16.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    fn from_slice_u16(numbers: &mut [u16]);
-
-    /// Converts the given slice of unsigned 32 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_u32(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5u32.swap_bytes(), 65000u32.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    fn from_slice_u32(numbers: &mut [u32]);
-
-    /// Converts the given slice of unsigned 64 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_u64(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5u64.swap_bytes(), 65000u64.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    fn from_slice_u64(numbers: &mut [u64]);
-
-    /// Converts the given slice of unsigned 128 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// #![feature(i128_type)]
-    ///
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_u128(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5u128.swap_bytes(), 65000u128.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    #[cfg(feature = "i128")]
-    fn from_slice_u128(numbers: &mut [u128]);
-
-    /// Converts the given slice of signed 16 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_i16(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5i16.swap_bytes(), 65000i16.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    #[inline]
-    fn from_slice_i16(numbers: &mut [i16]) {
-        Self::from_slice_u16(unsafe { transmute(numbers) });
-    }
-
-    /// Converts the given slice of signed 32 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_i32(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5i32.swap_bytes(), 65000i32.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    #[inline]
-    fn from_slice_i32(numbers: &mut [i32]) {
-        Self::from_slice_u32(unsafe { transmute(numbers) });
-    }
-
-    /// Converts the given slice of signed 64 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_i64(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5i64.swap_bytes(), 65000i64.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    #[inline]
-    fn from_slice_i64(numbers: &mut [i64]) {
-        Self::from_slice_u64(unsafe { transmute(numbers) });
-    }
-
-    /// Converts the given slice of signed 128 bit integers to a particular
-    /// endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// # Examples
-    ///
-    /// Convert the host platform's endianness to big-endian:
-    ///
-    /// ```rust
-    /// #![feature(i128_type)]
-    ///
-    /// use byteorder::{ByteOrder, BigEndian};
-    ///
-    /// let mut numbers = [5, 65000];
-    /// BigEndian::from_slice_i128(&mut numbers);
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(numbers, [5i128.swap_bytes(), 65000i128.swap_bytes()]);
-    /// } else {
-    ///     assert_eq!(numbers, [5, 65000]);
-    /// }
-    /// ```
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn from_slice_i128(numbers: &mut [i128]) {
-        Self::from_slice_u128(unsafe { transmute(numbers) });
-    }
-
-    /// Converts the given slice of IEEE754 single-precision (4 bytes) floating
-    /// point numbers to a particular endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// Note that the results of this operation are guaranteed to be defined.
-    /// In particular, this method may replace signaling NaN values with
-    /// quiet NaN values.
-    fn from_slice_f32(numbers: &mut [f32]);
-
-    /// Converts the given slice of IEEE754 double-precision (8 bytes) floating
-    /// point numbers to a particular endianness.
-    ///
-    /// If the endianness matches the endianness of the host platform, then
-    /// this is a no-op.
-    ///
-    /// Note that the results of this operation are guaranteed to be defined.
-    /// In particular, this method may replace signaling NaN values with
-    /// quiet NaN values.
-    fn from_slice_f64(numbers: &mut [f64]);
-}
-
-/// Defines big-endian serialization.
-///
-/// Note that this type has no value constructor. It is used purely at the
-/// type level.
-///
-/// # Examples
-///
-/// Write and read `u32` numbers in big endian order:
-///
-/// ```rust
-/// use byteorder::{ByteOrder, BigEndian};
-///
-/// let mut buf = [0; 4];
-/// BigEndian::write_u32(&mut buf, 1_000_000);
-/// assert_eq!(1_000_000, BigEndian::read_u32(&buf));
-/// ```
-#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
-pub enum BigEndian {}
-
-impl Default for BigEndian {
-    fn default() -> BigEndian {
-        panic!("BigEndian default")
-    }
-}
-
-/// A type alias for `BigEndian`.
-pub type BE = BigEndian;
-
-/// Defines little-endian serialization.
-///
-/// Note that this type has no value constructor. It is used purely at the
-/// type level.
-///
-/// # Examples
-///
-/// Write and read `u32` numbers in little endian order:
-///
-/// ```rust
-/// use byteorder::{ByteOrder, LittleEndian};
-///
-/// let mut buf = [0; 4];
-/// LittleEndian::write_u32(&mut buf, 1_000_000);
-/// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
-/// ```
-#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
-pub enum LittleEndian {}
-
-impl Default for LittleEndian {
-    fn default() -> LittleEndian {
-        panic!("LittleEndian default")
-    }
-}
-
-/// A type alias for `LittleEndian`.
-pub type LE = LittleEndian;
-
-/// Defines network byte order serialization.
-///
-/// Network byte order is defined by [RFC 1700][1] to be big-endian, and is
-/// referred to in several protocol specifications.  This type is an alias of
-/// BigEndian.
-///
-/// [1]: https://tools.ietf.org/html/rfc1700
-///
-/// Note that this type has no value constructor. It is used purely at the
-/// type level.
-///
-/// # Examples
-///
-/// Write and read `i16` numbers in big endian order:
-///
-/// ```rust
-/// use byteorder::{ByteOrder, NetworkEndian, BigEndian};
-///
-/// let mut buf = [0; 2];
-/// BigEndian::write_i16(&mut buf, -50_000);
-/// assert_eq!(-50_000, NetworkEndian::read_i16(&buf));
-/// ```
-pub type NetworkEndian = BigEndian;
-
-/// Defines system native-endian serialization.
-///
-/// Note that this type has no value constructor. It is used purely at the
-/// type level.
-#[cfg(target_endian = "little")]
-pub type NativeEndian = LittleEndian;
-
-/// Defines system native-endian serialization.
-///
-/// Note that this type has no value constructor. It is used purely at the
-/// type level.
-#[cfg(target_endian = "big")]
-pub type NativeEndian = BigEndian;
-
-macro_rules! read_num_bytes {
-    ($ty:ty, $size:expr, $src:expr, $which:ident) => ({
-        assert!($size == ::core::mem::size_of::<$ty>());
-        assert!($size <= $src.len());
-        let mut data: $ty = 0;
-        unsafe {
-            copy_nonoverlapping(
-                $src.as_ptr(),
-                &mut data as *mut $ty as *mut u8,
-                $size);
-        }
-        data.$which()
-    });
-}
-
-macro_rules! write_num_bytes {
-    ($ty:ty, $size:expr, $n:expr, $dst:expr, $which:ident) => ({
-        assert!($size <= $dst.len());
-        unsafe {
-            // N.B. https://github.com/rust-lang/rust/issues/22776
-            let bytes = transmute::<_, [u8; $size]>($n.$which());
-            copy_nonoverlapping((&bytes).as_ptr(), $dst.as_mut_ptr(), $size);
-        }
-    });
-}
-
-macro_rules! read_slice {
-    ($src:expr, $dst:expr, $size:expr, $which:ident) => {{
-        assert_eq!($src.len(), $size * $dst.len());
-
-        unsafe {
-            copy_nonoverlapping(
-                $src.as_ptr(),
-                $dst.as_mut_ptr() as *mut u8,
-                $src.len());
-        }
-        for v in $dst.iter_mut() {
-            *v = v.$which();
-        }
-    }};
-}
-
-macro_rules! write_slice_native {
-    ($src:expr, $dst:expr, $ty:ty, $size:expr) => {{
-        assert!($size == ::core::mem::size_of::<$ty>());
-        assert_eq!($size * $src.len(), $dst.len());
-
-        unsafe {
-            copy_nonoverlapping(
-                $src.as_ptr() as *const u8,
-                $dst.as_mut_ptr(),
-                $dst.len());
-        }
-    }};
-}
-
-macro_rules! write_slice {
-    ($src:expr, $dst:expr, $ty:ty, $size:expr, $write:expr) => ({
-        assert!($size == ::core::mem::size_of::<$ty>());
-        assert_eq!($size * $src.len(), $dst.len());
-
-        for (&n, chunk) in $src.iter().zip($dst.chunks_mut($size)) {
-            $write(chunk, n);
-        }
-    });
-}
-
-impl ByteOrder for BigEndian {
-    #[inline]
-    fn read_u16(buf: &[u8]) -> u16 {
-        read_num_bytes!(u16, 2, buf, to_be)
-    }
-
-    #[inline]
-    fn read_u32(buf: &[u8]) -> u32 {
-        read_num_bytes!(u32, 4, buf, to_be)
-    }
-
-    #[inline]
-    fn read_u64(buf: &[u8]) -> u64 {
-        read_num_bytes!(u64, 8, buf, to_be)
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128(buf: &[u8]) -> u128 {
-        read_num_bytes!(u128, 16, buf, to_be)
-    }
-
-    #[inline]
-    fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
-        assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len());
-        let mut out = [0u8; 8];
-        let ptr_out = out.as_mut_ptr();
-        unsafe {
-            copy_nonoverlapping(
-                buf.as_ptr(), ptr_out.offset((8 - nbytes) as isize), nbytes);
-            (*(ptr_out as *const u64)).to_be()
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
-        assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
-        let mut out = [0u8; 16];
-        let ptr_out = out.as_mut_ptr();
-        unsafe {
-            copy_nonoverlapping(
-                buf.as_ptr(), ptr_out.offset((16 - nbytes) as isize), nbytes);
-            (*(ptr_out as *const u128)).to_be()
-        }
-    }
-
-    #[inline]
-    fn write_u16(buf: &mut [u8], n: u16) {
-        write_num_bytes!(u16, 2, n, buf, to_be);
-    }
-
-    #[inline]
-    fn write_u32(buf: &mut [u8], n: u32) {
-        write_num_bytes!(u32, 4, n, buf, to_be);
-    }
-
-    #[inline]
-    fn write_u64(buf: &mut [u8], n: u64) {
-        write_num_bytes!(u64, 8, n, buf, to_be);
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_u128(buf: &mut [u8], n: u128) {
-        write_num_bytes!(u128, 16, n, buf, to_be);
-    }
-
-    #[inline]
-    fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
-        assert!(pack_size(n) <= nbytes && nbytes <= 8);
-        assert!(nbytes <= buf.len());
-        unsafe {
-            let bytes: [u8; 8] = transmute(n.to_be());
-            copy_nonoverlapping(
-                bytes.as_ptr().offset((8 - nbytes) as isize),
-                buf.as_mut_ptr(),
-                nbytes);
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
-        assert!(pack_size128(n) <= nbytes && nbytes <= 16);
-        assert!(nbytes <= buf.len());
-        unsafe {
-            let bytes: [u8; 16] = transmute(n.to_be());
-            copy_nonoverlapping(
-                bytes.as_ptr().offset((16 - nbytes) as isize),
-                buf.as_mut_ptr(),
-                nbytes);
-        }
-    }
-
-    #[inline]
-    fn read_u16_into(src: &[u8], dst: &mut [u16]) {
-        read_slice!(src, dst, 2, to_be);
-    }
-
-    #[inline]
-    fn read_u32_into(src: &[u8], dst: &mut [u32]) {
-        read_slice!(src, dst, 4, to_be);
-    }
-
-    #[inline]
-    fn read_u64_into(src: &[u8], dst: &mut [u64]) {
-        read_slice!(src, dst, 8, to_be);
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128_into(src: &[u8], dst: &mut [u128]) {
-        read_slice!(src, dst, 16, to_be);
-    }
-
-    #[inline]
-    fn write_u16_into(src: &[u16], dst: &mut [u8]) {
-        if cfg!(target_endian = "big") {
-            write_slice_native!(src, dst, u16, 2);
-        } else {
-            write_slice!(src, dst, u16, 2, Self::write_u16);
-        }
-    }
-
-    #[inline]
-    fn write_u32_into(src: &[u32], dst: &mut [u8]) {
-        if cfg!(target_endian = "big") {
-            write_slice_native!(src, dst, u32, 4);
-        } else {
-            write_slice!(src, dst, u32, 4, Self::write_u32);
-        }
-    }
-
-    #[inline]
-    fn write_u64_into(src: &[u64], dst: &mut [u8]) {
-        if cfg!(target_endian = "big") {
-            write_slice_native!(src, dst, u64, 8);
-        } else {
-            write_slice!(src, dst, u64, 8, Self::write_u64);
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_u128_into(src: &[u128], dst: &mut [u8]) {
-        if cfg!(target_endian = "big") {
-            write_slice_native!(src, dst, u128, 16);
-        } else {
-            write_slice!(src, dst, u128, 16, Self::write_u128);
-        }
-    }
-
-    #[inline]
-    fn from_slice_u16(numbers: &mut [u16]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                *n = n.to_be();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_u32(numbers: &mut [u32]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                *n = n.to_be();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_u64(numbers: &mut [u64]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                *n = n.to_be();
-            }
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn from_slice_u128(numbers: &mut [u128]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                *n = n.to_be();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_f32(numbers: &mut [f32]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                let int: u32 = unsafe { transmute(*n) };
-                *n = safe_u32_bits_to_f32(int.to_be());
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_f64(numbers: &mut [f64]) {
-        if cfg!(target_endian = "little") {
-            for n in numbers {
-                let int: u64 = unsafe { transmute(*n) };
-                *n = safe_u64_bits_to_f64(int.to_be());
-            }
-        }
-    }
-}
-
-impl ByteOrder for LittleEndian {
-    #[inline]
-    fn read_u16(buf: &[u8]) -> u16 {
-        read_num_bytes!(u16, 2, buf, to_le)
-    }
-
-    #[inline]
-    fn read_u32(buf: &[u8]) -> u32 {
-        read_num_bytes!(u32, 4, buf, to_le)
-    }
-
-    #[inline]
-    fn read_u64(buf: &[u8]) -> u64 {
-        read_num_bytes!(u64, 8, buf, to_le)
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128(buf: &[u8]) -> u128 {
-        read_num_bytes!(u128, 16, buf, to_le)
-    }
-
-    #[inline]
-    fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
-        assert!(1 <= nbytes && nbytes <= 8 && nbytes <= buf.len());
-        let mut out = [0u8; 8];
-        let ptr_out = out.as_mut_ptr();
-        unsafe {
-            copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes);
-            (*(ptr_out as *const u64)).to_le()
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
-        assert!(1 <= nbytes && nbytes <= 16 && nbytes <= buf.len());
-        let mut out = [0u8; 16];
-        let ptr_out = out.as_mut_ptr();
-        unsafe {
-            copy_nonoverlapping(buf.as_ptr(), ptr_out, nbytes);
-            (*(ptr_out as *const u128)).to_le()
-        }
-    }
-
-    #[inline]
-    fn write_u16(buf: &mut [u8], n: u16) {
-        write_num_bytes!(u16, 2, n, buf, to_le);
-    }
-
-    #[inline]
-    fn write_u32(buf: &mut [u8], n: u32) {
-        write_num_bytes!(u32, 4, n, buf, to_le);
-    }
-
-    #[inline]
-    fn write_u64(buf: &mut [u8], n: u64) {
-        write_num_bytes!(u64, 8, n, buf, to_le);
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_u128(buf: &mut [u8], n: u128) {
-        write_num_bytes!(u128, 16, n, buf, to_le);
-    }
-
-    #[inline]
-    fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
-        assert!(pack_size(n as u64) <= nbytes && nbytes <= 8);
-        assert!(nbytes <= buf.len());
-        unsafe {
-            let bytes: [u8; 8] = transmute(n.to_le());
-            copy_nonoverlapping(bytes.as_ptr(), buf.as_mut_ptr(), nbytes);
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
-        assert!(pack_size128(n as u128) <= nbytes && nbytes <= 16);
-        assert!(nbytes <= buf.len());
-        unsafe {
-            let bytes: [u8; 16] = transmute(n.to_le());
-            copy_nonoverlapping(bytes.as_ptr(), buf.as_mut_ptr(), nbytes);
-        }
-    }
-
-    #[inline]
-    fn read_u16_into(src: &[u8], dst: &mut [u16]) {
-        read_slice!(src, dst, 2, to_le);
-    }
-
-    #[inline]
-    fn read_u32_into(src: &[u8], dst: &mut [u32]) {
-        read_slice!(src, dst, 4, to_le);
-    }
-
-    #[inline]
-    fn read_u64_into(src: &[u8], dst: &mut [u64]) {
-        read_slice!(src, dst, 8, to_le);
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn read_u128_into(src: &[u8], dst: &mut [u128]) {
-        read_slice!(src, dst, 16, to_le);
-    }
-
-    #[inline]
-    fn write_u16_into(src: &[u16], dst: &mut [u8]) {
-        if cfg!(target_endian = "little") {
-            write_slice_native!(src, dst, u16, 2);
-        } else {
-            write_slice!(src, dst, u16, 2, Self::write_u16);
-        }
-    }
-
-    #[inline]
-    fn write_u32_into(src: &[u32], dst: &mut [u8]) {
-        if cfg!(target_endian = "little") {
-            write_slice_native!(src, dst, u32, 4);
-        } else {
-            write_slice!(src, dst, u32, 4, Self::write_u32);
-        }
-    }
-
-    #[inline]
-    fn write_u64_into(src: &[u64], dst: &mut [u8]) {
-        if cfg!(target_endian = "little") {
-            write_slice_native!(src, dst, u64, 8);
-        } else {
-            write_slice!(src, dst, u64, 8, Self::write_u64);
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn write_u128_into(src: &[u128], dst: &mut [u8]) {
-        if cfg!(target_endian = "little") {
-            write_slice_native!(src, dst, u128, 16);
-        } else {
-            write_slice!(src, dst, u128, 16, Self::write_u128);
-        }
-    }
-
-    #[inline]
-    fn from_slice_u16(numbers: &mut [u16]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                *n = n.to_le();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_u32(numbers: &mut [u32]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                *n = n.to_le();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_u64(numbers: &mut [u64]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                *n = n.to_le();
-            }
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    #[inline]
-    fn from_slice_u128(numbers: &mut [u128]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                *n = n.to_le();
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_f32(numbers: &mut [f32]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                let int: u32 = unsafe { transmute(*n) };
-                *n = safe_u32_bits_to_f32(int.to_le());
-            }
-        }
-    }
-
-    #[inline]
-    fn from_slice_f64(numbers: &mut [f64]) {
-        if cfg!(target_endian = "big") {
-            for n in numbers {
-                let int: u64 = unsafe { transmute(*n) };
-                *n = safe_u64_bits_to_f64(int.to_le());
-            }
-        }
-    }
-}
-
-#[inline]
-fn safe_u32_bits_to_f32(u: u32) -> f32 {
-    use core::f32::NAN;
-
-    const EXP_MASK: u32 = 0x7F800000;
-    const FRACT_MASK: u32 = 0x007FFFFF;
-
-    if u & EXP_MASK == EXP_MASK && u & FRACT_MASK != 0 {
-        // While IEEE 754-2008 specifies encodings for quiet NaNs and
-        // signaling ones, certains MIPS and PA-RISC CPUs treat signaling
-        // NaNs differently. Therefore, to be safe, we pass a known quiet
-        // NaN if u is any kind of NaN. The check above only assumes
-        // IEEE 754-1985 to be valid.
-        NAN
-    } else {
-        unsafe { transmute(u) }
-    }
-}
-
-#[inline]
-fn safe_u64_bits_to_f64(u: u64) -> f64 {
-    use core::f64::NAN;
-
-    const EXP_MASK: u64 = 0x7FF0000000000000;
-    const FRACT_MASK: u64 = 0x000FFFFFFFFFFFFF;
-
-    if u & EXP_MASK == EXP_MASK && u & FRACT_MASK != 0 {
-        // While IEEE 754-2008 specifies encodings for quiet NaNs and
-        // signaling ones, certains MIPS and PA-RISC CPUs treat signaling
-        // NaNs differently. Therefore, to be safe, we pass a known quiet
-        // NaN if u is any kind of NaN. The check above only assumes
-        // IEEE 754-1985 to be valid.
-        NAN
-    } else {
-        unsafe { transmute(u) }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    extern crate quickcheck;
-    extern crate rand;
-
-    use self::quickcheck::{QuickCheck, StdGen, Testable};
-    use self::rand::thread_rng;
-    #[cfg(feature = "i128")] use self::quickcheck::{Arbitrary, Gen};
-
-    pub const U24_MAX: u32 = 16_777_215;
-    pub const I24_MAX: i32 = 8_388_607;
-
-    pub const U64_MAX: u64 = ::core::u64::MAX;
-    pub const I64_MAX: u64 = ::core::i64::MAX as u64;
-
-    macro_rules! calc_max {
-        ($max:expr, $bytes:expr) => { calc_max!($max, $bytes, 8) };
-        ($max:expr, $bytes:expr, $maxbytes:expr) => {
-            ($max - 1) >> (8 * ($maxbytes - $bytes))
-        };
-    }
-
-    #[derive(Clone, Debug)]
-    pub struct Wi128<T>(pub T);
-
-    #[cfg(feature = "i128")]
-    impl<T: Clone> Wi128<T> {
-        pub fn clone(&self) -> T {
-            self.0.clone()
-        }
-    }
-
-    impl<T: PartialEq> PartialEq<T> for Wi128<T> {
-        fn eq(&self, other: &T) -> bool {
-            self.0.eq(other)
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    impl Arbitrary for Wi128<u128> {
-        fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<u128> {
-            let max = calc_max!(::core::u128::MAX, gen.size(), 16);
-            let output =
-                (gen.gen::<u64>() as u128) |
-                ((gen.gen::<u64>() as u128) << 64);
-            Wi128(output & (max - 1))
-        }
-    }
-
-    #[cfg(feature = "i128")]
-    impl Arbitrary for Wi128<i128> {
-        fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<i128> {
-            let max = calc_max!(::core::i128::MAX, gen.size(), 16);
-            let output =
-                (gen.gen::<i64>() as i128) |
-                ((gen.gen::<i64>() as i128) << 64);
-            Wi128(output & (max - 1))
-        }
-    }
-
-    pub fn qc_sized<A: Testable>(f: A, size: u64) {
-        QuickCheck::new()
-            .gen(StdGen::new(thread_rng(), size as usize))
-            .tests(1_00)
-            .max_tests(10_000)
-            .quickcheck(f);
-    }
-
-    macro_rules! qc_byte_order {
-        ($name:ident, $ty_int:ty, $max:expr,
-         $bytes:expr, $read:ident, $write:ident) => (
-            mod $name {
-                use {BigEndian, ByteOrder, NativeEndian, LittleEndian};
-                #[allow(unused_imports)] use super::{ qc_sized, Wi128 };
-
-                #[test]
-                fn big_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut buf = [0; 16];
-                        BigEndian::$write(&mut buf, n.clone(), $bytes);
-                        n == BigEndian::$read(&mut buf[..$bytes], $bytes)
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-
-                #[test]
-                fn little_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut buf = [0; 16];
-                        LittleEndian::$write(&mut buf, n.clone(), $bytes);
-                        n == LittleEndian::$read(&mut buf[..$bytes], $bytes)
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-
-                #[test]
-                fn native_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut buf = [0; 16];
-                        NativeEndian::$write(&mut buf, n.clone(), $bytes);
-                        n == NativeEndian::$read(&mut buf[..$bytes], $bytes)
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-            }
-        );
-        ($name:ident, $ty_int:ty, $max:expr,
-         $read:ident, $write:ident) => (
-            mod $name {
-                use core::mem::size_of;
-                use {BigEndian, ByteOrder, NativeEndian, LittleEndian};
-                #[allow(unused_imports)] use super::{ qc_sized, Wi128 };
-
-                #[test]
-                fn big_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let bytes = size_of::<$ty_int>();
-                        let mut buf = [0; 16];
-                        BigEndian::$write(&mut buf[16 - bytes..], n.clone());
-                        n == BigEndian::$read(&mut buf[16 - bytes..])
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-
-                #[test]
-                fn little_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let bytes = size_of::<$ty_int>();
-                        let mut buf = [0; 16];
-                        LittleEndian::$write(&mut buf[..bytes], n.clone());
-                        n == LittleEndian::$read(&mut buf[..bytes])
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-
-                #[test]
-                fn native_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let bytes = size_of::<$ty_int>();
-                        let mut buf = [0; 16];
-                        NativeEndian::$write(&mut buf[..bytes], n.clone());
-                        n == NativeEndian::$read(&mut buf[..bytes])
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-            }
-        );
-    }
-
-    qc_byte_order!(prop_u16, u16, ::core::u16::MAX as u64, read_u16, write_u16);
-    qc_byte_order!(prop_i16, i16, ::core::i16::MAX as u64, read_i16, write_i16);
-    qc_byte_order!(prop_u24, u32, ::test::U24_MAX as u64, read_u24, write_u24);
-    qc_byte_order!(prop_i24, i32, ::test::I24_MAX as u64, read_i24, write_i24);
-    qc_byte_order!(prop_u32, u32, ::core::u32::MAX as u64, read_u32, write_u32);
-    qc_byte_order!(prop_i32, i32, ::core::i32::MAX as u64, read_i32, write_i32);
-    qc_byte_order!(prop_u64, u64, ::core::u64::MAX as u64, read_u64, write_u64);
-    qc_byte_order!(prop_i64, i64, ::core::i64::MAX as u64, read_i64, write_i64);
-    qc_byte_order!(prop_f32, f32, ::core::u64::MAX as u64, read_f32, write_f32);
-    qc_byte_order!(prop_f64, f64, ::core::i64::MAX as u64, read_f64, write_f64);
-
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
-
-    qc_byte_order!(prop_uint_1,
-        u64, calc_max!(super::U64_MAX, 1), 1, read_uint, write_uint);
-    qc_byte_order!(prop_uint_2,
-        u64, calc_max!(super::U64_MAX, 2), 2, read_uint, write_uint);
-    qc_byte_order!(prop_uint_3,
-        u64, calc_max!(super::U64_MAX, 3), 3, read_uint, write_uint);
-    qc_byte_order!(prop_uint_4,
-        u64, calc_max!(super::U64_MAX, 4), 4, read_uint, write_uint);
-    qc_byte_order!(prop_uint_5,
-        u64, calc_max!(super::U64_MAX, 5), 5, read_uint, write_uint);
-    qc_byte_order!(prop_uint_6,
-        u64, calc_max!(super::U64_MAX, 6), 6, read_uint, write_uint);
-    qc_byte_order!(prop_uint_7,
-        u64, calc_max!(super::U64_MAX, 7), 7, read_uint, write_uint);
-    qc_byte_order!(prop_uint_8,
-        u64, calc_max!(super::U64_MAX, 8), 8, read_uint, write_uint);
-
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_1,
-        Wi128<u128>, 1, 1, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_2,
-        Wi128<u128>, 2, 2, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_3,
-        Wi128<u128>, 3, 3, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_4,
-        Wi128<u128>, 4, 4, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_5,
-        Wi128<u128>, 5, 5, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_6,
-        Wi128<u128>, 6, 6, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_7,
-        Wi128<u128>, 7, 7, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_8,
-        Wi128<u128>, 8, 8, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_9,
-        Wi128<u128>, 9, 9, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_10,
-        Wi128<u128>, 10, 10, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_11,
-        Wi128<u128>, 11, 11, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_12,
-        Wi128<u128>, 12, 12, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_13,
-        Wi128<u128>, 13, 13, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_14,
-        Wi128<u128>, 14, 14, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_15,
-        Wi128<u128>, 15, 15, read_uint128, write_uint128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_uint128_16,
-        Wi128<u128>, 16, 16, read_uint128, write_uint128);
-
-    qc_byte_order!(prop_int_1,
-        i64, calc_max!(super::I64_MAX, 1), 1, read_int, write_int);
-    qc_byte_order!(prop_int_2,
-        i64, calc_max!(super::I64_MAX, 2), 2, read_int, write_int);
-    qc_byte_order!(prop_int_3,
-        i64, calc_max!(super::I64_MAX, 3), 3, read_int, write_int);
-    qc_byte_order!(prop_int_4,
-        i64, calc_max!(super::I64_MAX, 4), 4, read_int, write_int);
-    qc_byte_order!(prop_int_5,
-        i64, calc_max!(super::I64_MAX, 5), 5, read_int, write_int);
-    qc_byte_order!(prop_int_6,
-        i64, calc_max!(super::I64_MAX, 6), 6, read_int, write_int);
-    qc_byte_order!(prop_int_7,
-        i64, calc_max!(super::I64_MAX, 7), 7, read_int, write_int);
-    qc_byte_order!(prop_int_8,
-        i64, calc_max!(super::I64_MAX, 8), 8, read_int, write_int);
-
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_1,
-        Wi128<i128>, 1, 1, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_2,
-        Wi128<i128>, 2, 2, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_3,
-        Wi128<i128>, 3, 3, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_4,
-        Wi128<i128>, 4, 4, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_5,
-        Wi128<i128>, 5, 5, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_6,
-        Wi128<i128>, 6, 6, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_7,
-        Wi128<i128>, 7, 7, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_8,
-        Wi128<i128>, 8, 8, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_9,
-        Wi128<i128>, 9, 9, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_10,
-        Wi128<i128>, 10, 10, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_11,
-        Wi128<i128>, 11, 11, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_12,
-        Wi128<i128>, 12, 12, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_13,
-        Wi128<i128>, 13, 13, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_14,
-        Wi128<i128>, 14, 14, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_15,
-        Wi128<i128>, 15, 15, read_int128, write_int128);
-    #[cfg(feature = "i128")]
-    qc_byte_order!(prop_int128_16,
-        Wi128<i128>, 16, 16, read_int128, write_int128);
-
-
-    // Test that all of the byte conversion functions panic when given a
-    // buffer that is too small.
-    //
-    // These tests are critical to ensure safety, otherwise we might end up
-    // with a buffer overflow.
-    macro_rules! too_small {
-        ($name:ident, $maximally_small:expr, $zero:expr,
-         $read:ident, $write:ident) => (
-            mod $name {
-                use {BigEndian, ByteOrder, NativeEndian, LittleEndian};
-
-                #[test]
-                #[should_panic]
-                fn read_big_endian() {
-                    let buf = [0; $maximally_small];
-                    BigEndian::$read(&buf);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_little_endian() {
-                    let buf = [0; $maximally_small];
-                    LittleEndian::$read(&buf);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_native_endian() {
-                    let buf = [0; $maximally_small];
-                    NativeEndian::$read(&buf);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_big_endian() {
-                    let mut buf = [0; $maximally_small];
-                    BigEndian::$write(&mut buf, $zero);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_little_endian() {
-                    let mut buf = [0; $maximally_small];
-                    LittleEndian::$write(&mut buf, $zero);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_native_endian() {
-                    let mut buf = [0; $maximally_small];
-                    NativeEndian::$write(&mut buf, $zero);
-                }
-            }
-        );
-        ($name:ident, $maximally_small:expr, $read:ident) => (
-            mod $name {
-                use {BigEndian, ByteOrder, NativeEndian, LittleEndian};
-
-                #[test]
-                #[should_panic]
-                fn read_big_endian() {
-                    let buf = [0; $maximally_small];
-                    BigEndian::$read(&buf, $maximally_small + 1);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_little_endian() {
-                    let buf = [0; $maximally_small];
-                    LittleEndian::$read(&buf, $maximally_small + 1);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_native_endian() {
-                    let buf = [0; $maximally_small];
-                    NativeEndian::$read(&buf, $maximally_small + 1);
-                }
-            }
-        );
-    }
-
-    too_small!(small_u16, 1, 0, read_u16, write_u16);
-    too_small!(small_i16, 1, 0, read_i16, write_i16);
-    too_small!(small_u32, 3, 0, read_u32, write_u32);
-    too_small!(small_i32, 3, 0, read_i32, write_i32);
-    too_small!(small_u64, 7, 0, read_u64, write_u64);
-    too_small!(small_i64, 7, 0, read_i64, write_i64);
-    too_small!(small_f32, 3, 0.0, read_f32, write_f32);
-    too_small!(small_f64, 7, 0.0, read_f64, write_f64);
-    #[cfg(feature = "i128")]
-    too_small!(small_u128, 15, 0, read_u128, write_u128);
-    #[cfg(feature = "i128")]
-    too_small!(small_i128, 15, 0, read_i128, write_i128);
-
-    too_small!(small_uint_1, 1, read_uint);
-    too_small!(small_uint_2, 2, read_uint);
-    too_small!(small_uint_3, 3, read_uint);
-    too_small!(small_uint_4, 4, read_uint);
-    too_small!(small_uint_5, 5, read_uint);
-    too_small!(small_uint_6, 6, read_uint);
-    too_small!(small_uint_7, 7, read_uint);
-
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_1, 1, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_2, 2, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_3, 3, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_4, 4, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_5, 5, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_6, 6, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_7, 7, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_8, 8, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_9, 9, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_10, 10, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_11, 11, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_12, 12, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_13, 13, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_14, 14, read_uint128);
-    #[cfg(feature = "i128")]
-    too_small!(small_uint128_15, 15, read_uint128);
-
-    too_small!(small_int_1, 1, read_int);
-    too_small!(small_int_2, 2, read_int);
-    too_small!(small_int_3, 3, read_int);
-    too_small!(small_int_4, 4, read_int);
-    too_small!(small_int_5, 5, read_int);
-    too_small!(small_int_6, 6, read_int);
-    too_small!(small_int_7, 7, read_int);
-
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_1, 1, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_2, 2, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_3, 3, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_4, 4, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_5, 5, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_6, 6, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_7, 7, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_8, 8, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_9, 9, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_10, 10, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_11, 11, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_12, 12, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_13, 13, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_14, 14, read_int128);
-    #[cfg(feature = "i128")]
-    too_small!(small_int128_15, 15, read_int128);
-
-    // Test that reading/writing slices enforces the correct lengths.
-    macro_rules! slice_lengths {
-        ($name:ident, $read:ident, $write:ident,
-         $num_bytes:expr, $numbers:expr) => {
-            mod $name {
-                use {ByteOrder, BigEndian, NativeEndian, LittleEndian};
-
-                #[test]
-                #[should_panic]
-                fn read_big_endian() {
-                    let bytes = [0; $num_bytes];
-                    let mut numbers = $numbers;
-                    BigEndian::$read(&bytes, &mut numbers);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_little_endian() {
-                    let bytes = [0; $num_bytes];
-                    let mut numbers = $numbers;
-                    LittleEndian::$read(&bytes, &mut numbers);
-                }
-
-                #[test]
-                #[should_panic]
-                fn read_native_endian() {
-                    let bytes = [0; $num_bytes];
-                    let mut numbers = $numbers;
-                    NativeEndian::$read(&bytes, &mut numbers);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_big_endian() {
-                    let mut bytes = [0; $num_bytes];
-                    let numbers = $numbers;
-                    BigEndian::$write(&numbers, &mut bytes);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_little_endian() {
-                    let mut bytes = [0; $num_bytes];
-                    let numbers = $numbers;
-                    LittleEndian::$write(&numbers, &mut bytes);
-                }
-
-                #[test]
-                #[should_panic]
-                fn write_native_endian() {
-                    let mut bytes = [0; $num_bytes];
-                    let numbers = $numbers;
-                    NativeEndian::$write(&numbers, &mut bytes);
-                }
-            }
-        }
-    }
-
-    slice_lengths!(
-        slice_len_too_small_u16, read_u16_into, write_u16_into, 3, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_u16, read_u16_into, write_u16_into, 5, [0, 0]);
-    slice_lengths!(
-        slice_len_too_small_i16, read_i16_into, write_i16_into, 3, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_i16, read_i16_into, write_i16_into, 5, [0, 0]);
-
-    slice_lengths!(
-        slice_len_too_small_u32, read_u32_into, write_u32_into, 7, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_u32, read_u32_into, write_u32_into, 9, [0, 0]);
-    slice_lengths!(
-        slice_len_too_small_i32, read_i32_into, write_i32_into, 7, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_i32, read_i32_into, write_i32_into, 9, [0, 0]);
-
-    slice_lengths!(
-        slice_len_too_small_u64, read_u64_into, write_u64_into, 15, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_u64, read_u64_into, write_u64_into, 17, [0, 0]);
-    slice_lengths!(
-        slice_len_too_small_i64, read_i64_into, write_i64_into, 15, [0, 0]);
-    slice_lengths!(
-        slice_len_too_big_i64, read_i64_into, write_i64_into, 17, [0, 0]);
-
-    #[cfg(feature = "i128")]
-    slice_lengths!(
-        slice_len_too_small_u128, read_u128_into, write_u128_into, 31, [0, 0]);
-    #[cfg(feature = "i128")]
-    slice_lengths!(
-        slice_len_too_big_u128, read_u128_into, write_u128_into, 33, [0, 0]);
-    #[cfg(feature = "i128")]
-    slice_lengths!(
-        slice_len_too_small_i128, read_i128_into, write_i128_into, 31, [0, 0]);
-    #[cfg(feature = "i128")]
-    slice_lengths!(
-        slice_len_too_big_i128, read_i128_into, write_i128_into, 33, [0, 0]);
-
-    #[test]
-    fn uint_bigger_buffer() {
-        use {ByteOrder, LittleEndian};
-        let n = LittleEndian::read_uint(&[1, 2, 3, 4, 5, 6, 7, 8], 5);
-        assert_eq!(n, 0x0504030201);
-    }
-
-    #[test]
-    fn read_snan() {
-        use core::f32;
-        use core::f64;
-        use core::mem::transmute;
-
-        use {ByteOrder, BigEndian, LittleEndian};
-
-        let sf = BigEndian::read_f32(&[0xFF, 0x80, 0x00, 0x01]);
-        let sbits: u32 = unsafe { transmute(sf) };
-        assert_eq!(sbits, unsafe { transmute(f32::NAN) });
-        assert_eq!(sf.classify(), ::core::num::FpCategory::Nan);
-
-        let df = BigEndian::read_f64(&[0x7F, 0xF0, 0, 0, 0, 0, 0, 0x01]);
-        let dbits: u64 = unsafe { ::core::mem::transmute(df) };
-        assert_eq!(dbits, unsafe { transmute(f64::NAN) });
-        assert_eq!(df.classify(), ::core::num::FpCategory::Nan);
-
-        let sf = LittleEndian::read_f32(&[0x01, 0x00, 0x80, 0xFF]);
-        let sbits: u32 = unsafe { transmute(sf) };
-        assert_eq!(sbits, unsafe { transmute(f32::NAN) });
-        assert_eq!(sf.classify(), ::core::num::FpCategory::Nan);
-
-        let df = LittleEndian::read_f64(&[0x01, 0, 0, 0, 0, 0, 0xF0, 0x7F]);
-        let dbits: u64 = unsafe { ::core::mem::transmute(df) };
-        assert_eq!(dbits, unsafe { transmute(f64::NAN) });
-        assert_eq!(df.classify(), ::core::num::FpCategory::Nan);
-    }
-}
-
-#[cfg(test)]
-#[cfg(feature = "std")]
-mod stdtests {
-    extern crate quickcheck;
-    extern crate rand;
-
-    use self::quickcheck::{QuickCheck, StdGen, Testable};
-    use self::rand::thread_rng;
-
-    fn qc_unsized<A: Testable>(f: A) {
-
-        QuickCheck::new()
-            .gen(StdGen::new(thread_rng(), 16))
-            .tests(1_00)
-            .max_tests(10_000)
-            .quickcheck(f);
-    }
-
-    macro_rules! calc_max {
-        ($max:expr, $bytes:expr) => { ($max - 1) >> (8 * (8 - $bytes)) };
-    }
-
-    macro_rules! qc_bytes_ext {
-        ($name:ident, $ty_int:ty, $max:expr,
-         $bytes:expr, $read:ident, $write:ident) => (
-            mod $name {
-                use std::io::Cursor;
-                use {
-                    ReadBytesExt, WriteBytesExt,
-                    BigEndian, NativeEndian, LittleEndian,
-                };
-                #[allow(unused_imports)] use test::{qc_sized, Wi128};
-
-                #[test]
-                fn big_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<BigEndian>(n.clone()).unwrap();
-                        let mut rdr = Vec::new();
-                        rdr.extend(wtr[wtr.len()-$bytes..].iter().map(|&x| x));
-                        let mut rdr = Cursor::new(rdr);
-                        n == rdr.$read::<BigEndian>($bytes).unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-
-                #[test]
-                fn little_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<LittleEndian>(n.clone()).unwrap();
-                        let mut rdr = Cursor::new(wtr);
-                        n == rdr.$read::<LittleEndian>($bytes).unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-
-                #[test]
-                fn native_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<NativeEndian>(n.clone()).unwrap();
-                        let mut rdr = Cursor::new(wtr);
-                        n == rdr.$read::<NativeEndian>($bytes).unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max);
-                }
-            }
-        );
-        ($name:ident, $ty_int:ty, $max:expr, $read:ident, $write:ident) => (
-            mod $name {
-                use std::io::Cursor;
-                use {
-                    ReadBytesExt, WriteBytesExt,
-                    BigEndian, NativeEndian, LittleEndian,
-                };
-                #[allow(unused_imports)] use test::{qc_sized, Wi128};
-
-                #[test]
-                fn big_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<BigEndian>(n.clone()).unwrap();
-                        let mut rdr = Cursor::new(wtr);
-                        n == rdr.$read::<BigEndian>().unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-
-                #[test]
-                fn little_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<LittleEndian>(n.clone()).unwrap();
-                        let mut rdr = Cursor::new(wtr);
-                        n == rdr.$read::<LittleEndian>().unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-
-                #[test]
-                fn native_endian() {
-                    fn prop(n: $ty_int) -> bool {
-                        let mut wtr = vec![];
-                        wtr.$write::<NativeEndian>(n.clone()).unwrap();
-                        let mut rdr = Cursor::new(wtr);
-                        n == rdr.$read::<NativeEndian>().unwrap()
-                    }
-                    qc_sized(prop as fn($ty_int) -> bool, $max - 1);
-                }
-            }
-        );
-    }
-
-    qc_bytes_ext!(prop_ext_u16,
-        u16, ::std::u16::MAX as u64, read_u16, write_u16);
-    qc_bytes_ext!(prop_ext_i16,
-        i16, ::std::i16::MAX as u64, read_i16, write_i16);
-    qc_bytes_ext!(prop_ext_u32,
-        u32, ::std::u32::MAX as u64, read_u32, write_u32);
-    qc_bytes_ext!(prop_ext_i32,
-        i32, ::std::i32::MAX as u64, read_i32, write_i32);
-    qc_bytes_ext!(prop_ext_u64,
-        u64, ::std::u64::MAX as u64, read_u64, write_u64);
-    qc_bytes_ext!(prop_ext_i64,
-        i64, ::std::i64::MAX as u64, read_i64, write_i64);
-    qc_bytes_ext!(prop_ext_f32,
-        f32, ::std::u64::MAX as u64, read_f32, write_f32);
-    qc_bytes_ext!(prop_ext_f64,
-        f64, ::std::i64::MAX as u64, read_f64, write_f64);
-
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
-
-    qc_bytes_ext!(prop_ext_uint_1,
-        u64, calc_max!(::test::U64_MAX, 1), 1, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_2,
-        u64, calc_max!(::test::U64_MAX, 2), 2, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_3,
-        u64, calc_max!(::test::U64_MAX, 3), 3, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_4,
-        u64, calc_max!(::test::U64_MAX, 4), 4, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_5,
-        u64, calc_max!(::test::U64_MAX, 5), 5, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_6,
-        u64, calc_max!(::test::U64_MAX, 6), 6, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_7,
-        u64, calc_max!(::test::U64_MAX, 7), 7, read_uint, write_u64);
-    qc_bytes_ext!(prop_ext_uint_8,
-        u64, calc_max!(::test::U64_MAX, 8), 8, read_uint, write_u64);
-
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_1,
-        Wi128<u128>, 1, 1, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_2,
-        Wi128<u128>, 2, 2, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_3,
-        Wi128<u128>, 3, 3, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_4,
-        Wi128<u128>, 4, 4, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_5,
-        Wi128<u128>, 5, 5, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_6,
-        Wi128<u128>, 6, 6, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_7,
-        Wi128<u128>, 7, 7, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_8,
-        Wi128<u128>, 8, 8, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_9,
-        Wi128<u128>, 9, 9, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_10,
-        Wi128<u128>, 10, 10, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_11,
-        Wi128<u128>, 11, 11, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_12,
-        Wi128<u128>, 12, 12, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_13,
-        Wi128<u128>, 13, 13, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_14,
-        Wi128<u128>, 14, 14, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_15,
-        Wi128<u128>, 15, 15, read_uint128, write_u128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_uint128_16,
-        Wi128<u128>, 16, 16, read_uint128, write_u128);
-
-    qc_bytes_ext!(prop_ext_int_1,
-        i64, calc_max!(::test::I64_MAX, 1), 1, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_2,
-        i64, calc_max!(::test::I64_MAX, 2), 2, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_3,
-        i64, calc_max!(::test::I64_MAX, 3), 3, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_4,
-        i64, calc_max!(::test::I64_MAX, 4), 4, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_5,
-        i64, calc_max!(::test::I64_MAX, 5), 5, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_6,
-        i64, calc_max!(::test::I64_MAX, 6), 6, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_7,
-        i64, calc_max!(::test::I64_MAX, 1), 7, read_int, write_i64);
-    qc_bytes_ext!(prop_ext_int_8,
-        i64, calc_max!(::test::I64_MAX, 8), 8, read_int, write_i64);
-
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_1,
-        Wi128<i128>, 1, 1, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_2,
-        Wi128<i128>, 2, 2, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_3,
-        Wi128<i128>, 3, 3, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_4,
-        Wi128<i128>, 4, 4, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_5,
-        Wi128<i128>, 5, 5, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_6,
-        Wi128<i128>, 6, 6, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_7,
-        Wi128<i128>, 7, 7, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_8,
-        Wi128<i128>, 8, 8, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_9,
-        Wi128<i128>, 9, 9, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_10,
-        Wi128<i128>, 10, 10, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_11,
-        Wi128<i128>, 11, 11, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_12,
-        Wi128<i128>, 12, 12, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_13,
-        Wi128<i128>, 13, 13, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_14,
-        Wi128<i128>, 14, 14, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_15,
-        Wi128<i128>, 15, 15, read_int128, write_i128);
-    #[cfg(feature = "i128")]
-    qc_bytes_ext!(prop_ext_int128_16,
-        Wi128<i128>, 16, 16, read_int128, write_i128);
-
-    // Test slice serialization/deserialization.
-    macro_rules! qc_slice {
-        ($name:ident, $ty_int:ty, $read:ident, $write:ident, $zero:expr) => {
-            mod $name {
-                use core::mem::size_of;
-                use {ByteOrder, BigEndian, NativeEndian, LittleEndian};
-                use super::qc_unsized;
-                #[allow(unused_imports)]
-                use test::Wi128;
-
-                #[test]
-                fn big_endian() {
-                    #[allow(unused_unsafe)]
-                    fn prop(numbers: Vec<$ty_int>) -> bool {
-                        let numbers: Vec<_> = numbers
-                            .into_iter()
-                            .map(|x| x.clone())
-                            .collect();
-                        let num_bytes = size_of::<$ty_int>() * numbers.len();
-                        let mut bytes = vec![0; num_bytes];
-
-                        BigEndian::$write(&numbers, &mut bytes);
-
-                        let mut got = vec![$zero; numbers.len()];
-                        unsafe { BigEndian::$read(&bytes, &mut got); }
-
-                        numbers == got
-                    }
-                    qc_unsized(prop as fn(_) -> bool);
-                }
-
-                #[test]
-                fn little_endian() {
-                    #[allow(unused_unsafe)]
-                    fn prop(numbers: Vec<$ty_int>) -> bool {
-                        let numbers: Vec<_> = numbers
-                            .into_iter()
-                            .map(|x| x.clone())
-                            .collect();
-                        let num_bytes = size_of::<$ty_int>() * numbers.len();
-                        let mut bytes = vec![0; num_bytes];
-
-                        LittleEndian::$write(&numbers, &mut bytes);
-
-                        let mut got = vec![$zero; numbers.len()];
-                        unsafe { LittleEndian::$read(&bytes, &mut got); }
-
-                        numbers == got
-                    }
-                    qc_unsized(prop as fn(_) -> bool);
-                }
-
-                #[test]
-                fn native_endian() {
-                    #[allow(unused_unsafe)]
-                    fn prop(numbers: Vec<$ty_int>) -> bool {
-                        let numbers: Vec<_> = numbers
-                            .into_iter()
-                            .map(|x| x.clone())
-                            .collect();
-                        let num_bytes = size_of::<$ty_int>() * numbers.len();
-                        let mut bytes = vec![0; num_bytes];
-
-                        NativeEndian::$write(&numbers, &mut bytes);
-
-                        let mut got = vec![$zero; numbers.len()];
-                        unsafe { NativeEndian::$read(&bytes, &mut got); }
-
-                        numbers == got
-                    }
-                    qc_unsized(prop as fn(_) -> bool);
-                }
-            }
-        }
-    }
-
-    qc_slice!(prop_slice_u16, u16, read_u16_into, write_u16_into, 0);
-    qc_slice!(prop_slice_i16, i16, read_i16_into, write_i16_into, 0);
-    qc_slice!(prop_slice_u32, u32, read_u32_into, write_u32_into, 0);
-    qc_slice!(prop_slice_i32, i32, read_i32_into, write_i32_into, 0);
-    qc_slice!(prop_slice_u64, u64, read_u64_into, write_u64_into, 0);
-    qc_slice!(prop_slice_i64, i64, read_i64_into, write_i64_into, 0);
-    #[cfg(feature = "i128")]
-    qc_slice!(
-        prop_slice_u128, Wi128<u128>, read_u128_into, write_u128_into, 0);
-    #[cfg(feature = "i128")]
-    qc_slice!(
-        prop_slice_i128, Wi128<i128>, read_i128_into, write_i128_into, 0);
-
-    qc_slice!(
-        prop_slice_f32, f32, read_f32_into_unchecked, write_f32_into, 0.0);
-    qc_slice!(
-        prop_slice_f64, f64, read_f64_into_unchecked, write_f64_into, 0.0);
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.appveyor.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: x86_64-pc-windows-gnu
-  - TARGET: i686-pc-windows-gnu
-  RUST_BACKTRACE: full
-install:
-  - curl -sSf -o rustup-init.exe https://win.rustup.rs/
-  - rustup-init.exe -y --default-host %TARGET%
-  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
-  - rustc -vV
-  - cargo -vV
-build: false
-test_script:
-  - cargo build --verbose --features yaml
-  - cargo test --verbose --features yaml
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".appveyor.yml":"38fb7e583271029caad727c9123a2b2679b7c59971de418f16dc5136dbebaeb5",".clog.toml":"f691701bd51b5f311931d0d8f05fa3d78c00dda8d60f3313e21011309c736ff1",".github/CONTRIBUTING.md":"f7eff737f3aa25294802fefb233e3758a64b248781dbbf3262532d693f340a87",".github/ISSUE_TEMPLATE.md":"681afbd64b3603e3e82789ceb6841d851eaa7333caec5769173462bab1b5d82b",".mention-bot":"51790ab49f43ed86a4a7c3d2e468aa5fa526ca5e2ac6af20432a2cb5b2fdbe84",".travis.yml":"2975b3159624d4ecc4dd29577f378e9d4fa27f1991bfd5042ac3c267fb2cdd38","CHANGELOG.md":"89936cd672f43681351e1b76622cc44d11c69f60440dd101f7b9db1cf2f184f7","CONTRIBUTORS.md":"5d7dbafaff6879bbfbb01b22cca299953ec163872d8d624bbf99e20851ca0165","Cargo.toml":"f12c622fae3f6582168616219b6e07e2ec99943e9515b76f97974e75227b9aa0","LICENSE-MIT":"6725d1437fc6c77301f2ff0e7d52914cf4f9509213e1078dc77d9356dbe6eac5","README.md":"bce567fb1e3e57129f3d0f58f5a1e9e07dc7414731644a47939c50b76f9976bb","clap-test.rs":"995a9d41ef372a814616113f4a58c1e580043678e54527afc2ebee7e8e1d3ef5","index.html":"36f9ce4465266f3af9a259444b01c4239200473cabfc848f789f75b322a3ea8f","justfile":"811b2dec57aec46e570aeeb9945018cf87fe65f6d5b27cdb9ffca79d906910f6","rustfmt.toml":"8fd2d63119df515fd5f44e530c709b19d66b09fbc2e22a640bf4b64c57e7d6b3","src/app/help.rs":"515f3ec638e3df8323b44c906073c07657122ec1b34bdadbdc47661c5d97ad1d","src/app/macros.rs":"44610b6522cedbcb140670aac27c796379f562ce77fcf5e8d104b038aadf52ec","src/app/meta.rs":"a56d28bb466a8ba68155b3f2883e85228b4b74cf25658f62fc050e07cff2dc85","src/app/mod.rs":"d0e1843ae1f77c1da4179cebdd8fb1ea55803002fb1ae96087de3a8cdcedf6fc","src/app/parser.rs":"1bae4cecf4fc798efdc2ad8d237f17536dafd7524e2d9a366f30f72a8a275846","src/app/settings.rs":"c6b87d4da01891123edddee9e28b048cba0c19d8c1db34ad5ad3e85b657c6b97","src/app/usage.rs":"703cec975c53e7f01b14b4593de41c518910ab347bc4c54efe79367a704ffc4c","src/app/validator.rs":"bc2291f6231a63456acab9e7743d1f881f1d5dfc17955394fa856703a8e80086","src/args/any_arg.rs":"b082385eeff2505ced7b747bd44d20a3fb6fd9d4bd14be9e99870699c43ea072","src/args/arg.rs":"673de3f1957eccb1b116255bac9638fe24c0da54ccb358d958446c8ed54c9621","src/args/arg_builder/base.rs":"8b99a9ab811df3e0bdcfba8c0994042b0bcd06d8ddf794ab559baaf9a490ba59","src/args/arg_builder/flag.rs":"4007a950869789b1f4d5f953107aee228477e2d5fe82515d3b895286c65522c6","src/args/arg_builder/mod.rs":"7a32c8fd85b48f7b60e5f2c13dc70fa9100aa65cd933ba419300d28d682bf722","src/args/arg_builder/option.rs":"d5e5243e3a72d2c820c8fad4e1efc4b985881c6f60f3a72757b33a9054a87e99","src/args/arg_builder/positional.rs":"f103a22803d9fb7f7c8f37f705fe214fdaad46903439964fc13740ec6f647eb8","src/args/arg_builder/switched.rs":"61f5121b0ec746461215a47e1b7a4d699a37a3f181172820e0615f68d5f6f0ef","src/args/arg_builder/valued.rs":"19368a03e046d6b63451c3d04dff6e51d49f140ed45330f82879539c6d1b28dd","src/args/arg_matcher.rs":"27829739ae12ac7800a26109e751ce9f8c3d26e262d41de161a38baf5c421167","src/args/arg_matches.rs":"9d72a388053ef0c31fe2516df9ea791a4d0f6c0b5e9758eb61886f1ac8df89ab","src/args/group.rs":"7fe5e2f0dd24faf1765410a9336d85976875e964d7f246e1fa216c4808d88dde","src/args/macros.rs":"57f248e2694f9413cbbaf9087813ed4f27064f5f8e29eaf4ec41ec2b274ae806","src/args/matched_arg.rs":"1ed8d338869ecc3b5fa426ef4cf42f4c9c3b1dd538cdea1fe0489169345536f7","src/args/mod.rs":"c155cd989fa4ca1f8de6a79115afbf5086f092adcb854ff9698b9100f45fc323","src/args/settings.rs":"2753ff50046def9ccb7f601b3d9f565348da1ef0253af24ccee94616a2e5c470","src/args/subcommand.rs":"e1ad9638c33785f1301675de1795b0a4f4b079452aa11f7526d263c2a1179432","src/completions/bash.rs":"116c6830ee2b6310f299a69924f5b1e39b05ebec2b5f7b0ffe3b6938b7fa5514","src/completions/fish.rs":"63975f8beea9af6bef66c7dd7938bfa61c6f871995a74dbc1545daa9fbc1f2d0","src/completions/macros.rs":"ebad5037e6e63401b1a54498e09d3bd93d1a3a06f045c2990902d47eb9a73774","src/completions/mod.rs":"5d4a734df6a21e6c1e0831a2f7be50a45d2e7bdaf7475589ea78b978643229cd","src/completions/powershell.rs":"866409e5d0a9b2551d739f86c0e4faf86911e9e7c656fb74b38e6960844233b5","src/completions/shell.rs":"c7995ca229fd0d8671761da0aca0513c4f740165f02d06cd97aa0ae881c22cd4","src/completions/zsh.rs":"8ac4576e1cb3b1403dbb35ce146159aa8b29864e1d8201776200d999052b422d","src/errors.rs":"3c46a4d79d9304ffb152a190528ec9db0cb6c05799bb5211e6df9f7d7abab814","src/fmt.rs":"f205f784268572544ff7e84a89f416c898255404275d4ab1f8fea7e89695daa9","src/lib.rs":"87b3ee49c6389cdbaa23e705732bcc68e7235bb16ff469321c92a89258c21beb","src/macros.rs":"2317a90223c80d8688fea5334b09b783c8aca8894e6c22ec2fd400ce941d301b","src/osstringext.rs":"a87a5a0685dd8310f6329d5f8e8f54c0fac68eb75595a835aeb1c36208efd5f9","src/strext.rs":"d4418d396069e9c05804f92c042ba7192a4244e46059e2edc98670b45cd2daee","src/suggestions.rs":"ad1165a9896382a0f09f73c0f6bf468454c19da207f28c3973e02879f453ad68","src/usage_parser.rs":"a04143bba42a6506746091a3f898c38e2c7409bacefed21fa8194c90961ca390"},"package":"867a885995b4184be051b70a592d4d70e32d7a188db6e8dff626af286a962771"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.clog.toml
+++ /dev/null
@@ -1,13 +0,0 @@
-[clog]
-repository = "https://github.com/kbknapp/clap-rs"
-outfile = "CHANGELOG.md"
-from-latest-tag = true
-
-[sections]
-Performance = ["perf"]
-Improvements = ["impr", "im", "imp"]
-Documentation = ["docs"]
-Deprecations = ["depr"]
-Examples = ["examples"]
-"New Settings" = ["setting", "settings"]
-"API Additions" = ["add", "api"]
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# How to Contribute
-
-Contributions are always welcome! Please use the following guidelines when contributing to `clap`
-
-## Goals
-
-There are a few goals of `clap` that I'd like to maintain throughout contributions.
-
-* Remain backwards compatible when possible
-  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
-  - This does not apply for security concerns
-  - `clap` officially supports the current stable version of Rust, minus two releases (i.e. if 1.13.0 is current, `clap` must support 1.11.0 and beyond)
-* Parse arguments quickly
-  - Parsing of arguments shouldn't slow down usage of the main program
-  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
-* Try to be cognizant of memory usage
-  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
-* `panic!` on *developer* error, exit gracefully on *end-user* error
-
-### Commit Messages
-
-I use a [conventional](https://github.com/ajoslin/conventional-changelog/blob/a5505865ff3dd710cf757f50530e73ef0ca641da/conventions/angular.md) changelog format so I can update my changelog automatically using [clog](https://github.com/clog-tool/clog-cli)
-
- * Please format your commit subject line using the following format: `TYPE(COMPONENT): MESSAGE` where `TYPE` is one of the following:
-    - `api`  - An addition to the API
-    - `setting` - A new `AppSettings` variant
-    - `feat` - A new feature of an existing API
-    - `imp`  - An improvement to an existing feature/API
-    - `perf` - A performance improvement
-    - `docs` - Changes to documentation only
-    - `tests` - Changes to the testing framework or tests only
-    - `fix` - A bug fix
-    - `refactor` - Code functionality doesn't change, but underlying structure may
-    - `style` - Stylistic changes only, no functionality changes
-    - `wip` - A work in progress commit (Should typically be `git rebase`'ed away)
-    - `chore` - Catch all or things that have to do with the build system, etc
-    - `examples` - Changes to existing example, or a new example
- * The `COMPONENT` is optional, and may be a single file, directory, or logical component. Parenthesis can be omitted if you are opting not to use the `COMPONENT`. 
-
-### Tests and Documentation
-
-1. Create tests for your changes
-2. **Ensure the tests are passing.** Run the tests (`cargo test --features "yaml unstable"`), alternatively `just run-tests` if you have `just` installed.
-3. **Optional** Run the lints (`cargo build --features lints`) (requires a nightly compiler), alternatively `just lint`
-4. Ensure your changes contain documentation if adding new APIs or features.
-
-### Preparing the PR
-
-1. `git rebase` into concise commits and remove `--fixup`s or `wip` commits (`git rebase -i HEAD~NUM` where `NUM` is number of commits back to start the rebase)
-2. Push your changes back to your fork (`git push origin $your-branch`)
-3. Create a pull request against `master`! (You can also create the pull request first, and we'll merge when ready. This a good way to discuss proposed changes.)
-
-### Other ways to contribute
-
-Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](../examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
-
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,31 +0,0 @@
-Please use the following template to assist with creating an issue, and getting a speedy resolution. If an area is not aplicable, feel free to delete the area, or mark with `N/A`
-
-### Rust Version
-
-* Use the output of `rustc -V`
-
-### Affected Version of clap
-
-* Can be found in Cargo.lock of your project (i.e. `grep clap Cargo.lock`)
-
-### Expected Behavior Summary
-
-
-### Actual Behavior Summary
-
-
-### Steps to Reproduce the issue
-
-
-### Sample Code or Link to Sample Code
-
-
-### Debug output
-
-Compile clap with cargo features `"debug"` such as:
-
-```toml
-[dependencies]
-clap = { version = "2", features = ["debug"] }
-```
-The output may be very long, so feel free to link to a gist or attach a text file
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.mention-bot
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "findPotentialReviewers": false, 
-  "alwaysNotifyForPaths": [
-    {
-      "name": "kbknapp", 
-      "files": ["**/*.rs", "**/*.md", "*"] 
-    }
-  ]
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/.travis.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-sudo: true
-language: rust
-cache: cargo
-rust:
-  - nightly
-  - nightly-2017-01-25
-  - beta
-  - stable
-  - 1.11.0
-matrix:
-    allow_failures:
-        - rust: nightly
-before_script:
-  - |
-    pip install git+git://github.com/kbknapp/travis-cargo.git --user &&
-    export PATH=$HOME/.local/bin:$PATH
-script:
-  - |
-    travis-cargo test -- --verbose --no-default-features &&
-    travis-cargo --skip nightly test -- --verbose --features "yaml unstable" &&
-    travis-cargo --only nightly test -- --verbose --features "yaml unstable nightly" &&
-    travis-cargo --only nightly bench
-addons:
-  apt:
-    packages:
-    - libcurl4-openssl-dev
-    - libelf-dev
-    - libdw-dev
-    - cmake
-    - gcc
-    - binutils-dev
-after_success:
-  - |
-    wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
-    tar xzf master.tar.gz &&
-    cd kcov-master &&
-    mkdir build &&
-    cd build &&
-    cmake .. &&
-    make &&
-    sudo make install &&
-    cd ../.. &&
-    rm -rf kcov-master &&
-    cargo clean &&
-    cargo test --no-run --features "yaml unstable" &&
-    for file in target/debug/*-*; do mkdir -p "target/cov/$(basename $file)"; kcov --exclude-pattern=/.cargo --verify "target/cov/$(basename $file)" "$file"; done &&
-    kcov --coveralls-id=$TRAVIS_JOB_ID --merge target/cov target/cov/* &&
-    echo "Uploaded code coverage"
-env:
-  global:
-    - TRAVIS_CARGO_NIGHTLY_FEATURE=lints
-    - secure: JLBlgHY6OEmhJ8woewNJHmuBokTNUv7/WvLkJGV8xk0t6bXBwSU0jNloXwlH7FiQTc4TccX0PumPDD4MrMgxIAVFPmmmlQOCmdpYP4tqZJ8xo189E5zk8lKF5OyaVYCs5SMmFC3cxCsKjfwGIexNu3ck5Uhwe9jI0tqgkgM3URA=
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/CHANGELOG.md
+++ /dev/null
@@ -1,2498 +0,0 @@
-<a name="v2.24.2"></a>
-### v2.25.0 (2017-06-20)
-
-
-#### Features
-
-*   use textwrap crate for wrapping help texts ([b93870c1](https://github.com/kbknapp/clap-rs/commit/b93870c10ae3bd90d233c586a33e086803117285))
-
-#### Improvements
-
-* **Suggestions:**  suggests to use flag after subcommand when applicable ([2671ca72](https://github.com/kbknapp/clap-rs/commit/2671ca7260119d4311d21c4075466aafdd9da734))
-* Bumps bitflags crate to v0.9
-
-#### Documentation
-
-*   Change `who's` -> `whose` ([53c1ffe8](https://github.com/kbknapp/clap-rs/commit/53c1ffe87f38b05d8804a0f7832412a952845349))
-
-#### Documentation
-
-* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cbea3d5a](https://github.com/kbknapp/clap-rs/commit/cbea3d5acf3271a7a734498c4d99c709941c331e), closes [#949](https://github.com/kbknapp/clap-rs/issues/949))
-* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([f9b0d657](https://github.com/kbknapp/clap-rs/commit/f9b0d657835d3f517f313d70962177dc30acf4a7))
-* **README.md:**
-  *  added a warning about using ~ deps ([821929b5](https://github.com/kbknapp/clap-rs/commit/821929b51bd60213955705900a436c9a64fcb79f), closes [#964](https://github.com/kbknapp/clap-rs/issues/964))
-  *  added a warning about using ~ deps ([667697b0](https://github.com/kbknapp/clap-rs/commit/667697b0018369b71da41d02d567ab57df0f4887))
-* **clap_app!:**  adds using the @group specifier to the macro docs ([826048cb](https://github.com/kbknapp/clap-rs/commit/826048cb3cbc0280169303f1498ff0a2b7395883), closes [#932](https://github.com/kbknapp/clap-rs/issues/932))
-
-
-
-<a name="v2.24.2"></a>
-### v2.24.2 (2017-05-15)
-
-
-#### Bug Fixes
-
-*   adds a debug assertion to ensure all args added to groups actually exist ([14f6b8f3](https://github.com/kbknapp/clap-rs/commit/14f6b8f3a2f6df73aeeec9c54a54909b1acfc158), closes [#917](https://github.com/kbknapp/clap-rs/issues/917))
-*   fixes a bug where args that allow values to start with a hyphen couldnt contain a double hyphen -- as a value ([ebf73a09](https://github.com/kbknapp/clap-rs/commit/ebf73a09db6f3c03c19cdd76b1ba6113930e1643), closes [#960](https://github.com/kbknapp/clap-rs/issues/960))
-*   fixes a bug where positional argument help text is misaligned ([54c16836](https://github.com/kbknapp/clap-rs/commit/54c16836dea4651806a2cfad53146a83fa3abf21))
-
-#### Documentation
-
-* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cf569438](https://github.com/kbknapp/clap-rs/commit/cf569438f309c199800bb8e46c9f140187de69d7), closes [#949](https://github.com/kbknapp/clap-rs/issues/949))
-* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([ded5a2f1](https://github.com/kbknapp/clap-rs/commit/ded5a2f15474d4a5bd46a67b130ccb8b6781bd01))
-* **clap_app!:**  adds using the @group specifier to the macro docs ([fe85fcb1](https://github.com/kbknapp/clap-rs/commit/fe85fcb1772b61f13b20b7ea5290e2437a76190c), closes [#932](https://github.com/kbknapp/clap-rs/issues/932))
-
-
-
-<a name="v2.24.0"></a>
-### v2.24.0 (2017-05-07)
-
-
-#### Bug Fixes
-
-*   fixes a bug where args with last(true) and required(true) set were not being printed in the usage string ([3ac533fe](https://github.com/kbknapp/clap-rs/commit/3ac533fedabf713943eedf006f830a5a486bbe80), closes [#944](https://github.com/kbknapp/clap-rs/issues/944))
-*   fixes a bug that was printing the arg name, instead of value name when Arg::last(true) was used ([e1fe8ac3](https://github.com/kbknapp/clap-rs/commit/e1fe8ac3bc1f9cf4e36df0d881f8419755f1787b), closes [#940](https://github.com/kbknapp/clap-rs/issues/940))
-*   fixes a bug where flags were parsed as flags AND positional values when specific combinations of settings were used ([20f83292](https://github.com/kbknapp/clap-rs/commit/20f83292d070038b8cee2a6b47e91f6b0a2f7871), closes [#946](https://github.com/kbknapp/clap-rs/issues/946))
-
-
-
-<a name="v2.24.0"></a>
-## v2.24.0 (2017-05-05)
-
-
-#### Documentation
-
-* **README.md:**  fix some typos ([fa34deac](https://github.com/kbknapp/clap-rs/commit/fa34deac079f334c3af97bb7fb151880ba8887f8))
-
-#### API Additions
-
-* **Arg:**  add `default_value_os` ([d5ef8955](https://github.com/kbknapp/clap-rs/commit/d5ef8955414b1587060f7218385256105b639c88))
-* **arg_matches.rs:**  Added a Default implementation for Values and OsValues iterators. ([0a4384e3](https://github.com/kbknapp/clap-rs/commit/0a4384e350eed74c2a4dc8964c203f21ac64897f))
-
-
-<a name="v2.23.2"></a>
-### v2.23.2 (2017-04-19)
-
-
-#### Bug Fixes
-
-* **PowerShell Completions:**  fixes a bug where powershells completions cant be used if no subcommands are defined ([a8bce558](https://github.com/kbknapp/clap-rs/commit/a8bce55837dc4e0fb187dc93180884a40ae09c6f), closes [#931](https://github.com/kbknapp/clap-rs/issues/931))
-
-#### Improvements
-
-*   bumps term_size to take advantage of better terminal dimension handling ([e05100b7](https://github.com/kbknapp/clap-rs/commit/e05100b73d74066a90876bf38f952adf5e8ee422))
-* **PowerShell Completions:**  massively dedups subcommand names in the generate script to make smaller scripts that are still functionally equiv ([85b0e1cc](https://github.com/kbknapp/clap-rs/commit/85b0e1cc4b9755dda75a93d898d79bc38631552b))
-
-#### Documentation
-
-*   Fix a typo the minimum rust version required ([71dabba3](https://github.com/kbknapp/clap-rs/commit/71dabba3ea0a17c88b0e2199c9d99f0acbf3bc17))
-
-<a name="v2.23.1"></a>
-### v2.23.1 (2017-04-05)
-
-
-#### Bug Fixes
-
-*   fixes a missing newline character in the autogenerated help and version messages in some instances ([5ae9007d](https://github.com/kbknapp/clap-rs/commit/5ae9007d984ae94ae2752df51bcbaeb0ec89bc15))
-
-
-<a name="v2.23.0"></a>
-## v2.23.0 (2017-04-05)
-
-
-#### API Additions
-
-* `App::long_about`
-* `App::long_version`
-* `App::print_long_help`
-* `App::write_long_help`
-* `App::print_long_version`
-* `App::write_long_version`
-* `Arg::long_help`
-
-#### Features
-
-*   allows distinguishing between short and long version messages (-V/short or --version/long) ([59272b06](https://github.com/kbknapp/clap-rs/commit/59272b06cc213289dc604dbc694cb95d383a5d68))
-*   allows distinguishing between short and long help with subcommands in the same manner as args ([6b371891](https://github.com/kbknapp/clap-rs/commit/6b371891a1702173a849d1e95f9fecb168bf6fc4))
-*   allows specifying a short help vs a long help (i.e. varying levels of detail depending on if -h or --help was used) ([ef1b24c3](https://github.com/kbknapp/clap-rs/commit/ef1b24c3a0dff2f58c5e2e90880fbc2b69df20ee))
-* **clap_app!:**  adds support for arg names with hyphens similar to longs with hyphens ([f7a88779](https://github.com/kbknapp/clap-rs/commit/f7a8877978c8f90e6543d4f0d9600c086cf92cd7), closes [#869](https://github.com/kbknapp/clap-rs/issues/869))
-
-#### Bug Fixes
-
-*   fixes a bug that wasn't allowing help and version to be properly overridden ([8b2ceb83](https://github.com/kbknapp/clap-rs/commit/8b2ceb8368bcb70689fadf1c7f4b9549184926c1), closes [#922](https://github.com/kbknapp/clap-rs/issues/922))
-
-#### Documentation
-
-* **clap_app!:**  documents the `--("some-arg")` method for using args with hyphens inside them ([bc08ef3e](https://github.com/kbknapp/clap-rs/commit/bc08ef3e185393073d969d301989b6319c616c1f), closes [#919](https://github.com/kbknapp/clap-rs/issues/919))
-
-
-
-<a name="v2.22.2"></a>
-### v2.22.2 (2017-03-30)
-
-
-#### Bug Fixes
-
-* **Custom Usage Strings:**  fixes the usage string regression when using help templates ([0e4fd96d](https://github.com/kbknapp/clap-rs/commit/0e4fd96d74280d306d09e60ac44f938a82321769))
-
-
-
-<a name="v2.22.1"></a>
-### v2.22.1 (2017-03-24)
-
-
-#### Bug Fixes
-
-* **usage:**  fixes a big regression with custom usage strings ([2c41caba](https://github.com/kbknapp/clap-rs/commit/2c41caba3c7d723a2894e315d04da796b0e97759))
-
-<a name="v2.22.0"></a>
-## v2.22.0 (2017-03-23)
-
-#### API Additions
-
-* **App::name:**  adds the ability to change the name of the App instance after creation ([d49e8292](https://github.com/kbknapp/clap-rs/commit/d49e8292b026b06e2b70447cd9f08299f4fcba76), closes [#908](https://github.com/kbknapp/clap-rs/issues/908))
-* **Arg::hide_default_value:**  adds ability to hide the default value of an argument from the help string ([89e6ea86](https://github.com/kbknapp/clap-rs/commit/89e6ea861e16a1ad56757ca12f6b32d02253e44a), closes [#902](https://github.com/kbknapp/clap-rs/issues/902))
-
-
-<a name="v2.21.3"></a>
-### v2.21.3 (2017-03-23)
-
-#### Bug Fixes
-
-* **yaml:**  adds support for loading author info from yaml ([e04c390c](https://github.com/kbknapp/clap-rs/commit/e04c390c597a55fa27e724050342f16c42f1c5c9))
-
-
-<a name="v2.21.2"></a>
-### v2.21.2 (2017-03-17)
-
-
-#### Improvements
-
-*   add fish subcommand help support ([f8f68cf8](https://github.com/kbknapp/clap-rs/commit/f8f68cf8251669aef4539a25a7c1166f0ac81ea6))
-*   options that use `require_equals(true)` now display the equals sign in help messages, usage strings, and errors" ([c8eb0384](https://github.com/kbknapp/clap-rs/commit/c8eb0384d394d2900ccdc1593099c97808a3fa05), closes [#903](https://github.com/kbknapp/clap-rs/issues/903))
-
-
-#### Bug Fixes
-
-*  setting the max term width now correctly propagates down through child subcommands
-
-
-
-<a name="v2.21.1"></a>
-### v2.21.1 (2017-03-12)
-
-
-#### Bug Fixes
-
-* **ArgRequiredElseHelp:**  fixes the precedence of this error to prioritize over other error messages ([74b751ff](https://github.com/kbknapp/clap-rs/commit/74b751ff2e3631e337b7946347c1119829a41c53), closes [#895](https://github.com/kbknapp/clap-rs/issues/895))
-* **Positionals:**  fixes some regression bugs resulting from old asserts in debug mode. ([9a3bc98e](https://github.com/kbknapp/clap-rs/commit/9a3bc98e9b55e7514b74b73374c5ac8b6e5e0508), closes [#896](https://github.com/kbknapp/clap-rs/issues/896))
-
-
-
-<a name="v2.21.0"></a>
-## v2.21.0 (2017-03-09)
-
-#### Performance
-
-*   doesn't run `arg_post_processing` on multiple values anymore ([ec516182](https://github.com/kbknapp/clap-rs/commit/ec5161828729f6a53f0fccec8648f71697f01f78))
-*   changes internal use of `VecMap` to `Vec` for matched values of `Arg`s ([22bf137a](https://github.com/kbknapp/clap-rs/commit/22bf137ac581684c6ed460d2c3c640c503d62621))
-*   vastly reduces the amount of cloning when adding non-global args minus when they're added from `App::args` which is forced to clone ([8da0303b](https://github.com/kbknapp/clap-rs/commit/8da0303bc02db5fe047cfc0631a9da41d9dc60f7))
-*   refactor to remove unneeded vectors and allocations and checks for significant performance increases ([0efa4119](https://github.com/kbknapp/clap-rs/commit/0efa4119632f134fc5b8b9695b007dd94b76735d))
-
-#### Documentation
-
-*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/kbknapp/clap-rs/commit/60cf875d67a252e19bb85054be57696fac2c57a1))
-
-#### Improvements
-
-*   when `AppSettings::SubcommandsNegateReqs` and `ArgsNegateSubcommands` are used, a new more accurate double line usage string is shown ([50f02300](https://github.com/kbknapp/clap-rs/commit/50f02300d81788817acefef0697e157e01b6ca32), closes [#871](https://github.com/kbknapp/clap-rs/issues/871))
-
-#### API Additions
-
-* **Arg::last:**  adds the ability to mark a positional argument as 'last' which means it should be used with `--` syntax and can be accessed early ([6a7aea90](https://github.com/kbknapp/clap-rs/commit/6a7aea9043b83badd9ab038b4ecc4c787716147e), closes [#888](https://github.com/kbknapp/clap-rs/issues/888))
-*   provides `default_value_os` and `default_value_if[s]_os` ([0f2a3782](https://github.com/kbknapp/clap-rs/commit/0f2a378219a6930748d178ba350fe5925be5dad5), closes [#849](https://github.com/kbknapp/clap-rs/issues/849))
-*   provides `App::help_message` and `App::version_message` which allows one to override the auto-generated help/version flag associated help ([389c413](https://github.com/kbknapp/clap-rs/commit/389c413b7023dccab8c76aa00577ea1d048e7a99), closes [#889](https://github.com/kbknapp/clap-rs/issues/889))
-
-#### New Settings
-
-* **InferSubcommands:**  adds a setting to allow one to infer shortened subcommands or aliases (i.e. for subcommmand "test", "t", "te", or "tes" would be allowed assuming no other ambiguities) ([11602032](https://github.com/kbknapp/clap-rs/commit/11602032f6ff05881e3adf130356e37d5e66e8f9), closes [#863](https://github.com/kbknapp/clap-rs/issues/863))
-
-#### Bug Fixes
-
-*   doesn't print the argument sections in the help message if all args in that section are hidden ([ce5ee5f5](https://github.com/kbknapp/clap-rs/commit/ce5ee5f5a76f838104aeddd01c8ec956dd347f50))
-*   doesn't include the various [ARGS] [FLAGS] or [OPTIONS] if the only ones available are hidden ([7b4000af](https://github.com/kbknapp/clap-rs/commit/7b4000af97637703645c5fb2ac8bb65bd546b95b), closes [#882](https://github.com/kbknapp/clap-rs/issues/882))
-*   now correctly shows subcommand as required in the usage string when AppSettings::SubcommandRequiredElseHelp is used ([8f0884c1](https://github.com/kbknapp/clap-rs/commit/8f0884c1764983a49b45de52a1eddf8d721564d8))
-*   fixes some memory leaks when an error is detected and clap exits ([8c2dd287](https://github.com/kbknapp/clap-rs/commit/8c2dd28718262ace4ae0db98563809548e02a86b))
-*   fixes a trait that's marked private accidentlly, but should be crate internal public ([1ae21108](https://github.com/kbknapp/clap-rs/commit/1ae21108015cea87e5360402e1747025116c7878))
-* **Completions:**   fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/kbknapp/clap-rs/issues/846))
-
-#### Features
-
-* **Options:**  adds the ability to require the equals syntax with options --opt=val ([f002693d](https://github.com/kbknapp/clap-rs/commit/f002693dec6a6959c4e9590cb7b7bfffd6d6e5bc), closes [#833](https://github.com/kbknapp/clap-rs/issues/833))
-
-
-
-<a name="v2.20.5"></a>
-### v2.20.5 (2017-02-18)
-
-
-#### Bug Fixes
-
-* **clap_app!:**   fixes a critical bug of a missing fragment specifier when using `!property` style tags. ([5635c1f94](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94))
-
-
-<a name="v2.20.4"></a>
-### v2.20.4 (2017-02-15)
-
-
-#### Bug Fixes
-
-* **Completions:**   fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/kbknapp/clap-rs/issues/846))
-
-#### Documentation
-
-*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/kbknapp/clap-rs/commit/60cf875d67a252e19bb85054be57696fac2c57a1))
-
-
-<a name="v2.20.3"></a>
-### v2.20.3 (2017-02-03)
-
-
-#### Documentation
-
-* **Macros:**  adds a warning about changing values in Cargo.toml not triggering a rebuild automatically ([112aea3e](https://github.com/kbknapp/clap-rs/commit/112aea3e42ae9e0c0a2d33ebad89496dbdd95e5d), closes [#838](https://github.com/kbknapp/clap-rs/issues/838))
-
-#### Bug Fixes
-
-*   fixes a println->debugln typo ([279aa62e](https://github.com/kbknapp/clap-rs/commit/279aa62eaf08f56ce090ba16b937bc763cbb45be))
-*   fixes bash completions for commands that have an underscore in the name ([7f5cfa72](https://github.com/kbknapp/clap-rs/commit/7f5cfa724f0ac4e098f5fe466c903febddb2d994), closes [#581](https://github.com/kbknapp/clap-rs/issues/581))
-*   fixes a bug where ZSH completions would panic if the binary name had an underscore in it ([891a2a00](https://github.com/kbknapp/clap-rs/commit/891a2a006f775e92c556dda48bb32fac9807c4fb), closes [#581](https://github.com/kbknapp/clap-rs/issues/581))
-*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/kbknapp/clap-rs/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/kbknapp/clap-rs/issues/828))
-* fixes a bug where global args weren't included in the generated completion scripts ([9a1e006e](https://github.com/kbknapp/clap-rs/commit/9a1e006eb75ad5a6057ebd119aa90f7e06c0ace8), closes [#841](https://github.com/kbknapp/clap-rs/issues/841))
-
-
-
-<a name="v2.20.2"></a>
-### v2.20.2 (2017-02-03)
-
-#### Bug Fixes
-
-*   fixes a critical bug where subcommand settings were being propogated too far ([74648c94](https://github.com/kbknapp/clap-rs/commit/74648c94b893df542bfa5bb595e68c7bb8167e36), closes [#832](https://github.com/kbknapp/clap-rs/issues/832))
-
-
-#### Improvements
-
-*   adds ArgGroup::multiple to the supported YAML fields for building ArgGroups from YAML ([d8590037](https://github.com/kbknapp/clap-rs/commit/d8590037ce07dafd8cd5b26928aa4a9fd3018288), closes [#840](https://github.com/kbknapp/clap-rs/issues/840))
-
-<a name="v2.20.1"></a>
-### v2.20.1 (2017-01-31)
-
-#### Bug Fixes
-
-*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/kbknapp/clap-rs/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/kbknapp/clap-rs/issues/828))
-*   actually show character in debug output ([84d8c547](https://github.com/kbknapp/clap-rs/commit/84d8c5476de95b7f37d61888bc4f13688b712434))
-*   include final character in line lenght ([aff4ba18](https://github.com/kbknapp/clap-rs/commit/aff4ba18da8147e1259b04b0bfbc1fcb5c78a3c0))
-
-#### Improvements
-
-*   updates libc and term_size deps for the libc version conflict ([6802ac4a](https://github.com/kbknapp/clap-rs/commit/6802ac4a59c142cda9ec55ca0c45ae5cb9a6ab55))
-
-#### Documentation
-
-*   fix link from app_from_crate! to crate_authors! (#822) ([5b29be9b](https://github.com/kbknapp/clap-rs/commit/5b29be9b073330ab1f7227cdd19fe4aab39d5dcb))
-*   fix spelling of "guaranteed" ([4f30a65b](https://github.com/kbknapp/clap-rs/commit/4f30a65b9c03eb09607eb91a929a6396637dc105))
-
-<a name="v2.20.0"></a>
-
-#### New Settings
-
-* **ArgsNegateSubcommands:**  disables args being allowed between subcommands ([5e2af8c9](https://github.com/kbknapp/clap-rs/commit/5e2af8c96adb5ab75fa2d1536237ebcb41869494), closes [#793](https://github.com/kbknapp/clap-rs/issues/793))
-* **DontCollapseArgsInUsage:** disables the collapsing of positional args into `[ARGS]` in the usage string  ([c2978afc](https://github.com/kbknapp/clap-rs/commit/c2978afc61fb46d5263ab3b2d87ecde1c9ce1553), closes [#769](https://github.com/kbknapp/clap-rs/issues/769))
-* **DisableHelpSubcommand:**  disables building the `help` subcommand  ([a10fc859](https://github.com/kbknapp/clap-rs/commit/a10fc859ee20159fbd9ff4337be59b76467a64f2))
-* **AllowMissingPositional:**  allows one to implement `$ prog [optional] <required>` style CLIs where the second postional argument is required, but the first is optional ([1110fdc7](https://github.com/kbknapp/clap-rs/commit/1110fdc7a345c108820dc45783a9bf893fa4c214), closes [#636](https://github.com/kbknapp/clap-rs/issues/636))
-* **PropagateGlobalValuesDown:**  automatically propagats global arg's values down through *used* subcommands ([985536c8](https://github.com/kbknapp/clap-rs/commit/985536c8ebcc09af98aac835f42a8072ad58c262), closes [#694](https://github.com/kbknapp/clap-rs/issues/694))
-
-#### API Additions
-
-##### Arg
-
-* **Arg::value_terminator:**  adds the ability to terminate multiple values with a given string or char ([be64ce0c](https://github.com/kbknapp/clap-rs/commit/be64ce0c373efc106384baca3f487ea99fe7b8cf), closes [#782](https://github.com/kbknapp/clap-rs/issues/782))
-* **Arg::default_value_if[s]:**  adds new methods for *conditional* default values (such as a particular value from another argument was used) ([eb4010e7](https://github.com/kbknapp/clap-rs/commit/eb4010e7b21724447ef837db11ac441915728f22))
-* **Arg::requires_if[s]:**  adds the ability to *conditionally* require additional args (such as if a particular value was used) ([198449d6](https://github.com/kbknapp/clap-rs/commit/198449d64393c265f0bc327aaeac23ec4bb97226))
-* **Arg::required_if[s]:**  adds the ability for an arg to be *conditionally* required (i.e. "arg X is only required if arg Y was used with value Z") ([ee9cfddf](https://github.com/kbknapp/clap-rs/commit/ee9cfddf345a6b5ae2af42ba72aa5c89e2ca7f59))
-* **Arg::validator_os:**  adds ability to validate values which may contain invalid UTF-8 ([47232498](https://github.com/kbknapp/clap-rs/commit/47232498a813db4f3366ccd3e9faf0bff56433a4))
-
-##### Macros
-
-* **crate_description!:** Uses the `Cargo.toml` description field to fill in the `App::about` method at compile time ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-* **crate_name!:** Uses the `Cargo.toml` name field to fill in the `App::new` method at compile time ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-* **app_from_crate!:** Combines `crate_version!`, `crate_name!`, `crate_description!`, and `crate_authors!` into a single macro call to build a default `App` instance from the `Cargo.toml` fields ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-
-
-#### Features
-
-* **no_cargo:**  adds a `no_cargo` feature to disable Cargo-env-var-dependent macros for those *not* using `cargo` to build their crates (#786) ([6fdd2f9d](https://github.com/kbknapp/clap-rs/commit/6fdd2f9d693aaf1118fc61bd362273950703f43d))
-
-#### Bug Fixes
-
-* **Options:**  fixes a critical bug where options weren't forced to have a value ([5a5f2b1e](https://github.com/kbknapp/clap-rs/commit/5a5f2b1e9f598a0d0280ef3e98abbbba2bc41132), closes [#665](https://github.com/kbknapp/clap-rs/issues/665))
-*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([d3d34a2b](https://github.com/kbknapp/clap-rs/commit/d3d34a2b51ef31004055b0ab574f766d801c3adf), closes [#789](https://github.com/kbknapp/clap-rs/issues/789))
-* **Help Subcommand:**  fixes a bug where the help subcommand couldn't be overriden ([d34ec3e0](https://github.com/kbknapp/clap-rs/commit/d34ec3e032d03e402d8e87af9b2942fe2819b2da), closes [#787](https://github.com/kbknapp/clap-rs/issues/787))
-* **Low Index Multiples:**  fixes a bug which caused combinations of LowIndexMultiples and `Arg::allow_hyphen_values` to fail parsing ([26c670ca](https://github.com/kbknapp/clap-rs/commit/26c670ca16d2c80dc26d5c1ce83380ace6357318))
-
-#### Improvements
-
-* **Default Values:**  improves the error message when default values are involved ([1f33de54](https://github.com/kbknapp/clap-rs/commit/1f33de545036e7fd2f80faba251fca009bd519b8), closes [#774](https://github.com/kbknapp/clap-rs/issues/774))
-* **YAML:**  adds conditional requirements and conditional default values to YAML ([9a4df327](https://github.com/kbknapp/clap-rs/commit/9a4df327893486adb5558ffefba790c634ccdc6e), closes [#764](https://github.com/kbknapp/clap-rs/issues/764))
-*  Support `--("some-arg-name")` syntax for defining long arg names when using `clap_app!` macro ([f41ec962](https://github.com/kbknapp/clap-rs/commit/f41ec962c243a5ffff8b1be1ae2ad63970d3d1d4))
-*  Support `("some app name")` syntax for defining app names when using `clap_app!` macro ([9895b671](https://github.com/kbknapp/clap-rs/commit/9895b671cff784f35cf56abcd8270f7c2ba09699), closes [#759](https://github.com/kbknapp/clap-rs/issues/759))
-* **Help Wrapping:**  long app names (with spaces), authors, and descriptions are now wrapped appropriately ([ad4691b7](https://github.com/kbknapp/clap-rs/commit/ad4691b71a63e951ace346318238d8834e04ad8a), closes [#777](https://github.com/kbknapp/clap-rs/issues/777))
-
-
-#### Documentation
-
-* **Conditional Default Values:**  fixes the failing doc tests of Arg::default_value_ifs ([4ef09101](https://github.com/kbknapp/clap-rs/commit/4ef091019c083b4db1a0c13f1c1e95ac363259f2))
-* **Conditional Requirements:**  adds docs for Arg::requires_ifs ([7f296e29](https://github.com/kbknapp/clap-rs/commit/7f296e29db7d9036e76e5dbcc9c8b20dfe7b25bd))
-* **README.md:**  fix some typos ([f22c21b4](https://github.com/kbknapp/clap-rs/commit/f22c21b422d5b287d1a1ac183a379ee02eebf54f))
-* **src/app/mod.rs:**  fix some typos ([5c9b0d47](https://github.com/kbknapp/clap-rs/commit/5c9b0d47ca78dea285c5b9dec79063d24c3e451a))
-
-<a name="v2.19.3"></a>
-### v2.19.3 (2016-12-28)
-
-
-#### Bug Fixes
-
-*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([a0ee4993](https://github.com/kbknapp/clap-rs/commit/a0ee4993015ea97b06b5bc9f378d8bcb18f1c51c), closes [#789](https://github.com/kbknapp/clap-rs/issues/789))
-
-
-
-<a name="v2.19.2"></a>
-### v2.19.2 (2016-12-08)
-
-#### Bug Fixes
-
-* **ZSH Completions:**  escapes square brackets in ZSH completions ([7e17d5a3](https://github.com/kbknapp/clap-rs/commit/7e17d5a36b2cc2cc77e7b15796b14d639ed3cbf7), closes [#771](https://github.com/kbknapp/clap-rs/issues/771))
-
-#### Documentation
-
-* **Examples:**  adds subcommand examples ([0e0f3354](https://github.com/kbknapp/clap-rs/commit/0e0f33547a6901425afc1d9fbe19f7ae3832d9a4), closes [#766](https://github.com/kbknapp/clap-rs/issues/766))
-* **README.md:**  adds guidance on when to use ~ in version pinning, and clarifies breaking change policy ([591eaefc](https://github.com/kbknapp/clap-rs/commit/591eaefc7319142ba921130e502bb0729feed907), closes [#765](https://github.com/kbknapp/clap-rs/issues/765))
-
-
-
-<a name="v2.19.1"></a>
-### v2.19.1 (2016-12-01)
-
-
-#### Bug Fixes
-
-* **Help Messages:**  fixes help message alignment when specific settings are used on options ([cd94b318](https://github.com/kbknapp/clap-rs/commit/cd94b3188d63b63295a319e90e826bca46befcd2), closes [#760](https://github.com/kbknapp/clap-rs/issues/760))
-
-#### Improvements
-
-* **Bash Completion:**  allows bash completion to fall back to traidtional bash completion upon no matching completing function ([b1b16d56](https://github.com/kbknapp/clap-rs/commit/b1b16d56d8fddf819bdbe24b3724bb6a9f3fa613)))
-
-
-<a name="v2.19.0"></a>
-## v2.19.0 (2016-11-21)
-
-#### Features
-
-*   allows specifying AllowLeadingHyphen style values, but only for specific args vice command wide ([c0d70feb](https://github.com/kbknapp/clap-rs/commit/c0d70febad9996a77a54107054daf1914c50d4ef), closes [#742](https://github.com/kbknapp/clap-rs/issues/742))
-
-#### Bug Fixes
-
-* **Required Unless:**  fixes a bug where having required_unless set doesn't work when conflicts are also set ([d20331b6](https://github.com/kbknapp/clap-rs/commit/d20331b6f7940ac3a4e919999f8bb4780875125d), closes [#753](https://github.com/kbknapp/clap-rs/issues/753))
-* **ZSH Completions:**  fixes an issue where zsh completions caused panics if there were no subcommands ([49e7cdab](https://github.com/kbknapp/clap-rs/commit/49e7cdab76dd1ccc07221e360f07808ec62648aa), closes [#754](https://github.com/kbknapp/clap-rs/issues/754))
-
-#### Improvements
-
-* **Validators:**  improves the error messages for validators ([65eb3385](https://github.com/kbknapp/clap-rs/commit/65eb33859d3ff53e7d3277f02a9d3fd9038a9dfb), closes [#744](https://github.com/kbknapp/clap-rs/issues/744))
-
-#### Documentation
-
-*   updates the docs landing page ([01e1e33f](https://github.com/kbknapp/clap-rs/commit/01e1e33f377934099a4a725fab5cd6c5ff50eaa2))
-*   adds the macro version back to the readme ([45eb9bf1](https://github.com/kbknapp/clap-rs/commit/45eb9bf130329c3f3853aba0342c2fe3c64ff80f))
-*   fix broken docs links ([808e7cee](https://github.com/kbknapp/clap-rs/commit/808e7ceeb86d4a319bdc270f51c23a64621dbfb3))
-* **Compatibility Policy:**  adds an official compatibility policy to ([760d66dc](https://github.com/kbknapp/clap-rs/commit/760d66dc17310b357f257776624151da933cd25d), closes [#740](https://github.com/kbknapp/clap-rs/issues/740))
-* **Contributing:**  updates the readme to improve the readability and contributing sections ([eb51316c](https://github.com/kbknapp/clap-rs/commit/eb51316cdfdc7258d287ba13b67ef2f42bd2b8f6))
-
-<a name="v2.18.0"></a>
-## v2.18.0 (2016-11-05)
-
-
-#### Features
-
-* **Completions:**  adds completion support for PowerShell. ([cff82c88](https://github.com/kbknapp/clap-rs/commit/cff82c880e21064fca63351507b80350df6caadf), closes [#729](https://github.com/kbknapp/clap-rs/issues/729))
-
-
-
-<a name="v2.17.1"></a>
-### v2.17.1 (2016-11-02)
-
-
-#### Bug Fixes
-
-* **Low Index Multiples:**  fixes a bug where using low index multiples was propgated to subcommands ([33924e88](https://github.com/kbknapp/clap-rs/commit/33924e884461983c4e6b5ea1330fecc769a4ade7), closes [#725](https://github.com/kbknapp/clap-rs/issues/725))
-
-
-
-<a name="v2.17.0"></a>
-## v2.17.0 (2016-11-01)
-
-
-#### Features
-
-* **Positional Args:**  allows specifying the second to last positional argument as multiple(true) ([1ced2a74](https://github.com/kbknapp/clap-rs/commit/1ced2a7433ea8937a1b260ea65d708f32ca7c95e), closes [#725](https://github.com/kbknapp/clap-rs/issues/725))
-
-
-
-<a name="v2.16.4"></a>
-### v2.16.4 (2016-10-31)
-
-
-#### Improvements
-
-* **Error Output:**  conflicting errors are now symetrical, meaning more consistent and less confusing ([3d37001d](https://github.com/kbknapp/clap-rs/commit/3d37001d1dc647d73cc597ff172f1072d4beb80d), closes [#718](https://github.com/kbknapp/clap-rs/issues/718))
-
-#### Documentation
-
-*   Fix typo in example `13a_enum_values_automatic` ([c22fbc07](https://github.com/kbknapp/clap-rs/commit/c22fbc07356e556ffb5d1a79ec04597d149b915e))
-* **README.md:**  fixes failing yaml example (#715) ([21fba9e6](https://github.com/kbknapp/clap-rs/commit/21fba9e6cd8c163012999cd0ce271ec8780c5695))
-
-#### Bug Fixes
-
-* **ZSH Completions:**  fixes bug that caused panic on subcommands with aliases ([5c70e1a0](https://github.com/kbknapp/clap-rs/commit/5c70e1a01bc977e44c10015d18bb8e215c32dfc8), closes [#714](https://github.com/kbknapp/clap-rs/issues/714))
-* **debug:**  fixes the debug feature (#716) ([6c11ccf4](https://github.com/kbknapp/clap-rs/commit/6c11ccf443d46258d51f7cda33fbcc81e7fe8e90))
-
-
-
-<a name="v2.16.3"></a>
-### v2.16.3 (2016-10-28)
-
-
-#### Bug Fixes
-
-*   Derive display order after propagation ([9cb6facf](https://github.com/kbknapp/clap-rs/commit/9cb6facf507aff7cddd124b8c29714d2b0e7bd13), closes [#706](https://github.com/kbknapp/clap-rs/issues/706))
-* **yaml-example:**  inconsistent args ([847f7199](https://github.com/kbknapp/clap-rs/commit/847f7199219ead5065561d91d64780d99ae4b587))
-
-
-
-<a name="v2.15.1"></a>
-### v2.16.2 (2016-10-25)
-
-
-#### Bug Fixes
-
-* **Fish Completions:**  fixes a bug where single quotes are not escaped ([780b4a18](https://github.com/kbknapp/clap-rs/commit/780b4a18281b6f7f7071e1b9db2290fae653c406), closes [#704](https://github.com/kbknapp/clap-rs/issues/704))
-
-
-<a name="v2.16.1"></a>
-### v2.16.1 (2016-10-24)
-
-
-#### Bug Fixes
-
-* **Help Message:**  fixes a regression bug where args with multiple(true) threw off alignment ([ebddac79](https://github.com/kbknapp/clap-rs/commit/ebddac791f3ceac193d5ad833b4b734b9643a7af), closes [#702](https://github.com/kbknapp/clap-rs/issues/702))
-
-
-
-<a name="v2.16.0"></a>
-## v2.16.0 (2016-10-23)
-
-
-#### Features
-
-* **Completions:**  adds ZSH completion support ([3e36b0ba](https://github.com/kbknapp/clap-rs/commit/3e36b0bac491d3f6194aee14604caf7be26b3d56), closes [#699](https://github.com/kbknapp/clap-rs/issues/699))
-
-
-
-<a name="v2.15.0"></a>
-## v2.15.0 (2016-10-21)
-
-
-#### Features
-
-* **AppSettings:**  adds new setting `AppSettings::AllowNegativeNumbers` ([ab064546](https://github.com/kbknapp/clap-rs/commit/ab06454677fb6aa9b9f804644fcca2168b1eaee3), closes [#696](https://github.com/kbknapp/clap-rs/issues/696))
-
-#### Documentation
-
-* **app/settings.rs:**  moves variants to roughly alphabetical order ([9ed4d4d7](https://github.com/kbknapp/clap-rs/commit/9ed4d4d7957a23357aef60081e45639ab9e3905f))
-
-
-<a name="v2.14.1"></a>
-### v2.14.1 (2016-10-20)
-
-
-#### Documentation
-
-*   Improve documentation around features ([4ee85b95](https://github.com/kbknapp/clap-rs/commit/4ee85b95d2d16708a016a3ba4e6e2c93b89b7fad))
-*   reword docs for ErrorKind and app::Settings ([3ccde7a4](https://github.com/kbknapp/clap-rs/commit/3ccde7a4b8f7a2ea8b916a5415c04a8ff4b5cb7a))
-*   fix tests that fail when the "suggestions" feature is disabled ([996fc381](https://github.com/kbknapp/clap-rs/commit/996fc381763a48d125c7ea8a58fed057fd0b4ac6))
-*   fix the OsString-using doc-tests ([af9e1a39](https://github.com/kbknapp/clap-rs/commit/af9e1a393ce6cdda46a03c8a4f48df222b015a24))
-*   tag non-rust code blocks as such instead of ignoring them ([0ba9f4b1](https://github.com/kbknapp/clap-rs/commit/0ba9f4b123f281952581b6dec948f7e51dd22890))
-* **ErrorKind:**  improve some errors about subcommands ([9f6217a4](https://github.com/kbknapp/clap-rs/commit/9f6217a424da823343d7b801b9c350dee3cd1906))
-* **yaml:**  make sure the doc-tests don't fail before "missing file" ([8c0f5551](https://github.com/kbknapp/clap-rs/commit/8c0f55516f4910c78c9f8a2bdbd822729574f95b))
-
-#### Improvements
-
-*   Stabilize clap_app! ([cd516006](https://github.com/kbknapp/clap-rs/commit/cd516006e35c37b005f329338560a0a53d1f3e00))
-* **with_defaults:**  Deprecate App::with_defaults() ([26085409](https://github.com/kbknapp/clap-rs/commit/2608540940c8bb66e517b65706bc7dea55510682), closes [#638](https://github.com/kbknapp/clap-rs/issues/638))
-
-#### Bug Fixes
-
-*   fixes a bug that made determining when to auto-wrap long help messages inconsistent ([468baadb](https://github.com/kbknapp/clap-rs/commit/468baadb8398fc1d37897b0c49374aef4cf97dca), closes [#688](https://github.com/kbknapp/clap-rs/issues/688))
-* **Completions:**  fish completions for nested subcommands ([a61eaf8a](https://github.com/kbknapp/clap-rs/commit/a61eaf8aade76cfe90ccc0f7125751ebf60e3254))
-* **features:**  Make lints not enable other nightly-requiring features ([835f75e3](https://github.com/kbknapp/clap-rs/commit/835f75e3ba20999117363ed9f916464d777f36ef))
-
-
-
-<a name="v2.14.0"></a>
-## v2.14.0 (2016-10-05)
-
-
-#### Features
-
-* **arg_aliases:**  Ability to alias arguments ([33b5f6ef](https://github.com/kbknapp/clap-rs/commit/33b5f6ef2c9612ecabb31f96b824793e46bfd3dd), closes [#669](https://github.com/kbknapp/clap-rs/issues/669))
-* **flag_aliases:**  Ability to alias flags ([40d6dac9](https://github.com/kbknapp/clap-rs/commit/40d6dac973927dded6ab423481634ef47ee7bfd7))
-
-#### Bug Fixes
-
-* **UsageParser:**  Handle non-ascii names / options. ([1d6a7c6e](https://github.com/kbknapp/clap-rs/commit/1d6a7c6e7e6aadc527346aa822f19d8587f714f3), closes [#664](https://github.com/kbknapp/clap-rs/issues/664))
-
-#### Documentation
-
-*   typo ([bac417fa](https://github.com/kbknapp/clap-rs/commit/bac417fa1cea3d32308334c7cccfcf54546cd9d8))
-
-
-<a name="v2.13.0"></a>
-## v2.13.0 (2016-09-18)
-
-
-#### Documentation
-
-*   updates README.md with new website information and updated video tutorials info ([0c19c580](https://github.com/kbknapp/clap-rs/commit/0c19c580cf50f1b82ff32f70b36708ae2bcac132))
-*   updates the docs about removing implicit value_delimiter(true) ([c81bc722](https://github.com/kbknapp/clap-rs/commit/c81bc722ebb8a86d22be89b5aec98df9fe222a08))
-* **Default Values:**  adds better examples on using default values ([57a8d9ab](https://github.com/kbknapp/clap-rs/commit/57a8d9abb2f973c235a8a14f8fc031673d7a7460), closes [#418](https://github.com/kbknapp/clap-rs/issues/418))
-
-#### Bug Fixes
-
-* **Value Delimiters:**  fixes the confusion around implicitly setting value delimiters. (default is now `false`) ([09d4d0a9](https://github.com/kbknapp/clap-rs/commit/09d4d0a9038d7ce2df55c2aec95e16f36189fcee), closes [#666](https://github.com/kbknapp/clap-rs/issues/666))
-
-
-
-<a name="v2.12.1"></a>
-### v2.12.1 (2016-09-13)
-
-
-#### Bug Fixes
-
-* **Help Wrapping:**  fixes a regression-bug where the old {n} newline char stopped working ([92ac353b](https://github.com/kbknapp/clap-rs/commit/92ac353b48b7caa2511ad2a046d94da93c236cf6), closes [#661](https://github.com/kbknapp/clap-rs/issues/661))
-
-
-
-<a name="v2.12.0"></a>
-## v2.12.0 (2016-09-13)
-
-
-#### Features
-
-* **Help:**  adds ability to hide the possible values on a per argument basis ([9151ef73](https://github.com/kbknapp/clap-rs/commit/9151ef739871f2e74910c342299c0de196b95dec), closes [#640](https://github.com/kbknapp/clap-rs/issues/640))
-* **help:**  allow for limiting detected terminal width ([a43e28af](https://github.com/kbknapp/clap-rs/commit/a43e28af85c9a9deaedd5ef735f4f13008daab29), closes [#653](https://github.com/kbknapp/clap-rs/issues/653))
-
-#### Documentation
-
-* **Help Wrapping:**  removes the verbage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/kbknapp/clap-rs/commit/c5a2b352ca600f5b802290ad945731066cd53611))
-* **Value Delimiters:**  updates the docs for the Arg::multiple method WRT value delimiters and default settings ([f9d17a06](https://github.com/kbknapp/clap-rs/commit/f9d17a060aa53f10d0a6e1a7eed5d989d1a59533))
-* **appsettings:**  Document AppSetting::DisableVersion ([94501965](https://github.com/kbknapp/clap-rs/commit/945019654d2ca67eb2b1d6014fdf80b84d528d30), closes [#589](https://github.com/kbknapp/clap-rs/issues/589))
-
-#### Bug Fixes
-
-* **AllowLeadingHyphen:**  fixes a bug where valid args aren't recognized with this setting ([a9699e4d](https://github.com/kbknapp/clap-rs/commit/a9699e4d7cdc9a06e73b845933ff1fe6d76f016a), closes [#588](https://github.com/kbknapp/clap-rs/issues/588))
-
-#### Improvements
-
-* **Help Wrapping:**
-  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/kbknapp/clap-rs/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/kbknapp/clap-rs/issues/617))
-  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/kbknapp/clap-rs/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))
-* **Value Delimiters:**  changes the default value delimiter rules ([f9e69254](https://github.com/kbknapp/clap-rs/commit/f9e692548e8c94de15f909432de301407d6bb834), closes [#655](https://github.com/kbknapp/clap-rs/issues/655))
-* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/kbknapp/clap-rs/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))
-
-#### Performance
-
-* **help:**  fix redundant contains() checks ([a8afed74](https://github.com/kbknapp/clap-rs/commit/a8afed7428bf0733f8e93bb11ad6c00d9e970fcc))
-
-
-
-<a name="v2.11.3"></a>
-### v2.11.3 (2016-09-07)
-
-
-#### Documentation
-
-* **Help Wrapping:**  removes the verbage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/kbknapp/clap-rs/commit/c5a2b352ca600f5b802290ad945731066cd53611))
-
-#### Improvements
-
-* **Help Wrapping:**
-  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/kbknapp/clap-rs/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/kbknapp/clap-rs/issues/617))
-  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/kbknapp/clap-rs/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))
-* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/kbknapp/clap-rs/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))
-
-
-
-
-<a name="v2.11.2"></a>
-### v2.11.2 (2016-09-06)
-
-#### Improvements
-
-* **Help Wrapping:**  makes some minor changes to when next line help is automatically used ([5658b117](https://github.com/kbknapp/clap-rs/commit/5658b117aec3e03adff9c8c52a4c4bc1fcb4e1ff))
-
-
-<a name="v2.11.1"></a>
-### v2.11.1 (2016-09-05)
-
-
-#### Bug Fixes
-
-* **Settings:**  fixes an issue where settings weren't propogated down through grand-child subcommands ([b3efc107](https://github.com/kbknapp/clap-rs/commit/b3efc107515d78517b20798ff3890b8a2b04498e), closes [#638](https://github.com/kbknapp/clap-rs/issues/638))
-
-#### Features
-
-* **Errors:**  Errors with custom description ([58512f2f](https://github.com/kbknapp/clap-rs/commit/58512f2fcb430745f1ee6ee8f1c67f62dc216c73))
-
-#### Improvements
-
-* **help:**  use term_size instead of home-grown solution ([fc7327e9](https://github.com/kbknapp/clap-rs/commit/fc7327e9dcf4258ef2baebf0a8714d9c0622855b))
-
-
-
-<a name="v2.11.0"></a>
-### v2.11.0 (2016-08-28)
-
-
-#### Bug Fixes
-
-* **Groups:**  fixes some usage strings that contain both args in groups and ones that conflict with each other ([3d782def](https://github.com/kbknapp/clap-rs/commit/3d782def57725e2de26ca5a5bc5cc2e40ddebefb), closes [#616](https://github.com/kbknapp/clap-rs/issues/616))
-
-#### Documentation
-
-*   moves docs to docs.rs ([03209d5e](https://github.com/kbknapp/clap-rs/commit/03209d5e1300906f00bafec1869c2047a92e5071), closes [#634](https://github.com/kbknapp/clap-rs/issues/634))
-
-#### Improvements
-
-* **Completions:**  uses standard conventions for bash completion files, namely '{bin}.bash-completion' ([27f5bbfb](https://github.com/kbknapp/clap-rs/commit/27f5bbfbcc9474c2f57c2b92b1feb898ae46ee70), closes [#567](https://github.com/kbknapp/clap-rs/issues/567))
-* **Help:**  automatically moves help text to the next line and wraps when term width is determined to be too small, or help text is too long ([150964c4](https://github.com/kbknapp/clap-rs/commit/150964c4e7124d54476c9d9b4b3f2406f0fd00e5), closes [#597](https://github.com/kbknapp/clap-rs/issues/597))
-* **YAML Errors:**  vastly improves error messages when using YAML ([f43b7c65](https://github.com/kbknapp/clap-rs/commit/f43b7c65941c53adc0616b8646a21dc255862eb2), closes [#574](https://github.com/kbknapp/clap-rs/issues/574))
-
-#### Features
-
-*   adds App::with_defaults to automatically use crate_authors! and crate_version! macros ([5520bb01](https://github.com/kbknapp/clap-rs/commit/5520bb012c127dfd299fd55699443c744d8dcd5b), closes [#600](https://github.com/kbknapp/clap-rs/issues/600))
-
-
-
-<a name="v2.10.4"></a>
-### v2.10.4 (2016-08-25)
-
-
-#### Bug Fixes
-
-* **Help Wrapping:**  fixes a bug where help is wrapped incorrectly and causing a panic with some non-English characters ([d0b442c7](https://github.com/kbknapp/clap-rs/commit/d0b442c7beeecac9764406bc3bd171ced0b8825e), closes [#626](https://github.com/kbknapp/clap-rs/issues/626))
-
-
-
-<a name="v2.10.3"></a>
-### v2.10.3 (2016-08-25)
-
-#### Features
-
-* **Help:**  adds new short hand way to use source formatting and ignore term width in help messages ([7dfdaf20](https://github.com/kbknapp/clap-rs/commit/7dfdaf200ebb5c431351a045b48f5e0f0d3f31db), closes [#625](https://github.com/kbknapp/clap-rs/issues/625))
-
-#### Documentation
-
-* **Term Width:**  adds details about set_term_width(0) ([00b8205d](https://github.com/kbknapp/clap-rs/commit/00b8205d22639d1b54b9c453c55c785aace52cb2))
-
-#### Bug Fixes
-
-* **Unicode:**  fixes two bugs where non-English characters were stripped or caused a panic with help wrapping ([763a5c92](https://github.com/kbknapp/clap-rs/commit/763a5c920e23efc74d190af0cb8b5dd714b2d67a), closes [#626](https://github.com/kbknapp/clap-rs/issues/626))
-
-
-
-<a name="v2.10.2"></a>
-### v2.10.2 (2016-08-22)
-
-
-#### Bug Fixes
-
-*   fixes a bug where the help is printed twice ([a643fb28](https://github.com/kbknapp/clap-rs/commit/a643fb283acd9905dc727c4579c5c9fa2ceaa7e7), closes [#623](https://github.com/kbknapp/clap-rs/issues/623))
-
-
-
-<a name="v2.10.1"></a>
-### v2.10.1 (2016-08-21)
-
-
-#### Bug Fixes
-
-* **Help Subcommand:**  fixes misleading usage string when using multi-level subcommmands ([e203515e](https://github.com/kbknapp/clap-rs/commit/e203515e3ac495b405dbba4f78fb6af148fd282e), closes [#618](https://github.com/kbknapp/clap-rs/issues/618))
-
-#### Features
-
-* **YAML:**  allows using lists or single values with arg declarations ([9ade2cd4](https://github.com/kbknapp/clap-rs/commit/9ade2cd4b268d6d7fe828319ce6a523c641b9c38), closes [#614](https://github.com/kbknapp/clap-rs/issues/614), [#613](https://github.com/kbknapp/clap-rs/issues/613))
-
-
-
-<a name="v2.10.0"></a>
-## v2.10.0 (2016-07-29)
-
-
-#### Features
-
-* **Completions:**  one can generate a basic fish completions script at compile time ([1979d2f2](https://github.com/kbknapp/clap-rs/commit/1979d2f2f3216e57d02a97e624a8a8f6cf867ed9))
-
-#### Bug Fixes
-
-* **parser:**  preserve external subcommand name ([875df243](https://github.com/kbknapp/clap-rs/commit/875df24316c266920a073c13bbefbf546bc1f635))
-
-#### Breaking Changes
-
-* **parser:**  preserve external subcommand name ([875df243](https://github.com/kbknapp/clap-rs/commit/875df24316c266920a073c13bbefbf546bc1f635))
-
-#### Documentation
-
-* **YAML:**  fixes example 17's incorrect reference to arg_groups instead of groups ([b6c99e13](https://github.com/kbknapp/clap-rs/commit/b6c99e1377f918e78c16c8faced70a71607da931), closes [#601](https://github.com/kbknapp/clap-rs/issues/601))
-
-
-
-<a name="2.9.3"></a>
-### 2.9.3 (2016-07-24)
-
-
-#### Bug Fixes
-
-*   fixes bug where only first arg in list of required_unless_one is recognized ([1fc3b55b](https://github.com/kbknapp/clap-rs/commit/1fc3b55bd6c8653b02e7c4253749c6b77737d2ac), closes [#575](https://github.com/kbknapp/clap-rs/issues/575))
-* **Settings:**  fixes typo subcommandsrequired->subcommandrequired ([fc72cdf5](https://github.com/kbknapp/clap-rs/commit/fc72cdf591d30f5d9375d0b5cc2a2ff3e812f9f6), closes [#593](https://github.com/kbknapp/clap-rs/issues/593))
-
-#### Features
-
-* **Completions:**  adds the ability to generate completions to io::Write object ([9f62cf73](https://github.com/kbknapp/clap-rs/commit/9f62cf7378ba5acb5ce8c5bac89b4aa60c30755f))
-* **Settings:**  Add unset_setting and unset_settings fns to App (#598) ([0ceba231](https://github.com/kbknapp/clap-rs/commit/0ceba231c6767cd6d88fdb1feeeea41deadf77ff), closes [#590](https://github.com/kbknapp/clap-rs/issues/590))
-
-
-<a name="2.9.2"></a>
-### 2.9.2 (2016-07-03)
-
-
-#### Documentation
-
-* **Completions:**  fixes the formatting of the Cargo.toml excerpt in the completions example ([722f2607](https://github.com/kbknapp/clap-rs/commit/722f2607beaef56b6a0e433db5fd09492d9f028c))
-
-#### Bug Fixes
-
-* **Completions:**  fixes bug where --help and --version short weren't added to the completion list ([e9f2438e](https://github.com/kbknapp/clap-rs/commit/e9f2438e2ce99af0ae570a2eaf541fc7f55b771b), closes [#536](https://github.com/kbknapp/clap-rs/issues/536))
-
-
-
-<a name="2.9.1"></a>
-### 2.9.1 (2016-07-02)
-
-
-#### Improvements
-
-* **Completions:**  allows multiple completions to be built by namespacing with bin name ([57484b2d](https://github.com/kbknapp/clap-rs/commit/57484b2daeaac01c1026e8c84efc8bf099e0eb31))
-
-
-<a name="v2.9.0"></a>
-## v2.9.0 (2016-07-01)
-
-
-#### Documentation
-
-* **Completions:**
-  *  fixes some errors in the completion docs ([9b359bf0](https://github.com/kbknapp/clap-rs/commit/9b359bf06255d3dad8f489308044b60a9d1e6a87))
-  *  adds documentation for completion scripts ([c6c519e4](https://github.com/kbknapp/clap-rs/commit/c6c519e40efd6c4533a9ef5efe8e74fd150391b7))
-
-#### Features
-
-* **Completions:**
-  *  one can now generate a bash completions script at compile time! ([e75b6c7b](https://github.com/kbknapp/clap-rs/commit/e75b6c7b75f729afb9eb1d2a2faf61dca7674634), closes [#376](https://github.com/kbknapp/clap-rs/issues/376))
-  *  completions now include aliases to subcommands, including all subcommand options ([0ab9f840](https://github.com/kbknapp/clap-rs/commit/0ab9f84052a8cf65b5551657f46c0c270841e634), closes [#556](https://github.com/kbknapp/clap-rs/issues/556))
-  *  completions now continue completing even after first completion ([18fc2e5b](https://github.com/kbknapp/clap-rs/commit/18fc2e5b5af63bf54a94b72cec5e1223d49f4806))
-  *  allows matching on possible values in options ([89cc2026](https://github.com/kbknapp/clap-rs/commit/89cc2026ba9ac69cf44c5254360bbf99236d4f89), closes [#557](https://github.com/kbknapp/clap-rs/issues/557))
-
-#### Bug Fixes
-
-* **AllowLeadingHyphen:**  fixes an issue where  isn't ignored like it should be with this setting ([96c24c9a](https://github.com/kbknapp/clap-rs/commit/96c24c9a8fa1f85e06138d3cdd133e51659e19d2), closes [#558](https://github.com/kbknapp/clap-rs/issues/558))
-
-<a name="v2.8.0"></a>
-## v2.8.0 (2016-06-30)
-
-
-#### Features
-
-* **Arg:**  adds new setting `Arg::require_delimiter` which requires val delimiter to parse multiple values ([920b5595](https://github.com/kbknapp/clap-rs/commit/920b5595ed72abfb501ce054ab536067d8df2a66))
-
-#### Bug Fixes
-
-*   Declare term::Winsize as repr(C) ([5d663d90](https://github.com/kbknapp/clap-rs/commit/5d663d905c9829ce6e7a164f1f0896cdd70236dd))
-
-#### Documentation
-
-* **Arg:**  adds docs for ([49af4e38](https://github.com/kbknapp/clap-rs/commit/49af4e38a5dae2ab0a7fc3b4147e2c053d532484))
-
-
-
-<a name="v2.7.1"></a>
-### v2.7.1 (2016-06-29)
-
-
-#### Bug Fixes
-
-* **Options:**
-  *  options with multiple values and using delimiters no longer parse additional values after a trailing space ([cdc500bd](https://github.com/kbknapp/clap-rs/commit/cdc500bdde6abe238c36ade406ddafc2bafff583))
-  *  using options with multiple values and with an = no longer parse args after the trailing space as values ([290f61d0](https://github.com/kbknapp/clap-rs/commit/290f61d07177413cf082ada55526d83405f6d011))
-
-
-
-<a name="v2.7.0"></a>
-## v2.7.0 (2016-06-28)
-
-
-#### Documentation
-
-*   fix typos ([43b3d40b](https://github.com/kbknapp/clap-rs/commit/43b3d40b8c38b1571da75af86b5088be96cccec2))
-* **ArgGroup:**  vastly improves ArgGroup docs by adding better examples ([9e5f4f5d](https://github.com/kbknapp/clap-rs/commit/9e5f4f5d734d630bca5535c3a0aa4fd4f9db3e39), closes [#534](https://github.com/kbknapp/clap-rs/issues/534))
-
-#### Features
-
-* **ArgGroup:**  one can now specify groups which require AT LEAST one of the args ([33689acc](https://github.com/kbknapp/clap-rs/commit/33689acc689b217a8c0ee439f1b1225590c38355), closes [#533](https://github.com/kbknapp/clap-rs/issues/533))
-
-#### Bug Fixes
-
-* **App:**  using `App::print_help` now prints the same as would have been printed by `--help` or the like ([e84cc018](https://github.com/kbknapp/clap-rs/commit/e84cc01836bbe0527e97de6db9889bd9e0fd6ba1), closes [#536](https://github.com/kbknapp/clap-rs/issues/536))
-* **Help:**
-  *  prevents invoking <cmd> help help and displaying incorrect help message ([e3d2893f](https://github.com/kbknapp/clap-rs/commit/e3d2893f377942a2d4cf3c6ff04524d0346e6fdb), closes [#538](https://github.com/kbknapp/clap-rs/issues/538))
-  *  subcommand help messages requested via <cmd> help <sub> now correctly match <cmd> <sub> --help ([08ad1cff](https://github.com/kbknapp/clap-rs/commit/08ad1cff4fec57224ea957a2891a057b323c01bc), closes [#539](https://github.com/kbknapp/clap-rs/issues/539))
-
-#### Improvements
-
-* **ArgGroup:**  Add multiple ArgGroups per Arg ([902e182f](https://github.com/kbknapp/clap-rs/commit/902e182f7a58aff11ff01e0a452abcdbdb2262aa), closes [#426](https://github.com/kbknapp/clap-rs/issues/426))
-* **Usage Strings:**  `[FLAGS]` and `[ARGS]` are no longer blindly added to usage strings ([9b2e45b1](https://github.com/kbknapp/clap-rs/commit/9b2e45b170aff567b038d8b3368880b6046c10c6), closes [#537](https://github.com/kbknapp/clap-rs/issues/537))
-* **arg_enum!:**  allows using meta items like repr(C) with arg_enum!s ([edf9b233](https://github.com/kbknapp/clap-rs/commit/edf9b2331c17a2cbcc13f961add4c55c2778e773), closes [#543](https://github.com/kbknapp/clap-rs/issues/543))
-
-
-
-<a name="v2.6.0"></a>
-## v2.6.0 (2016-06-14)
-
-
-#### Improvements
-
-*   removes extra newline from help output ([86e61d19](https://github.com/kbknapp/clap-rs/commit/86e61d19a748fb9870fcf1175308984e51ca1115))
-*   allows printing version to any io::Write object ([921f5f79](https://github.com/kbknapp/clap-rs/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))
-*   removes extra newline when printing version ([7e2e2cbb](https://github.com/kbknapp/clap-rs/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))
-* **Aliases:**  improves readability of asliases in help messages ([ca511de7](https://github.com/kbknapp/clap-rs/commit/ca511de71f5b8c2ac419f1b188658e8c63b67846), closes [#526](https://github.com/kbknapp/clap-rs/issues/526), [#529](https://github.com/kbknapp/clap-rs/issues/529))
-* **Usage Strings:**  improves the default usage string when only a single positional arg is present ([ec86f2da](https://github.com/kbknapp/clap-rs/commit/ec86f2dada1545a63fc72355e22fcdc4c466c215), closes [#518](https://github.com/kbknapp/clap-rs/issues/518))
-
-#### Features
-
-* **Help:**  allows wrapping at specified term width (Even on Windows!) ([1761dc0d](https://github.com/kbknapp/clap-rs/commit/1761dc0d27d0d621229d792be40c36fbf65c3014), closes [#451](https://github.com/kbknapp/clap-rs/issues/451))
-* **Settings:**
-  *  adds new setting to stop delimiting values with -- or TrailingVarArg ([fc3e0f5a](https://github.com/kbknapp/clap-rs/commit/fc3e0f5afda6d24cdb3c4676614beebe13e1e870), closes [#511](https://github.com/kbknapp/clap-rs/issues/511))
-  *  one can now set an AppSetting which is propogated down through child subcommands ([e2341835](https://github.com/kbknapp/clap-rs/commit/e23418351a3b98bf08dfd7744bc14377c70d59ee), closes [#519](https://github.com/kbknapp/clap-rs/issues/519))
-* **Subcommands:**  adds support for visible aliases ([7b10e7f8](https://github.com/kbknapp/clap-rs/commit/7b10e7f8937a07fdb8d16a6d8df79ce78d080cd3), closes [#522](https://github.com/kbknapp/clap-rs/issues/522))
-
-#### Bug Fixes
-
-*   fixes bug where args are printed out of order with templates ([05abb534](https://github.com/kbknapp/clap-rs/commit/05abb534864764102031a0d402e64ac65867aa87))
-*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/kbknapp/clap-rs/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/kbknapp/clap-rs/issues/514))
-*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/kbknapp/clap-rs/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))
-* **Help:**  `App::before_help` and `App::after_help` now correctly wrap ([1f4da767](https://github.com/kbknapp/clap-rs/commit/1f4da7676e6e71aa8dda799f3eeefad105a47819), closes [#516](https://github.com/kbknapp/clap-rs/issues/516))
-* **Settings:**  fixes bug where new color settings couldn't be converted from strs ([706a7c11](https://github.com/kbknapp/clap-rs/commit/706a7c11b0900be594de6d5a3121938eff197602))
-* **Subcommands:**  subcommands with aliases now display help of the aliased subcommand ([5354d14b](https://github.com/kbknapp/clap-rs/commit/5354d14b51f189885ba110e01e6b76cca3752992), closes [#521](https://github.com/kbknapp/clap-rs/issues/521))
-* **Windows:**  fixes a failing windows build ([01e7dfd6](https://github.com/kbknapp/clap-rs/commit/01e7dfd6c07228c0be6695b3c7bf9370d82860d4))
-* **YAML:**  adds missing YAML methods for App and Arg ([e468faf3](https://github.com/kbknapp/clap-rs/commit/e468faf3f05950fd9f72d84b69aa2061e91c6c64), closes [#528](https://github.com/kbknapp/clap-rs/issues/528))
-
-
-
-<a name="v2.5.2"></a>
-### v2.5.2 (2016-05-31)
-
-
-#### Improvements
-
-*   removes extra newline from help output ([86e61d19](https://github.com/kbknapp/clap-rs/commit/86e61d19a748fb9870fcf1175308984e51ca1115))
-*   allows printing version to any io::Write object ([921f5f79](https://github.com/kbknapp/clap-rs/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))
-*   removes extra newline when printing version ([7e2e2cbb](https://github.com/kbknapp/clap-rs/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))
-
-#### Bug Fixes
-
-*   fixes bug where args are printed out of order with templates ([3935431d](https://github.com/kbknapp/clap-rs/commit/3935431d5633f577c0826ae2142794b301f4b8ca))
-*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/kbknapp/clap-rs/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/kbknapp/clap-rs/issues/514))
-*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/kbknapp/clap-rs/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))
-
-#### Documentation
-
-*   inter-links all types and pages ([3312893d](https://github.com/kbknapp/clap-rs/commit/3312893ddaef3f44d68d8d26ed3d08010be50d97), closes [#505](https://github.com/kbknapp/clap-rs/issues/505))
-*   makes all publicly available types viewable in docs ([52ca6505](https://github.com/kbknapp/clap-rs/commit/52ca6505b4fec7b5c2d53d160c072d395eb21da6))
-
-<a name="v2.5.1"></a>
-### v2.5.1 (2016-05-11)
-
-
-#### Bug Fixes
-
-* **Subcommand Aliases**: fixes lifetime issue when setting multiple aliases at once ([ac42f6cf0](https://github.com/kbknapp/clap-rs/commit/ac42f6cf0de6c4920f703807d63061803930b18d))
-
-<a name="v2.5.0"></a>
-## v2.5.0 (2016-05-10)
-
-
-#### Improvements
-
-* **SubCommand Aliases:**  adds feature to yaml configs too ([69592195](https://github.com/kbknapp/clap-rs/commit/695921954dde46dfd483399dcdef482c9dd7f34a))
-
-#### Features
-
-* **SubCommands:**  adds support for subcommand aliases ([66b4dea6](https://github.com/kbknapp/clap-rs/commit/66b4dea65c44d8f77ff522238a9237aed1bcab6d), closes [#469](https://github.com/kbknapp/clap-rs/issues/469))
-
-
-<a name="v2.4.3"></a>
-### v2.4.3 (2016-05-10)
-
-
-#### Bug Fixes
-
-* **Usage Strings:**
-  *  now properly dedups args that are also in groups ([3ca0947c](https://github.com/kbknapp/clap-rs/commit/3ca0947c166b4f8525752255e3a4fa6565eb9689), closes [#498](https://github.com/kbknapp/clap-rs/issues/498))
-  *  removes duplicate groups from usage strings ([f574fb8a](https://github.com/kbknapp/clap-rs/commit/f574fb8a7cde4d4a2fa4c4481d59be2d0f135427))
-
-#### Improvements
-
-* **Groups:**  formats positional args in groups in a better way ([fef11154](https://github.com/kbknapp/clap-rs/commit/fef11154fb7430d1cbf04a672aabb366e456a368))
-* **Help:**
-  *  moves positionals to standard <> formatting ([03dfe5ce](https://github.com/kbknapp/clap-rs/commit/03dfe5ceff1d63f172788ff688567ddad9fe119b))
-  *  default help subcommand string has been shortened ([5b7fe8e4](https://github.com/kbknapp/clap-rs/commit/5b7fe8e4161e43ab19e2e5fcf55fbe46791134e9), closes [#494](https://github.com/kbknapp/clap-rs/issues/494))
-
-<a name="v2.4.2"></a>
-### v2.4.3 (2016-05-10)
-
-* Ghost Release
-
-<a name="v2.4.1"></a>
-### v2.4.3 (2016-05-10)
-
-* Ghost Release
-
-<a name="v2.4.0"></a>
-## v2.4.0 (2016-05-02)
-
-
-#### Features
-
-* **Help:**  adds support for displaying info before help message ([29fbfa3b](https://github.com/kbknapp/clap-rs/commit/29fbfa3b963f2f3ca7704bf5d3e1201531baa373))
-* **Required:**  adds allowing args that are required unless certain args are present ([af1f7916](https://github.com/kbknapp/clap-rs/commit/af1f79168390ea7da4074d0d9777de458ea64971))
-
-#### Documentation
-
-*   hides formatting from docs ([cb708093](https://github.com/kbknapp/clap-rs/commit/cb708093a7cd057f08c98b7bd1ed54c2db86ae7e))
-* **required_unless:**  adds docs and examples for required_unless ([ca727b52](https://github.com/kbknapp/clap-rs/commit/ca727b52423b9883acd88b2f227b2711bc144573))
-
-#### Bug Fixes
-
-* **Required Args:**  fixes issue where missing required args are sometimes duplicatd in error messages ([3beebd81](https://github.com/kbknapp/clap-rs/commit/3beebd81e7bc2faa4115ac109cf570e512c5477f), closes [#492](https://github.com/kbknapp/clap-rs/issues/492))
-
-
-<a name="v2.3.0"></a>
-## v2.3.0 (2016-04-18)
-
-
-#### Improvements
-
-* **macros.rs:**  Added write_nspaces macro (a new version of write_spaces) ([9d757e86](https://github.com/kbknapp/clap-rs/commit/9d757e8678e334e5a740ac750c76a9ed4e785cba))
-* **parser.rs:**
-  *  Provide a way to create a usage string without the USAGE: title ([a91d378b](https://github.com/kbknapp/clap-rs/commit/a91d378ba0c91b5796457f8c6e881b13226ab735))
-  *  Make Parser's create_usage public allowing to have function outside the parser to generate the help ([d51945f8](https://github.com/kbknapp/clap-rs/commit/d51945f8b82ebb0963f4f40b384a9e8335783091))
-  *  Expose Parser's flags, opts and positionals argument as iterators ([9b23e7ee](https://github.com/kbknapp/clap-rs/commit/9b23e7ee40e51f7a823644c4496be955dc6c9d3a))
-* **src/args:**  Exposes argument display order by introducing a new Trait ([1321630e](https://github.com/kbknapp/clap-rs/commit/1321630ef56955f152c73376d4d85cceb0bb4a12))
-* **srs/args:**  Added longest_filter to AnyArg trait ([65b3f667](https://github.com/kbknapp/clap-rs/commit/65b3f667532685f854c699ddd264d326599cf7e5))
-
-#### Features
-
-* **Authors Macro:**  adds a crate_authors macro ([38fb59ab](https://github.com/kbknapp/clap-rs/commit/38fb59abf480eb2b6feca269097412f8b00b5b54), closes [#447](https://github.com/kbknapp/clap-rs/issues/447))
-* **HELP:**
-  *  implements optional colored help messages ([abc8f669](https://github.com/kbknapp/clap-rs/commit/abc8f669c3c8193ffc3a3b0ac6c3ac2198794d4f), closes [#483](https://github.com/kbknapp/clap-rs/issues/483))
-  *  Add a Templated Help system. ([81e121ed](https://github.com/kbknapp/clap-rs/commit/81e121edd616f7285593f11120c63bcccae0d23e))
-
-#### Bug Fixes
-
-* **HELP:**  Adjust Help to semantic changes introduced in 6933b84 ([8d23806b](https://github.com/kbknapp/clap-rs/commit/8d23806bd67530ad412c34a1dcdcb1435555573d))
-
-<a name="v2.2.6"></a>
-### v2.2.6 (2016-04-11)
-
-#### Bug Fixes
-
-* **Arg Groups**: fixes bug where arg name isn't printed properly ([3019a685](https://github.com/kbknapp/clap-rs/commit/3019a685eee747ccbe6be09ad5dddce0b1d1d4db), closes [#476](https://github.com/kbknapp/clap-rs/issues/476))
-
-
-<a name="v2.2.5"></a>
-### v2.2.5 (2016-04-03)
-
-
-#### Bug Fixes
-
-* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/kbknapp/clap-rs/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/kbknapp/clap-rs/issues/470))
-* **Help Message:**  fixes bug where arg name is printed twice ([71acf1d5](https://github.com/kbknapp/clap-rs/commit/71acf1d576946658b8bbdb5ae79e6716c43a030f), closes [#472](https://github.com/kbknapp/clap-rs/issues/472))
-
-
-<a name="v2.2.4"></a>
-### v2.2.4 (2016-03-30)
-
-
-#### Bug Fixes
-
-*   fixes compiling with debug cargo feature ([d4b55450](https://github.com/kbknapp/clap-rs/commit/d4b554509928031ac0808076178075bb21f8c1da))
-* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/kbknapp/clap-rs/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/kbknapp/clap-rs/issues/470))
-
-
-
-<a name="v2.2.3"></a>
-### v2.2.3 (2016-03-28)
-
-
-#### Bug Fixes
-
-* **Help Subcommand:**  fixes issue where help and version flags weren't properly displayed ([205b07bf](https://github.com/kbknapp/clap-rs/commit/205b07bf2e6547851f1290f8cd6b169145e144f1), closes [#466](https://github.com/kbknapp/clap-rs/issues/466))
-
-<a name="v2.2.2"></a>
-### v2.2.2 (2016-03-27)
-
-
-#### Bug Fixes
-
-* **Help Message:**  fixes bug with wrapping in the middle of a unicode sequence ([05365ddc](https://github.com/kbknapp/clap-rs/commit/05365ddcc252e4b49e7a75e199d6001a430bd84d), closes [#456](https://github.com/kbknapp/clap-rs/issues/456))
-* **Usage Strings:**  fixes small bug where -- would appear needlessly in usage strings ([6933b849](https://github.com/kbknapp/clap-rs/commit/6933b8491c2a7e28cdb61b47dcf10caf33c2f78a), closes [#461](https://github.com/kbknapp/clap-rs/issues/461))
-
-
-<a name="2.2.1"></a>
-### 2.2.1 (2016-03-16)
-
-
-#### Features
-
-* **Help Message:**  wraps and aligns the help message of subcommands ([813d75d0](https://github.com/kbknapp/clap-rs/commit/813d75d06fbf077c65762608c0fa5e941cfc393c), closes [#452](https://github.com/kbknapp/clap-rs/issues/452))
-
-#### Bug Fixes
-
-* **Help Message:**  fixes a bug where small terminal sizes causing a loop ([1d73b035](https://github.com/kbknapp/clap-rs/commit/1d73b0355236923aeaf6799abc759762ded7e1d0), closes [#453](https://github.com/kbknapp/clap-rs/issues/453))
-
-
-<a name="v2.2.0"></a>
-## v2.2.0 (2016-03-15)
-
-
-#### Features
-
-* **Help Message:**  can auto wrap and aligning help text to term width ([e36af026](https://github.com/kbknapp/clap-rs/commit/e36af0266635f23e85e951b9088d561e9a5d1bf6), closes [#428](https://github.com/kbknapp/clap-rs/issues/428))
-* **Help Subcommand:**  adds support passing additional subcommands to help subcommand ([2c12757b](https://github.com/kbknapp/clap-rs/commit/2c12757bbdf34ce481f3446c074e24c09c2e60fd), closes [#416](https://github.com/kbknapp/clap-rs/issues/416))
-* **Opts and Flags:**  adds support for custom ordering in help messages ([9803b51e](https://github.com/kbknapp/clap-rs/commit/9803b51e799904c0befaac457418ee766ccc1ab9))
-* **Settings:**  adds support for automatically deriving custom display order of args ([ad86e433](https://github.com/kbknapp/clap-rs/commit/ad86e43334c4f70e86909689a088fb87e26ff95a), closes [#444](https://github.com/kbknapp/clap-rs/issues/444))
-* **Subcommands:**  adds support for custom ordering in help messages ([7d2a2ed4](https://github.com/kbknapp/clap-rs/commit/7d2a2ed413f5517d45988eef0765cdcd663b6372), closes [#442](https://github.com/kbknapp/clap-rs/issues/442))
-
-#### Bug Fixes
-
-* **From Usage:**  fixes a bug where adding empty lines werent ignored ([c5c58c86](https://github.com/kbknapp/clap-rs/commit/c5c58c86b9c503d8de19da356a5a5cffb59fbe84))
-
-#### Documentation
-
-* **Groups:**  explains required ArgGroups better ([4ff0205b](https://github.com/kbknapp/clap-rs/commit/4ff0205b85a45151b59bbaf090a89df13438380f), closes [#439](https://github.com/kbknapp/clap-rs/issues/439))
-
-<a name="v2.1.2"></a>
-### v2.1.2 (2016-02-24)
-
-#### Bug Fixes
-
-* **Nightly:**  fixes failing nightly build ([d752c170](https://github.com/kbknapp/clap-rs/commit/d752c17029598b19037710f204b7943f0830ae75), closes [#434](https://github.com/kbknapp/clap-rs/issues/434))
-
-
-<a name="v2.1.1"></a>
-### v2.1.1 (2016-02-19)
-
-
-#### Documentation
-
-* **AppSettings:**  clarifies that AppSettings do not propagate ([3c8db0e9](https://github.com/kbknapp/clap-rs/commit/3c8db0e9be1d24edaad364359513cbb02abb4186), closes [#429](https://github.com/kbknapp/clap-rs/issues/429))
-* **Arg Examples:**  adds better examples ([1e79cccc](https://github.com/kbknapp/clap-rs/commit/1e79cccc12937bc0e7cd2aad8e404410798e9fff))
-
-#### Improvements
-
-* **Help:**  adds setting for next line help by arg ([066df748](https://github.com/kbknapp/clap-rs/commit/066df7486e684cf50a8479a356a12ba972c34ce1), closes [#427](https://github.com/kbknapp/clap-rs/issues/427))
-
-
-<a name="v2.1.0"></a>
-## v2.1.0 (2016-02-10)
-
-
-#### Features
-
-* **Defult Values:**  adds support for default values in args ([73211952](https://github.com/kbknapp/clap-rs/commit/73211952964a79d97b434dd567e6d7d34be7feb5), closes [#418](https://github.com/kbknapp/clap-rs/issues/418))
-
-#### Documentation
-
-* **Default Values:**  adds better examples and notes for default values ([9facd74f](https://github.com/kbknapp/clap-rs/commit/9facd74f843ef3807c5d35259558a344e6c25905))
-
-
-<a name="v2.0.6"></a>
-### v2.0.6 (2016-02-09)
-
-
-#### Improvements
-
-* **Positional Arguments:**  now displays value name if appropriate ([f0a99916](https://github.com/kbknapp/clap-rs/commit/f0a99916c59ce675515c6dcdfe9a40b130510908), closes [#420](https://github.com/kbknapp/clap-rs/issues/420))
-
-
-<a name="v2.0.5"></a>
-### v2.0.5 (2016-02-05)
-
-
-#### Bug Fixes
-
-* **Multiple Values:**  fixes bug where number_of_values wasnt respected ([72c387da](https://github.com/kbknapp/clap-rs/commit/72c387da0bb8a6f526f863770f08bb8ca0d3de03))
-
-
-<a name="v2.0.4"></a>
-### v2.0.4 (2016-02-04)
-
-
-#### Bug Fixes
-
-*   adds support for building ArgGroups from standalone YAML ([fcbc7e12](https://github.com/kbknapp/clap-rs/commit/fcbc7e12f5d7b023b8f30cba8cad28a01cf6cd26))
-*   Stop lonely hyphens from causing panic ([85b11468](https://github.com/kbknapp/clap-rs/commit/85b11468b0189d5cc15f1cfac5db40d17a0077dc), closes [#410](https://github.com/kbknapp/clap-rs/issues/410))
-* **AppSettings:**  fixes bug where subcmds didn't receive parent ver ([a62e4527](https://github.com/kbknapp/clap-rs/commit/a62e452754b3b0e3ac9a15aa8b5330636229ead1))
-
-<a name="v2.0.3"></a>
-### v2.0.3 (2016-02-02)
-
-
-#### Improvements
-
-* **values:**  adds support for up to u64::max values per arg ([c7abf7d7](https://github.com/kbknapp/clap-rs/commit/c7abf7d7611e317b0d31d97632e3d2e13570947c))
-* **occurrences:**  Allow for more than 256 occurrences of an argument. ([3731ddb3](https://github.com/kbknapp/clap-rs/commit/3731ddb361163f3d6b86844362871e48c80fa530))
-
-#### Features
-
-* **AppSettings:**  adds HidePossibleValuesInHelp to skip writing those values ([cdee7a0e](https://github.com/kbknapp/clap-rs/commit/cdee7a0eb2beeec723cb98acfacf03bf629c1da3))
-
-#### Bug Fixes
-
-* **value_t_or_exit:**  fixes typo which causes value_t_or_exit to return a Result ([ee96baff](https://github.com/kbknapp/clap-rs/commit/ee96baffd306cb8d20ddc5575cf739bb1a6354e8))
-
-
-<a name="v2.0.2"></a>
-### v2.0.2 (2016-01-31)
-
-
-#### Improvements
-
-* **arg_enum:**  enum declared with arg_enum returns [&'static str; #] instead of Vec ([9c4b8a1a](https://github.com/kbknapp/clap-rs/commit/9c4b8a1a6b12949222f17d1074578ad7676b9c0d))
-
-#### Bug Fixes
-
-*   clap_app! should be gated by unstable, not nightly feature ([0c8b84af](https://github.com/kbknapp/clap-rs/commit/0c8b84af6161d5baf683688eafc00874846f83fa))
-* **SubCommands:**  fixed where subcmds weren't recognized after mult args ([c19c17a8](https://github.com/kbknapp/clap-rs/commit/c19c17a8850602990e24347aeb4427cf43316223), closes [#405](https://github.com/kbknapp/clap-rs/issues/405))
-* **Usage Parser:**  fixes a bug where literal single quotes weren't allowed in help strings ([0bcc7120](https://github.com/kbknapp/clap-rs/commit/0bcc71206478074769e311479b34a9f74fe80f5c), closes [#406](https://github.com/kbknapp/clap-rs/issues/406))
-
-
-<a name="v2.0.1"></a>
-### v2.0.1 (2016-01-30)
-
-
-#### Bug Fixes
-
-*   fixes cargo features to NOT require nightly with unstable features ([dcbcc60c](https://github.com/kbknapp/clap-rs/commit/dcbcc60c9ba17894be636472ea4b07a82d86a9db), closes [#402](https://github.com/kbknapp/clap-rs/issues/402))
-
-
-<a name="v2.0.0"></a>
-## v2.0.0 (2016-01-28)
-
-
-#### Improvements
-
-* **From Usage:**  vastly improves the usage parser ([fa3a2f86](https://github.com/kbknapp/clap-rs/commit/fa3a2f86bd674c5eb07128c95098fab7d1437247), closes [#350](https://github.com/kbknapp/clap-rs/issues/350))
-
-#### Features
-
-*   adds support for external subcommands ([177fe5cc](https://github.com/kbknapp/clap-rs/commit/177fe5cce745c2164a8e38c23be4c4460d2d7211), closes [#372](https://github.com/kbknapp/clap-rs/issues/372))
-*   adds support values with a leading hyphen ([e4d429b9](https://github.com/kbknapp/clap-rs/commit/e4d429b9d52e95197bd0b572d59efacecf305a59), closes [#385](https://github.com/kbknapp/clap-rs/issues/385))
-*   adds support for turning off the value delimiter ([508db850](https://github.com/kbknapp/clap-rs/commit/508db850a87c2e251cf6b6ddead9ad56b29f9e57), closes [#352](https://github.com/kbknapp/clap-rs/issues/352))
-*   adds support changing the value delimiter ([dafeae8a](https://github.com/kbknapp/clap-rs/commit/dafeae8a526162640f6a68da434370c64d190889), closes [#353](https://github.com/kbknapp/clap-rs/issues/353))
-*   adds support for comma separated values ([e69da6af](https://github.com/kbknapp/clap-rs/commit/e69da6afcd2fe48a3c458ca031db40997f860eda), closes [#348](https://github.com/kbknapp/clap-rs/issues/348))
-*   adds support with options with optional values ([4555736c](https://github.com/kbknapp/clap-rs/commit/4555736cad01441dcde4ea84a285227e0844c16e), closes [#367](https://github.com/kbknapp/clap-rs/issues/367))
-* **UTF-8:**  adds support for invalid utf8 in values ([c5c59dec](https://github.com/kbknapp/clap-rs/commit/c5c59dec0bc33b86b2e99d30741336f17ec84282), closes [#269](https://github.com/kbknapp/clap-rs/issues/269))
-* **v2:**  implementing the base of 2.x ([a3536054](https://github.com/kbknapp/clap-rs/commit/a3536054512ba833533dc56615ce3663d884381c))
-
-#### Bug Fixes
-
-*   fixes nightly build with new lints ([17599195](https://github.com/kbknapp/clap-rs/commit/175991956c37dc83ba9c49396e927a1cb65c5b11))
-*   fixes Windows build for 2x release ([674c9b48](https://github.com/kbknapp/clap-rs/commit/674c9b48c7c92079cb180cc650a9e39f34781c32), closes [#392](https://github.com/kbknapp/clap-rs/issues/392))
-*   fixes yaml build for 2x base ([adceae64](https://github.com/kbknapp/clap-rs/commit/adceae64c8556d00ab715677377b216f9f468ad7))
-
-#### Documentation
-
-*   updates examples for 2x release ([1303b360](https://github.com/kbknapp/clap-rs/commit/1303b3607468f362ab1b452d5614c1a064dc69b4), closes [#394](https://github.com/kbknapp/clap-rs/issues/394))
-*   updates examples for 2x release ([0a011f31](https://github.com/kbknapp/clap-rs/commit/0a011f3142aec338d388a6c8bfe22fa7036021bb), closes [#394](https://github.com/kbknapp/clap-rs/issues/394))
-*   updates documentation for v2 release ([8d51724e](https://github.com/kbknapp/clap-rs/commit/8d51724ef73dfde5bb94fb9466bc5463a1cc1502))
-*   updating docs for 2x release ([576d0e0e](https://github.com/kbknapp/clap-rs/commit/576d0e0e2c7b8f386589179bbf7419b93abacf1c))
-* **README.md:**
-  *  updates readme for v2 release ([acaba01a](https://github.com/kbknapp/clap-rs/commit/acaba01a353c12144b9cd9a3ce447400691849b0), closes [#393](https://github.com/kbknapp/clap-rs/issues/393))
-  *  fix typo and make documentation conspicuous ([07b9f614](https://github.com/kbknapp/clap-rs/commit/07b9f61495d927f69f7abe6c0d85253f0f4e6107))
-
-#### BREAKING CHANGES
-
-* **Fewer liftimes! Yay!**
- * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`
- * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`
- * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`
-* **Simply Renamed**
- * `App::arg_group` => `App::group`
- * `App::arg_groups` => `App::groups`
- * `ArgGroup::add` => `ArgGroup::arg`
- * `ArgGroup::add_all` => `ArgGroup::args`
- * `ClapError` => `Error`
-  * struct field `ClapError::error_type` => `Error::kind`
- * `ClapResult` => `Result`
- * `ClapErrorType` => `ErrorKind`
-* **Removed Deprecated Functions and Methods**
- * `App::subcommands_negate_reqs`
- * `App::subcommand_required`
- * `App::arg_required_else_help`
- * `App::global_version(bool)`
- * `App::versionless_subcommands`
- * `App::unified_help_messages`
- * `App::wait_on_error`
- * `App::subcommand_required_else_help`
- * `SubCommand::new`
- * `App::error_on_no_subcommand`
- * `Arg::new`
- * `Arg::mutually_excludes`
- * `Arg::mutually_excludes_all`
- * `Arg::mutually_overrides_with`
- * `simple_enum!`
-* **Renamed Error Variants**
- * `InvalidUnicode` => `InvalidUtf8`
- * `InvalidArgument` => `UnknownArgument`
-* **Usage Parser**
- * Value names can now be specified inline, i.e. `-o, --option <FILE> <FILE2> 'some option which takes two files'`
- * **There is now a priority of order to determine the name** - This is perhaps the biggest breaking change. See the documentation for full details. Prior to this change, the value name took precedence. **Ensure your args are using the proper names (i.e. typically the long or short and NOT the value name) throughout the code**
-* `ArgMatches::values_of` returns an `Values` now which implements `Iterator` (should not break any code)
-* `crate_version!` returns `&'static str` instead of `String`
-* Using the `clap_app!` macro requires compiling with the `unstable` feature because the syntax could change slightly in the future
-
-
-<a name="v1.5.5"></a>
-### v1.5.5 (2016-01-04)
-
-
-#### Bug Fixes
-
-*   fixes an issue where invalid short args didn't cause an error ([c9bf7e44](https://github.com/kbknapp/clap-rs/commit/c9bf7e4440bd2f9b524ea955311d433c40a7d1e0))
-*   prints the name in version and help instead of binary name ([8f3817f6](https://github.com/kbknapp/clap-rs/commit/8f3817f665c0cab6726bc16c56a53b6a61e44448), closes [#368](https://github.com/kbknapp/clap-rs/issues/368))
-*   fixes an intentional panic issue discovered via clippy ([ea83a3d4](https://github.com/kbknapp/clap-rs/commit/ea83a3d421ea8856d4cac763942834d108b71406))
-
-
-<a name="v1.5.4"></a>
-### v1.5.4 (2015-12-18)
-
-
-#### Examples
-
-* **17_yaml:**  conditinonally compile 17_yaml example ([575de089](https://github.com/kbknapp/clap-rs/commit/575de089a3e240c398cb10e6cf5a5c6b68662c01))
-
-#### Improvements
-
-*   clippy improvements ([99cdebc2](https://github.com/kbknapp/clap-rs/commit/99cdebc23da3a45a165f14b27bebeb2ed828a2ce))
-
-#### Bug Fixes
-
-
-* **errors:**  return correct error type in WrongNumValues error builder ([5ba8ba9d](https://github.com/kbknapp/clap-rs/commit/5ba8ba9dcccdfa74dd1c44260e64b359bbb36be6))
-*   ArgRequiredElseHelp setting now takes precedence over missing required args ([faad83fb](https://github.com/kbknapp/clap-rs/commit/faad83fbef6752f3093b6e98fca09a9449b830f4), closes [#362](https://github.com/kbknapp/clap-rs/issues/362))
-
-
-<a name="v1.5.3"></a>
-### v1.5.3 (2015-11-20)
-
-
-#### Bug Fixes
-
-* **Errors:**  fixes some instances when errors are missing a final newline ([c4d2b171](https://github.com/kbknapp/clap-rs/commit/c4d2b1711994479ad64ee52b6b49d2ceccbf2118))
-
-
-
-
-<a name="v1.5.2"></a>
-### v1.5.2 (2015-11-14)
-
-
-#### Bug Fixes
-
-* **Errors:**  fixes a compiling bug when built on Windows or without the color feature ([a35f7634](https://github.com/kbknapp/clap-rs/commit/a35f76346fe6ecc88dda6a1eb13627186e7ce185))
-
-
-
-<a name="v1.5.1"></a>
-### v1.5.1 (2015-11-13)
-
-
-#### Bug Fixes
-
-* **Required Args:**  fixes a bug where required args are not correctly accounted for ([f03b88a9](https://github.com/kbknapp/clap-rs/commit/f03b88a9766b331a63879bcd747687f2e5a2661b), closes [#343](https://github.com/kbknapp/clap-rs/issues/343))
-
-
-
-<a name="v1.5.0"></a>
-## v1.5.0 (2015-11-13)
-
-
-#### Bug Fixes
-
-*   fixes a bug with required positional args in usage strings ([c6858f78](https://github.com/kbknapp/clap-rs/commit/c6858f78755f8e860204323c828c8355a066dc83))
-
-#### Documentation
-
-* **FAQ:**  updates readme with slight changes to FAQ ([a4ef0fab](https://github.com/kbknapp/clap-rs/commit/a4ef0fab73c8dc68f1b138965d1340459c113398))
-
-#### Improvements
-
-*   massive errors overhaul ([cdc29175](https://github.com/kbknapp/clap-rs/commit/cdc29175bc9c53e5b4aec86cbc04c1743154dae6))
-* **ArgMatcher:**  huge refactor and deduplication of code ([8988853f](https://github.com/kbknapp/clap-rs/commit/8988853fb8825e8f841fde349834cc12cdbad081))
-* **Errors:**  errors have been vastly improved ([e59bc0c1](https://github.com/kbknapp/clap-rs/commit/e59bc0c16046db156a88ba71a037db05028e995c))
-* **Traits:**  refactoring some configuration into traits ([5800cdec](https://github.com/kbknapp/clap-rs/commit/5800cdec6dce3def4242b9f7bd136308afb19685))
-
-#### Performance
-
-* **App:**
-  *  more BTreeMap->Vec, Opts and SubCmds ([bc4495b3](https://github.com/kbknapp/clap-rs/commit/bc4495b32ec752b6c4b29719e831c043ef2a26ce))
-  *  changes flags BTreeMap->Vec ([d357640f](https://github.com/kbknapp/clap-rs/commit/d357640fab55e5964fe83efc3c771e53aa3222fd))
-  *  removed unneeded BTreeMap ([78971fd6](https://github.com/kbknapp/clap-rs/commit/78971fd68d7dc5c8e6811b4520cdc54e4188f733))
-  *  changes BTreeMap to VecMap in some instances ([64b921d0](https://github.com/kbknapp/clap-rs/commit/64b921d087fdd03775c95ba0bcf65d3f5d36f812))
-  *  removed excess clones ([ec0089d4](https://github.com/kbknapp/clap-rs/commit/ec0089d42ed715d293fb668d3a90b0db0aa3ec39))
-
-
-
-<a name="v1.4.7"></a>
-### v1.4.7 (2015-11-03)
-
-
-#### Documentation
-
-*   Clarify behavior of Arg::multiple with options. ([434f497a](https://github.com/kbknapp/clap-rs/commit/434f497ab6d831f8145cf09278c97ca6ee6c6fe7))
-*   Fix typos and improve grammar. ([c1f66b5d](https://github.com/kbknapp/clap-rs/commit/c1f66b5de7b5269fbf8760a005ef8c645edd3229))
-
-#### Bug Fixes
-
-* **Error Status:**  fixes bug where --help and --version return non-zero exit code ([89b51fdf](https://github.com/kbknapp/clap-rs/commit/89b51fdf8b1ab67607567344e2317ff1a757cb12))
-
-
-
-<a name="v1.4.6"></a>
-### v1.4.6 (2015-10-29)
-
-
-#### Features
-
-*   allows parsing without a binary name for daemons and interactive CLIs ([aff89d57](https://github.com/kbknapp/clap-rs/commit/aff89d579b5b85c3dc81b64f16d5865299ec39a2), closes [#318](https://github.com/kbknapp/clap-rs/issues/318))
-
-#### Bug Fixes
-
-* **Errors:**  tones down quoting in some error messages ([34ce59ed](https://github.com/kbknapp/clap-rs/commit/34ce59ede53bfa2eef722c74881cdba7419fd9c7), closes [#309](https://github.com/kbknapp/clap-rs/issues/309))
-* **Help and Version:**  only builds help and version once ([e3be87cf](https://github.com/kbknapp/clap-rs/commit/e3be87cfc095fc41c9811adcdc6d2b079f237d5e))
-* **Option Args:**  fixes bug with args and multiple values ([c9a9548a](https://github.com/kbknapp/clap-rs/commit/c9a9548a8f96cef8a3dd9a980948325fbbc1b91b), closes [#323](https://github.com/kbknapp/clap-rs/issues/323))
-* **POSIX Overrides:**  fixes bug where required args are overridden ([40ed2b50](https://github.com/kbknapp/clap-rs/commit/40ed2b50c3a9fe88bfdbaa43cef9fd6493ecaa8e))
-* **Safe Matches:**  using 'safe' forms of the get_matches family no longer exit the process ([c47025dc](https://github.com/kbknapp/clap-rs/commit/c47025dca2b3305dea0a0acfdd741b09af0c0d05), closes [#256](https://github.com/kbknapp/clap-rs/issues/256))
-* **Versionless SubCommands:**  fixes a bug where the -V flag was needlessly built ([27df8b9d](https://github.com/kbknapp/clap-rs/commit/27df8b9d98d13709dad3929a009f40ebff089a1a), closes [#329](https://github.com/kbknapp/clap-rs/issues/329))
-
-#### Documentation
-
-*   adds comparison in readme ([1a8bf31e](https://github.com/kbknapp/clap-rs/commit/1a8bf31e7a6b87ce48a66af2cde1645b2dd5bc95), closes [#325](https://github.com/kbknapp/clap-rs/issues/325))
-
-
-
-<a name="v1.4.5"></a>
-### v1.4.5 (2015-10-06)
-
-
-#### Bug Fixes
-
-*   fixes crash on invalid arg error ([c78ce128](https://github.com/kbknapp/clap-rs/commit/c78ce128ebbe7b8f730815f8176c29d76f4ade8c))
-
-
-
-<a name="v1.4.4"></a>
-### v1.4.4 (2015-10-06)
-
-
-#### Documentation
-
-*   clean up some formatting ([b7df92d7](https://github.com/kbknapp/clap-rs/commit/b7df92d7ea25835701dd22ddff984b9749f48a00))
-*   move the crate-level docs to top of the lib.rs file ([d7233bf1](https://github.com/kbknapp/clap-rs/commit/d7233bf122dbf80ba8fc79e5641be2df8af10e7a))
-*   changes doc comments to rustdoc comments ([34b601be](https://github.com/kbknapp/clap-rs/commit/34b601be5fdde76c1a0859385b359b96d66b8732))
-*   fixes panic in 14_groups example ([945b00a0](https://github.com/kbknapp/clap-rs/commit/945b00a0c27714b63bdca48d003fe205fcfdc578), closes [#295](https://github.com/kbknapp/clap-rs/issues/295))
-*   avoid suggesting star dependencies. ([d33228f4](https://github.com/kbknapp/clap-rs/commit/d33228f40b5fefb84cf3dd51546bfb340dcd9f5a))
-* **Rustdoc:**  adds portions of the readme to main rustdoc page ([6f9ee181](https://github.com/kbknapp/clap-rs/commit/6f9ee181e69d90bd4206290e59d6f3f1e8f0cbb2), closes [#293](https://github.com/kbknapp/clap-rs/issues/293))
-
-#### Bug Fixes
-
-*   grammar error in some conflicting option errors ([e73b07e1](https://github.com/kbknapp/clap-rs/commit/e73b07e19474323ad2260da66abbf6a6d4ecbd4f))
-* **Unified Help:**  sorts both flags and options as a unified category ([2a223dad](https://github.com/kbknapp/clap-rs/commit/2a223dad82901fa2e74baad3bfc4c7b94509300f))
-* **Usage:**  fixes a bug where required args aren't filtered properly ([72b453dc](https://github.com/kbknapp/clap-rs/commit/72b453dc170af3050bb123d35364f6da77fc06d7), closes [#277](https://github.com/kbknapp/clap-rs/issues/277))
-* **Usage Strings:**  fixes a bug ordering of elements in usage strings ([aaf0d6fe](https://github.com/kbknapp/clap-rs/commit/aaf0d6fe7aa2403e76096c16204d254a9ee61ee2), closes [#298](https://github.com/kbknapp/clap-rs/issues/298))
-
-#### Features
-
-*   supports -aValue style options ([0e3733e4](https://github.com/kbknapp/clap-rs/commit/0e3733e4fec2015c2d566a51432dcd92cb69cad3))
-* **Trailing VarArg:**  adds opt-in setting for final arg being vararg ([27018b18](https://github.com/kbknapp/clap-rs/commit/27018b1821a4bcd5235cfe92abe71b3c99efc24d), closes [#278](https://github.com/kbknapp/clap-rs/issues/278))
-
-
-
-<a name="v1.4.3"></a>
-### v1.4.3 (2015-09-30)
-
-
-#### Features
-
-*   allows accessing arg values by group name ([c92a4b9e](https://github.com/kbknapp/clap-rs/commit/c92a4b9eff2d679957f61c0c41ff404b40d38a91))
-
-#### Documentation
-
-*   use links to examples instead of plain text ([bb4fe237](https://github.com/kbknapp/clap-rs/commit/bb4fe237858535627271465147add537e4556b43))
-
-#### Bug Fixes
-
-* **Help Message:**  required args no longer double list in usage ([1412e639](https://github.com/kbknapp/clap-rs/commit/1412e639e0a79df84936d1101a837f90077d1c83), closes [#277](https://github.com/kbknapp/clap-rs/issues/277))
-* **Possible Values:**  possible value validation is restored ([f121ae74](https://github.com/kbknapp/clap-rs/commit/f121ae749f8f4bfe754ef2e8a6dfc286504b5b75), closes [#287](https://github.com/kbknapp/clap-rs/issues/287))
-
-
-
-<a name="v1.4.2"></a>
-### v1.4.2 (2015-09-23)
-
-
-#### Bug Fixes
-
-* **Conflicts:**  fixes bug with conflicts not removing required args ([e17fcec5](https://github.com/kbknapp/clap-rs/commit/e17fcec53b3216ad047a13dddc6f740473fad1a1), closes [#271](https://github.com/kbknapp/clap-rs/issues/271))
-
-
-
-<a name="v1.4.1"></a>
-### v1.4.1 (2015-09-22)
-
-
-#### Examples
-
-*   add clap_app quick example ([4ba6249c](https://github.com/kbknapp/clap-rs/commit/4ba6249c3cf4d2e083370d1fe4dcc7025282c28a))
-
-#### Features
-
-* **Unicode:**  allows non-panicing on invalid unicode characters ([c5bf7ddc](https://github.com/kbknapp/clap-rs/commit/c5bf7ddc8cfb876ec928a5aaf5591232bbb32e5d))
-
-#### Documentation
-
-*   properly names Examples section for rustdoc ([87ba5445](https://github.com/kbknapp/clap-rs/commit/87ba54451d7ec7b1c9b9ef134f90bbe39e6fac69))
-*   fixes various typos and spelling ([f85640f9](https://github.com/kbknapp/clap-rs/commit/f85640f9f6d8fd3821a40e9b8b7a34fabb789d02))
-* **Arg:**  unhides fields of the Arg struct ([931aea88](https://github.com/kbknapp/clap-rs/commit/931aea88427edf43a3da90d5a500c1ff2b2c3614))
-
-#### Bug Fixes
-
-*   flush the buffer in App::print_version() ([cbc42a37](https://github.com/kbknapp/clap-rs/commit/cbc42a37d212d84d22b1777d08e584ff191934e7))
-*   Macro benchmarks ([13712da1](https://github.com/kbknapp/clap-rs/commit/13712da1d36dc7614eec3a10ad488257ba615751))
-
-
-
-<a name="v1.4.0"></a>
-## v1.4.0 (2015-09-09)
-
-
-#### Features
-
-*   allows printing help message by library consumers ([56b95f32](https://github.com/kbknapp/clap-rs/commit/56b95f320875c62dda82cb91b29059671e120ed1))
-*   allows defining hidden args and subcmds ([2cab4d03](https://github.com/kbknapp/clap-rs/commit/2cab4d0334ea3c2439a1d4bfca5bf9905c7ea9ac), closes [#231](https://github.com/kbknapp/clap-rs/issues/231))
-*   Builder macro to assist with App/Arg/Group/SubCommand building ([443841b0](https://github.com/kbknapp/clap-rs/commit/443841b012a8d795cd5c2bd69ae6e23ef9b16477))
-* **Errors:**  allows consumers to write to stderr and exit on error ([1e6403b6](https://github.com/kbknapp/clap-rs/commit/1e6403b6a863574fa3cb6946b1fb58f034e8664c))
-
-
-
-<a name="v1.3.2"></a>
-### v1.3.2 (2015-09-08)
-
-
-#### Documentation
-
-*   fixed ErrorKind docs ([dd057843](https://github.com/kbknapp/clap-rs/commit/dd05784327fa070eb6ce5ce89a8507e011d8db94))
-* **ErrorKind:**  changed examples content ([b9ca2616](https://github.com/kbknapp/clap-rs/commit/b9ca261634b89613bbf3d98fd74d55cefbb31a8c))
-
-#### Bug Fixes
-
-*   fixes a bug where the help subcommand wasn't overridable ([94003db4](https://github.com/kbknapp/clap-rs/commit/94003db4b5eebe552ca337521c1c001295822745))
-
-#### Features
-
-*   adds abiltiy not consume self when parsing matches and/or exit on help ([94003db4](https://github.com/kbknapp/clap-rs/commit/94003db4b5eebe552ca337521c1c001295822745))
-* **App:**  Added ability for users to handle errors themselves ([934e6fbb](https://github.com/kbknapp/clap-rs/commit/934e6fbb643b2385efc23444fe6fce31494dc288))
-
-
-
-<a name="v1.3.1"></a>
-### v1.3.1 (2015-09-04)
-
-
-#### Examples
-
-* **17_yaml:**  fixed example ([9b848622](https://github.com/kbknapp/clap-rs/commit/9b848622296c8c5c7b9a39b93ddd41f51df790b5))
-
-#### Performance
-
-*   changes ArgGroup HashSets to Vec ([3cb4a48e](https://github.com/kbknapp/clap-rs/commit/3cb4a48ebd15c20692f4f3a2a924284dc7fd5e10))
-*   changes BTreeSet for Vec in some instances ([baab2e3f](https://github.com/kbknapp/clap-rs/commit/baab2e3f4060e811abee14b1654cbcd5cf3b5fea))
-
-
-
-<a name="v1.3.0"></a>
-## v1.3.0 (2015-09-01)
-
-
-#### Features
-
-* **YAML:**  allows building a CLI from YAML files ([86cf4c45](https://github.com/kbknapp/clap-rs/commit/86cf4c45626a36b8115446952f9069f73c1debc3))
-* **ArgGroups:**  adds support for building ArgGroups from yaml ([ecf88665](https://github.com/kbknapp/clap-rs/commit/ecf88665cbff367018b29161a1b75d44a212707d))
-* **Subcommands:**  adds support for subcommands from yaml ([e415cf78](https://github.com/kbknapp/clap-rs/commit/e415cf78ba916052d118a8648deba2b9c16b1530))
-
-#### Documentation
-
-* **YAML:**  adds examples for using YAML to build a CLI ([ab41d7f3](https://github.com/kbknapp/clap-rs/commit/ab41d7f38219544750e6e1426076dc498073191b))
-* **Args from YAML:**  fixes doc examples ([19b348a1](https://github.com/kbknapp/clap-rs/commit/19b348a10050404cd93888dbbbe4f396681b67d0))
-* **Examples:**  adds better usage examples instead of having unused variables ([8cbacd88](https://github.com/kbknapp/clap-rs/commit/8cbacd8883004fe71a8ea036ec4391c7dd8efe94))
-
-#### Examples
-
-*   Add AppSettings example ([12705079](https://github.com/kbknapp/clap-rs/commit/12705079ca96a709b4dd94f7ddd20a833b26838c))
-
-#### Bug Fixes
-
-* **Unified Help Messages:**  fixes a crash from this setting and no opts ([169ffec1](https://github.com/kbknapp/clap-rs/commit/169ffec1003d58d105d7ef2585b3425e57980000), closes [#210](https://github.com/kbknapp/clap-rs/issues/210))
-
-
-
-<a name="v1.2.5"></a>
-### v1.2.5 (2015-08-27)
-
-
-#### Examples
-
-*   add custom validator example ([b9997d1f](https://github.com/kbknapp/clap-rs/commit/b9997d1fca74d4d8f93971f2a01bdf9798f913d5))
-*   fix indentation ([d4f1b740](https://github.com/kbknapp/clap-rs/commit/d4f1b740ede410fd2528b9ecd89592c2fd8b1e20))
-
-#### Features
-
-* **Args:**  allows opts and args to define a name for help and usage msgs ([ad962ec4](https://github.com/kbknapp/clap-rs/commit/ad962ec478da999c7dba0afdb84c266f4d09b1bd))
-
-
-
-<a name="v1.2.4"></a>
-### v1.2.4 (2015-08-26)
-
-
-#### Bug Fixes
-
-* **Possible Values:**  fixes a bug where suggestions arent made when using --long=value format ([3d5e9a6c](https://github.com/kbknapp/clap-rs/commit/3d5e9a6cedb26668839b481c9978e2fbbab8be6f), closes [#192](https://github.com/kbknapp/clap-rs/issues/192))
-
-
-
-<a name="v1.2.3"></a>
-### v1.2.3 (2015-08-24)
-
-
-#### Bug Fixes
-
-* **App, Args:**  fixed subcommand reqs negation ([b41afa8c](https://github.com/kbknapp/clap-rs/commit/b41afa8c3ded3d1be12f7a2f8ea06cc44afc9458), closes [#188](https://github.com/kbknapp/clap-rs/issues/188))
-
-
-
-<a name="v1.2.2"></a>
-### v1.2.2 (2015-08-23)
-
-
-#### Bug Fixes
-
-*   fixed confusing error message, also added test for it ([fc7a31a7](https://github.com/kbknapp/clap-rs/commit/fc7a31a745efbf1768ee2c62cd3bb72bfe30c708))
-* **App:**  fixed requirmets overriding ([9c135eb7](https://github.com/kbknapp/clap-rs/commit/9c135eb790fa16183e5bdb2009ddc3cf9e25f99f))
-
-
-
-<a name="v1.2.1"></a>
-### v1.2.1 (2015-08-20)
-
-
-#### Documentation
-
-* **README.md:**  updates for new features ([16cf9245](https://github.com/kbknapp/clap-rs/commit/16cf9245fb5fc4cf6face898e358368bf9961cbb))
-
-#### Features
-
-*   implements posix compatible conflicts for long args ([8c2d48ac](https://github.com/kbknapp/clap-rs/commit/8c2d48acf5473feebd721a9049a9c9b7051e70f9))
-*   added overrides to support conflicts in POSIX compatible manner ([0b916a00](https://github.com/kbknapp/clap-rs/commit/0b916a00de26f6941538f6bc5f3365fa302083c1))
-* **Args:**  allows defining POSIX compatible argument conflicts ([d715646e](https://github.com/kbknapp/clap-rs/commit/d715646e69759ccd95e01f49b04f489827ecf502))
-
-#### Bug Fixes
-
-*   fixed links in cargo and license buttons ([6d9837ad](https://github.com/kbknapp/clap-rs/commit/6d9837ad9a9e006117cd7372fdc60f9a3889c7e2))
-
-#### Performance
-
-* **Args and Apps:**  changes HashSet->Vec in some instances for increased performance ([d0c3b379](https://github.com/kbknapp/clap-rs/commit/d0c3b379700757e0a9b0c40af709f8af1f5b4949))
-
-
-
-<a name="v1.2.0"></a>
-### v1.2.0 (2015-08-15)
-
-
-#### Bug Fixes
-
-*   fixed misspell and enum name ([7df170d7](https://github.com/kbknapp/clap-rs/commit/7df170d7f4ecff06608317655d1e0c4298f62076))
-*   fixed use for clap crate ([dc3ada73](https://github.com/kbknapp/clap-rs/commit/dc3ada738667d4b689678f79d14251ee82004ece))
-
-#### Documentation
-
-*   updates docs for new features ([03496547](https://github.com/kbknapp/clap-rs/commit/034965471782d872ca495045b58d34b31807c5b1))
-*   fixed docs for previous changes ([ade36778](https://github.com/kbknapp/clap-rs/commit/ade367780c366425de462506d256e0f554ed3b9c))
-
-#### Improvements
-
-* **AppSettings:**  adds ability to add multiple settings at once ([4a00e251](https://github.com/kbknapp/clap-rs/commit/4a00e2510d0ca8d095d5257d51691ba3b61c1374))
-
-#### Features
-
-*   Replace application level settings with enum variants ([618dc4e2](https://github.com/kbknapp/clap-rs/commit/618dc4e2c205bf26bc43146164e65eb1f6b920ed))
-* **Args:**  allows for custom argument value validations to be defined ([84ae2ddb](https://github.com/kbknapp/clap-rs/commit/84ae2ddbceda34b5cbda98a6959edaa52fde2e1a), closes [#170](https://github.com/kbknapp/clap-rs/issues/170))
-
-
-
-<a name="v1.1.6"></a>
-### v1.1.6 (2015-08-01)
-
-
-#### Bug Fixes
-
-*   fixes two bugs in App when printing newlines in help and subcommands required error ([d63c0136](https://github.com/kbknapp/clap-rs/commit/d63c0136310db9dd2b1c7b4745938311601d8938))
-
-
-
-<a name="v1.1.5"></a>
-### v1.1.5 (2015-07-29)
-
-#### Performance
-
-*   removes some unneeded allocations ([93e915df](https://github.com/kbknapp/clap-rs/commit/93e915dfe300f7b7d6209ca93323c6a46f89a8c1))
-
-<a name="v1.1.4"></a>
-### v1.1.4 (2015-07-20)
-
-
-#### Improvements
-
-* **Usage Strings**  displays a [--] when it may be helpful ([86c3be85](https://github.com/kbknapp/clap-rs/commit/86c3be85fb6f77f83b5a6d2df40ae60937486984))
-
-#### Bug Fixes
-
-* **Macros**  fixes a typo in a macro generated error message ([c9195c5f](https://github.com/kbknapp/clap-rs/commit/c9195c5f92abb8cd6a37b4f4fbb2f1fee2a8e368))
-* **Type Errors**  fixes formatting of error output when failed type parsing ([fe5d95c6](https://github.com/kbknapp/clap-rs/commit/fe5d95c64f3296e6eddcbec0cb8b86659800145f))
-
-
-
-<a name="v1.1.3"></a>
-### v1.1.3 (2015-07-18)
-
-
-#### Documentation
-
-*   updates README.md to include lack of color support on Windows ([52f81e17](https://github.com/kbknapp/clap-rs/commit/52f81e17377b18d2bd0f34693b642b7f358998ee))
-
-#### Bug Fixes
-
-*   fixes formatting bug which prevented compiling on windows ([9cb5dceb](https://github.com/kbknapp/clap-rs/commit/9cb5dceb3e5fe5e0e7b24619ff77e5040672b723), closes [#163](https://github.com/kbknapp/clap-rs/issues/163))
-
-
-
-<a name="v1.1.2"></a>
-### v1.1.2 (2015-07-17)
-
-
-#### Bug Fixes
-
-*   fixes a bug when parsing multiple {n} newlines inside help strings ([6d214b54](https://github.com/kbknapp/clap-rs/commit/6d214b549a9b7e189a94e5fa2b7c92cc333ca637))
-
-
-
-<a name="v1.1.1"></a>
-## v1.1.1 (2015-07-17)
-
-
-#### Bug Fixes
-
-*   fixes a logic bug and allows setting Arg::number_of_values() < 2 ([42b6d1fc](https://github.com/kbknapp/clap-rs/commit/42b6d1fc3c519c92dfb3af15276e7d3b635e6cfe), closes [#161](https://github.com/kbknapp/clap-rs/issues/161))
-
-
-
-<a name="v1.1.0"></a>
-## v1.1.0 (2015-07-16)
-
-
-#### Features
-
-*   allows creating unified help messages, a la docopt or getopts ([52bcd892](https://github.com/kbknapp/clap-rs/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1), closes [#158](https://github.com/kbknapp/clap-rs/issues/158))
-*   allows stating all subcommands should *not* have --version flags ([336c476f](https://github.com/kbknapp/clap-rs/commit/336c476f631d512b54ac56fdca6f29ebdc2c00c5), closes [#156](https://github.com/kbknapp/clap-rs/issues/156))
-*   allows setting version number to auto-propagate through subcommands ([bc66d3c6](https://github.com/kbknapp/clap-rs/commit/bc66d3c6deedeca62463fff95369ab1cfcdd366b), closes [#157](https://github.com/kbknapp/clap-rs/issues/157))
-
-#### Improvements
-
-* **Help Strings**  properly aligns and handles newlines in long help strings ([f9800a29](https://github.com/kbknapp/clap-rs/commit/f9800a29696dd2cc0b0284bf693b3011831e556f), closes [#145](https://github.com/kbknapp/clap-rs/issues/145))
-
-
-#### Performance
-
-* **Help Messages**  big performance improvements when printing help messages ([52bcd892](https://github.com/kbknapp/clap-rs/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1))
-
-#### Documentation
-
-*   updates readme with new features ([8232f7bb](https://github.com/kbknapp/clap-rs/commit/8232f7bb52e88862bc13c3d4f99ee4f56cfe4bc0))
-*   fix incorrect code example for `App::subcommand_required` ([8889689d](https://github.com/kbknapp/clap-rs/commit/8889689dc6336ccc45b2c9f2cf8e2e483a639e93))
-
-
-<a name="v1.0.3"></a>
-### v1.0.3 (2015-07-11)
-
-
-#### Improvements
-
-* **Errors**  writes errors to stderr ([cc76ab8c](https://github.com/kbknapp/clap-rs/commit/cc76ab8c2b77c67b42f4717ded530df7806142cf), closes [#154](https://github.com/kbknapp/clap-rs/issues/154))
-
-#### Documentation
-
-* **README.md**  updates example help message to new format ([0aca29bd](https://github.com/kbknapp/clap-rs/commit/0aca29bd5d6d1a4e9971bdc88d946ffa58606efa))
-
-
-
-<a name="v1.0.2"></a>
-### v1.0.2 (2015-07-09)
-
-
-#### Improvements
-
-* **Usage**  re-orders optional arguments and required to natural standard ([dc7e1fce](https://github.com/kbknapp/clap-rs/commit/dc7e1fcea5c85d317018fb201d2a9262249131b4), closes [#147](https://github.com/kbknapp/clap-rs/issues/147))
-
-
-
-<a name="v1.0.1"></a>
-### v1.0.1 (2015-07-08)
-
-
-#### Bug Fixes
-
-*   allows empty values when using --long='' syntax ([083f82d3](https://github.com/kbknapp/clap-rs/commit/083f82d333b69720a6ef30074875310921d964d1), closes [#151](https://github.com/kbknapp/clap-rs/issues/151))
-
-
-
-<a name="v1.0.0"></a>
-## v1.0.0 (2015-07-08)
-
-
-#### Documentation
-
-* **README.md**  adds new features to what's new list ([938f7f01](https://github.com/kbknapp/clap-rs/commit/938f7f01340f521969376cf4e2e3d9436bca21f7))
-* **README.md**  use with_name for subcommands ([28b7e316](https://github.com/kbknapp/clap-rs/commit/28b7e3161fb772e5309042648fe8c3a420645bac))
-
-#### Features
-
-*   args can now be parsed from arbitrary locations, not just std::env::args() ([75312528](https://github.com/kbknapp/clap-rs/commit/753125282b1b9bfff875f1557ce27610edcc59e1))
-
-
-
-<a name="v1.0.0"></a>
-## v1.0.0-beta (2015-06-30)
-
-
-#### Features
-
-*   allows waiting for user input on error ([d0da3bdd](https://github.com/kbknapp/clap-rs/commit/d0da3bdd9d1871541907ea9c645322a74d260e07), closes [#140](https://github.com/kbknapp/clap-rs/issues/140))
-* **Help**  allows one to fully override the auto-generated help message ([26d5ae3e](https://github.com/kbknapp/clap-rs/commit/26d5ae3e330d1e150811d5b60b2b01a8f8df854e), closes [#141](https://github.com/kbknapp/clap-rs/issues/141))
-
-#### Documentation
-
-*   adds "whats new" section to readme ([ff149a29](https://github.com/kbknapp/clap-rs/commit/ff149a29dd9e179865e6d577cd7dc87c54f8f95c))
-
-#### Improvements
-
-*   removes deprecated functions in prep for 1.0 ([274484df](https://github.com/kbknapp/clap-rs/commit/274484dfd08fff4859cefd7e9bef3b73d3a9cb5f))
-
-
-
-<a name="v0.11.0"></a>
-## v0.11.0 (2015-06-17) - BREAKING CHANGE
-
-
-#### Documentation
-
-*   updates docs to new version flag defaults ([ebf442eb](https://github.com/kbknapp/clap-rs/commit/ebf442ebebbcd2ec6bfe2c06566c9d362bccb112))
-
-#### Features
-
-* **Help and Version**  default short for version is now `-V` but can be overridden (only breaks manual documentation) (**BREAKING CHANGE** [eb1d9320](https://github.com/kbknapp/clap-rs/commit/eb1d9320c509c1e4e57d7c7959da82bcfe06ada0))
-
-
-
-<a name="v0.10.5"></a>
-### v0.10.5 (2015-06-06)
-
-
-#### Bug Fixes
-
-* **Global Args**  global arguments propogate fully now ([1f377960](https://github.com/kbknapp/clap-rs/commit/1f377960a48c82f54ca5f39eb56bcb393140b046), closes [#137](https://github.com/kbknapp/clap-rs/issues/137))
-
-
-
-<a name="v0.10.4"></a>
-### v0.10.4 (2015-06-06)
-
-
-#### Bug Fixes
-
-* **Global Args**  global arguments propogate fully now ([8f2c0160](https://github.com/kbknapp/clap-rs/commit/8f2c0160c8d844daef375a33dbaec7d89de00a00), closes [#137](https://github.com/kbknapp/clap-rs/issues/137))
-
-
-
-<a name="v0.10.3"></a>
-### v0.10.3 (2015-05-31)
-
-
-#### Bug Fixes
-
-* **Global Args**  fixes a bug where globals only transfer to one subcommand ([a37842ee](https://github.com/kbknapp/clap-rs/commit/a37842eec1ee3162b86fdbda23420b221cdb1e3b), closes [#135](https://github.com/kbknapp/clap-rs/issues/135))
-
-
-
-<a name="v0.10.2"></a>
-### v0.10.2 (2015-05-30)
-
-
-#### Improvements
-
-* **Binary Names**  allows users to override the system determined bin name ([2191fe94](https://github.com/kbknapp/clap-rs/commit/2191fe94bda35771383b52872fb7f5421b178be1), closes [#134](https://github.com/kbknapp/clap-rs/issues/134))
-
-#### Documentation
-
-*   adds contributing guidelines ([6f76bd0a](https://github.com/kbknapp/clap-rs/commit/6f76bd0a07e8b7419b391243ab2d6687cd8a9c5f))
-
-
-
-<a name="v0.10.1"></a>
-### v0.10.1 (2015-05-26)
-
-
-#### Features
-
-*   can now specify that an app or subcommand should display help on no args or subcommands ([29ca7b2f](https://github.com/kbknapp/clap-rs/commit/29ca7b2f74376ca0cdb9d8ee3bfa99f7640cc404), closes [#133](https://github.com/kbknapp/clap-rs/issues/133))
-
-
-
-<a name="v0.10.0"></a>
-## v0.10.0 (2015-05-23)
-
-
-#### Features
-
-* **Global Args**  allows args that propagate down to child commands ([2bcc6137](https://github.com/kbknapp/clap-rs/commit/2bcc6137a83cb07757771a0afea953e68e692f0b), closes [#131](https://github.com/kbknapp/clap-rs/issues/131))
-
-#### Improvements
-
-* **Colors**  implements more structured colored output ([d6c3ed54](https://github.com/kbknapp/clap-rs/commit/d6c3ed54d21cf7b40d9f130d4280ff5448522fc5), closes [#129](https://github.com/kbknapp/clap-rs/issues/129))
-
-#### Deprecations
-
-* **SubCommand/App**  several methods and functions for stable release ([28b73855](https://github.com/kbknapp/clap-rs/commit/28b73855523ad170544afdb20665db98702fbe70))
-
-#### Documentation
-
-*   updates for deprecations and new features ([743eefe8](https://github.com/kbknapp/clap-rs/commit/743eefe8dd40c1260065ce086d572e9e9358bc4c))
-
-
-
-<a name="v0.9.2"></a>
-## v0.9.2 (2015-05-20)
-
-
-#### Bug Fixes
-
-* **help**  allows parent requirements to be ignored with help and version ([52218cc1](https://github.com/kbknapp/clap-rs/commit/52218cc1fdb06a42456c964d98cc2c7ac3432412), closes [#124](https://github.com/kbknapp/clap-rs/issues/124))
-
-
-
-<a name="v0.9.1"></a>
-## v0.9.1 (2015-05-18)
-
-
-#### Bug Fixes
-
-* **help**  fixes a bug where requirements are included as program name in help and version ([08ba3f25](https://github.com/kbknapp/clap-rs/commit/08ba3f25cf38b149229ba8b9cb37a5804fe6b789))
-
-
-
-<a name="v0.9.0"></a>
-## v0.9.0 (2015-05-17)
-
-
-#### Improvements
-
-* **usage**  usage strings now include parent command requirements ([dd8f21c7](https://github.com/kbknapp/clap-rs/commit/dd8f21c7c15cde348fdcf44fa7c205f0e98d2e4a), closes [#125](https://github.com/kbknapp/clap-rs/issues/125))
-* **args**  allows consumer of clap to decide if empty values are allowed or not ([ab4ec609](https://github.com/kbknapp/clap-rs/commit/ab4ec609ccf692b9b72cccef5c9f74f5577e360d), closes [#122](https://github.com/kbknapp/clap-rs/issues/122))
-
-#### Features
-
-* **subcommands**
-  *  allows optionally specifying that no subcommand is an error ([7554f238](https://github.com/kbknapp/clap-rs/commit/7554f238fd3afdd60b7e4dcf00ff4a9eccf842c1), closes [#126](https://github.com/kbknapp/clap-rs/issues/126))
-  *  subcommands can optionally negate parent requirements ([4a4229f5](https://github.com/kbknapp/clap-rs/commit/4a4229f500e21c350e1ef78dd09ef27559653288), closes [#123](https://github.com/kbknapp/clap-rs/issues/123))
-
-
-
-<a name="v0.8.6"></a>
-## v0.8.6 (2015-05-17)
-
-
-#### Bug Fixes
-
-* **args**  `-` can now be parsed as a value for an argument ([bc12e78e](https://github.com/kbknapp/clap-rs/commit/bc12e78eadd7eaf9d008a8469fdd2dfd7990cb5d), closes [#121](https://github.com/kbknapp/clap-rs/issues/121))
-
-
-
-<a name="v0.8.5"></a>
-## v0.8.5 (2015-05-15)
-
-
-#### Bug Fixes
-
-* **macros**  makes macro errors consistent with others ([0c264a8c](https://github.com/kbknapp/clap-rs/commit/0c264a8ca57ec1cfdcb74dae79145d766cdc9b97), closes [#118](https://github.com/kbknapp/clap-rs/issues/118))
-
-#### Features
-
-* **macros**
-  *  arg_enum! and simple_enum! provide a Vec<&str> of variant names ([30fa87ba](https://github.com/kbknapp/clap-rs/commit/30fa87ba4e0f3189351d8f4f78b72e616a30d0bd), closes [#119](https://github.com/kbknapp/clap-rs/issues/119))
-  *  arg_enum! and simple_enum! auto-implement Display ([d1219f0d](https://github.com/kbknapp/clap-rs/commit/d1219f0d1371d872061bd0718057eca4ef47b739), closes [#120](https://github.com/kbknapp/clap-rs/issues/120))
-
-
-
-<a name="v0.8.4"></a>
-## v0.8.4 (2015-05-12)
-
-
-#### Bug Fixes
-
-* **suggestions**  --help and --version now get suggestions ([d2b3b1fa](https://github.com/kbknapp/clap-rs/commit/d2b3b1faa0bdc1c5d2350cc4635aba81e02e9d96), closes [#116](https://github.com/kbknapp/clap-rs/issues/116))
-
-
-
-<a name="v0.8.3"></a>
-## v0.8.3 (2015-05-10)
-
-
-#### Bug Fixes
-
-* **usage**  groups unfold their members in usage strings ([55d15582](https://github.com/kbknapp/clap-rs/commit/55d155827ea4a6b077a83669701e797ce1ad68f4), closes [#114](https://github.com/kbknapp/clap-rs/issues/114))
-
-#### Performance
-
-* **usage**  removes unneeded allocations ([fd53cd18](https://github.com/kbknapp/clap-rs/commit/fd53cd188555f5c3dc8bc341c5d7eb04b761a70f))
-
-
-
-<a name="v0.8.2"></a>
-## v0.8.2 (2015-05-08)
-
-
-#### Bug Fixes
-
-* **usage strings**  positional arguments are presented in index order ([eb0e374e](https://github.com/kbknapp/clap-rs/commit/eb0e374ecf952f1eefbc73113f21e0705936e40b), closes [#112](https://github.com/kbknapp/clap-rs/issues/112))
-
-
-
-<a name="v0.8.1"></a>
-## v0.8.1 (2015-05-06)
-
-
-#### Bug Fixes
-
-* **subcommands**  stops parsing multiple values when subcommands are found ([fc79017e](https://github.com/kbknapp/clap-rs/commit/fc79017eced04fd41cc1801331e5054df41fac17), closes [#109](https://github.com/kbknapp/clap-rs/issues/109))
-
-#### Improvements
-
-* **color**  reduces color in error messages ([aab44cca](https://github.com/kbknapp/clap-rs/commit/aab44cca6352f47e280c296e50c535f5d752dd46), closes [#110](https://github.com/kbknapp/clap-rs/issues/110))
-* **suggestions**  adds suggested arguments to usage strings ([99447414](https://github.com/kbknapp/clap-rs/commit/994474146e9fb8b701af773a52da71553d74d4b7))
-
-
-
-<a name="v0.8.0"></a>
-## v0.8.0 (2015-05-06)
-
-
-#### Bug Fixes
-
-* **did-you-mean**  for review ([0535cfb0](https://github.com/kbknapp/clap-rs/commit/0535cfb0c711331568b4de8080eeef80bd254b68))
-* **Positional**  positionals were ignored if they matched a subcmd, even after '--' ([90e7b081](https://github.com/kbknapp/clap-rs/commit/90e7b0818741668b47cbe3becd029bab588e3553))
-* **help**  fixes bug where space between arg and help is too long ([632fb115](https://github.com/kbknapp/clap-rs/commit/632fb11514c504999ea86bdce47cdd34f8ebf646))
-
-#### Features
-
-* **from_usage**  adds ability to add value names or num of vals in usage string ([3d581976](https://github.com/kbknapp/clap-rs/commit/3d58197674ed7886ca315efb76e411608a327501), closes [#98](https://github.com/kbknapp/clap-rs/issues/98))
-* **did-you-mean**
-  *  gate it behind 'suggestions' ([c0e38351](https://github.com/kbknapp/clap-rs/commit/c0e383515d01bdd5ca459af9c2f7e2cf49e2488b))
-  *  for possible values ([1cc2deb2](https://github.com/kbknapp/clap-rs/commit/1cc2deb29158e0e4e8b434e4ce26b3d819301a7d))
-  *  for long flags (i.e. --long) ([52a0b850](https://github.com/kbknapp/clap-rs/commit/52a0b8505c99354bdf5fd1cd256cf41197ac2d81))
-  *  for subcommands ([06e869b5](https://github.com/kbknapp/clap-rs/commit/06e869b5180258047ed3c60ba099de818dd25fff))
-* **Flags**  adds sugestions functionality ([8745071c](https://github.com/kbknapp/clap-rs/commit/8745071c3257dd327c497013516f12a823df9530))
-* **errors**  colorizes output red on error ([f8b26b13](https://github.com/kbknapp/clap-rs/commit/f8b26b13da82ba3ba9a932d3d1ab4ea45d1ab036))
-
-#### Improvements
-
-* **arg_enum**  allows ascii case insensitivity for enum variants ([b249f965](https://github.com/kbknapp/clap-rs/commit/b249f9657c6921c004764bd80d13ebca81585eec), closes [#104](https://github.com/kbknapp/clap-rs/issues/104))
-* **clap-test**  simplified `make test` invocation ([d17dcb29](https://github.com/kbknapp/clap-rs/commit/d17dcb2920637a1f58c61c596b7bd362fd53047c))
-
-#### Documentation
-
-* **README**  adds details about optional and new features ([960389de](https://github.com/kbknapp/clap-rs/commit/960389de02c9872aaee9adabe86987f71f986e39))
-* **clap**  fix typos caught by codespell ([8891d929](https://github.com/kbknapp/clap-rs/commit/8891d92917aa1a069cca67272be41b99e548356e))
-* **from_usage**  explains new usage strings with multiple values ([05476fc6](https://github.com/kbknapp/clap-rs/commit/05476fc61cd1e5f4a4e750d258c878732a3a9c64))
-
-
-
-<a name="v0.7.6"></a>
-## v0.7.6 (2015-05-05)
-
-
-#### Improvements
-
-* **Options**  adds number of values to options in help/usage ([c1c993c4](https://github.com/kbknapp/clap-rs/commit/c1c993c419d18e35c443785053d8de9a2ef88073))
-
-#### Features
-
-* **from_usage**  adds ability to add value names or num of vals in usage string ([ad55748c](https://github.com/kbknapp/clap-rs/commit/ad55748c265cf27935c7b210307d2040b6a09125), closes [#98](https://github.com/kbknapp/clap-rs/issues/98))
-
-#### Bug Fixes
-
-* **MultipleValues**  properly distinguishes between multiple values and multiple occurrences ([dd2a7564](https://github.com/kbknapp/clap-rs/commit/dd2a75640ca68a91b973faad15f04df891356cef), closes [#99](https://github.com/kbknapp/clap-rs/issues/99))
-* **help**  fixes tab alignment with multiple values ([847001ff](https://github.com/kbknapp/clap-rs/commit/847001ff6d8f4d9518e810fefb8edf746dd0f31e))
-
-#### Documentation
-
-* **from_usage**  explains new usage strings with multiple values ([5a3a42df](https://github.com/kbknapp/clap-rs/commit/5a3a42dfa3a783537f88dedc0fd5f0edcb8ea372))
-
-
-
-<a name="v0.7.5"></a>
-## v0.7.5 (2015-05-04)
-
-
-#### Bug Fixes
-
-* **Options**  fixes bug where options with no value don't error out ([a1fb94be](https://github.com/kbknapp/clap-rs/commit/a1fb94be53141572ffd97aad037295d4ffec82d0))
-
-
-
-<a name="v0.7.4"></a>
-## v0.7.4 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **Options**  fixes a bug where option arguments in succession get their values skipped ([f66334d0](https://github.com/kbknapp/clap-rs/commit/f66334d0ce984e2b56e5c19abb1dd536fae9342a))
-
-
-
-<a name="v0.7.3"></a>
-## v0.7.3 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **RequiredValues**  fixes a bug where missing values are parsed as missing arguments ([93c4a723](https://github.com/kbknapp/clap-rs/commit/93c4a7231ba1a08152648598f7aa4503ea82e4de))
-
-#### Improvements
-
-* **ErrorMessages**  improves error messages and corrections ([a29c3983](https://github.com/kbknapp/clap-rs/commit/a29c3983c4229906655a29146ec15a0e46dd942d))
-* **ArgGroups**  improves requirement and confliction support for groups ([c236dc5f](https://github.com/kbknapp/clap-rs/commit/c236dc5ff475110d2a1b80e62903f80296163ad3))
-
-
-
-<a name="v0.7.2"></a>
-## v0.7.2 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **RequiredArgs**  fixes bug where required-by-default arguments are not listed in usage ([12aea961](https://github.com/kbknapp/clap-rs/commit/12aea9612d290845ba86515c240aeeb0a21198db), closes [#96](https://github.com/kbknapp/clap-rs/issues/96))
-
-
-
-<a name="v0.7.1"></a>
-## v0.7.1 (2015-05-01)
-
-
-#### Bug Fixes
-
-* **MultipleValues**  stops evaluating values if the max or exact number of values was reached ([86d92c9f](https://github.com/kbknapp/clap-rs/commit/86d92c9fdbf9f422442e9562977bbaf268dbbae1))
-
-
-
-<a name="v0.7.0"></a>
-## v0.7.0 (2015-04-30) - BREAKING CHANGE
-
-
-#### Bug Fixes
-
-* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/kbknapp/clap-rs/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/kbknapp/clap-rs/issues/83))
-
-#### Features
-
-* **MultipleValues**
-  *  add support for minimum and maximum number of values ([53f6b8c9](https://github.com/kbknapp/clap-rs/commit/53f6b8c9d8dc408b4fa9f833fc3a63683873c42f))
-  *  adds support limited number and named values ([ae09f05e](https://github.com/kbknapp/clap-rs/commit/ae09f05e92251c1b39a83d372736fcc7b504e432))
-  *  implement shorthand for options with multiple values ([6669f0a9](https://github.com/kbknapp/clap-rs/commit/6669f0a9687d4f668523145d7bd5c007d1eb59a8))
-* **arg**  allow other types besides Vec for multiple value settings (**BREAKING CHANGE** [0cc2f698](https://github.com/kbknapp/clap-rs/commit/0cc2f69839b9b1db5d06330771b494783049a88e), closes [#87](https://github.com/kbknapp/clap-rs/issues/87))
-* **usage**  implement smart usage strings on errors ([d77048ef](https://github.com/kbknapp/clap-rs/commit/d77048efb1e595ffe831f1a2bea2f2700db53b9f), closes [#88](https://github.com/kbknapp/clap-rs/issues/88))
-
-
-
-<a name="v0.6.9"></a>
-## v0.6.9 (2015-04-29)
-
-
-#### Bug Fixes
-
-* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/kbknapp/clap-rs/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/kbknapp/clap-rs/issues/83))
-
-
-
-<a name="0.6.8"></a>
-## 0.6.8 (2015-04-27)
-
-
-#### Bug Fixes
-
-* **help**  change long help --long=long -> --long <long> ([1e25abfc](https://github.com/kbknapp/clap-rs/commit/1e25abfc36679ab89eae71bf98ced4de81992d00))
-* **RequiredArgs**  required by default args should no longer be required when their exclusions are present ([4bb4c3cc](https://github.com/kbknapp/clap-rs/commit/4bb4c3cc076b49e86720e882bf8c489877199f2d))
-
-#### Features
-
-* **ArgGroups**  add ability to create arg groups ([09eb4d98](https://github.com/kbknapp/clap-rs/commit/09eb4d9893af40c347e50e2b717e1adef552357d))
-
-
-
-<a name="v0.6.7"></a>
-## v0.6.7 (2015-04-22)
-
-
-#### Bug Fixes
-
-* **from_usage**  fix bug causing args to not be required ([b76129e9](https://github.com/kbknapp/clap-rs/commit/b76129e9b71a63365d5c77a7f57b58dbd1e94d49))
-
-#### Features
-
-* **apps**  add ability to display additional help info after auto-gen'ed help msg ([65cc259e](https://github.com/kbknapp/clap-rs/commit/65cc259e4559cbe3653c865ec0c4b1e42a389b07))
-
-
-
-<a name="v0.6.6"></a>
-## v0.6.6 (2015-04-19)
-
-
-#### Bug Fixes
-
-* **from_usage**  tabs and spaces should be treated equally ([4fd44181](https://github.com/kbknapp/clap-rs/commit/4fd44181d55d8eb88caab1e625231cfa3129e347))
-
-#### Features
-
-* **macros.rs**  add macro to get version from Cargo.toml ([c630969a](https://github.com/kbknapp/clap-rs/commit/c630969aa3bbd386379219cae27ba1305b117f3e))
-
-
-
-<a name="v0.6.5"></a>
-## v0.6.5 (2015-04-19)
-
-
-#### Bug Fixes
-
-* **macros.rs**  fix use statements for trait impls ([86e4075e](https://github.com/kbknapp/clap-rs/commit/86e4075eb111937c8a7bdb344e866e350429f042))
-
-
-
-<a name="v0.6.4"></a>
-## v0.6.4 (2015-04-17)
-
-
-#### Features
-
-* **macros**  add ability to create enums pub or priv with derives ([2c499f80](https://github.com/kbknapp/clap-rs/commit/2c499f8015a199827cdf1fa3ec4f6f171722f8c7))
-
-
-
-<a name="v0.6.3"></a>
-## v0.6.3 (2015-04-16)
-
-
-#### Features
-
-* **macros**  add macro to create custom enums to use as types ([fb672aff](https://github.com/kbknapp/clap-rs/commit/fb672aff561c29db2e343d6c607138f141aca8b6))
-
-
-
-<a name="v0.6.2"></a>
-## v0.6.2 (2015-04-14)
-
-
-#### Features
-
-* **macros**
-  *  add ability to get mutliple typed values or exit ([0b87251f](https://github.com/kbknapp/clap-rs/commit/0b87251fc088234bee51c323c2b652d7254f7a59))
-  *  add ability to get a typed multiple values ([e243fe38](https://github.com/kbknapp/clap-rs/commit/e243fe38ddbbf845a46c0b9baebaac3778c80927))
-  *  add convenience macro to get a typed value or exit ([4b7cd3ea](https://github.com/kbknapp/clap-rs/commit/4b7cd3ea4947780d9daa39f3e1ddab53ad4c7fef))
-  *  add convenience macro to get a typed value ([8752700f](https://github.com/kbknapp/clap-rs/commit/8752700fbb30e89ee68adbce24489ae9a24d33a9))
-
-
-
-<a name="v0.6.1"></a>
-## v0.6.1 (2015-04-13)
-
-
-#### Bug Fixes
-
-* **from_usage**  trim all whitespace before parsing ([91d29045](https://github.com/kbknapp/clap-rs/commit/91d2904599bd602deef2e515dfc65dc2863bdea0))
-
-
-
-<a name="v0.6.0"></a>
-## v0.6.0 (2015-04-13)
-
-
-#### Bug Fixes
-
-* **tests**  fix failing doc tests ([3710cd69](https://github.com/kbknapp/clap-rs/commit/3710cd69162f87221a62464f63437c1ce843ad3c))
-
-#### Features
-
-* **app**  add support for building args from usage strings ([d5d48bcf](https://github.com/kbknapp/clap-rs/commit/d5d48bcf463a4e494ef758836bd69a4c220bbbb5))
-* **args**  add ability to create basic arguments from a usage string ([ab409a8f](https://github.com/kbknapp/clap-rs/commit/ab409a8f1db9e37cc70200f6f4a84a162692e618))
-
-
-
-<a name="v0.5.14"></a>
-## v0.5.14 (2015-04-10)
-
-
-#### Bug Fixes
-
-* **usage**
-  *  remove unneeded space ([51372789](https://github.com/kbknapp/clap-rs/commit/5137278942121bc2593ce6e5dc224ec2682549e6))
-  *  remove warning about unused variables ([ba817b9d](https://github.com/kbknapp/clap-rs/commit/ba817b9d815e37320650973f1bea0e7af3030fd7))
-
-#### Features
-
-* **usage**  add ability to get usage string for subcommands too ([3636afc4](https://github.com/kbknapp/clap-rs/commit/3636afc401c2caa966efb5b1869ef4f1ed3384aa))
-
-
-
-<a name="v0.5.13"></a>
-## v0.5.13 (2015-04-09)
-
-
-#### Features
-
-* **SubCommands**  add method to get name and subcommand matches together ([64e53928](https://github.com/kbknapp/clap-rs/commit/64e539280e23e567cf5de393b346eb0ca20e7eb5))
-* **ArgMatches**  add method to get default usage string ([02462150](https://github.com/kbknapp/clap-rs/commit/02462150ca750bdc7012627d7e8d96379d494d7f))
-
-
-
-<a name="v0.5.12"></a>
-## v0.5.12 (2015-04-08)
-
-
-#### Features
-
-* **help**  sort arguments by name so as to not display a random order ([f4b2bf57](https://github.com/kbknapp/clap-rs/commit/f4b2bf5767386013069fb74862e6e938dacf44d2))
-
-
-
-<a name="v0.5.11"></a>
-## v0.5.11 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **flags**  fix bug not allowing users to specify -v or -h ([90e72cff](https://github.com/kbknapp/clap-rs/commit/90e72cffdee321b79eea7a2207119533540062b4))
-
-
-
-<a name="v0.5.10"></a>
-## v0.5.10 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix spacing when option argument has not long version ([ca17fa49](https://github.com/kbknapp/clap-rs/commit/ca17fa494b68e92da83ee364bf64b0687006824b))
-
-
-
-<a name="v0.5.9"></a>
-## v0.5.9 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **positional args**  all previous positional args become required when a latter one is required ([c14c3f31](https://github.com/kbknapp/clap-rs/commit/c14c3f31fd557c165570b60911d8ee483d89d6eb), closes [#50](https://github.com/kbknapp/clap-rs/issues/50))
-* **clap**  remove unstable features for Rust 1.0 ([9abdb438](https://github.com/kbknapp/clap-rs/commit/9abdb438e36e364d41550e7f5d44ebcaa8ee6b10))
-* **args**  improve error messages for arguments with mutual exclusions ([18dbcf37](https://github.com/kbknapp/clap-rs/commit/18dbcf37024daf2b76ca099a6f118b53827aa339), closes [#51](https://github.com/kbknapp/clap-rs/issues/51))
-
-
-
-<a name="v0.5.8"></a>
-## v0.5.8 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **option args**  fix bug in getting the wrong number of occurrences for options ([82ad6ad7](https://github.com/kbknapp/clap-rs/commit/82ad6ad77539cf9f9a03b78db466f575ebd972cc))
-* **help**  fix formatting for option arguments with no long ([e8691004](https://github.com/kbknapp/clap-rs/commit/e869100423d93fa3acff03c4620cbcc0d0e790a1))
-* **flags**  add assertion to catch flags with specific value sets ([a0a2a40f](https://github.com/kbknapp/clap-rs/commit/a0a2a40fed57f7c5ad9d68970d090e9856306c7d), closes [#52](https://github.com/kbknapp/clap-rs/issues/52))
-* **args**  improve error messages for arguments with mutual exclusions ([bff945fc](https://github.com/kbknapp/clap-rs/commit/bff945fc5d03bba4266533340adcffb002508d1b), closes [#51](https://github.com/kbknapp/clap-rs/issues/51))
-* **tests**  add missing .takes_value(true) to option2 ([bdb0e88f](https://github.com/kbknapp/clap-rs/commit/bdb0e88f696c8595c3def3bfb0e52d538c7be085))
-* **positional args**  all previous positional args become required when a latter one is required ([343d47dc](https://github.com/kbknapp/clap-rs/commit/343d47dcbf83786a45c0d0f01b27fd9dd76725de), closes [#50](https://github.com/kbknapp/clap-rs/issues/50))
-
-
-
-<a name="v0.5.7"></a>
-## v0.5.7 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **args**  fix bug in arguments who are required and mutually exclusive ([6ceb88a5](https://github.com/kbknapp/clap-rs/commit/6ceb88a594caae825605abc1cdad95204996bf29))
-
-
-
-<a name="v0.5.6"></a>
-## v0.5.6 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix formatting of help and usage ([28691b52](https://github.com/kbknapp/clap-rs/commit/28691b52f67e65c599e10e4ea2a0f6f9765a06b8))
-
-
-
-<a name="v0.5.5"></a>
-## v0.5.5 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix formatting of help for flags and options ([6ec10115](https://github.com/kbknapp/clap-rs/commit/6ec1011563a746f0578a93b76d45e63878e0f9a8))
-
-
-
-<a name="v0.5.4"></a>
-## v0.5.4 (2015-04-08)
-
-
-#### Features
-
-* **help**  add '...' to indicate multiple values supported ([297ddba7](https://github.com/kbknapp/clap-rs/commit/297ddba77000e2228762ab0eca50b480f7467386))
-
-
-
-<a name="v0.5.3"></a>
-## v0.5.3 (2015-04-08)
-
-
-#### Features
-
-* **positionals**
-  *  add assertions for positional args with multiple vals ([b7fa72d4](https://github.com/kbknapp/clap-rs/commit/b7fa72d40f18806ec2042dd67a518401c2cf5681))
-  *  add support for multiple values ([80784009](https://github.com/kbknapp/clap-rs/commit/807840094109fbf90b348039ae22669ef27889ba))
-
-
-
-<a name="v0.5.2"></a>
-## v0.5.2 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **apps**  allow use of hyphens in application and subcommand names ([da549dcb](https://github.com/kbknapp/clap-rs/commit/da549dcb6c7e0d773044ab17829744483a8b0f7f))
-
-
-
-<a name="v0.5.1"></a>
-## v0.5.1 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **args**  determine if the only arguments allowed are also required ([0a09eb36](https://github.com/kbknapp/clap-rs/commit/0a09eb365ced9a03faf8ed24f083ef730acc90e8))
-
-
-
-<a name="v0.5.0"></a>
-## v0.5.0 (2015-04-08)
-
-
-#### Features
-
-* **args**  add support for a specific set of allowed values on options or positional arguments ([270eb889](https://github.com/kbknapp/clap-rs/commit/270eb88925b6dc2881bff1f31ee344f085d31809))
-
-
-
-<a name="v0.4.18"></a>
-## v0.4.18 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **usage**  display required args in usage, even if only required by others ([1b7316d4](https://github.com/kbknapp/clap-rs/commit/1b7316d4a8df70b0aa584ccbfd33f68966ad2a54))
-
-#### Features
-
-* **subcommands**  properly list subcommands in help and usage ([4ee02344](https://github.com/kbknapp/clap-rs/commit/4ee023442abc3dba54b68138006a52b714adf331))
-
-
-
-<a name="v0.4.17"></a>
-## v0.4.17 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **tests**  remove cargo test from claptests makefile ([1cf73817](https://github.com/kbknapp/clap-rs/commit/1cf73817d6fb1dccb5b6a23b46c2efa8b567ad62))
-
-
-
-<a name="v0.4.16"></a>
-## v0.4.16 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **option**  fix bug with option occurrence values ([9af52e93](https://github.com/kbknapp/clap-rs/commit/9af52e93cef9e17ac9974963f132013d0b97b946))
-* **tests**  fix testing script bug and formatting ([d8f03a55](https://github.com/kbknapp/clap-rs/commit/d8f03a55c4f74d126710ee06aad5a667246a8001))
-
-#### Features
-
-* **arg**  allow lifetimes other than 'static in arguments ([9e8c1fb9](https://github.com/kbknapp/clap-rs/commit/9e8c1fb9406f8448873ca58bab07fe905f1551e5))
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/CONTRIBUTORS.md
+++ /dev/null
@@ -1,67 +0,0 @@
-the following is a list of contributors:
-
-
-[<img alt="kbknapp" src="https://avatars2.githubusercontent.com/u/6942134?v=3&s=117" width="117">](https://github.com/kbknapp) |[<img alt="homu" src="https://avatars2.githubusercontent.com/u/10212162?v=3&s=117" width="117">](https://github.com/homu) |[<img alt="Vinatorul" src="https://avatars2.githubusercontent.com/u/6770624?v=3&s=117" width="117">](https://github.com/Vinatorul) |[<img alt="tormol" src="https://avatars0.githubusercontent.com/u/10460821?v=3&s=117" width="117">](https://github.com/tormol) |[<img alt="sru" src="https://avatars0.githubusercontent.com/u/2485892?v=3&s=117" width="117">](https://github.com/sru) |[<img alt="nabijaczleweli" src="https://avatars0.githubusercontent.com/u/6709544?v=3&s=117" width="117">](https://github.com/nabijaczleweli) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[kbknapp](https://github.com/kbknapp) |[homu](https://github.com/homu) |[Vinatorul](https://github.com/Vinatorul) |[tormol](https://github.com/tormol) |[sru](https://github.com/sru) |[nabijaczleweli](https://github.com/nabijaczleweli) |
-
-[<img alt="Byron" src="https://avatars1.githubusercontent.com/u/63622?v=3&s=117" width="117">](https://github.com/Byron) |[<img alt="hgrecco" src="https://avatars3.githubusercontent.com/u/278566?v=3&s=117" width="117">](https://github.com/hgrecco) |[<img alt="james-darkfox" src="https://avatars0.githubusercontent.com/u/637155?v=3&s=117" width="117">](https://github.com/james-darkfox) |[<img alt="rtaycher" src="https://avatars3.githubusercontent.com/u/324733?v=3&s=117" width="117">](https://github.com/rtaycher) |[<img alt="glowing-chemist" src="https://avatars3.githubusercontent.com/u/17074682?v=3&s=117" width="117">](https://github.com/glowing-chemist) |[<img alt="Arnavion" src="https://avatars1.githubusercontent.com/u/1096010?v=3&s=117" width="117">](https://github.com/Arnavion) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[Byron](https://github.com/Byron) |[hgrecco](https://github.com/hgrecco) |[james-darkfox](https://github.com/james-darkfox) |[rtaycher](https://github.com/rtaycher) |[glowing-chemist](https://github.com/glowing-chemist) |[Arnavion](https://github.com/Arnavion) |
-
-[<img alt="mgeisler" src="https://avatars3.githubusercontent.com/u/89623?v=3&s=117" width="117">](https://github.com/mgeisler) |[<img alt="afiune" src="https://avatars3.githubusercontent.com/u/5712253?v=3&s=117" width="117">](https://github.com/afiune) |[<img alt="crazymerlyn" src="https://avatars2.githubusercontent.com/u/6919679?v=3&s=117" width="117">](https://github.com/crazymerlyn) |[<img alt="SuperFluffy" src="https://avatars3.githubusercontent.com/u/701177?v=3&s=117" width="117">](https://github.com/SuperFluffy) |[<img alt="untitaker" src="https://avatars3.githubusercontent.com/u/837573?v=3&s=117" width="117">](https://github.com/untitaker) |[<img alt="japaric" src="https://avatars0.githubusercontent.com/u/5018213?v=3&s=117" width="117">](https://github.com/japaric) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[mgeisler](https://github.com/mgeisler) |[afiune](https://github.com/afiune) |[crazymerlyn](https://github.com/crazymerlyn) |[SuperFluffy](https://github.com/SuperFluffy) |[untitaker](https://github.com/untitaker) |[japaric](https://github.com/japaric) |
-
-[<img alt="matthiasbeyer" src="https://avatars3.githubusercontent.com/u/427866?v=3&s=117" width="117">](https://github.com/matthiasbeyer) |[<img alt="SShrike" src="https://avatars2.githubusercontent.com/u/4061736?v=3&s=117" width="117">](https://github.com/SShrike) |[<img alt="gohyda" src="https://avatars0.githubusercontent.com/u/10263838?v=3&s=117" width="117">](https://github.com/gohyda) |[<img alt="jimmycuadra" src="https://avatars1.githubusercontent.com/u/122457?v=3&s=117" width="117">](https://github.com/jimmycuadra) |[<img alt="Nemo157" src="https://avatars2.githubusercontent.com/u/81079?v=3&s=117" width="117">](https://github.com/Nemo157) |[<img alt="tshepang" src="https://avatars3.githubusercontent.com/u/588486?v=3&s=117" width="117">](https://github.com/tshepang) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[matthiasbeyer](https://github.com/matthiasbeyer) |[SShrike](https://github.com/SShrike) |[gohyda](https://github.com/gohyda) |[jimmycuadra](https://github.com/jimmycuadra) |[Nemo157](https://github.com/Nemo157) |[tshepang](https://github.com/tshepang) |
-
-[<img alt="porglezomp" src="https://avatars2.githubusercontent.com/u/1690225?v=3&s=117" width="117">](https://github.com/porglezomp) |[<img alt="wdv4758h" src="https://avatars2.githubusercontent.com/u/2716047?v=3&s=117" width="117">](https://github.com/wdv4758h) |[<img alt="frewsxcv" src="https://avatars1.githubusercontent.com/u/416575?v=3&s=117" width="117">](https://github.com/frewsxcv) |[<img alt="hoodie" src="https://avatars2.githubusercontent.com/u/260370?v=3&s=117" width="117">](https://github.com/hoodie) |[<img alt="huonw" src="https://avatars2.githubusercontent.com/u/1203825?v=3&s=117" width="117">](https://github.com/huonw) |[<img alt="GrappigPanda" src="https://avatars3.githubusercontent.com/u/2055372?v=3&s=117" width="117">](https://github.com/GrappigPanda) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[porglezomp](https://github.com/porglezomp) |[wdv4758h](https://github.com/wdv4758h) |[frewsxcv](https://github.com/frewsxcv) |[hoodie](https://github.com/hoodie) |[huonw](https://github.com/huonw) |[GrappigPanda](https://github.com/GrappigPanda) |
-
-[<img alt="ignatenkobrain" src="https://avatars2.githubusercontent.com/u/2866862?v=3&s=117" width="117">](https://github.com/ignatenkobrain) |[<img alt="cstorey" src="https://avatars0.githubusercontent.com/u/743059?v=3&s=117" width="117">](https://github.com/cstorey) |[<img alt="musoke" src="https://avatars3.githubusercontent.com/u/16665084?v=3&s=117" width="117">](https://github.com/musoke) |[<img alt="nelsonjchen" src="https://avatars2.githubusercontent.com/u/5363?v=3&s=117" width="117">](https://github.com/nelsonjchen) |[<img alt="pkgw" src="https://avatars3.githubusercontent.com/u/59598?v=3&s=117" width="117">](https://github.com/pkgw) |[<img alt="Deedasmi" src="https://avatars3.githubusercontent.com/u/5093293?v=3&s=117" width="117">](https://github.com/Deedasmi) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[ignatenkobrain](https://github.com/ignatenkobrain) |[cstorey](https://github.com/cstorey) |[musoke](https://github.com/musoke) |[nelsonjchen](https://github.com/nelsonjchen) |[pkgw](https://github.com/pkgw) |[Deedasmi](https://github.com/Deedasmi) |
-
-[<img alt="N-006" src="https://avatars3.githubusercontent.com/u/399312?v=3&s=117" width="117">](https://github.com/N-006) |[<img alt="Keats" src="https://avatars1.githubusercontent.com/u/680355?v=3&s=117" width="117">](https://github.com/Keats) |[<img alt="starkat99" src="https://avatars2.githubusercontent.com/u/8295111?v=3&s=117" width="117">](https://github.com/starkat99) |[<img alt="alex-gulyas" src="https://avatars3.githubusercontent.com/u/8698329?v=3&s=117" width="117">](https://github.com/alex-gulyas) |[<img alt="cite-reader" src="https://avatars2.githubusercontent.com/u/4196987?v=3&s=117" width="117">](https://github.com/cite-reader) |[<img alt="alexbool" src="https://avatars0.githubusercontent.com/u/1283792?v=3&s=117" width="117">](https://github.com/alexbool) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[N-006](https://github.com/N-006) |[Keats](https://github.com/Keats) |[starkat99](https://github.com/starkat99) |[alex-gulyas](https://github.com/alex-gulyas) |[cite-reader](https://github.com/cite-reader) |[alexbool](https://github.com/alexbool) |
-
-[<img alt="AluisioASG" src="https://avatars1.githubusercontent.com/u/1904165?v=3&s=117" width="117">](https://github.com/AluisioASG) |[<img alt="BurntSushi" src="https://avatars0.githubusercontent.com/u/456674?v=3&s=117" width="117">](https://github.com/BurntSushi) |[<img alt="nox" src="https://avatars3.githubusercontent.com/u/123095?v=3&s=117" width="117">](https://github.com/nox) |[<img alt="pixelistik" src="https://avatars2.githubusercontent.com/u/170929?v=3&s=117" width="117">](https://github.com/pixelistik) |[<img alt="brennie" src="https://avatars0.githubusercontent.com/u/156585?v=3&s=117" width="117">](https://github.com/brennie) |[<img alt="ogham" src="https://avatars0.githubusercontent.com/u/503760?v=3&s=117" width="117">](https://github.com/ogham) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[AluisioASG](https://github.com/AluisioASG) |[BurntSushi](https://github.com/BurntSushi) |[nox](https://github.com/nox) |[pixelistik](https://github.com/pixelistik) |[brennie](https://github.com/brennie) |[ogham](https://github.com/ogham) |
-
-[<img alt="Bilalh" src="https://avatars3.githubusercontent.com/u/171602?v=3&s=117" width="117">](https://github.com/Bilalh) |[<img alt="dotdash" src="https://avatars2.githubusercontent.com/u/230962?v=3&s=117" width="117">](https://github.com/dotdash) |[<img alt="bradurani" src="https://avatars3.githubusercontent.com/u/4195952?v=3&s=117" width="117">](https://github.com/bradurani) |[<img alt="Seeker14491" src="https://avatars1.githubusercontent.com/u/6490497?v=3&s=117" width="117">](https://github.com/Seeker14491) |[<img alt="brianp" src="https://avatars2.githubusercontent.com/u/179134?v=3&s=117" width="117">](https://github.com/brianp) |[<img alt="casey" src="https://avatars1.githubusercontent.com/u/1945?v=3&s=117" width="117">](https://github.com/casey) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[Bilalh](https://github.com/Bilalh) |[dotdash](https://github.com/dotdash) |[bradurani](https://github.com/bradurani) |[Seeker14491](https://github.com/Seeker14491) |[brianp](https://github.com/brianp) |[casey](https://github.com/casey) |
-
-[<img alt="volks73" src="https://avatars2.githubusercontent.com/u/1915469?v=3&s=117" width="117">](https://github.com/volks73) |[<img alt="daboross" src="https://avatars2.githubusercontent.com/u/1152146?v=3&s=117" width="117">](https://github.com/daboross) |[<img alt="mernen" src="https://avatars3.githubusercontent.com/u/6412?v=3&s=117" width="117">](https://github.com/mernen) |[<img alt="dguo" src="https://avatars3.githubusercontent.com/u/2763135?v=3&s=117" width="117">](https://github.com/dguo) |[<img alt="davidszotten" src="https://avatars0.githubusercontent.com/u/412005?v=3&s=117" width="117">](https://github.com/davidszotten) |[<img alt="eddyb" src="https://avatars1.githubusercontent.com/u/77424?v=3&s=117" width="117">](https://github.com/eddyb) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[volks73](https://github.com/volks73) |[daboross](https://github.com/daboross) |[mernen](https://github.com/mernen) |[dguo](https://github.com/dguo) |[davidszotten](https://github.com/davidszotten) |[eddyb](https://github.com/eddyb) |
-
-[<img alt="birkenfeld" src="https://avatars3.githubusercontent.com/u/144359?v=3&s=117" width="117">](https://github.com/birkenfeld) |[<img alt="tanakh" src="https://avatars1.githubusercontent.com/u/109069?v=3&s=117" width="117">](https://github.com/tanakh) |[<img alt="SirVer" src="https://avatars3.githubusercontent.com/u/140115?v=3&s=117" width="117">](https://github.com/SirVer) |[<img alt="idmit" src="https://avatars2.githubusercontent.com/u/2546728?v=3&s=117" width="117">](https://github.com/idmit) |[<img alt="archer884" src="https://avatars2.githubusercontent.com/u/679494?v=3&s=117" width="117">](https://github.com/archer884) |[<img alt="shepmaster" src="https://avatars3.githubusercontent.com/u/174509?v=3&s=117" width="117">](https://github.com/shepmaster) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[birkenfeld](https://github.com/birkenfeld) |[tanakh](https://github.com/tanakh) |[SirVer](https://github.com/SirVer) |[idmit](https://github.com/idmit) |[archer884](https://github.com/archer884) |[shepmaster](https://github.com/shepmaster) |
-
-[<img alt="jespino" src="https://avatars3.githubusercontent.com/u/290303?v=3&s=117" width="117">](https://github.com/jespino) |[<img alt="jtdowney" src="https://avatars2.githubusercontent.com/u/44654?v=3&s=117" width="117">](https://github.com/jtdowney) |[<img alt="andete" src="https://avatars1.githubusercontent.com/u/689017?v=3&s=117" width="117">](https://github.com/andete) |[<img alt="joshtriplett" src="https://avatars1.githubusercontent.com/u/162737?v=3&s=117" width="117">](https://github.com/joshtriplett) |[<img alt="malbarbo" src="https://avatars0.githubusercontent.com/u/1678126?v=3&s=117" width="117">](https://github.com/malbarbo) |[<img alt="iliekturtles" src="https://avatars0.githubusercontent.com/u/5081378?v=3&s=117" width="117">](https://github.com/iliekturtles) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[jespino](https://github.com/jespino) |[jtdowney](https://github.com/jtdowney) |[andete](https://github.com/andete) |[joshtriplett](https://github.com/joshtriplett) |[malbarbo](https://github.com/malbarbo) |[iliekturtles](https://github.com/iliekturtles) |
-
-[<img alt="nicompte" src="https://avatars1.githubusercontent.com/u/439369?v=3&s=117" width="117">](https://github.com/nicompte) |[<img alt="NickeZ" src="https://avatars1.githubusercontent.com/u/492753?v=3&s=117" width="117">](https://github.com/NickeZ) |[<img alt="nvzqz" src="https://avatars3.githubusercontent.com/u/10367662?v=3&s=117" width="117">](https://github.com/nvzqz) |[<img alt="Geogi" src="https://avatars2.githubusercontent.com/u/1818316?v=3&s=117" width="117">](https://github.com/Geogi) |[<img alt="flying-sheep" src="https://avatars3.githubusercontent.com/u/291575?v=3&s=117" width="117">](https://github.com/flying-sheep) |[<img alt="peppsac" src="https://avatars0.githubusercontent.com/u/2198295?v=3&s=117" width="117">](https://github.com/peppsac) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[nicompte](https://github.com/nicompte) |[NickeZ](https://github.com/NickeZ) |[nvzqz](https://github.com/nvzqz) |[Geogi](https://github.com/Geogi) |[flying-sheep](https://github.com/flying-sheep) |[peppsac](https://github.com/peppsac) |
-
-[<img alt="hexjelly" src="https://avatars3.githubusercontent.com/u/435283?v=3&s=117" width="117">](https://github.com/hexjelly) |[<img alt="rnelson" src="https://avatars0.githubusercontent.com/u/118361?v=3&s=117" width="117">](https://github.com/rnelson) |[<img alt="swatteau" src="https://avatars0.githubusercontent.com/u/5521255?v=3&s=117" width="117">](https://github.com/swatteau) |[<img alt="tspiteri" src="https://avatars3.githubusercontent.com/u/18604588?v=3&s=117" width="117">](https://github.com/tspiteri) |[<img alt="vks" src="https://avatars1.githubusercontent.com/u/33460?v=3&s=117" width="117">](https://github.com/vks) |[<img alt="th4t" src="https://avatars1.githubusercontent.com/u/2801030?v=3&s=117" width="117">](https://github.com/th4t) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[hexjelly](https://github.com/hexjelly) |[rnelson](https://github.com/rnelson) |[swatteau](https://github.com/swatteau) |[tspiteri](https://github.com/tspiteri) |[vks](https://github.com/vks) |[th4t](https://github.com/th4t) |
-
-[<img alt="mineo" src="https://avatars2.githubusercontent.com/u/78236?v=3&s=117" width="117">](https://github.com/mineo) |[<img alt="grossws" src="https://avatars1.githubusercontent.com/u/171284?v=3&s=117" width="117">](https://github.com/grossws) |[<img alt="messense" src="https://avatars3.githubusercontent.com/u/1556054?v=3&s=117" width="117">](https://github.com/messense) |[<img alt="mvaude" src="https://avatars2.githubusercontent.com/u/9532611?v=3&s=117" width="117">](https://github.com/mvaude) |[<img alt="panicbit" src="https://avatars1.githubusercontent.com/u/628445?v=3&s=117" width="117">](https://github.com/panicbit) |[<img alt="mitsuhiko" src="https://avatars2.githubusercontent.com/u/7396?v=3&s=117" width="117">](https://github.com/mitsuhiko) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[mineo](https://github.com/mineo) |[grossws](https://github.com/grossws) |[messense](https://github.com/messense) |[mvaude](https://github.com/mvaude) |[panicbit](https://github.com/panicbit) |[mitsuhiko](https://github.com/mitsuhiko) |
-
-
-
-
-This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/Cargo.toml
+++ /dev/null
@@ -1,117 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "clap"
-version = "2.25.0"
-authors = ["Kevin K. <kbknapp@gmail.com>"]
-exclude = ["examples/*", "clap-test/*", "tests/*", "benches/*", "*.png", "clap-perf/*", "*.dot"]
-description = "A simple to use, efficient, and full featured  Command Line Argument Parser\n"
-homepage = "https://clap.rs/"
-documentation = "https://docs.rs/clap/"
-readme = "README.md"
-keywords = ["argument", "command", "arg", "parser", "parse"]
-categories = ["command-line-interface"]
-license = "MIT"
-repository = "https://github.com/kbknapp/clap-rs.git"
-[profile.test]
-opt-level = 1
-lto = false
-codegen-units = 4
-debug = true
-debug-assertions = true
-rpath = false
-
-[profile.doc]
-opt-level = 0
-lto = false
-codegen-units = 4
-debug = true
-debug-assertions = true
-rpath = false
-
-[profile.bench]
-opt-level = 3
-lto = true
-debug = false
-debug-assertions = false
-rpath = false
-
-[profile.dev]
-opt-level = 0
-lto = false
-codegen-units = 4
-debug = true
-debug-assertions = true
-rpath = false
-
-[profile.release]
-opt-level = 3
-lto = true
-debug = false
-debug-assertions = false
-rpath = false
-[dependencies.ansi_term]
-version = "0.9.0"
-optional = true
-
-[dependencies.term_size]
-version = "0.3.0"
-optional = true
-
-[dependencies.textwrap]
-version = "0.6.0"
-
-[dependencies.yaml-rust]
-version = "0.3.5"
-optional = true
-
-[dependencies.unicode-width]
-version = "0.1.4"
-
-[dependencies.atty]
-version = "0.2.2"
-optional = true
-
-[dependencies.vec_map]
-version = "0.8"
-
-[dependencies.clippy]
-version = "~0.0.131"
-optional = true
-
-[dependencies.unicode-segmentation]
-version = "~1.1.0"
-
-[dependencies.bitflags]
-version = "0.9"
-
-[dependencies.strsim]
-version = "0.6.0"
-optional = true
-[dev-dependencies.regex]
-version = "0.2"
-
-[dev-dependencies.lazy_static]
-version = "0.2"
-
-[features]
-unstable = []
-default = ["suggestions", "color", "wrap_help"]
-color = ["ansi_term", "atty"]
-yaml = ["yaml-rust"]
-no_cargo = []
-wrap_help = ["term_size"]
-suggestions = ["strsim"]
-nightly = []
-debug = []
-lints = ["clippy"]
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/LICENSE-MIT
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-2016 Kevin B. Knapp
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/README.md
+++ /dev/null
@@ -1,715 +0,0 @@
-clap
-====
-
-[![Crates.io](https://img.shields.io/crates/v/clap.svg)](https://crates.io/crates/clap) [![Crates.io](https://img.shields.io/crates/d/clap.svg)](https://crates.io/crates/clap) [![license](http://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/kbknapp/clap-rs/blob/master/LICENSE-MIT) [![Coverage Status](https://coveralls.io/repos/kbknapp/clap-rs/badge.svg?branch=master&service=github)](https://coveralls.io/github/kbknapp/clap-rs?branch=master) [![Join the chat at https://gitter.im/kbknapp/clap-rs](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kbknapp/clap-rs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-Linux: [![Build Status](https://travis-ci.org/kbknapp/clap-rs.svg?branch=master)](https://travis-ci.org/kbknapp/clap-rs)
-Windows: [![Build status](https://ci.appveyor.com/api/projects/status/ejg8c33dn31nhv36/branch/master?svg=true)](https://ci.appveyor.com/project/kbknapp/clap-rs/branch/master)
-
-Command Line Argument Parser for Rust
-
-It is a simple-to-use, efficient, and full-featured library for parsing command line arguments and subcommands when writing console/terminal applications.
-
-## [documentation](https://docs.rs/clap/)
-## [website](https://clap.rs/)
-## [blog](https://blog.clap.rs/)
-
-Table of Contents
-=================
-
-* [What's New](#whats-new)
-* [About](#about)
-* [FAQ](#faq)
-* [Features](#features)
-* [Quick Example](#quick-example)
-* [Try it!](#try-it)
-  * [Pre-Built Test](#pre-built-test)
-  * [BYOB (Build Your Own Binary)](#byob-build-your-own-binary)
-* [Usage](#usage)
-  * [Optional Dependencies / Features](#optional-dependencies--features)
-  * [Dependencies Tree](#dependencies-tree)
-  * [More Information](#more-information)
-    * [Video Tutorials](#video-tutorials)
-* [How to Contribute](#how-to-contribute)
-  * [Testing Code](#testing-code)
-  * [Linting Code](#linting-code)
-  * [Debugging Code](#debugging-code)
-  * [Goals](#goals)
-  * [Compatibility Policy](#compatibility-policy)
-    * [Minimum Version of Rust](#minimum-version-of-rust)
-* [License](#license)
-* [Recent Breaking Changes](#recent-breaking-changes)
-  * [Deprecations](#deprecations)
-
-Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)
-
-## What's New
-
-Here's the highlights for v2.25.0
-
-* use textwrap crate for wrapping help texts 
-* suggests to use flag after subcommand when applicable 
-* Bumps bitflags crate to v0.9
-
-Here's the highlights for v2.21.0 to v2.24.2
-
-* fixes a bug where args that allow values to start with a hyphen couldnt contain a double hyphen -- as a value 
-* fixes a bug where positional argument help text is misaligned 
-* **App::template docs:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template 
-* **Arg::allow_hyphen_values docs:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together 
-* **clap_app! docs:**  adds using the @group specifier to the macro docs 
-* adds a debug assertion to ensure all args added to groups actually exist 
-* fixes a bug where args with last(true) and required(true) set were not being printed in the usage string 
-* fixes a bug that was printing the arg name, instead of value name when Arg::last(true) was used 
-* fixes a bug where flags were parsed as flags AND positional values when specific combinations of settings were used 
-* **README.md:**  fix some typos 
-* **Arg:**  add `default_value_os` 
-* **arg_matches.rs:**  Added a Default implementation for Values and OsValues iterators. 
-* **PowerShell Completions:**
-  * fixes a bug where powershells completions cant be used if no subcommands are defined
-  * massively dedups subcommand names in the generate script to make smaller scripts that are still functionally equiv
-* allows specifying a short help vs a long help (i.e. varying levels of detail depending on if -h or --help was used)
-* **clap_app!:**  adds support for arg names with hyphens similar to longs with hyphens
-* fixes a bug that wasn't allowing help and version to be properly overridden
-  * This may break code that was relying on this bug! If you add a flag with a long of `help` manually *and* rely on the help message to be printed automatically your code could break. Please see the commit link in the full CHANGELOG.md
-* `App::long_about`
-* `App::long_version`
-* `App::print_long_help`
-* `App::write_long_help`
-* `App::print_long_version`
-* `App::write_long_version`
-* `Arg::long_help`
-* **clap_app!:**  documents the `--("some-arg")` method for using args with hyphens inside them
-* fixes the usage string regression when using help templates
-* fixes a big regression with custom usage strings
-* adds the ability to change the name of the App instance after creation
-* adds ability to hide the default value of an argument from the help string
-* fixes support for loading author info from yaml
-* adds fish subcommand help support
-* options that use `require_equals(true)` now display the equals sign in help messages, usage strings, and errors
-* setting the max term width now correctly propagates down through child subcommands
-* fixes the precedence of this error to prioritize over other error messages
-* fixes some regression bugs resulting from old asserts in debug mode.
-* adds the ability to mark a positional argument as 'last' which means it should be used with `--` syntax and can be accessed early to effectivly skip other positional args
-* Some performance improvements by reducing the ammount of duplicate work, cloning, and allocations in all cases.
-* Some massive performance gains when using many args (i.e. things like shell glob expansions)
-* adds a setting to allow one to infer shortened subcommands or aliases (i.e. for subcommmand "test", "t", "te", or "tes" would be allowed assuming no other ambiguities)
-* when `AppSettings::SubcommandsNegateReqs` and `ArgsNegateSubcommands` are used, a new more accurate double line usage string is shown
-* provides `default_value_os` and `default_value_if[s]_os`
-* provides `App::help_message` and `App::version_message` which allows one to override the auto-generated help/version flag associated help
-* adds the ability to require the equals syntax with options `--opt=val`
-* doesn't print the argument sections in the help message if all args in that section are hidden
-* doesn't include the various `[ARGS]` `[FLAGS]` or `[OPTIONS]` if the only ones available are hidden
-* now correctly shows subcommand as required in the usage string when AppSettings::SubcommandRequiredElseHelp is used
-* fixes some "memory leaks" when an error is detected and clap exits
-* fixes a trait that's marked private accidentlly, but should be crate internal public
-* fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts
-* Fixes a critical bug in the `clap_app!` macro of a missing fragment specifier when using `!property` style tags.
-* Fix examples link in CONTRIBUTING.md
-
-For full details, see [CHANGELOG.md](https://github.com/kbknapp/clap-rs/blob/master/CHANGELOG.md)
-
-## About
-
-`clap` is used to parse *and validate* the string of command line arguments provided by the user at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means you focus on your *applications* functionality, and less on the parsing and validating of arguments.
-
-`clap` also provides the traditional version and help switches (or flags) 'for free' meaning automatically with no configuration. It does this by checking list of valid possibilities you supplied and adding only the ones you haven't already defined. If you are using subcommands, `clap` will also auto-generate a `help` subcommand for you in addition to the traditional flags.
-
-Once `clap` parses the user provided string of arguments, it returns the matches along with any applicable values. If the user made an error or typo, `clap` informs them of the mistake and exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to exit). Because of this, you can make reasonable assumptions in your code about the validity of the arguments.
-
-## FAQ
-
-For a full FAQ and more in depth details, see [the wiki page](https://github.com/kbknapp/clap-rs/wiki/FAQ)
-
-### Comparisons
-
-First, let me say that these comparisons are highly subjective, and not meant in a critical or harsh manner. All the argument parsing libraries out there (to include `clap`) have their own strengths and weaknesses. Sometimes it just comes down to personal taste when all other factors are equal. When in doubt, try them all and pick one that you enjoy :) There's plenty of room in the Rust community for multiple implementations!
-
-#### How does `clap` compare to [getopts](https://github.com/rust-lang-nursery/getopts)?
-
-`getopts` is a very basic, fairly minimalist argument parsing library. This isn't a bad thing, sometimes you don't need tons of features, you just want to parse some simple arguments, and have some help text generated for you based on valid arguments you specify. The downside to this approach is that you must manually implement most of the common features (such as checking to display help messages, usage strings, etc.). If you want a highly custom argument parser, and don't mind writing the majority of the functionality yourself, `getopts` is an excellent base.
-
-`getopts` also doesn't allocate much, or at all. This gives it a very small performance boost. Although, as you start implementing additional features, that boost quickly disappears.
-
-Personally, I find many, many uses of `getopts` are manually implementing features that `clap` provides by default. Using `clap` simplifies your codebase allowing you to focus on your application, and not argument parsing.
-
-#### How does `clap` compare to [docopt.rs](https://github.com/docopt/docopt.rs)?
-
-I first want to say I'm a big a fan of BurntSushi's work, the creator of `Docopt.rs`. I aspire to produce the quality of libraries that this man does! When it comes to comparing these two libraries they are very different. `docopt` tasks you with writing a help message, and then it parsers that message for you to determine all valid arguments and their use. Some people LOVE this approach, others do not. If you're willing to write a detailed help message, it's nice that you can stick that in your program and have `docopt` do the rest. On the downside, it's far less flexible.
-
-`docopt` is also excellent at translating arguments into Rust types automatically. There is even a syntax extension which will do all this for you, if you're willing to use a nightly compiler (use of a stable compiler requires you to somewhat manually translate from arguments to Rust types). To use BurntSushi's words, `docopt` is also a sort of black box. You get what you get, and it's hard to tweak implementation or customize the experience for your use case.
-
-Because `docopt` is doing a ton of work to parse your help messages and determine what you were trying to communicate as valid arguments, it's also one of the more heavy weight parsers performance-wise. For most applications this isn't a concern and this isn't to say `docopt` is slow, in fact from it. This is just something to keep in mind while comparing.
-
-#### All else being equal, what are some reasons to use `clap`?
-
-`clap` is as fast, and as lightweight as possible while still giving all the features you'd expect from a modern argument parser. In fact, for the amount and type of features `clap` offers it remains about as fast as `getopts`. If you use `clap` when just need some simple arguments parsed, you'll find it's a walk in the park. `clap` also makes it possible to represent extremely complex, and advanced requirements, without too much thought. `clap` aims to be intuitive, easy to use, and fully capable for wide variety use cases and needs.
-
-## Features
-
-Below are a few of the features which `clap` supports, full descriptions and usage can be found in the [documentation](https://docs.rs/clap/) and [examples/](examples) directory
-
-* **Auto-generated Help, Version, and Usage information**
-  - Can optionally be fully, or partially overridden if you want a custom help, version, or usage
-* **Auto-generated bash completion scripts at compile time**
-  - Even works through many multiple levels of subcommands
-  - Works with options which only accept certain values
-  - Works with subcommand aliases
-* **Flags / Switches** (i.e. bool fields)
-  - Both short and long versions supported (i.e. `-f` and `--flag` respectively)
-  - Supports combining short versions (i.e. `-fBgoZ` is the same as `-f -B -g -o -Z`)
-  - Supports multiple occurrences (i.e. `-vvv` or `-v -v -v`)
-* **Positional Arguments** (i.e. those which are based off an index from the program name)
-  - Supports multiple values (i.e. `myprog <file>...` such as `myprog file1.txt file2.txt` being two values for the same "file" argument)
-  - Supports Specific Value Sets (See below)
-  - Can set value parameters (such as the minimum number of values, the maximum number of values, or the exact number of values)
-  - Can set custom validations on values to extend the argument parsing capability to truly custom domains
-* **Option Arguments** (i.e. those that take values)
-  - Both short and long versions supported (i.e. `-o value`, `-ovalue`, `-o=value` and `--option value` or `--option=value` respectively)
-  - Supports multiple values (i.e. `-o <val1> -o <val2>` or `-o <val1> <val2>`)
-  - Supports delimited values (i.e. `-o=val1,val2,val3`, can also change the delimiter)
-  - Supports Specific Value Sets (See below)
-  - Supports named values so that the usage/help info appears as `-o <FILE> <INTERFACE>` etc. for when you require specific multiple values
-  - Can set value parameters (such as the minimum number of values, the maximum number of values, or the exact number of values)
-  - Can set custom validations on values to extend the argument parsing capability to truly custom domains
-* **Sub-Commands** (i.e. `git add <file>` where `add` is a sub-command of `git`)
-  - Support their own sub-arguments, and sub-sub-commands independent of the parent
-  - Get their own auto-generated Help, Version, and Usage independent of parent
-* **Support for building CLIs from YAML** - This keeps your Rust source nice and tidy and makes supporting localized translation very simple!
-* **Requirement Rules**: Arguments can define the following types of requirement rules
-  - Can be required by default
-  - Can be required only if certain arguments are present
-  - Can require other arguments to be present
-* **Confliction Rules**: Arguments can optionally define the following types of exclusion rules
-  - Can be disallowed when certain arguments are present
-  - Can disallow use of other arguments when present
-* **Groups**: Arguments can be made part of a group
-  - Fully compatible with other relational rules (requirements, conflicts, and overrides) which allows things like requiring the use of any arg in a group, or denying the use of an entire group conditionally
-* **Specific Value Sets**: Positional or Option Arguments can define a specific set of allowed values (i.e. imagine a `--mode` option which may *only* have one of two values `fast` or `slow` such as `--mode fast` or `--mode slow`)
-* **Default Values**
-* **Automatic Version from Cargo.toml**: `clap` is fully compatible with Rust's `env!()` macro for automatically setting the version of your application to the version in your Cargo.toml. See [09_auto_version example](examples/09_auto_version.rs) for how to do this (Thanks to [jhelwig](https://github.com/jhelwig) for pointing this out)
-* **Typed Values**: You can use several convenience macros provided by `clap` to get typed values (i.e. `i32`, `u8`, etc.) from positional or option arguments so long as the type you request implements `std::str::FromStr` See the [12_typed_values example](examples/12_typed_values.rs). You can also use `clap`s `arg_enum!` macro to create an enum with variants that automatically implement `std::str::FromStr`. See [13a_enum_values_automatic example](examples/13a_enum_values_automatic.rs) for details
-* **Suggestions**: Suggests corrections when the user enters a typo. For example, if you defined a `--myoption` argument, and the user mistakenly typed `--moyption` (notice `y` and `o` transposed), they would receive a `Did you mean '--myoption'?` error and exit gracefully. This also works for subcommands and flags. (Thanks to [Byron](https://github.com/Byron) for the implementation) (This feature can optionally be disabled, see 'Optional Dependencies / Features')
-* **Colorized Errors (Non Windows OS only)**: Error message are printed in in colored text (this feature can optionally be disabled, see 'Optional Dependencies / Features').
-* **Global Arguments**: Arguments can optionally be defined once, and be available to all child subcommands.
-* **Custom Validations**: You can define a function to use as a validator of argument values. Imagine defining a function to validate IP addresses, or fail parsing upon error. This means your application logic can be solely focused on *using* values.
-* **POSIX Compatible Conflicts/Overrides** - In POSIX args can be conflicting, but not fail parsing because whichever arg comes *last* "wins" so to speak. This allows things such as aliases (i.e. `alias ls='ls -l'` but then using `ls -C` in your terminal which ends up passing `ls -l -C` as the final arguments. Since `-l` and `-C` aren't compatible, this effectively runs `ls -C` in `clap` if you choose...`clap` also supports hard conflicts that fail parsing). (Thanks to [Vinatorul](https://github.com/Vinatorul)!)
-* Supports the Unix `--` meaning, only positional arguments follow
-
-## Quick Example
-
-The following examples show a quick example of some of the very basic functionality of `clap`. For more advanced usage, such as requirements, conflicts, groups, multiple values and occurrences see the [documentation](https://docs.rs/clap/), [examples/](examples) directory of this repository or the [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-
- **NOTE:** All of these examples are functionally the same, but show different styles in which to use `clap`
-
-The first example shows a method that allows more advanced configuration options (not shown in this small example), or even dynamically generating arguments when desired. The downside is it's more verbose.
-
-```rust
-// (Full example with detailed comments in examples/01b_quick_example.rs)
-//
-// This example demonstrates clap's full 'builder pattern' style of creating arguments which is
-// more verbose, but allows easier editing, and at times more advanced options, or the possibility
-// to generate arguments dynamically.
-extern crate clap;
-use clap::{Arg, App, SubCommand};
-
-fn main() {
-    let matches = App::new("My Super Program")
-                          .version("1.0")
-                          .author("Kevin K. <kbknapp@gmail.com>")
-                          .about("Does awesome things")
-                          .arg(Arg::with_name("config")
-                               .short("c")
-                               .long("config")
-                               .value_name("FILE")
-                               .help("Sets a custom config file")
-                               .takes_value(true))
-                          .arg(Arg::with_name("INPUT")
-                               .help("Sets the input file to use")
-                               .required(true)
-                               .index(1))
-                          .arg(Arg::with_name("v")
-                               .short("v")
-                               .multiple(true)
-                               .help("Sets the level of verbosity"))
-                          .subcommand(SubCommand::with_name("test")
-                                      .about("controls testing features")
-                                      .version("1.3")
-                                      .author("Someone E. <someone_else@other.com>")
-                                      .arg(Arg::with_name("debug")
-                                          .short("d")
-                                          .help("print debug information verbosely")))
-                          .get_matches();
-
-    // Gets a value for config if supplied by user, or defaults to "default.conf"
-    let config = matches.value_of("config").unwrap_or("default.conf");
-    println!("Value for config: {}", config);
-
-    // Calling .unwrap() is safe here because "INPUT" is required (if "INPUT" wasn't
-    // required we could have used an 'if let' to conditionally get the value)
-    println!("Using input file: {}", matches.value_of("INPUT").unwrap());
-
-    // Vary the output based on how many times the user used the "verbose" flag
-    // (i.e. 'myprog -v -v -v' or 'myprog -vvv' vs 'myprog -v'
-    match matches.occurrences_of("v") {
-        0 => println!("No verbose info"),
-        1 => println!("Some verbose info"),
-        2 => println!("Tons of verbose info"),
-        3 | _ => println!("Don't be crazy"),
-    }
-
-    // You can handle information about subcommands by requesting their matches by name
-    // (as below), requesting just the name used, or both at the same time
-    if let Some(matches) = matches.subcommand_matches("test") {
-        if matches.is_present("debug") {
-            println!("Printing debug info...");
-        } else {
-            println!("Printing normally...");
-        }
-    }
-
-    // more program logic goes here...
-}
-```
-
-The next example shows a far less verbose method, but sacrifices some of the advanced configuration options (not shown in this small example). This method also takes a *very* minor runtime penalty.
-
-```rust
-// (Full example with detailed comments in examples/01a_quick_example.rs)
-//
-// This example demonstrates clap's "usage strings" method of creating arguments
-// which is less verbose
-extern crate clap;
-use clap::{Arg, App, SubCommand};
-
-fn main() {
-    let matches = App::new("myapp")
-                          .version("1.0")
-                          .author("Kevin K. <kbknapp@gmail.com>")
-                          .about("Does awesome things")
-                          .args_from_usage(
-                              "-c, --config=[FILE] 'Sets a custom config file'
-                              <INPUT>              'Sets the input file to use'
-                              -v...                'Sets the level of verbosity'")
-                          .subcommand(SubCommand::with_name("test")
-                                      .about("controls testing features")
-                                      .version("1.3")
-                                      .author("Someone E. <someone_else@other.com>")
-                                      .arg_from_usage("-d, --debug 'Print debug information'"))
-                          .get_matches();
-
-    // Same as previous example...
-}
-```
-
-This third method shows how you can use a YAML file to build your CLI and keep your Rust source tidy
-or support multiple localized translations by having different YAML files for each localization.
-
-First, create the `cli.yml` file to hold your CLI options, but it could be called anything we like:
-
-```yaml
-name: myapp
-version: "1.0"
-author: Kevin K. <kbknapp@gmail.com>
-about: Does awesome things
-args:
-    - config:
-        short: c
-        long: config
-        value_name: FILE
-        help: Sets a custom config file
-        takes_value: true
-    - INPUT:
-        help: Sets the input file to use
-        required: true
-        index: 1
-    - verbose:
-        short: v
-        multiple: true
-        help: Sets the level of verbosity
-subcommands:
-    - test:
-        about: controls testing features
-        version: "1.3"
-        author: Someone E. <someone_else@other.com>
-        args:
-            - debug:
-                short: d
-                help: print debug information
-```
-
-Since this feature requires additional dependencies that not everyone may want, it is *not* compiled in by default and we need to enable a feature flag in Cargo.toml:
-
-Simply change your `clap = "2.19"` to `clap = {version = "2.19", features = ["yaml"]}`.
-
-At last we create our `main.rs` file just like we would have with the previous two examples:
-
-```rust
-// (Full example with detailed comments in examples/17_yaml.rs)
-//
-// This example demonstrates clap's building from YAML style of creating arguments which is far
-// more clean, but takes a very small performance hit compared to the other two methods.
-#[macro_use]
-extern crate clap;
-use clap::App;
-
-fn main() {
-    // The YAML file is found relative to the current file, similar to how modules are found
-    let yaml = load_yaml!("cli.yml");
-    let matches = App::from_yaml(yaml).get_matches();
-
-    // Same as previous examples...
-}
-```
-
-Finally there is a macro version, which is like a hybrid approach offering the speed of the builder pattern (the first example), but without all the verbosity.
-
-```rust
-#[macro_use]
-extern crate clap;
-
-fn main() {
-    let matches = clap_app!(myapp =>
-        (version: "1.0")
-        (author: "Kevin K. <kbknapp@gmail.com>")
-        (about: "Does awesome things")
-        (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
-        (@arg INPUT: +required "Sets the input file to use")
-        (@arg debug: -d ... "Sets the level of debugging information")
-        (@subcommand test =>
-            (about: "controls testing features")
-            (version: "1.3")
-            (author: "Someone E. <someone_else@other.com>")
-            (@arg verbose: -v --verbose "Print test information verbosely")
-        )
-    ).get_matches();
-
-    // Same as before...
-}
-```
-
-If you were to compile any of the above programs and run them with the flag `--help` or `-h` (or `help` subcommand, since we defined `test` as a subcommand) the following would be output
-
-```sh
-$ myprog --help
-My Super Program 1.0
-Kevin K. <kbknapp@gmail.com>
-Does awesome things
-
-USAGE:
-    MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
-
-FLAGS:
-    -h, --help       Prints this message
-    -v               Sets the level of verbosity
-    -V, --version    Prints version information
-
-OPTIONS:
-    -c, --config <FILE>    Sets a custom config file
-
-ARGS:
-    INPUT    The input file to use
-
-SUBCOMMANDS:
-    help    Prints this message
-    test    Controls testing features
-```
-
-**NOTE:** You could also run `myapp test --help` to see similar output and options for the `test` subcommand.
-
-## Try it!
-
-### Pre-Built Test
-
-To try out the pre-built example, use the following steps:
-
-* Clone the repository `$ git clone https://github.com/kbknapp/clap-rs && cd clap-rs/tests`
-* Compile the example `$ cargo build --release`
-* Run the help info `$ ./target/release/claptests --help`
-* Play with the arguments!
-
-### BYOB (Build Your Own Binary)
-
-To test out `clap`'s default auto-generated help/version follow these steps:
-* Create a new cargo project `$ cargo new fake --bin && cd fake`
-* Add `clap` to your `Cargo.toml`
-*
-```toml
-[dependencies]
-clap = "2"
-```
-
-* Add the following to your `src/main.rs`
-
-```rust
-extern crate clap;
-use clap::App;
-
-fn main() {
-  App::new("fake").version("v1.0-beta").get_matches();
-}
-```
-
-* Build your program `$ cargo build --release`
-* Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake --version`
-
-## Usage
-
-For full usage, add `clap` as a dependency in your `Cargo.toml` () to use from crates.io:
-
-```toml
-[dependencies]
-clap = "~2.19.0"
-```
-
-(**note**: If you are concerned with supporting a minimum version of Rust that is *older* than the current stable Rust minus 2 stable releases, it's recommended to use the `~major.minor.patch` style versions in your `Cargo.toml` which will only update the patch version automatically. For more information see the [Compatibility Policy](#compatibility-policy))
-
-Then add `extern crate clap;` to your crate root.
-
-Define a list of valid arguments for your program (see the [documentation](https://docs.rs/clap/) or [examples/](examples) directory of this repo)
-
-Then run `cargo build` or `cargo update && cargo build` for your project.
-
-### Optional Dependencies / Features
-
-#### Features enabled by default
-
-* **"suggestions"**: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
-* **"color"**: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term`)
-* **"wrap_help"**: Wraps the help at the actual terminal width when available, instead of 120 characters. (builds dependency `term_size`)
-
-To disable these, add this to your `Cargo.toml`:
-
-```toml
-[dependencies.clap]
-version = "2.19"
-default-features = false
-```
-
-You can also selectively enable only the features you'd like to include, by adding:
-
-```toml
-[dependencies.clap]
-version = "2.19"
-default-features = false
-
-# Cherry-pick the features you'd like to use
-features = [ "suggestions", "color" ]
-```
-
-#### Opt-in features
-
-* **"yaml"**: Enables building CLIs from YAML documents. (builds dependency `yaml-rust`)
-* **"unstable"**: Enables unstable `clap` features that may change from release to release
-
-### Dependencies Tree
-
-The following graphic depicts `clap`s dependency graph (generated using [cargo-graph](https://github.com/kbknapp/cargo-graph)).
-
- * **Dashed** Line: Optional dependency
- * **Red** Color: **NOT** included by default (must use cargo `features` to enable)
- * **Blue** Color: Dev dependency, only used while developing.
-
-![clap dependencies](clap_dep_graph.png)
-
-### More Information
-
-You can find complete documentation on the [docs.rs](https://docs.rs/clap/) for this project.
-
-You can also find usage examples in the [examples/](examples) directory of this repo.
-
-#### Video Tutorials
-
-There's also the video tutorial series [Argument Parsing with Rust v2](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-
-These videos slowly trickle out as I finish them and currently a work in progress.
-
-## How to Contribute
-
-Contributions are always welcome! And there is a multitude of ways in which you can help depending on what you like to do, or are good at. Anything from documentation, code cleanup, issue completion, new features, you name it, even filing issues is contributing and greatly appreciated!
-
-Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
-
-Please read [CONTRIBUTING.md](.github/CONTRIBUTING.md) before you start contributing.
-
-
-### Testing Code
-
-To test with all features both enabled and disabled, you can run these commands:
-
-```sh
-$ cargo test --no-default-features
-$ cargo test --features "yaml unstable"
-```
-
-Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the prebuilt recipes. *Not* using `just` is perfectly fine as well, it simply bundles commands automatically.
-
-For example, to test the code, as above simply run:
-
-```sh
-$ just run-tests
-```
-
-From here on, I will list the appropriate `cargo` command as well as the `just` command.
-
-Sometimes it's helpful to only run a subset of the tests, which can be done via:
-
-```sh
-$ cargo test --test <test_name>
-
-# Or
-
-$ just run-test <test_name>
-```
-
-### Linting Code
-
-During the CI process `clap` runs against many different lints using [`clippy`](https://github.com/Manishearth/rust-clippy). In order to check if these lints pass on your own computer prior to submitting a PR you'll need a nightly compiler.
-
-In order to check the code for lints run either:
-
-```sh
-$ rustup override add nightly
-$ cargo build --features lints
-$ rustup override remove
-
-# Or
-
-$ just lint
-```
-
-### Debugging Code
-
-Another helpful technique is to see the `clap` debug output while developing features. In order to see the debug output while running the full test suite or individual tests, run:
-
-```sh
-$ cargo test --features debug
-
-# Or for individual tests
-$ cargo test --test <test_name> --features debug
-
-# The corresponding just command for individual debugging tests is:
-$ just debug <test_name>
-```
-
-### Goals
-
-There are a few goals of `clap` that I'd like to maintain throughout contributions. If your proposed changes break, or go against any of these goals we'll discuss the changes further before merging (but will *not* be ignored, all contributes are welcome!). These are by no means hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by mistake or ignorance :P).
-
-* Remain backwards compatible when possible
-  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
-  - This does not apply for security concerns
-* Parse arguments quickly
-  - Parsing of arguments shouldn't slow down usage of the main program
-  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
-* Try to be cognizant of memory usage
-  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
-* `panic!` on *developer* error, exit gracefully on *end-user* error
-
-### Compatibility Policy
-
-Because `clap` takes SemVer and compatibility seriously, this is the official policy regarding breaking changes and minimum required versions of Rust.
-
-`clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version of `clap` will be bumped.
-
-In order to keep from being surprised of breaking changes, it is **highly** recommended to use the `~major.minor.patch` style in your `Cargo.toml` only if you wish to target a version of Rust that is *older* than current stable minus two releases:
-
-```toml
-[dependencies]
-clap = "~2.19.0"
-```
-
-This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore cannot break due to new features, or bumped minimum versions of Rust.
-
-#### Warning about '~' Dependencies
-
-Using `~` can cause issues in certain circumstances.
-
-From @alexcrichton:
-
-Right now Cargo's version resolution is pretty naive, it's just a brute-force search of the solution space, returning the first resolvable graph. This also means that it currently won't terminate until it proves there is not possible resolvable graph. This leads to situations where workspaces with multiple binaries, for example, have two different dependencies such as:
-
-```toml
-
-# In one Cargo.toml
-[dependencies]
-clap = "~2.19.0"
-
-# In another Cargo.toml
-[dependencies]
-clap = "2.22"
-
-```
-
-This is inherently an unresolvable crate graph in Cargo right now. Cargo requires there's only one major version of a crate, and being in the same workspace these two crates must share a version. This is impossible in this location, though, as these version constraints cannot be met.
-
-#### Minimum Version of Rust
-
-`clap` will officially support current stable Rust, minus two releases, but may work with prior releases as well. For example, current stable Rust at the time of this writing is 1.13.0, meaning `clap` is guaranteed to compile with 1.11.0 and beyond.
-At the 1.14.0 release, `clap` will be guaranteed to compile with 1.12.0 and beyond, etc.
-
-Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be clearly annotated in the `CHANGELOG.md`
-
-#### Breaking Changes
-
-`clap` takes a similar policy to Rust and will bump the major version number upon breaking changes with only the following exceptions:
-
- * The breaking change is to fix a security concern
- * The breaking change is to be fixing a bug (i.e. relying on a bug as a feature)
- * The breaking change is a feature isn't used in the wild, or all users of said feature have given approval *prior* to the change
-
-## License
-
-`clap` is licensed under the MIT license. Please read the [LICENSE-MIT](LICENSE-MIT) file in this repository for more information.
-
-## Recent Breaking Changes
-
-`clap` follows semantic versioning, so breaking changes should only happen upon major version bumps. The only exception to this rule is breaking changes that happen due to implementation that was deemed to be a bug, security concerns, or it can be reasonably proved to affect no code. For the full details, see [CHANGELOG.md](./CHANGELOG.md).
-
-As of 2.0.0 (From 1.x)
-
-* **Fewer lifetimes! Yay!**
- * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`
- * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`
- * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`
-* **Simply Renamed**
- * `App::arg_group` => `App::group`
- * `App::arg_groups` => `App::groups`
- * `ArgGroup::add` => `ArgGroup::arg`
- * `ArgGroup::add_all` => `ArgGroup::args`
- * `ClapError` => `Error`
-  * struct field `ClapError::error_type` => `Error::kind`
- * `ClapResult` => `Result`
- * `ClapErrorType` => `ErrorKind`
-* **Removed Deprecated Functions and Methods**
- * `App::subcommands_negate_reqs`
- * `App::subcommand_required`
- * `App::arg_required_else_help`
- * `App::global_version(bool)`
- * `App::versionless_subcommands`
- * `App::unified_help_messages`
- * `App::wait_on_error`
- * `App::subcommand_required_else_help`
- * `SubCommand::new`
- * `App::error_on_no_subcommand`
- * `Arg::new`
- * `Arg::mutually_excludes`
- * `Arg::mutually_excludes_all`
- * `Arg::mutually_overrides_with`
- * `simple_enum!`
-* **Renamed Error Variants**
- * `InvalidUnicode` => `InvalidUtf8`
- * `InvalidArgument` => `UnknownArgument`
-* **Usage Parser**
- * Value names can now be specified inline, i.e. `-o, --option <FILE> <FILE2> 'some option which takes two files'`
- * **There is now a priority of order to determine the name** - This is perhaps the biggest breaking change. See the documentation for full details. Prior to this change, the value name took precedence. **Ensure your args are using the proper names (i.e. typically the long or short and NOT the value name) throughout the code**
-* `ArgMatches::values_of` returns an `Values` now which implements `Iterator` (should not break any code)
-* `crate_version!` returns `&'static str` instead of `String`
-
-### Deprecations
-
-Old method names will be left around for several minor version bumps, or one major version bump.
-
-As of 2.19.0:
-
- * None!
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/clap-test.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-#[allow(unused_imports, dead_code)]
-mod test {
-    use std::str;
-    use std::io::{Cursor, Write};
-
-    use regex::Regex;
-
-    use clap::{App, Arg, SubCommand, ArgGroup};
-
-    fn compare<S, S2>(l: S, r: S2) -> bool
-        where S: AsRef<str>,
-              S2: AsRef<str>
-    {
-        let re = Regex::new("\x1b[^m]*m").unwrap();
-        // Strip out any mismatching \r character on windows that might sneak in on either side
-        let ls = l.as_ref().trim().replace("\r", "");
-        let rs = r.as_ref().trim().replace("\r", "");
-        let left = re.replace_all(&*ls, "");
-        let right = re.replace_all(&*rs, "");
-        let b = left == right;
-        if !b {
-            println!("");
-            println!("--> left");
-            println!("{}", left);
-            println!("--> right");
-            println!("{}", right);
-            println!("--")
-        }
-        b
-    }
-
-    pub fn compare_output(l: App, args: &str, right: &str, stderr: bool) -> bool {
-        let mut buf = Cursor::new(Vec::with_capacity(50));
-        let res = l.get_matches_from_safe(args.split(' ').collect::<Vec<_>>());
-        let err = res.unwrap_err();
-        err.write_to(&mut buf).unwrap();
-        let content = buf.into_inner();
-        let left = String::from_utf8(content).unwrap();
-        assert_eq!(stderr, err.use_stderr());
-        compare(left, right)
-    }
-
-    // Legacy tests from the pyhton script days
-
-    pub fn complex_app() -> App<'static, 'static> {
-        let args = "-o --option=[opt]... 'tests options'
-                    [positional] 'tests positionals'";
-        let opt3_vals = ["fast", "slow"];
-        let pos3_vals = ["vi", "emacs"];
-        App::new("clap-test")
-            .version("v1.4.8")
-            .about("tests clap library")
-            .author("Kevin K. <kbknapp@gmail.com>")
-            .args_from_usage(args)
-            .arg(Arg::from_usage("-f --flag... 'tests flags'")
-                .global(true))
-            .args(&[
-                Arg::from_usage("[flag2] -F 'tests flags with exclusions'").conflicts_with("flag").requires("long-option-2"),
-                Arg::from_usage("--long-option-2 [option2] 'tests long options with exclusions'").conflicts_with("option").requires("positional2"),
-                Arg::from_usage("[positional2] 'tests positionals with exclusions'"),
-                Arg::from_usage("-O --Option [option3] 'specific vals'").possible_values(&opt3_vals),
-                Arg::from_usage("[positional3]... 'tests specific values'").possible_values(&pos3_vals),
-                Arg::from_usage("--multvals [one] [two] 'Tests mutliple values, not mult occs'"),
-                Arg::from_usage("--multvalsmo... [one] [two] 'Tests mutliple values, and mult occs'"),
-                Arg::from_usage("--minvals2 [minvals]... 'Tests 2 min vals'").min_values(2),
-                Arg::from_usage("--maxvals3 [maxvals]... 'Tests 3 max vals'").max_values(3)
-            ])
-            .subcommand(SubCommand::with_name("subcmd")
-                                    .about("tests subcommands")
-                                    .version("0.1")
-                                    .author("Kevin K. <kbknapp@gmail.com>")
-                                    .arg_from_usage("-o --option [scoption]... 'tests options'")
-                                    .arg_from_usage("-s --subcmdarg [subcmdarg] 'tests other args'")
-                                    .arg_from_usage("[scpositional] 'tests positionals'"))
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/index.html
+++ /dev/null
@@ -1,1 +0,0 @@
-<meta http-equiv="refresh" content="0; url=http://kbknapp.github.io/clap-rs/docs/clap/index.html" />
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/justfile
+++ /dev/null
@@ -1,39 +0,0 @@
-@update-contributors:
-	echo 'Removing old CONTRIBUTORS.md'
-	mv CONTRIBUTORS.md CONTRIBUTORS.md.bak
-	echo 'Downloading a list of new contributors'
-	echo "the following is a list of contributors:" > CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	githubcontrib --owner kbknapp --repo clap-rs --sha master --cols 6 --format md --showlogin true --sortBy contributions --sortOrder desc >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)" >> CONTRIBUTORS.md
-	rm CONTRIBUTORS.md.bak
-
-run-test TEST:
-	cargo test --test {{TEST}}
-
-debug TEST:
-	cargo test --test {{TEST}} --features debug
-
-run-tests:
-	cargo test --features "yaml unstable"
-
-@bench: nightly
-	cargo bench && just remove-nightly
-
-nightly:
-	rustup override add nightly
-
-remove-nightly:
-	rustup override remove
-
-@lint: nightly
-	cargo build --features lints && just remove-nightly
-
-clean:
-	cargo clean
-	find . -type f -name "*.orig" -exec rm {} \;
-	find . -type f -name "*.bk" -exec rm {} \;
-	find . -type f -name ".*~" -exec rm {} \;
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/rustfmt.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-format_strings = false
-chain_overflow_last = false
-same_line_if_else = true
-fn_single_line = true
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/help.rs
+++ /dev/null
@@ -1,927 +0,0 @@
-// Std
-use std::cmp;
-use std::collections::BTreeMap;
-use std::fmt::Display;
-use std::io::{self, Cursor, Read, Write};
-use std::usize;
-
-// Internal
-use app::{App, AppSettings};
-use app::parser::Parser;
-use args::{AnyArg, ArgSettings, DispOrder};
-use errors::{Error, Result as ClapResult};
-use fmt::{Format, Colorizer, ColorizerOption};
-use app::usage;
-
-// Third Party
-use unicode_width::UnicodeWidthStr;
-#[cfg(feature = "wrap_help")]
-use term_size;
-use textwrap;
-use vec_map::VecMap;
-
-#[cfg(not(feature = "wrap_help"))]
-mod term_size {
-    pub fn dimensions() -> Option<(usize, usize)> { None }
-}
-
-fn str_width(s: &str) -> usize { UnicodeWidthStr::width(s) }
-
-const TAB: &'static str = "    ";
-
-// These are just convenient traits to make the code easier to read.
-trait ArgWithDisplay<'b, 'c>: AnyArg<'b, 'c> + Display {}
-impl<'b, 'c, T> ArgWithDisplay<'b, 'c> for T where T: AnyArg<'b, 'c> + Display {}
-
-trait ArgWithOrder<'b, 'c>: ArgWithDisplay<'b, 'c> + DispOrder {
-    fn as_base(&self) -> &ArgWithDisplay<'b, 'c>;
-}
-impl<'b, 'c, T> ArgWithOrder<'b, 'c> for T
-    where T: ArgWithDisplay<'b, 'c> + DispOrder
-{
-    fn as_base(&self) -> &ArgWithDisplay<'b, 'c> { self }
-}
-
-fn as_arg_trait<'a, 'b, T: ArgWithOrder<'a, 'b>>(x: &T) -> &ArgWithOrder<'a, 'b> { x }
-
-impl<'b, 'c> DispOrder for App<'b, 'c> {
-    fn disp_ord(&self) -> usize { 999 }
-}
-
-macro_rules! color {
-    ($_self:ident, $s:expr, $c:ident) => {
-        if $_self.color {
-            write!($_self.writer, "{}", $_self.cizer.$c($s))
-        } else {
-            write!($_self.writer, "{}", $s)
-        }
-    };
-    ($_self:ident, $fmt_s:expr, $v:expr, $c:ident) => {
-        if $_self.color {
-            write!($_self.writer, "{}", $_self.cizer.$c(format!($fmt_s, $v)))
-        } else {
-            write!($_self.writer, $fmt_s, $v)
-        }
-    };
-}
-
-/// `clap` Help Writer.
-///
-/// Wraps a writer stream providing different methods to generate help for `clap` objects.
-pub struct Help<'a> {
-    writer: &'a mut Write,
-    next_line_help: bool,
-    hide_pv: bool,
-    term_w: usize,
-    color: bool,
-    cizer: Colorizer,
-    longest: usize,
-    force_next_line: bool,
-    use_long: bool,
-}
-
-// Public Functions
-impl<'a> Help<'a> {
-    /// Create a new `Help` instance.
-    #[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
-    pub fn new(w: &'a mut Write,
-               next_line_help: bool,
-               hide_pv: bool,
-               color: bool,
-               cizer: Colorizer,
-               term_w: Option<usize>,
-               max_w: Option<usize>,
-               use_long: bool)
-               -> Self {
-        debugln!("Help::new;");
-        Help {
-            writer: w,
-            next_line_help: next_line_help,
-            hide_pv: hide_pv,
-            term_w: match term_w {
-                Some(width) => if width == 0 { usize::MAX } else { width },
-                None => {
-                    cmp::min(term_size::dimensions().map_or(120, |(w, _)| w),
-                             match max_w {
-                                 None | Some(0) => usize::MAX,
-                                 Some(mw) => mw,
-                             })
-                }
-            },
-            color: color,
-            cizer: cizer,
-            longest: 0,
-            force_next_line: false,
-            use_long: use_long,
-        }
-    }
-
-    /// Reads help settings from an App
-    /// and write its help to the wrapped stream.
-    pub fn write_app_help(w: &'a mut Write, app: &App, use_long: bool) -> ClapResult<()> {
-        debugln!("Help::write_app_help;");
-        Self::write_parser_help(w, &app.p, use_long)
-    }
-
-    /// Reads help settings from a Parser
-    /// and write its help to the wrapped stream.
-    pub fn write_parser_help(w: &'a mut Write, parser: &Parser, use_long: bool) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        Self::_write_parser_help(w, parser, false, use_long)
-    }
-
-    /// Reads help settings from a Parser
-    /// and write its help to the wrapped stream which will be stderr. This method prevents
-    /// formatting when required.
-    pub fn write_parser_help_to_stderr(w: &'a mut Write, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        Self::_write_parser_help(w, parser, true, false)
-    }
-
-    #[doc(hidden)]
-    pub fn _write_parser_help(w: &'a mut Write, parser: &Parser, stderr: bool, use_long: bool) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        let nlh = parser.is_set(AppSettings::NextLineHelp);
-        let hide_v = parser.is_set(AppSettings::HidePossibleValuesInHelp);
-        let color = parser.is_set(AppSettings::ColoredHelp);
-        let cizer = Colorizer::new(ColorizerOption {
-            use_stderr: stderr,
-            when: parser.color(),
-        });
-        Self::new(w,
-                  nlh,
-                  hide_v,
-                  color,
-                  cizer,
-                  parser.meta.term_w,
-                  parser.meta.max_w,
-                  use_long)
-                .write_help(parser)
-    }
-
-    /// Writes the parser help to the wrapped stream.
-    pub fn write_help(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_help;");
-        if let Some(h) = parser.meta.help_str {
-            try!(write!(self.writer, "{}", h).map_err(Error::from));
-        } else if let Some(tmpl) = parser.meta.template {
-            try!(self.write_templated_help(parser, tmpl));
-        } else {
-            try!(self.write_default_help(parser));
-        }
-        Ok(())
-    }
-}
-
-// Methods to write AnyArg help.
-impl<'a> Help<'a> {
-    /// Writes help for each argument in the order they were declared to the wrapped stream.
-    fn write_args_unsorted<'b: 'd, 'c: 'd, 'd, I: 'd>(&mut self, args: I) -> io::Result<()>
-        where I: Iterator<Item = &'d ArgWithOrder<'b, 'c>>
-    {
-        debugln!("Help::write_args_unsorted;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut arg_v = Vec::with_capacity(10);
-        for arg in args.filter(|arg| {
-                                   !(arg.is_set(ArgSettings::Hidden)) ||
-                                   arg.is_set(ArgSettings::NextLineHelp)
-                               }) {
-            if arg.longest_filter() {
-                self.longest = cmp::max(self.longest, str_width(arg.to_string().as_str()));
-            }
-            arg_v.push(arg)
-        }
-        let mut first = true;
-        for arg in arg_v {
-            if first {
-                first = false;
-            } else {
-                try!(self.writer.write_all(b"\n"));
-            }
-            try!(self.write_arg(arg.as_base()));
-        }
-        Ok(())
-    }
-
-    /// Sorts arguments by length and display order and write their help to the wrapped stream.
-    fn write_args<'b: 'd, 'c: 'd, 'd, I: 'd>(&mut self, args: I) -> io::Result<()>
-        where I: Iterator<Item = &'d ArgWithOrder<'b, 'c>>
-    {
-        debugln!("Help::write_args;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut ord_m = VecMap::new();
-        // Determine the longest
-        for arg in args.filter(|arg| {
-            // If it's NextLineHelp, but we don't care to compute how long because it may be
-            // NextLineHelp on purpose *because* it's so long and would throw off all other
-            // args alignment
-            !arg.is_set(ArgSettings::Hidden) || arg.is_set(ArgSettings::NextLineHelp)
-        }) {
-            if arg.longest_filter() {
-                debugln!("Help::write_args: Current Longest...{}", self.longest);
-                self.longest = cmp::max(self.longest, str_width(arg.to_string().as_str()));
-                debugln!("Help::write_args: New Longest...{}", self.longest);
-            }
-            let btm = ord_m.entry(arg.disp_ord()).or_insert(BTreeMap::new());
-            btm.insert(arg.name(), arg);
-        }
-        let mut first = true;
-        for btm in ord_m.values() {
-            for arg in btm.values() {
-                if first {
-                    first = false;
-                } else {
-                    try!(self.writer.write_all(b"\n"));
-                }
-                try!(self.write_arg(arg.as_base()));
-            }
-        }
-        Ok(())
-    }
-
-    /// Writes help for an argument to the wrapped stream.
-    fn write_arg<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::write_arg;");
-        try!(self.short(arg));
-        try!(self.long(arg));
-        let spec_vals = try!(self.val(arg));
-        try!(self.help(arg, &*spec_vals));
-        Ok(())
-    }
-
-    /// Writes argument's short command to the wrapped stream.
-    fn short<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::short;");
-        try!(write!(self.writer, "{}", TAB));
-        if let Some(s) = arg.short() {
-            color!(self, "-{}", s, good)
-        } else if arg.has_switch() {
-            write!(self.writer, "{}", TAB)
-        } else {
-            Ok(())
-        }
-    }
-
-    /// Writes argument's long command to the wrapped stream.
-    fn long<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::long;");
-        if !arg.has_switch() {
-            return Ok(());
-        }
-        if arg.takes_value() {
-            if let Some(l) = arg.long() {
-                if arg.short().is_some() {
-                    try!(write!(self.writer, ", "));
-                }
-                try!(color!(self, "--{}", l, good))
-            }
-
-            let sep = if arg.is_set(ArgSettings::RequireEquals) {
-                "="
-            } else {
-                " "
-            };
-            try!(write!(self.writer, "{}", sep));
-        } else if let Some(l) = arg.long() {
-            if arg.short().is_some() {
-                try!(write!(self.writer, ", "));
-            }
-            try!(color!(self, "--{}", l, good));
-        }
-        Ok(())
-    }
-
-    /// Writes argument's possible values to the wrapped stream.
-    fn val<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> Result<String, io::Error> {
-        debugln!("Help::val: arg={}", arg);
-        if arg.takes_value() {
-            if let Some(vec) = arg.val_names() {
-                let mut it = vec.iter().peekable();
-                while let Some((_, val)) = it.next() {
-                    try!(color!(self, "<{}>", val, good));
-                    if it.peek().is_some() {
-                        try!(write!(self.writer, " "));
-                    }
-                }
-                let num = vec.len();
-                if arg.is_set(ArgSettings::Multiple) && num == 1 {
-                    try!(color!(self, "...", good));
-                }
-            } else if let Some(num) = arg.num_vals() {
-                let mut it = (0..num).peekable();
-                while let Some(_) = it.next() {
-                    try!(color!(self, "<{}>", arg.name(), good));
-                    if it.peek().is_some() {
-                        try!(write!(self.writer, " "));
-                    }
-                }
-                if arg.is_set(ArgSettings::Multiple) && num == 1 {
-                    try!(color!(self, "...", good));
-                }
-            } else if arg.has_switch() {
-                try!(color!(self, "<{}>", arg.name(), good));
-                if arg.is_set(ArgSettings::Multiple) {
-                    try!(color!(self, "...", good));
-                }
-            } else {
-                try!(color!(self, "{}", arg, good));
-            }
-        }
-
-        let spec_vals = self.spec_vals(arg);
-        let h = arg.help().unwrap_or("");
-        let h_w = str_width(h) + str_width(&*spec_vals);
-        let nlh = self.next_line_help || arg.is_set(ArgSettings::NextLineHelp);
-        let taken = self.longest + 12;
-        self.force_next_line = !nlh && self.term_w >= taken &&
-                               (taken as f32 / self.term_w as f32) > 0.40 &&
-                               h_w > (self.term_w - taken);
-
-        debug!("Help::val: Has switch...");
-        if arg.has_switch() {
-            sdebugln!("Yes");
-            debugln!("Help::val: force_next_line...{:?}", self.force_next_line);
-            debugln!("Help::val: nlh...{:?}", nlh);
-            debugln!("Help::val: taken...{}", taken);
-            debugln!("Help::val: help_width > (width - taken)...{} > ({} - {})",
-                     h_w,
-                     self.term_w,
-                     taken);
-            debugln!("Help::val: longest...{}", self.longest);
-            debug!("Help::val: next_line...");
-            if !(nlh || self.force_next_line) {
-                sdebugln!("No");
-                let self_len = str_width(arg.to_string().as_str());
-                // subtract ourself
-                let mut spcs = self.longest - self_len;
-                // Since we're writing spaces from the tab point we first need to know if we
-                // had a long and short, or just short
-                if arg.long().is_some() {
-                    // Only account 4 after the val
-                    spcs += 4;
-                } else {
-                    // Only account for ', --' + 4 after the val
-                    spcs += 8;
-                }
-
-                write_nspaces!(self.writer, spcs);
-            } else {
-                sdebugln!("Yes");
-            }
-        } else if !(nlh || self.force_next_line) {
-            sdebugln!("No, and not next_line");
-            write_nspaces!(self.writer, self.longest + 4 - (str_width(arg.to_string().as_str())));
-        } else {
-            sdebugln!("No");
-        }
-        Ok(spec_vals)
-    }
-
-    fn write_before_after_help(&mut self, h: &str) -> io::Result<()> {
-        debugln!("Help::write_before_after_help;");
-        let mut help = String::from(h);
-        // determine if our help fits or needs to wrap
-        debugln!("Help::write_before_after_help: Term width...{}",
-                 self.term_w);
-        let too_long = str_width(h) >= self.term_w;
-
-        debug!("Help::write_before_after_help: Too long...");
-        if too_long || h.contains("{n}") {
-            sdebugln!("Yes");
-            debugln!("Help::write_before_after_help: help: {}", help);
-            debugln!("Help::write_before_after_help: help width: {}",
-                     str_width(&*help));
-            // Determine how many newlines we need to insert
-            debugln!("Help::write_before_after_help: Usable space: {}",
-                     self.term_w);
-            help = wrap_help(&help.replace("{n}", "\n"), self.term_w);
-        } else {
-            sdebugln!("No");
-        }
-        try!(write!(self.writer, "{}", help));
-        Ok(())
-    }
-
-    /// Writes argument's help to the wrapped stream.
-    fn help<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>, spec_vals: &str) -> io::Result<()> {
-        debugln!("Help::help;");
-        let h = if self.use_long {
-            arg.long_help().unwrap_or_else(|| arg.help().unwrap_or(""))
-        } else {
-            arg.help().unwrap_or_else(|| arg.long_help().unwrap_or(""))
-        };
-        let mut help = String::from(h) + spec_vals;
-        let nlh = self.next_line_help || arg.is_set(ArgSettings::NextLineHelp) || self.use_long;
-        debugln!("Help::help: Next Line...{:?}", nlh);
-
-        let spcs = if nlh || self.force_next_line {
-            12 // "tab" * 3
-        } else {
-            self.longest + 12
-        };
-
-        let too_long = spcs + str_width(h) + str_width(&*spec_vals) >= self.term_w;
-
-        // Is help on next line, if so then indent
-        if nlh || self.force_next_line {
-            try!(write!(self.writer, "\n{}{}{}", TAB, TAB, TAB));
-        }
-
-        debug!("Help::help: Too long...");
-        if too_long && spcs <= self.term_w || h.contains("{n}") {
-            sdebugln!("Yes");
-            debugln!("Help::help: help...{}", help);
-            debugln!("Help::help: help width...{}", str_width(&*help));
-            // Determine how many newlines we need to insert
-            let avail_chars = self.term_w - spcs;
-            debugln!("Help::help: Usable space...{}", avail_chars);
-            help = wrap_help(&help.replace("{n}", "\n"), avail_chars);
-        } else {
-            sdebugln!("No");
-        }
-        if let Some(part) = help.lines().next() {
-            try!(write!(self.writer, "{}", part));
-        }
-        for part in help.lines().skip(1) {
-            try!(write!(self.writer, "\n"));
-            if nlh || self.force_next_line {
-                try!(write!(self.writer, "{}{}{}", TAB, TAB, TAB));
-            } else if arg.has_switch() {
-                write_nspaces!(self.writer, self.longest + 12);
-            } else {
-                write_nspaces!(self.writer, self.longest + 8);
-            }
-            try!(write!(self.writer, "{}", part));
-        }
-        if !help.contains('\n') && (nlh || self.force_next_line) {
-            try!(write!(self.writer, "\n"));
-        }
-        Ok(())
-    }
-
-    fn spec_vals(&self, a: &ArgWithDisplay) -> String {
-        debugln!("Help::spec_vals: a={}", a);
-        let mut spec_vals = vec![];
-        if !a.is_set(ArgSettings::HideDefaultValue) {
-            if let Some(pv) = a.default_val() {
-                debugln!("Help::spec_vals: Found default value...[{:?}]", pv);
-                spec_vals.push(format!(" [default: {}]",
-                                       if self.color {
-                                           self.cizer.good(pv.to_string_lossy())
-                                       } else {
-                                           Format::None(pv.to_string_lossy())
-                                       }));
-            }
-        }
-        if let Some(ref aliases) = a.aliases() {
-            debugln!("Help::spec_vals: Found aliases...{:?}", aliases);
-            spec_vals.push(format!(" [aliases: {}]",
-                                   if self.color {
-                                       aliases
-                                           .iter()
-                                           .map(|v| format!("{}", self.cizer.good(v)))
-                                           .collect::<Vec<_>>()
-                                           .join(", ")
-                                   } else {
-                                       aliases.join(", ")
-                                   }));
-        }
-        if !self.hide_pv && !a.is_set(ArgSettings::HidePossibleValues) {
-            if let Some(pv) = a.possible_vals() {
-                debugln!("Help::spec_vals: Found possible vals...{:?}", pv);
-                spec_vals.push(if self.color {
-                                   format!(" [values: {}]",
-                                           pv.iter()
-                                               .map(|v| format!("{}", self.cizer.good(v)))
-                                               .collect::<Vec<_>>()
-                                               .join(", "))
-                               } else {
-                                   format!(" [values: {}]", pv.join(", "))
-                               });
-            }
-        }
-        spec_vals.join(" ")
-    }
-}
-
-
-// Methods to write Parser help.
-impl<'a> Help<'a> {
-    /// Writes help for all arguments (options, flags, args, subcommands)
-    /// including titles of a Parser Object to the wrapped stream.
-    #[cfg_attr(feature = "lints", allow(useless_let_if_seq))]
-    #[cfg_attr(feature = "cargo-clippy", allow(useless_let_if_seq))]
-    pub fn write_all_args(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_all_args;");
-        let flags = parser.has_flags();
-        let pos = parser
-            .positionals()
-            .filter(|arg| !arg.is_set(ArgSettings::Hidden))
-            .count() > 0;
-        let opts = parser.has_opts();
-        let subcmds = parser.has_subcommands();
-
-        let unified_help = parser.is_set(AppSettings::UnifiedHelpMessage);
-
-        let mut first = true;
-
-        if unified_help && (flags || opts) {
-            let opts_flags = parser
-                .flags()
-                .map(as_arg_trait)
-                .chain(parser.opts().map(as_arg_trait));
-            try!(color!(self, "OPTIONS:\n", warning));
-            try!(self.write_args(opts_flags));
-            first = false;
-        } else {
-            if flags {
-                try!(color!(self, "FLAGS:\n", warning));
-                try!(self.write_args(parser.flags().map(as_arg_trait)));
-                first = false;
-            }
-            if opts {
-                if !first {
-                    try!(self.writer.write_all(b"\n\n"));
-                }
-                try!(color!(self, "OPTIONS:\n", warning));
-                try!(self.write_args(parser.opts().map(as_arg_trait)));
-                first = false;
-            }
-        }
-
-        if pos {
-            if !first {
-                try!(self.writer.write_all(b"\n\n"));
-            }
-            try!(color!(self, "ARGS:\n", warning));
-            try!(self.write_args_unsorted(parser.positionals().map(as_arg_trait)));
-            first = false;
-        }
-
-        if subcmds {
-            if !first {
-                try!(self.writer.write_all(b"\n\n"));
-            }
-            try!(color!(self, "SUBCOMMANDS:\n", warning));
-            try!(self.write_subcommands(parser));
-        }
-
-        Ok(())
-    }
-
-    /// Writes help for subcommands of a Parser Object to the wrapped stream.
-    fn write_subcommands(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_subcommands;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut ord_m = VecMap::new();
-        for sc in parser
-                .subcommands
-                .iter()
-                .filter(|s| !s.p.is_set(AppSettings::Hidden)) {
-            let btm = ord_m
-                .entry(sc.p.meta.disp_ord)
-                .or_insert(BTreeMap::new());
-            self.longest = cmp::max(self.longest, str_width(sc.p.meta.name.as_str()));
-            //self.longest = cmp::max(self.longest, sc.p.meta.name.len());
-            btm.insert(sc.p.meta.name.clone(), sc.clone());
-        }
-
-        let mut first = true;
-        for btm in ord_m.values() {
-            for sc in btm.values() {
-                if first {
-                    first = false;
-                } else {
-                    try!(self.writer.write_all(b"\n"));
-                }
-                try!(self.write_arg(sc));
-            }
-        }
-        Ok(())
-    }
-
-    /// Writes version of a Parser Object to the wrapped stream.
-    fn write_version(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_version;");
-        try!(write!(self.writer, "{}", parser.meta.version.unwrap_or("")));
-        Ok(())
-    }
-
-    /// Writes binary name of a Parser Object to the wrapped stream.
-    fn write_bin_name(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_bin_name;");
-        macro_rules! write_name {
-            () => {{
-                let mut name = parser.meta.name.clone();
-                name = name.replace("{n}", "\n");
-                try!(color!(self, wrap_help(&name, self.term_w), good));
-            }};
-        }
-        if let Some(bn) = parser.meta.bin_name.as_ref() {
-            if bn.contains(' ') {
-                // Incase we're dealing with subcommands i.e. git mv is translated to git-mv
-                try!(color!(self, bn.replace(" ", "-"), good))
-            } else {
-                write_name!();
-            }
-        } else {
-            write_name!();
-        }
-        Ok(())
-    }
-
-    /// Writes default help for a Parser Object to the wrapped stream.
-    pub fn write_default_help(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_default_help;");
-        if let Some(h) = parser.meta.pre_help {
-            try!(self.write_before_after_help(h));
-            try!(self.writer.write_all(b"\n\n"));
-        }
-
-        macro_rules! write_thing {
-            ($thing:expr) => {{
-                let mut owned_thing = $thing.to_owned();
-                owned_thing = owned_thing.replace("{n}", "\n");
-                try!(write!(self.writer, "{}\n",
-                            wrap_help(&owned_thing, self.term_w)))
-            }};
-        }
-        // Print the version
-        try!(self.write_bin_name(parser));
-        try!(self.writer.write_all(b" "));
-        try!(self.write_version(parser));
-        try!(self.writer.write_all(b"\n"));
-        if let Some(author) = parser.meta.author {
-            write_thing!(author)
-        }
-        if let Some(about) = parser.meta.about {
-            write_thing!(about)
-        }
-
-        try!(color!(self, "\nUSAGE:", warning));
-        try!(write!(self.writer,
-                    "\n{}{}\n\n",
-                    TAB,
-                    usage::create_usage_no_title(parser, &[])));
-
-        let flags = parser.has_flags();
-        let pos = parser.has_positionals();
-        let opts = parser.has_opts();
-        let subcmds = parser.has_subcommands();
-
-        if flags || opts || pos || subcmds {
-            try!(self.write_all_args(parser));
-        }
-
-        if let Some(h) = parser.meta.more_help {
-            if flags || opts || pos || subcmds {
-                try!(self.writer.write_all(b"\n\n"));
-            }
-            try!(self.write_before_after_help(h));
-        }
-
-        self.writer.flush().map_err(Error::from)
-    }
-}
-
-/// Possible results for a copying function that stops when a given
-/// byte was found.
-enum CopyUntilResult {
-    DelimiterFound(usize),
-    DelimiterNotFound(usize),
-    ReaderEmpty,
-    ReadError(io::Error),
-    WriteError(io::Error),
-}
-
-/// Copies the contents of a reader into a writer until a delimiter byte is found.
-/// On success, the total number of bytes that were
-/// copied from reader to writer is returned.
-fn copy_until<R: Read, W: Write>(r: &mut R, w: &mut W, delimiter_byte: u8) -> CopyUntilResult {
-    debugln!("copy_until;");
-
-    let mut count = 0;
-    for wb in r.bytes() {
-        match wb {
-            Ok(b) => {
-                if b == delimiter_byte {
-                    return CopyUntilResult::DelimiterFound(count);
-                }
-                match w.write(&[b]) {
-                    Ok(c) => count += c,
-                    Err(e) => return CopyUntilResult::WriteError(e),
-                }
-            }
-            Err(e) => return CopyUntilResult::ReadError(e),
-        }
-    }
-    if count > 0 {
-        CopyUntilResult::DelimiterNotFound(count)
-    } else {
-        CopyUntilResult::ReaderEmpty
-    }
-}
-
-/// Copies the contents of a reader into a writer until a {tag} is found,
-/// copying the tag content to a buffer and returning its size.
-/// In addition to errors, there are three possible outputs:
-///   - `None`: The reader was consumed.
-///   - `Some(Ok(0))`: No tag was captured but the reader still contains data.
-///   - `Some(Ok(length>0))`: a tag with `length` was captured to the `tag_buffer`.
-fn copy_and_capture<R: Read, W: Write>(r: &mut R,
-                                       w: &mut W,
-                                       tag_buffer: &mut Cursor<Vec<u8>>)
-                                       -> Option<io::Result<usize>> {
-    use self::CopyUntilResult::*;
-    debugln!("copy_and_capture;");
-
-    // Find the opening byte.
-    match copy_until(r, w, b'{') {
-
-        // The end of the reader was reached without finding the opening tag.
-        // (either with or without having copied data to the writer)
-        // Return None indicating that we are done.
-        ReaderEmpty |
-        DelimiterNotFound(_) => None,
-
-        // Something went wrong.
-        ReadError(e) | WriteError(e) => Some(Err(e)),
-
-        // The opening byte was found.
-        // (either with or without having copied data to the writer)
-        DelimiterFound(_) => {
-
-            // Lets reset the buffer first and find out how long it is.
-            tag_buffer.set_position(0);
-            let buffer_size = tag_buffer.get_ref().len();
-
-            // Find the closing byte,limiting the reader to the length of the buffer.
-            let mut rb = r.take(buffer_size as u64);
-            match copy_until(&mut rb, tag_buffer, b'}') {
-
-                // We were already at the end of the reader.
-                // Return None indicating that we are done.
-                ReaderEmpty => None,
-
-                // The closing tag was found.
-                // Return the tag_length.
-                DelimiterFound(tag_length) => Some(Ok(tag_length)),
-
-                // The end of the reader was found without finding the closing tag.
-                // Write the opening byte and captured text to the writer.
-                // Return 0 indicating that nothing was caputred but the reader still contains data.
-                DelimiterNotFound(not_tag_length) => {
-                    match w.write(b"{") {
-                        Err(e) => Some(Err(e)),
-                        _ => {
-                            match w.write(&tag_buffer.get_ref()[0..not_tag_length]) {
-                                Err(e) => Some(Err(e)),
-                                _ => Some(Ok(0)),
-                            }
-                        }
-                    }
-                }
-
-                ReadError(e) | WriteError(e) => Some(Err(e)),
-            }
-        }
-    }
-}
-
-
-// Methods to write Parser help using templates.
-impl<'a> Help<'a> {
-    /// Write help to stream for the parser in the format defined by the template.
-    ///
-    /// Tags arg given inside curly brackets:
-    /// Valid tags are:
-    ///     * `{bin}`         - Binary name.
-    ///     * `{version}`     - Version number.
-    ///     * `{author}`      - Author information.
-    ///     * `{usage}`       - Automatically generated or given usage string.
-    ///     * `{all-args}`    - Help for all arguments (options, flags, positionals arguments,
-    ///                         and subcommands) including titles.
-    ///     * `{unified}`     - Unified help for options and flags.
-    ///     * `{flags}`       - Help for flags.
-    ///     * `{options}`     - Help for options.
-    ///     * `{positionals}` - Help for positionals arguments.
-    ///     * `{subcommands}` - Help for subcommands.
-    ///     * `{after-help}`  - Info to be displayed after the help message.
-    ///     * `{before-help}` - Info to be displayed before the help message.
-    ///
-    /// The template system is, on purpose, very simple. Therefore the tags have to writen
-    /// in the lowercase and without spacing.
-    fn write_templated_help(&mut self, parser: &Parser, template: &str) -> ClapResult<()> {
-        debugln!("Help::write_templated_help;");
-        let mut tmplr = Cursor::new(&template);
-        let mut tag_buf = Cursor::new(vec![0u8; 15]);
-
-        // The strategy is to copy the template from the the reader to wrapped stream
-        // until a tag is found. Depending on its value, the appropriate content is copied
-        // to the wrapped stream.
-        // The copy from template is then resumed, repeating this sequence until reading
-        // the complete template.
-
-        loop {
-            let tag_length = match copy_and_capture(&mut tmplr, &mut self.writer, &mut tag_buf) {
-                None => return Ok(()),
-                Some(Err(e)) => return Err(Error::from(e)),
-                Some(Ok(val)) if val > 0 => val,
-                _ => continue,
-            };
-
-            debugln!("Help::write_template_help:iter: tag_buf={};", unsafe {
-                String::from_utf8_unchecked(tag_buf.get_ref()[0..tag_length]
-                                                .iter()
-                                                .map(|&i| i)
-                                                .collect::<Vec<_>>())
-            });
-            match &tag_buf.get_ref()[0..tag_length] {
-                b"?" => {
-                    try!(self.writer.write_all(b"Could not decode tag name"));
-                }
-                b"bin" => {
-                    try!(self.write_bin_name(parser));
-                }
-                b"version" => {
-                    try!(write!(self.writer,
-                                "{}",
-                                parser.meta.version.unwrap_or("unknown version")));
-                }
-                b"author" => {
-                    try!(write!(self.writer,
-                                "{}",
-                                parser.meta.author.unwrap_or("unknown author")));
-                }
-                b"about" => {
-                    try!(write!(self.writer,
-                                "{}",
-                                parser.meta.about.unwrap_or("unknown about")));
-                }
-                b"usage" => {
-                    try!(write!(self.writer, "{}", usage::create_usage_no_title(parser, &[])));
-                }
-                b"all-args" => {
-                    try!(self.write_all_args(parser));
-                }
-                b"unified" => {
-                    let opts_flags = parser
-                        .flags()
-                        .map(as_arg_trait)
-                        .chain(parser.opts().map(as_arg_trait));
-                    try!(self.write_args(opts_flags));
-                }
-                b"flags" => {
-                    try!(self.write_args(parser.flags().map(as_arg_trait)));
-                }
-                b"options" => {
-                    try!(self.write_args(parser.opts().map(as_arg_trait)));
-                }
-                b"positionals" => {
-                    try!(self.write_args(parser.positionals().map(as_arg_trait)));
-                }
-                b"subcommands" => {
-                    try!(self.write_subcommands(parser));
-                }
-                b"after-help" => {
-                    try!(write!(self.writer,
-                                "{}",
-                                parser.meta.more_help.unwrap_or("unknown after-help")));
-                }
-                b"before-help" => {
-                    try!(write!(self.writer,
-                                "{}",
-                                parser.meta.pre_help.unwrap_or("unknown before-help")));
-                }
-                // Unknown tag, write it back.
-                r => {
-                    try!(self.writer.write_all(b"{"));
-                    try!(self.writer.write_all(r));
-                    try!(self.writer.write_all(b"}"));
-                }
-            }
-        }
-    }
-}
-
-fn wrap_help(help: &str, avail_chars: usize) -> String {
-    let wrapper = textwrap::Wrapper::new(avail_chars).break_words(false);
-    help.lines()
-        .map(|line| wrapper.fill(line))
-        .collect::<Vec<String>>()
-        .join("\n")
-}
-
-#[cfg(test)]
-mod test {
-    use super::wrap_help;
-
-    #[test]
-    fn wrap_help_last_word() {
-        let help = String::from("foo bar baz");
-        assert_eq!(wrap_help(&help, 5), "foo\nbar\nbaz");
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/macros.rs
+++ /dev/null
@@ -1,165 +0,0 @@
-macro_rules! remove_overriden {
-    (@remove_requires $rem_from:expr, $a:ident.$ov:ident) => {
-        if let Some(ora) = $a.$ov() {
-            for i in (0 .. $rem_from.len()).rev() {
-                let should_remove = ora.iter().any(|&(_, ref name)| name == &$rem_from[i]);
-                if should_remove { $rem_from.swap_remove(i); }
-            }
-        }
-    };
-    (@remove $rem_from:expr, $a:ident.$ov:ident) => {
-        if let Some(ora) = $a.$ov() {
-            vec_remove_all!($rem_from, ora.iter());
-        }
-    };
-    (@arg $_self:ident, $arg:ident) => {
-        remove_overriden!(@remove_requires $_self.required, $arg.requires);
-        remove_overriden!(@remove $_self.blacklist, $arg.blacklist);
-        remove_overriden!(@remove $_self.overrides, $arg.overrides);
-    };
-    ($_self:ident, $name:expr) => {
-        debugln!("remove_overriden!;");
-        if let Some(o) = $_self.opts.iter() .find(|o| o.b.name == *$name) {
-            remove_overriden!(@arg $_self, o);
-        } else if let Some(f) = $_self.flags.iter() .find(|f| f.b.name == *$name) {
-            remove_overriden!(@arg $_self, f);
-        } else {
-            let p = $_self.positionals.values()
-                                      .find(|p| p.b.name == *$name)
-                                      .expect(INTERNAL_ERROR_MSG);
-            remove_overriden!(@arg $_self, p);
-        }
-    };
-}
-
-macro_rules! arg_post_processing {
-    ($me:ident, $arg:ident, $matcher:ident) => {
-        debugln!("arg_post_processing!;");
-        // Handle POSIX overrides
-        debug!("arg_post_processing!: Is '{}' in overrides...", $arg.to_string());
-        if $me.overrides.contains(&$arg.name()) {
-            if let Some(ref name) = find_name_from!($me, &$arg.name(), overrides, $matcher) {
-                sdebugln!("Yes by {}", name);
-                $matcher.remove(name);
-                remove_overriden!($me, name);
-            }
-        } else { sdebugln!("No"); }
-
-        // Add overrides
-        debug!("arg_post_processing!: Does '{}' have overrides...", $arg.to_string());
-        if let Some(or) = $arg.overrides() {
-            sdebugln!("Yes");
-            $matcher.remove_all(or);
-            for pa in or { remove_overriden!($me, pa); }
-            $me.overrides.extend(or);
-            vec_remove_all!($me.required, or.iter());
-        } else { sdebugln!("No"); }
-
-        // Handle conflicts
-        debug!("arg_post_processing!: Does '{}' have conflicts...", $arg.to_string());
-        if let Some(bl) = $arg.blacklist() {
-            sdebugln!("Yes");
-
-            for c in bl {
-                // Inject two-way conflicts
-                debug!("arg_post_processing!: Has '{}' already been matched...", c);
-                if $matcher.contains(c) {
-                    sdebugln!("Yes");
-                    // find who blacklisted us...
-                    $me.blacklist.push(&$arg.b.name);
-                } else {
-                    sdebugln!("No");
-                }
-            }
-
-            $me.blacklist.extend_from_slice(bl);
-            vec_remove_all!($me.overrides, bl.iter());
-            // vec_remove_all!($me.required, bl.iter());
-        } else { sdebugln!("No"); }
-
-        // Add all required args which aren't already found in matcher to the master
-        // list
-        debug!("arg_post_processing!: Does '{}' have requirements...", $arg.to_string());
-        if let Some(reqs) = $arg.requires() {
-            for n in reqs.iter()
-                .filter(|&&(val, _)| val.is_none())
-                .filter(|&&(_, req)| !$matcher.contains(&req))
-                .map(|&(_, name)| name) {
-                    
-                $me.required.push(n);
-            }
-        } else { sdebugln!("No"); }
-
-        _handle_group_reqs!($me, $arg);
-    };
-}
-
-macro_rules! _handle_group_reqs{
-    ($me:ident, $arg:ident) => ({
-        use args::AnyArg;
-        debugln!("_handle_group_reqs!;");
-        for grp in &$me.groups {
-            let found = if grp.args.contains(&$arg.name()) {
-                if let Some(ref reqs) = grp.requires {
-                    debugln!("_handle_group_reqs!: Adding {:?} to the required list", reqs);
-                    $me.required.extend(reqs);
-                }
-                if let Some(ref bl) = grp.conflicts {
-                    $me.blacklist.extend(bl);
-                }
-                true // What if arg is in more than one group with different reqs?
-            } else {
-                false
-            };
-            debugln!("_handle_group_reqs!:iter: grp={}, found={:?}", grp.name, found);
-            if found {
-                for i in (0 .. $me.required.len()).rev() {
-                    let should_remove = grp.args.contains(&$me.required[i]);
-                    if should_remove { $me.required.swap_remove(i); }
-                }
-                debugln!("_handle_group_reqs!:iter: Adding args from group to blacklist...{:?}", grp.args);
-                if !grp.multiple {
-                    $me.blacklist.extend(&grp.args);
-                    debugln!("_handle_group_reqs!: removing {:?} from blacklist", $arg.name());
-                    for i in (0 .. $me.blacklist.len()).rev() {
-                        let should_remove = $me.blacklist[i] == $arg.name();
-                        if should_remove { $me.blacklist.swap_remove(i); }
-                    }
-                }
-            }
-        }
-    })
-}
-
-macro_rules! parse_positional {
-    (
-        $_self:ident,
-        $p:ident,
-        $arg_os:ident,
-        $pos_counter:ident,
-        $matcher:ident
-    ) => {
-        debugln!("parse_positional!;");
-
-        if !$_self.is_set(AS::TrailingValues) &&
-           ($_self.is_set(AS::TrailingVarArg) &&
-            $pos_counter == $_self.positionals.len()) {
-            $_self.settings.set(AS::TrailingValues);
-        }
-        let _ = try!($_self.add_val_to_arg($p, &$arg_os, $matcher));
-
-        $matcher.inc_occurrence_of($p.b.name);
-        let _ = $_self.groups_for_arg($p.b.name)
-                      .and_then(|vec| Some($matcher.inc_occurrences_of(&*vec)));
-        if $_self.cache.map_or(true, |name| name != $p.b.name) {
-            arg_post_processing!($_self, $p, $matcher);
-            $_self.cache = Some($p.b.name);
-        }
-
-        $_self.settings.set(AS::ValidArgFound);
-        // Only increment the positional counter if it doesn't allow multiples
-        if !$p.b.settings.is_set(ArgSettings::Multiple) {
-            $pos_counter += 1;
-        }
-    };
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/meta.rs
+++ /dev/null
@@ -1,27 +0,0 @@
-#[doc(hidden)]
-#[allow(missing_debug_implementations)]
-#[derive(Default, Clone)]
-pub struct AppMeta<'b> {
-    pub name: String,
-    pub bin_name: Option<String>,
-    pub author: Option<&'b str>,
-    pub version: Option<&'b str>,
-    pub long_version: Option<&'b str>,
-    pub about: Option<&'b str>,
-    pub long_about: Option<&'b str>,
-    pub more_help: Option<&'b str>,
-    pub pre_help: Option<&'b str>,
-    pub aliases: Option<Vec<(&'b str, bool)>>, // (name, visible)
-    pub usage_str: Option<&'b str>,
-    pub usage: Option<String>,
-    pub help_str: Option<&'b str>,
-    pub disp_ord: usize,
-    pub term_w: Option<usize>,
-    pub max_w: Option<usize>,
-    pub template: Option<&'b str>,
-}
-
-impl<'b> AppMeta<'b> {
-    pub fn new() -> Self { Default::default() }
-    pub fn with_name(s: String) -> Self { AppMeta { name: s, disp_ord: 999, ..Default::default() } }
-}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/mod.rs
+++ /dev/null
@@ -1,1817 +0,0 @@
-mod settings;
-#[macro_use]
-mod macros;
-pub mod parser;
-mod meta;
-mod help;
-mod validator;
-mod usage;
-
-// Std
-use std::env;
-use std::ffi::{OsStr, OsString};
-use std::fmt;
-use std::io::{self, BufRead, BufWriter, Write};
-use std::path::Path;
-use std::process;
-use std::rc::Rc;
-use std::result::Result as StdResult;
-
-// Third Party
-use vec_map::{self, VecMap};
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-// Internal
-use app::help::Help;
-use app::parser::Parser;
-use args::{AnyArg, Arg, ArgGroup, ArgMatcher, ArgMatches, ArgSettings};
-use errors::Result as ClapResult;
-pub use self::settings::AppSettings;
-use completions::Shell;
-
-/// Used to create a representation of a command line program and all possible command line
-/// arguments. Application settings are set using the "builder pattern" with the
-/// [`App::get_matches`] family of methods being the terminal methods that starts the
-/// runtime-parsing process. These methods then return information about the user supplied
-/// arguments (or lack there of).
-///
-/// **NOTE:** There aren't any mandatory "options" that one must set. The "options" may
-/// also appear in any order (so long as one of the [`App::get_matches`] methods is the last method
-/// called).
-///
-/// # Examples
-///
-/// ```no_run
-/// # use clap::{App, Arg};
-/// let m = App::new("My Program")
-///     .author("Me, me@mail.com")
-///     .version("1.0.2")
-///     .about("Explains in brief what the program does")
-///     .arg(
-///         Arg::with_name("in_file").index(1)
-///     )
-///     .after_help("Longer explanation to appear after the options when \
-///                  displaying the help information from --help or -h")
-///     .get_matches();
-///
-/// // Your program logic starts here...
-/// ```
-/// [`App::get_matches`]: ./struct.App.html#method.get_matches
-#[allow(missing_debug_implementations)]
-pub struct App<'a, 'b>
-    where 'a: 'b
-{
-    #[doc(hidden)]
-    pub p: Parser<'a, 'b>,
-}
-
-
-impl<'a, 'b> App<'a, 'b> {
-    /// Creates a new instance of an application requiring a name. The name may be, but doesn't
-    /// have to be same as the binary. The name will be displayed to the user when they request to
-    /// print version or help and usage information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let prog = App::new("My Program")
-    /// # ;
-    /// ```
-    pub fn new<S: Into<String>>(n: S) -> Self { App { p: Parser::with_name(n.into()) } }
-
-    /// Get the name of the app
-    pub fn get_name(&self) -> &str { &self.p.meta.name }
-
-    /// Get the name of the binary
-    pub fn get_bin_name(&self) -> Option<&str> { self.p.meta.bin_name.as_ref().map(|s| s.as_str()) }
-
-    /// Creates a new instance of an application requiring a name, but uses the [`crate_authors!`]
-    /// and [`crate_version!`] macros to fill in the [`App::author`] and [`App::version`] fields.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let prog = App::with_defaults("My Program")
-    /// # ;
-    /// ```
-    /// [`crate_authors!`]: ./macro.crate_authors!.html
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`App::author`]: ./struct.App.html#method.author
-    /// [`App::version`]: ./struct.App.html#method.author
-    #[deprecated(since="2.14.1", note="Can never work; use explicit App::author() and App::version() calls instead")]
-    pub fn with_defaults<S: Into<String>>(n: S) -> Self {
-        let mut a = App { p: Parser::with_name(n.into()) };
-        a.p.meta.author = Some("Kevin K. <kbknapp@gmail.com>");
-        a.p.meta.version = Some("2.19.2");
-        a
-    }
-
-    /// Creates a new instance of [`App`] from a .yml (YAML) file. A full example of supported YAML
-    /// objects can be found in [`examples/17_yaml.rs`] and [`examples/17_yaml.yml`]. One great use
-    /// for using YAML is when supporting multiple languages and dialects, as each language could
-    /// be a distinct YAML file and determined at compiletime via `cargo` "features" in your
-    /// `Cargo.toml`
-    ///
-    /// In order to use this function you must compile `clap` with the `features = ["yaml"]` in
-    /// your settings for the `[dependencies.clap]` table of your `Cargo.toml`
-    ///
-    /// **NOTE:** Due to how the YAML objects are built there is a convenience macro for loading
-    /// the YAML file at compile time (relative to the current file, like modules work). That YAML
-    /// object can then be passed to this function.
-    ///
-    /// # Panics
-    ///
-    /// The YAML file must be properly formatted or this function will [`panic!`]. A good way to
-    /// ensure this doesn't happen is to run your program with the `--help` switch. If this passes
-    /// without error, you needn't worry because the YAML is properly formatted.
-    ///
-    /// # Examples
-    ///
-    /// The following example shows how to load a properly formatted YAML file to build an instance
-    /// of an [`App`] struct.
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::App;
-    /// # fn main() {
-    /// let yml = load_yaml!("app.yml");
-    /// let app = App::from_yaml(yml);
-    ///
-    /// // continued logic goes here, such as `app.get_matches()` etc.
-    /// # }
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`examples/17_yaml.rs`]: https://github.com/kbknapp/clap-rs/blob/master/examples/17_yaml.rs
-    /// [`examples/17_yaml.yml`]: https://github.com/kbknapp/clap-rs/blob/master/examples/17_yaml.yml
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(yaml: &'a Yaml) -> App<'a, 'a> { App::from(yaml) }
-
-    /// Sets a string of author(s) that will be displayed to the user when they
-    /// request the help information with `--help` or `-h`.
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_authors!`] to automatically set your
-    /// application's author(s) to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///      .author("Me, me@mymain.com")
-    /// # ;
-    /// ```
-    /// [`crate_authors!`]: ./macro.crate_authors!.html
-    /// [`examples/`]: https://github.com/kbknapp/clap-rs/tree/master/examples
-    pub fn author<S: Into<&'b str>>(mut self, author: S) -> Self {
-        self.p.meta.author = Some(author.into());
-        self
-    }
-
-    /// Overrides the system-determined binary name. This should only be used when absolutely
-    /// necessary, such as when the binary name for your application is misleading, or perhaps
-    /// *not* how the user should invoke your program.
-    ///
-    /// **Pro-tip:** When building things such as third party `cargo` subcommands, this setting
-    /// **should** be used!
-    ///
-    /// **NOTE:** This command **should not** be used for [`SubCommand`]s.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("My Program")
-    ///      .bin_name("my_binary")
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn bin_name<S: Into<String>>(mut self, name: S) -> Self {
-        self.p.meta.bin_name = Some(name.into());
-        self
-    }
-
-    /// Sets a string describing what the program does. This will be displayed when displaying help
-    /// information with `-h`.
-    ///
-    /// **NOTE:** If only `about` is provided, and not [`App::long_about`] but the user requests
-    /// `--help` clap will still display the contents of `about` appropriately
-    ///
-    /// **NOTE:** Only [`App::about`] is used in completion script generation in order to be
-    /// concise
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .about("Does really amazing things to great people")
-    /// # ;
-    /// ```
-    /// [`App::long_about`]: ./struct.App.html#method.long_about
-    pub fn about<S: Into<&'b str>>(mut self, about: S) -> Self {
-        self.p.meta.about = Some(about.into());
-        self
-    }
-
-    /// Sets a string describing what the program does. This will be displayed when displaying help
-    /// information.
-    ///
-    /// **NOTE:** If only `long_about` is provided, and not [`App::about`] but the user requests
-    /// `-h` clap will still display the contents of `long_about` appropriately
-    ///
-    /// **NOTE:** Only [`App::about`] is used in completion script generation in order to be
-    /// concise
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .long_about(
-    /// "Does really amazing things to great people. Now let's talk a little
-    ///  more in depth about how this subcommand really works. It may take about
-    ///  a few lines of text, but that's ok!")
-    /// # ;
-    /// ```
-    /// [`App::about`]: ./struct.App.html#method.about
-    pub fn long_about<S: Into<&'b str>>(mut self, about: S) -> Self {
-        self.p.meta.long_about = Some(about.into());
-        self
-    }
-
-    /// Sets the program's name. This will be displayed when displaying help information.
-    ///
-    /// **Pro-top:** This function is particularly useful when configuring a program via
-    /// [`App::from_yaml`] in conjunction with the [`crate_name!`] macro to derive the program's
-    /// name from its `Cargo.toml`.
-    ///
-    /// # Examples
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::App;
-    /// # fn main() {
-    /// let yml = load_yaml!("app.yml");
-    /// let app = App::from_yaml(yml)
-    ///     .name(crate_name!());
-    ///
-    /// // continued logic goes here, such as `app.get_matches()` etc.
-    /// # }
-    /// ```
-    ///
-    /// [`App::from_yaml`]: ./struct.App.html#method.from_yaml
-    /// [`crate_name!`]: ./macro.crate_name.html
-    pub fn name<S: Into<String>>(mut self, name: S) -> Self {
-        self.p.meta.name = name.into();
-        self
-    }
-
-    /// Adds additional help information to be displayed in addition to auto-generated help. This
-    /// information is displayed **after** the auto-generated help information. This is often used
-    /// to describe how to use the arguments, or caveats to be noted.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .after_help("Does really amazing things to great people...but be careful with -R")
-    /// # ;
-    /// ```
-    pub fn after_help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.more_help = Some(help.into());
-        self
-    }
-
-    /// Adds additional help information to be displayed in addition to auto-generated help. This
-    /// information is displayed **before** the auto-generated help information. This is often used
-    /// for header information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .before_help("Some info I'd like to appear before the help info")
-    /// # ;
-    /// ```
-    pub fn before_help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.pre_help = Some(help.into());
-        self
-    }
-
-    /// Sets a string of the version number to be displayed when displaying version or help
-    /// information with `-V`. 
-    ///
-    /// **NOTE:** If only `version` is provided, and not [`App::long_version`] but the user
-    /// requests `--version` clap will still display the contents of `version` appropriately
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_version!`] to automatically set your
-    /// application's version to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version("v0.1.24")
-    /// # ;
-    /// ```
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`examples/`]: https://github.com/kbknapp/clap-rs/tree/master/examples
-    /// [`App::long_version`]: ./struct.App.html#method.long_version
-    pub fn version<S: Into<&'b str>>(mut self, ver: S) -> Self {
-        self.p.meta.version = Some(ver.into());
-        self
-    }
-
-    /// Sets a string of the version number to be displayed when displaying version or help
-    /// information with `--version`.
-    ///
-    /// **NOTE:** If only `long_version` is provided, and not [`App::version`] but the user
-    /// requests `-V` clap will still display the contents of `long_version` appropriately
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_version!`] to automatically set your
-    /// application's version to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .long_version(
-    /// "v0.1.24
-    ///  commit: abcdef89726d
-    ///  revision: 123
-    ///  release: 2
-    ///  binary: myprog")
-    /// # ;
-    /// ```
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`examples/`]: https://github.com/kbknapp/clap-rs/tree/master/examples
-    /// [`App::version`]: ./struct.App.html#method.version
-    pub fn long_version<S: Into<&'b str>>(mut self, ver: S) -> Self {
-        self.p.meta.long_version = Some(ver.into());
-        self
-    }
-
-    /// Sets a custom usage string to override the auto-generated usage string.
-    ///
-    /// This will be displayed to the user when errors are found in argument parsing, or when you
-    /// call [`ArgMatches::usage`]
-    ///
-    /// **CAUTION:** Using this setting disables `clap`s "context-aware" usage strings. After this
-    /// setting is set, this will be the only usage string displayed to the user!
-    ///
-    /// **NOTE:** You do not need to specify the "USAGE: \n\t" portion, as that will
-    /// still be applied by `clap`, you only need to specify the portion starting
-    /// with the binary name.
-    ///
-    /// **NOTE:** This will not replace the entire help message, *only* the portion
-    /// showing the usage.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .usage("myapp [-clDas] <some_file>")
-    /// # ;
-    /// ```
-    /// [`ArgMatches::usage`]: ./struct.ArgMatches.html#method.usage
-    pub fn usage<S: Into<&'b str>>(mut self, usage: S) -> Self {
-        self.p.meta.usage_str = Some(usage.into());
-        self
-    }
-
-    /// Sets a custom help message and overrides the auto-generated one. This should only be used
-    /// when the auto-generated message does not suffice.
-    ///
-    /// This will be displayed to the user when they use `--help` or `-h`
-    ///
-    /// **NOTE:** This replaces the **entire** help message, so nothing will be auto-generated.
-    ///
-    /// **NOTE:** This **only** replaces the help message for the current command, meaning if you
-    /// are using subcommands, those help messages will still be auto-generated unless you
-    /// specify a [`Arg::help`] for them as well.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myapp")
-    ///     .help("myapp v1.0\n\
-    ///            Does awesome things\n\
-    ///            (C) me@mail.com\n\n\
-    ///
-    ///            USAGE: myapp <opts> <comamnd>\n\n\
-    ///
-    ///            Options:\n\
-    ///            -h, --helpe      Dispay this message\n\
-    ///            -V, --version    Display version info\n\
-    ///            -s <stuff>       Do something with stuff\n\
-    ///            -v               Be verbose\n\n\
-    ///
-    ///            Commmands:\n\
-    ///            help             Prints this message\n\
-    ///            work             Do some work")
-    /// # ;
-    /// ```
-    /// [`Arg::help`]: ./struct.Arg.html#method.help
-    pub fn help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.help_str = Some(help.into());
-        self
-    }
-
-    /// Sets the [`short`] for the auto-generated `help` argument.
-    ///
-    /// By default `clap` automatically assigns `h`, but this can be overridden if you have a
-    /// different argument which you'd prefer to use the `-h` short with. This can be done by
-    /// defining your own argument with a lowercase `h` as the [`short`].
-    ///
-    /// `clap` lazily generates these `help` arguments **after** you've defined any arguments of
-    /// your own.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the [`short`] version
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .help_short("H") // Using an uppercase `H` instead of the default lowercase `h`
-    /// # ;
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn help_short<S: AsRef<str> + 'b>(mut self, s: S) -> Self {
-        self.p.help_short(s.as_ref());
-        self
-    }
-
-    /// Sets the [`short`] for the auto-generated `version` argument.
-    ///
-    /// By default `clap` automatically assigns `V`, but this can be overridden if you have a
-    /// different argument which you'd prefer to use the `-V` short with. This can be done by
-    /// defining your own argument with an uppercase `V` as the [`short`].
-    ///
-    /// `clap` lazily generates these `version` arguments **after** you've defined any arguments of
-    /// your own.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the `short` version
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version_short("v") // Using a lowercase `v` instead of the default capital `V`
-    /// # ;
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn version_short<S: AsRef<str>>(mut self, s: S) -> Self {
-        self.p.version_short(s.as_ref());
-        self
-    }
-
-    /// Sets the help text for the auto-generated `help` argument.
-    ///
-    /// By default `clap` sets this to `"Prints help information"`, but if you're using a
-    /// different convention for your help messages and would prefer a different phrasing you can
-    /// override it.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .help_message("Print help information") // Perhaps you want imperative help messages
-    ///
-    /// # ;
-    /// ```
-    pub fn help_message<S: Into<&'a str>>(mut self, s: S) -> Self {
-        self.p.help_message = Some(s.into());
-        self
-    }
-
-    /// Sets the help text for the auto-generated `version` argument.
-    ///
-    /// By default `clap` sets this to `"Prints version information"`, but if you're using a
-    /// different convention for your help messages and would prefer a different phrasing then you
-    /// can change it.
-    ///
-    /// # Examples
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version_message("Print version information") // Perhaps you want imperative help messages
-    /// # ;
-    /// ```
-    pub fn version_message<S: Into<&'a str>>(mut self, s: S) -> Self {
-        self.p.version_message = Some(s.into());
-        self
-    }
-
-    /// Sets the help template to be used, overriding the default format.
-    ///
-    /// Tags arg given inside curly brackets.
-    ///
-    /// Valid tags are:
-    ///
-    ///   * `{bin}`         - Binary name.
-    ///   * `{version}`     - Version number.
-    ///   * `{author}`      - Author information.
-    ///   * `{about}`       - General description (from [`App::about`])
-    ///   * `{usage}`       - Automatically generated or given usage string.
-    ///   * `{all-args}`    - Help for all arguments (options, flags, positionals arguments,
-    ///                       and subcommands) including titles.
-    ///   * `{unified}`     - Unified help for options and flags. Note, you must *also* set 
-    ///                       [`AppSettings::UnifiedHelpMessage`] to fully merge both options and 
-    ///                       flags, otherwise the ordering is "best effort"
-    ///   * `{flags}`       - Help for flags.
-    ///   * `{options}`     - Help for options.
-    ///   * `{positionals}` - Help for positionals arguments.
-    ///   * `{subcommands}` - Help for subcommands.
-    ///   * `{after-help}`  - Help from [`App::after_help`]
-    ///   * `{before-help}`  - Help from [`App::before_help`]
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version("1.0")
-    ///     .template("{bin} ({version}) - {usage}")
-    /// # ;
-    /// ```
-    /// **NOTE:**The template system is, on purpose, very simple. Therefore the tags have to writen
-    /// in the lowercase and without spacing.
-    /// [`App::about`]: ./struct.App.html#method.about
-    /// [`App::after_help`]: ./struct.App.html#method.after_help
-    /// [`App::before_help`]: ./struct.App.html#method.before_help
-    /// [`AppSettings::UnifiedHelpMessage`]: ./enum.AppSettings.html#variant.UnifiedHelpMessage
-    pub fn template<S: Into<&'b str>>(mut self, s: S) -> Self {
-        self.p.meta.template = Some(s.into());
-        self
-    }
-
-    /// Enables a single command, or [`SubCommand`], level settings.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .setting(AppSettings::WaitOnError)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn setting(mut self, setting: AppSettings) -> Self {
-        self.p.set(setting);
-        self
-    }
-
-    /// Enables multiple command, or [`SubCommand`], level settings
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .settings(&[AppSettings::SubcommandRequired,
-    ///                  AppSettings::WaitOnError])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.set(*s);
-        }
-        self
-    }
-
-    /// Enables a single setting that is propogated *down* through all child [`SubCommand`]s.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// **NOTE**: The setting is *only* propogated *down* and not up through parent commands.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .global_setting(AppSettings::SubcommandRequired)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn global_setting(mut self, setting: AppSettings) -> Self {
-        self.p.set(setting);
-        self.p.g_settings.set(setting);
-        self
-    }
-
-    /// Enables multiple settings which are propogated *down* through all child [`SubCommand`]s.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// **NOTE**: The setting is *only* propogated *down* and not up through parent commands.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .global_settings(&[AppSettings::SubcommandRequired,
-    ///                  AppSettings::ColoredHelp])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn global_settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.set(*s);
-            self.p.g_settings.set(*s)
-        }
-        self
-    }
-
-    /// Disables a single command, or [`SubCommand`], level setting.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .unset_setting(AppSettings::ColorAuto)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn unset_setting(mut self, setting: AppSettings) -> Self {
-        self.p.unset(setting);
-        self
-    }
-
-    /// Disables multiple command, or [`SubCommand`], level settings.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .unset_settings(&[AppSettings::ColorAuto,
-    ///                       AppSettings::AllowInvalidUtf8])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn unset_settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.unset(*s);
-        }
-        self
-    }
-
-    /// Sets the terminal width at which to wrap help messages. Defaults to `120`. Using `0` will
-    /// ignore terminal widths and use source formatting.
-    ///
-    /// `clap` automatically tries to determine the terminal width on Unix, Linux, OSX and Windows
-    /// if the `wrap_help` cargo "feature" has been used while compiling. If the terminal width
-    /// cannot be determined, `clap` defaults to `120`.
-    ///
-    /// **NOTE:** This setting applies globally and *not* on a per-command basis.
-    ///
-    /// **NOTE:** This setting must be set **before** any subcommands are added!
-    ///
-    /// # Platform Specific
-    ///
-    /// Only Unix, Linux, OSX and Windows support automatic determination of terminal width.
-    /// Even on those platforms, this setting is useful if for any reason the terminal width
-    /// cannot be determined.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .set_term_width(80)
-    /// # ;
-    /// ```
-    pub fn set_term_width(mut self, width: usize) -> Self {
-        self.p.meta.term_w = Some(width);
-        self
-    }
-
-    /// Sets the max terminal width at which to wrap help messages. Using `0` will ignore terminal
-    /// widths and use source formatting.
-    ///
-    /// `clap` automatically tries to determine the terminal width on Unix, Linux, OSX and Windows
-    /// if the `wrap_help` cargo "feature" has been used while compiling, but one might want to
-    /// limit the size (e.g. when the terminal is running fullscreen).
-    ///
-    /// **NOTE:** This setting applies globally and *not* on a per-command basis.
-    ///
-    /// **NOTE:** This setting must be set **before** any subcommands are added!
-    ///
-    /// # Platform Specific
-    ///
-    /// Only Unix, Linux, OSX and Windows support automatic determination of terminal width.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .max_term_width(100)
-    /// # ;
-    /// ```
-    pub fn max_term_width(mut self, w: usize) -> Self {
-        self.p.meta.max_w = Some(w);
-        self
-    }
-
-    /// Adds an [argument] to the list of valid possibilities.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     // Adding a single "flag" argument with a short and help text, using Arg::with_name()
-    ///     .arg(
-    ///         Arg::with_name("debug")
-    ///            .short("d")
-    ///            .help("turns on debugging mode")
-    ///     )
-    ///     // Adding a single "option" argument with a short, a long, and help text using the less
-    ///     // verbose Arg::from_usage()
-    ///     .arg(
-    ///         Arg::from_usage("-c --config=[CONFIG] 'Optionally sets a config file to use'")
-    ///     )
-    /// # ;
-    /// ```
-    /// [argument]: ./struct.Arg.html
-    pub fn arg<A: Into<Arg<'a, 'b>>>(mut self, a: A) -> Self {
-        self.p.add_arg(a.into());
-        self
-    }
-
-    /// Adds multiple [arguments] to the list of valid possibilties
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .args(
-    ///         &[Arg::from_usage("[debug] -d 'turns on debugging info'"),
-    ///          Arg::with_name("input").index(1).help("the input file to use")]
-    ///     )
-    /// # ;
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    pub fn args(mut self, args: &[Arg<'a, 'b>]) -> Self {
-        for arg in args {
-            self.p.add_arg_ref(arg);
-        }
-        self
-    }
-
-    /// A convenience method for adding a single [argument] from a usage type string. The string
-    /// used follows the same rules and syntax as [`Arg::from_usage`]
-    ///
-    /// **NOTE:** The downside to using this method is that you can not set any additional
-    /// properties of the [`Arg`] other than what [`Arg::from_usage`] supports.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .arg_from_usage("-c --config=<FILE> 'Sets a configuration file to use'")
-    /// # ;
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    pub fn arg_from_usage(mut self, usage: &'a str) -> Self {
-        self.p.add_arg(Arg::from_usage(usage));
-        self
-    }
-
-    /// Adds multiple [arguments] at once from a usage string, one per line. See
-    /// [`Arg::from_usage`] for details on the syntax and rules supported.
-    ///
-    /// **NOTE:** Like [`App::arg_from_usage`] the downside is you only set properties for the
-    /// [`Arg`]s which [`Arg::from_usage`] supports.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .args_from_usage(
-    ///         "-c --config=[FILE] 'Sets a configuration file to use'
-    ///          [debug]... -d 'Sets the debugging level'
-    ///          <FILE> 'The input file to use'"
-    ///     )
-    /// # ;
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    /// [`App::arg_from_usage`]: ./struct.App.html#method.arg_from_usage
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn args_from_usage(mut self, usage: &'a str) -> Self {
-        for line in usage.lines() {
-            let l = line.trim();
-            if l.is_empty() {
-                continue;
-            }
-            self.p.add_arg(Arg::from_usage(l));
-        }
-        self
-    }
-
-    /// Allows adding a [`SubCommand`] alias, which function as "hidden" subcommands that
-    /// automatically dispatch as if this subcommand was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .alias("do-stuff"))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            als.push((name.into(), false));
-        } else {
-            self.p.meta.aliases = Some(vec![(name.into(), false)]);
-        }
-        self
-    }
-
-    /// Allows adding [`SubCommand`] aliases, which function as "hidden" subcommands that
-    /// automatically dispatch as if this subcommand was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .aliases(&["do-stuff", "do-tests", "tests"]))
-    ///                 .arg(Arg::with_name("input")
-    ///                             .help("the file to add")
-    ///                             .index(1)
-    ///                             .required(false))
-    ///             .get_matches_from(vec!["myprog", "do-tests"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            for n in names {
-                als.push((n, false));
-            }
-        } else {
-            self.p.meta.aliases = Some(names.iter().map(|n| (*n, false)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Allows adding a [`SubCommand`] alias that functions exactly like those defined with
-    /// [`App::alias`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .visible_alias("do-stuff"))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App::alias`]: ./struct.App.html#method.alias
-    pub fn visible_alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            als.push((name.into(), true));
-        } else {
-            self.p.meta.aliases = Some(vec![(name.into(), true)]);
-        }
-        self
-    }
-
-    /// Allows adding multiple [`SubCommand`] aliases that functions exactly like those defined
-    /// with [`App::aliases`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .visible_aliases(&["do-stuff", "tests"]))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App::aliases`]: ./struct.App.html#method.aliases
-    pub fn visible_aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            for n in names {
-                als.push((n, true));
-            }
-        } else {
-            self.p.meta.aliases = Some(names.iter().map(|n| (*n, true)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Adds an [`ArgGroup`] to the application. [`ArgGroup`]s are a family of related arguments.
-    /// By placing them in a logical group, you can build easier requirement and exclusion rules.
-    /// For instance, you can make an entire [`ArgGroup`] required, meaning that one (and *only*
-    /// one) argument from that group must be present at runtime.
-    ///
-    /// You can also do things such as name an [`ArgGroup`] as a conflict to another argument.
-    /// Meaning any of the arguments that belong to that group will cause a failure if present with
-    /// the conflicting argument.
-    ///
-    /// Another added benfit of [`ArgGroup`]s is that you can extract a value from a group instead
-    /// of determining exactly which argument was used.
-    ///
-    /// Finally, using [`ArgGroup`]s to ensure exclusion between arguments is another very common
-    /// use
-    ///
-    /// # Examples
-    ///
-    /// The following example demonstrates using an [`ArgGroup`] to ensure that one, and only one,
-    /// of the arguments from the specified group is present at runtime.
-    ///
-    /// ```no_run
-    /// # use clap::{App, ArgGroup};
-    /// App::new("app")
-    ///     .args_from_usage(
-    ///         "--set-ver [ver] 'set the version manually'
-    ///          --major         'auto increase major'
-    ///          --minor         'auto increase minor'
-    ///          --patch         'auto increase patch'")
-    ///     .group(ArgGroup::with_name("vers")
-    ///          .args(&["set-ver", "major", "minor","patch"])
-    ///          .required(true))
-    /// # ;
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn group(mut self, group: ArgGroup<'a>) -> Self {
-        self.p.add_group(group);
-        self
-    }
-
-    /// Adds multiple [`ArgGroup`]s to the [`App`] at once.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, ArgGroup};
-    /// App::new("app")
-    ///     .args_from_usage(
-    ///         "--set-ver [ver] 'set the version manually'
-    ///          --major         'auto increase major'
-    ///          --minor         'auto increase minor'
-    ///          --patch         'auto increase patch'
-    ///          -c [FILE]       'a config file'
-    ///          -i [IFACE]      'an interface'")
-    ///     .groups(&[
-    ///         ArgGroup::with_name("vers")
-    ///             .args(&["set-ver", "major", "minor","patch"])
-    ///             .required(true),
-    ///         ArgGroup::with_name("input")
-    ///             .args(&["c", "i"])
-    ///     ])
-    /// # ;
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    /// [`App`]: ./struct.App.html
-    pub fn groups(mut self, groups: &[ArgGroup<'a>]) -> Self {
-        for g in groups {
-            self = self.group(g.into());
-        }
-        self
-    }
-
-    /// Adds a [`SubCommand`] to the list of valid possibilities. Subcommands are effectively
-    /// sub-[`App`]s, because they can contain their own arguments, subcommands, version, usage,
-    /// etc. They also function just like [`App`]s, in that they get their own auto generated help,
-    /// version, and usage.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Controls configuration features")
-    ///         .arg_from_usage("<config> 'Required configuration file to use'"))
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    pub fn subcommand(mut self, subcmd: App<'a, 'b>) -> Self {
-        self.p.add_subcommand(subcmd);
-        self
-    }
-
-    /// Adds multiple subcommands to the list of valid possibilities by iterating over an
-    /// [`IntoIterator`] of [`SubCommand`]s
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// # App::new("myprog")
-    /// .subcommands( vec![
-    ///        SubCommand::with_name("config").about("Controls configuration functionality")
-    ///                                 .arg(Arg::with_name("config_file").index(1)),
-    ///        SubCommand::with_name("debug").about("Controls debug functionality")])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`IntoIterator`]: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
-    pub fn subcommands<I>(mut self, subcmds: I) -> Self
-        where I: IntoIterator<Item = App<'a, 'b>>
-    {
-        for subcmd in subcmds {
-            self.p.add_subcommand(subcmd);
-        }
-        self
-    }
-
-    /// Allows custom ordering of [`SubCommand`]s within the help message. Subcommands with a lower
-    /// value will be displayed first in the help message. This is helpful when one would like to
-    /// emphasise frequently used subcommands, or prioritize those towards the top of the list.
-    /// Duplicate values **are** allowed. Subcommands with duplicate display orders will be
-    /// displayed in alphabetical order.
-    ///
-    /// **NOTE:** The default is 999 for all subcommands.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand};
-    /// let m = App::new("cust-ord")
-    ///     .subcommand(SubCommand::with_name("alpha") // typically subcommands are grouped
-    ///                                                // alphabetically by name. Subcommands
-    ///                                                // without a display_order have a value of
-    ///                                                // 999 and are displayed alphabetically with
-    ///                                                // all other 999 subcommands
-    ///         .about("Some help and text"))
-    ///     .subcommand(SubCommand::with_name("beta")
-    ///         .display_order(1)   // In order to force this subcommand to appear *first*
-    ///                             // all we have to do is give it a value lower than 999.
-    ///                             // Any other subcommands with a value of 1 will be displayed
-    ///                             // alphabetically with this one...then 2 values, then 3, etc.
-    ///         .about("I should be first!"))
-    ///     .get_matches_from(vec![
-    ///         "cust-ord", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```text
-    /// cust-ord
-    ///
-    /// USAGE:
-    ///     cust-ord [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// SUBCOMMANDS:
-    ///     beta    I should be first!
-    ///     alpha   Some help and text
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn display_order(mut self, ord: usize) -> Self {
-        self.p.meta.disp_ord = ord;
-        self
-    }
-
-    /// Prints the full help message to [`io::stdout()`] using a [`BufWriter`] using the same
-    /// method as if someone ran `-h` to request the help message
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// let mut app = App::new("myprog");
-    /// app.print_help();
-    /// ```
-    /// [`io::stdout()`]: https://doc.rust-lang.org/std/io/fn.stdout.html
-    /// [`BufWriter`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn print_help(&mut self) -> ClapResult<()> {
-        // If there are global arguments, or settings we need to propgate them down to subcommands
-        // before parsing incase we run into a subcommand
-        self.p.propogate_globals();
-        self.p.propogate_settings();
-        self.p.derive_display_order();
-
-        self.p.create_help_and_version();
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_help(&mut buf_w)
-    }
-
-    /// Prints the full help message to [`io::stdout()`] using a [`BufWriter`] using the same
-    /// method as if someone ran `-h` to request the help message
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// let mut app = App::new("myprog");
-    /// app.print_long_help();
-    /// ```
-    /// [`io::stdout()`]: https://doc.rust-lang.org/std/io/fn.stdout.html
-    /// [`BufWriter`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn print_long_help(&mut self) -> ClapResult<()> {
-        // If there are global arguments, or settings we need to propgate them down to subcommands
-        // before parsing incase we run into a subcommand
-        self.p.propogate_globals();
-        self.p.propogate_settings();
-        self.p.derive_display_order();
-
-        self.p.create_help_and_version();
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_long_help(&mut buf_w)
-    }
-
-    /// Writes the full help message to the user to a [`io::Write`] object in the same method as if
-    /// the user ran `-h`
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// **NOTE:** There is a known bug where this method does not write propogated global arguments
-    /// or autogenerated arguments (i.e. the default help/version args). Prefer
-    /// [`App::write_long_help`] instead if possibe!
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_help(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn write_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        // PENDING ISSUE: 808
-        //      https://github.com/kbknapp/clap-rs/issues/808
-        // If there are global arguments, or settings we need to propgate them down to subcommands
-        // before parsing incase we run into a subcommand
-        // self.p.propogate_globals();
-        // self.p.propogate_settings();
-        // self.p.derive_display_order();
-        // self.p.create_help_and_version();
-
-        Help::write_app_help(w, self, false)
-    }
-
-    /// Writes the full help message to the user to a [`io::Write`] object in the same method as if
-    /// the user ran `--help`
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_long_help(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn write_long_help<W: Write>(&mut self, w: &mut W) -> ClapResult<()> {
-        self.p.propogate_globals();
-        self.p.propogate_settings();
-        self.p.derive_display_order();
-        self.p.create_help_and_version();
-
-        Help::write_app_help(w, self, true)
-    }
-
-    /// Writes the version message to the user to a [`io::Write`] object as if the user ran `-V`.
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" version messages
-    /// depending on if the user ran [`-V` (short)] or [`--version` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_version(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-V` (short)]: ./struct.App.html#method.version
-    /// [`--version` (long)]: ./struct.App.html#method.long_version
-    pub fn write_version<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        self.p.write_version(w, false).map_err(From::from)
-    }
-
-    /// Writes the version message to the user to a [`io::Write`] object
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" version messages
-    /// depending on if the user ran [`-V` (short)] or [`--version` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_long_version(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-V` (short)]: ./struct.App.html#method.version
-    /// [`--version` (long)]: ./struct.App.html#method.long_version
-    pub fn write_long_version<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        self.p.write_version(w, true).map_err(From::from)
-    }
-
-    /// Generate a completions file for a specified shell at compile time.
-    ///
-    /// **NOTE:** to generate the this file at compile time you must use a `build.rs` "Build Script"
-    ///
-    /// # Examples
-    ///
-    /// The following example generates a bash completion script via a `build.rs` script. In this
-    /// simple example, we'll demo a very small application with only a single subcommand and two
-    /// args. Real applications could be many multiple levels deep in subcommands, and have tens or
-    /// potentially hundreds of arguments.
-    ///
-    /// First, it helps if we separate out our `App` definition into a separate file. Whether you
-    /// do this as a function, or bare App definition is a matter of personal preference.
-    ///
-    /// ```
-    /// // src/cli.rs
-    ///
-    /// use clap::{App, Arg, SubCommand};
-    ///
-    /// pub fn build_cli() -> App<'static, 'static> {
-    ///     App::new("compl")
-    ///         .about("Tests completions")
-    ///         .arg(Arg::with_name("file")
-    ///             .help("some input file"))
-    ///         .subcommand(SubCommand::with_name("test")
-    ///             .about("tests things")
-    ///             .arg(Arg::with_name("case")
-    ///                 .long("case")
-    ///                 .takes_value(true)
-    ///                 .help("the case to test")))
-    /// }
-    /// ```
-    ///
-    /// In our regular code, we can simply call this `build_cli()` function, then call
-    /// `get_matches()`, or any of the other normal methods directly after. For example:
-    ///
-    /// ```ignore
-    /// // src/main.rs
-    ///
-    /// mod cli;
-    ///
-    /// fn main() {
-    ///     let m = cli::build_cli().get_matches();
-    ///
-    ///     // normal logic continues...
-    /// }
-    /// ```
-    ///
-    /// Next, we set up our `Cargo.toml` to use a `build.rs` build script.
-    ///
-    /// ```toml
-    /// # Cargo.toml
-    /// build = "build.rs"
-    ///
-    /// [build-dependencies]
-    /// clap = "2.23"
-    /// ```
-    ///
-    /// Next, we place a `build.rs` in our project root.
-    ///
-    /// ```ignore
-    /// extern crate clap;
-    ///
-    /// use clap::Shell;
-    ///
-    /// include!("src/cli.rs");
-    ///
-    /// fn main() {
-    ///     let outdir = match env::var_os("OUT_DIR") {
-    ///         None => return,
-    ///         Some(outdir) => outdir,
-    ///     };
-    ///     let mut app = build_cli();
-    ///     app.gen_completions("myapp",      // We need to specify the bin name manually
-    ///                         Shell::Bash,  // Then say which shell to build completions for
-    ///                         outdir);      // Then say where write the completions to
-    /// }
-    /// ```
-    /// Now, once we combile there will be a `{bin_name}.bash-completion` file in the directory.
-    /// Assuming we compiled with debug mode, it would be somewhere similar to
-    /// `<project>/target/debug/build/myapp-<hash>/out/myapp.bash-completion`.
-    ///
-    /// Fish shell completions will use the file format `{bin_name}.fish`
-    pub fn gen_completions<T: Into<OsString>, S: Into<String>>(&mut self,
-                                                               bin_name: S,
-                                                               for_shell: Shell,
-                                                               out_dir: T) {
-        self.p.meta.bin_name = Some(bin_name.into());
-        self.p.gen_completions(for_shell, out_dir.into());
-    }
-
-
-    /// Generate a completions file for a specified shell at runtime.  Until `cargo install` can
-    /// install extra files like a completion script, this may be used e.g. in a command that
-    /// outputs the contents of the completion script, to be redirected into a file by the user.
-    ///
-    /// # Examples
-    ///
-    /// Assuming a separate `cli.rs` like the [example above](./struct.App.html#method.gen_completions),
-    /// we can let users generate a completion script using a command:
-    ///
-    /// ```ignore
-    /// // src/main.rs
-    ///
-    /// mod cli;
-    /// use std::io;
-    ///
-    /// fn main() {
-    ///     let matches = cli::build_cli().get_matches();
-    ///
-    ///     if matches.is_present("generate-bash-completions") {
-    ///         cli::build_cli().gen_completions_to("myapp", Shell::Bash, &mut io::stdout());
-    ///     }
-    ///
-    ///     // normal logic continues...
-    /// }
-    ///
-    /// ```
-    ///
-    /// Usage:
-    ///
-    /// ```shell
-    /// $ myapp generate-bash-completions > /etc/bash_completion.d/myapp
-    /// ```
-    pub fn gen_completions_to<W: Write, S: Into<String>>(&mut self,
-                                                         bin_name: S,
-                                                         for_shell: Shell,
-                                                         buf: &mut W) {
-        self.p.meta.bin_name = Some(bin_name.into());
-        self.p.gen_completions_to(for_shell, buf);
-    }
-
-    /// Starts the parsing process, upon a failed parse an error will be displayed to the user and
-    /// the process will exit with the appropriate error code. By default this method gets all user
-    /// provided arguments from [`env::args_os`] in order to allow for invalid UTF-8 code points,
-    /// which are legal on many platforms.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches();
-    /// ```
-    /// [`env::args_os`]: https://doc.rust-lang.org/std/env/fn.args_os.html
-    pub fn get_matches(self) -> ArgMatches<'a> { self.get_matches_from(&mut env::args_os()) }
-
-    /// Starts the parsing process. This method will return a [`clap::Result`] type instead of exiting
-    /// the process on failed parse. By default this method gets matches from [`env::args_os`]
-    ///
-    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are
-    /// used. It will return a [`clap::Error`], where the [`kind`] is a
-    /// [`ErrorKind::HelpDisplayed`] or [`ErrorKind::VersionDisplayed`] respectively. You must call
-    /// [`Error::exit`] or perform a [`std::process::exit`].
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_safe()
-    ///     .unwrap_or_else( |e| e.exit() );
-    /// ```
-    /// [`env::args_os`]: https://doc.rust-lang.org/std/env/fn.args_os.html
-    /// [`ErrorKind::HelpDisplayed`]: ./enum.ErrorKind.html#variant.HelpDisplayed
-    /// [`ErrorKind::VersionDisplayed`]: ./enum.ErrorKind.html#variant.VersionDisplayed
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`std::process::exit`]: https://doc.rust-lang.org/std/process/fn.exit.html
-    /// [`clap::Result`]: ./type.Result.html
-    /// [`clap::Error`]: ./struct.Error.html
-    /// [`kind`]: ./struct.Error.html
-    pub fn get_matches_safe(self) -> ClapResult<ArgMatches<'a>> {
-        // Start the parsing
-        self.get_matches_from_safe(&mut env::args_os())
-    }
-
-    /// Starts the parsing process. Like [`App::get_matches`] this method does not return a [`clap::Result`]
-    /// and will automatically exit with an error message. This method, however, lets you specify
-    /// what iterator to use when performing matches, such as a [`Vec`] of your making.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_from(arg_vec);
-    /// ```
-    /// [`App::get_matches`]: ./struct.App.html#method.get_matches
-    /// [`clap::Result`]: ./type.Result.html
-    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches<'a>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
-    {
-        self.get_matches_from_safe_borrow(itr).unwrap_or_else(|e| {
-            // Otherwise, write to stderr and exit
-            if e.use_stderr() {
-                wlnerr!("{}", e.message);
-                if self.p.is_set(AppSettings::WaitOnError) {
-                    wlnerr!("\nPress [ENTER] / [RETURN] to continue...");
-                    let mut s = String::new();
-                    let i = io::stdin();
-                    i.lock().read_line(&mut s).unwrap();
-                }
-                drop(self);
-                drop(e);
-                process::exit(1);
-            }
-
-            drop(self);
-            e.exit()
-        })
-    }
-
-    /// Starts the parsing process. A combination of [`App::get_matches_from`], and
-    /// [`App::get_matches_safe`]
-    ///
-    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are
-    /// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::HelpDisplayed`]
-    /// or [`ErrorKind::VersionDisplayed`] respectively. You must call [`Error::exit`] or
-    /// perform a [`std::process::exit`] yourself.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_from_safe(arg_vec)
-    ///     .unwrap_or_else( |e| { panic!("An error occurs: {}", e) });
-    /// ```
-    /// [`App::get_matches_from`]: ./struct.App.html#method.get_matches_from
-    /// [`App::get_matches_safe`]: ./struct.App.html#method.get_matches_safe
-    /// [`ErrorKind::HelpDisplayed`]: ./enum.ErrorKind.html#variant.HelpDisplayed
-    /// [`ErrorKind::VersionDisplayed`]: ./enum.ErrorKind.html#variant.VersionDisplayed
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`std::process::exit`]: https://doc.rust-lang.org/std/process/fn.exit.html
-    /// [`clap::Error`]: ./struct.Error.html
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`kind`]: ./struct.Error.html
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from_safe<I, T>(mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
-    {
-        self.get_matches_from_safe_borrow(itr)
-    }
-
-    /// Starts the parsing process without consuming the [`App`] struct `self`. This is normally not
-    /// the desired functionality, instead prefer [`App::get_matches_from_safe`] which *does*
-    /// consume `self`.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let mut app = App::new("myprog");
-    ///     // Args and options go here...
-    /// let matches = app.get_matches_from_safe_borrow(arg_vec)
-    ///     .unwrap_or_else( |e| { panic!("An error occurs: {}", e) });
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`App::get_matches_from_safe`]: ./struct.App.html#method.get_matches_from_safe
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from_safe_borrow<I, T>(&mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
-    {
-        // If there are global arguments, or settings we need to propgate them down to subcommands
-        // before parsing incase we run into a subcommand
-        self.p.propogate_globals();
-        self.p.propogate_settings();
-        self.p.derive_display_order();
-
-        let mut matcher = ArgMatcher::new();
-
-        let mut it = itr.into_iter();
-        // Get the name of the program (argument 1 of env::args()) and determine the
-        // actual file
-        // that was used to execute the program. This is because a program called
-        // ./target/release/my_prog -a
-        // will have two arguments, './target/release/my_prog', '-a' but we don't want
-        // to display
-        // the full path when displaying help messages and such
-        if !self.p.is_set(AppSettings::NoBinaryName) {
-            if let Some(name) = it.next() {
-                let bn_os = name.into();
-                let p = Path::new(&*bn_os);
-                if let Some(f) = p.file_name() {
-                    if let Some(s) = f.to_os_string().to_str() {
-                        if self.p.meta.bin_name.is_none() {
-                            self.p.meta.bin_name = Some(s.to_owned());
-                        }
-                    }
-                }
-            }
-        }
-
-        // do the real parsing
-        if let Err(e) = self.p.get_matches_with(&mut matcher, &mut it.peekable()) {
-            return Err(e);
-        }
-
-        if self.p.is_set(AppSettings::PropagateGlobalValuesDown) {
-            for a in &self.p.global_args {
-                matcher.propagate(a.b.name);
-            }
-        }
-
-        Ok(matcher.into())
-    }
-}
-
-#[cfg(feature = "yaml")]
-impl<'a> From<&'a Yaml> for App<'a, 'a> {
-    fn from(mut yaml: &'a Yaml) -> Self {
-        use args::SubCommand;
-        // We WANT this to panic on error...so expect() is good.
-        let mut is_sc = None;
-        let mut a = if let Some(name) = yaml["name"].as_str() {
-            App::new(name)
-        } else {
-            let yaml_hash = yaml.as_hash().unwrap();
-            let sc_key = yaml_hash.keys().nth(0).unwrap();
-            is_sc = Some(yaml_hash.get(sc_key).unwrap());
-            App::new(sc_key.as_str().unwrap())
-        };
-        yaml = if let Some(sc) = is_sc { sc } else { yaml };
-
-        macro_rules! yaml_str {
-            ($a:ident, $y:ident, $i:ident) => {
-                if let Some(v) = $y[stringify!($i)].as_str() {
-                    $a = $a.$i(v);
-                } else if $y[stringify!($i)] != Yaml::BadValue {
-                    panic!("Failed to convert YAML value {:?} to a string", $y[stringify!($i)]);
-                }
-            };
-        }
-
-        yaml_str!(a, yaml, version);
-        yaml_str!(a, yaml, author);
-        yaml_str!(a, yaml, bin_name);
-        yaml_str!(a, yaml, about);
-        yaml_str!(a, yaml, before_help);
-        yaml_str!(a, yaml, after_help);
-        yaml_str!(a, yaml, template);
-        yaml_str!(a, yaml, usage);
-        yaml_str!(a, yaml, help);
-        yaml_str!(a, yaml, help_short);
-        yaml_str!(a, yaml, version_short);
-        yaml_str!(a, yaml, help_message);
-        yaml_str!(a, yaml, version_message);
-        yaml_str!(a, yaml, alias);
-        yaml_str!(a, yaml, visible_alias);
-
-        if let Some(v) = yaml["display_order"].as_i64() {
-            a = a.display_order(v as usize);
-        } else if yaml["display_order"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a u64",
-                   yaml["display_order"]);
-        }
-        if let Some(v) = yaml["setting"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["setting"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to an AppSetting",
-                   yaml["setting"]);
-        }
-        if let Some(v) = yaml["settings"].as_vec() {
-            for ys in v {
-                if let Some(s) = ys.as_str() {
-                    a = a.setting(s.parse().expect("unknown AppSetting found in YAML file"));
-                }
-            }
-        } else if let Some(v) = yaml["settings"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["settings"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a string",
-                   yaml["settings"]);
-        }
-        if let Some(v) = yaml["global_setting"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["global_setting"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to an AppSetting",
-                   yaml["setting"]);
-        }
-        if let Some(v) = yaml["global_settings"].as_vec() {
-            for ys in v {
-                if let Some(s) = ys.as_str() {
-                    a = a.global_setting(s.parse()
-                        .expect("unknown AppSetting found in YAML file"));
-                }
-            }
-        } else if let Some(v) = yaml["global_settings"].as_str() {
-            a = a.global_setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["global_settings"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a string",
-                   yaml["global_settings"]);
-        }
-
-        macro_rules! vec_or_str {
-            ($a:ident, $y:ident, $as_vec:ident, $as_single:ident) => {{
-                    let maybe_vec = $y[stringify!($as_vec)].as_vec();
-                    if let Some(vec) = maybe_vec {
-                        for ys in vec {
-                            if let Some(s) = ys.as_str() {
-                                $a = $a.$as_single(s);
-                            } else {
-                                panic!("Failed to convert YAML value {:?} to a string", ys);
-                            }
-                        }
-                    } else {
-                        if let Some(s) = $y[stringify!($as_vec)].as_str() {
-                            $a = $a.$as_single(s);
-                        } else if $y[stringify!($as_vec)] != Yaml::BadValue {
-                            panic!("Failed to convert YAML value {:?} to either a vec or string", $y[stringify!($as_vec)]);
-                        }
-                    }
-                    $a
-                }
-            };
-        }
-
-        a = vec_or_str!(a, yaml, aliases, alias);
-        a = vec_or_str!(a, yaml, visible_aliases, visible_alias);
-
-        if let Some(v) = yaml["args"].as_vec() {
-            for arg_yaml in v {
-                a = a.arg(Arg::from_yaml(arg_yaml.as_hash().unwrap()));
-            }
-        }
-        if let Some(v) = yaml["subcommands"].as_vec() {
-            for sc_yaml in v {
-                a = a.subcommand(SubCommand::from_yaml(sc_yaml));
-            }
-        }
-        if let Some(v) = yaml["groups"].as_vec() {
-            for ag_yaml in v {
-                a = a.group(ArgGroup::from(ag_yaml.as_hash().unwrap()));
-            }
-        }
-
-        a
-    }
-}
-
-impl<'a, 'b> Clone for App<'a, 'b> {
-    fn clone(&self) -> Self { App { p: self.p.clone() } }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for App<'n, 'e> {
-    fn name(&self) -> &'n str {
-        unreachable!("App struct does not support AnyArg::name, this is a bug!")
-    }
-    fn overrides(&self) -> Option<&[&'e str]> { None }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> { None }
-    fn blacklist(&self) -> Option<&[&'e str]> { None }
-    fn required_unless(&self) -> Option<&[&'e str]> { None }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> { None }
-    fn is_set(&self, _: ArgSettings) -> bool { false }
-    fn val_terminator(&self) -> Option<&'e str> { None }
-    fn set(&mut self, _: ArgSettings) {
-        unreachable!("App struct does not support AnyArg::set, this is a bug!")
-    }
-    fn has_switch(&self) -> bool { false }
-    fn max_vals(&self) -> Option<u64> { None }
-    fn num_vals(&self) -> Option<u64> { None }
-    fn possible_vals(&self) -> Option<&[&'e str]> { None }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> { None }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> { None }
-    fn min_vals(&self) -> Option<u64> { None }
-    fn short(&self) -> Option<char> { None }
-    fn long(&self) -> Option<&'e str> { None }
-    fn val_delim(&self) -> Option<char> { None }
-    fn takes_value(&self) -> bool { true }
-    fn help(&self) -> Option<&'e str> { self.p.meta.about }
-    fn long_help(&self) -> Option<&'e str> { self.p.meta.long_about }
-    fn default_val(&self) -> Option<&'e OsStr> { None }
-    fn default_vals_ifs(&self) -> Option<vec_map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        None
-    }
-    fn longest_filter(&self) -> bool { true }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.p.meta.aliases {
-            let vis_aliases: Vec<_> =
-                aliases.iter().filter_map(|&(n, v)| if v { Some(n) } else { None }).collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> fmt::Display for App<'n, 'e> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", self.p.meta.name) }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/parser.rs
+++ /dev/null
@@ -1,1873 +0,0 @@
-// Std
-use std::ffi::{OsStr, OsString};
-use std::fmt::Display;
-use std::fs::File;
-use std::io::{self, BufWriter, Write};
-#[cfg(feature = "debug")]
-use std::os::unix::ffi::OsStrExt;
-use std::path::PathBuf;
-use std::slice::Iter;
-use std::iter::Peekable;
-
-// Third Party
-use vec_map::{self, VecMap};
-
-// Internal
-use INTERNAL_ERROR_MSG;
-use INVALID_UTF8;
-use SubCommand;
-use app::App;
-use app::help::Help;
-use app::meta::AppMeta;
-use app::settings::AppFlags;
-use args::{AnyArg, ArgMatcher, Base, Switched, Arg, ArgGroup, FlagBuilder, OptBuilder, PosBuilder};
-use args::settings::ArgSettings;
-use completions::ComplGen;
-use errors::{Error, ErrorKind};
-use errors::Result as ClapResult;
-use fmt::ColorWhen;
-use osstringext::OsStrExt2;
-use completions::Shell;
-use suggestions;
-use app::settings::AppSettings as AS;
-use app::validator::Validator;
-use app::usage;
-
-#[derive(Debug, PartialEq, Copy, Clone)]
-#[doc(hidden)]
-pub enum ParseResult<'a> {
-    Flag,
-    Opt(&'a str),
-    Pos(&'a str),
-    MaybeHyphenValue,
-    MaybeNegNum,
-    NotFound,
-    ValuesDone,
-}
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Clone, Default)]
-pub struct Parser<'a, 'b>
-    where 'a: 'b
-{
-    pub meta: AppMeta<'b>,
-    settings: AppFlags,
-    pub g_settings: AppFlags,
-    pub flags: Vec<FlagBuilder<'a, 'b>>,
-    pub opts: Vec<OptBuilder<'a, 'b>>,
-    pub positionals: VecMap<PosBuilder<'a, 'b>>,
-    pub subcommands: Vec<App<'a, 'b>>,
-    pub groups: Vec<ArgGroup<'a>>,
-    pub global_args: Vec<Arg<'a, 'b>>,
-    pub required: Vec<&'a str>,
-    pub r_ifs: Vec<(&'a str, &'b str, &'a str)>,
-    pub blacklist: Vec<&'b str>,
-    pub overrides: Vec<&'b str>,
-    help_short: Option<char>,
-    version_short: Option<char>,
-    cache: Option<&'a str>,
-    pub help_message: Option<&'a str>,
-    pub version_message: Option<&'a str>,
-}
-
-impl<'a, 'b> Parser<'a, 'b>
-    where 'a: 'b
-{
-    pub fn with_name(n: String) -> Self {
-        Parser {
-            meta: AppMeta::with_name(n),
-            ..Default::default()
-        }
-    }
-
-    pub fn help_short(&mut self, s: &str) {
-        let c = s.trim_left_matches(|c| c == '-')
-            .chars()
-            .nth(0)
-            .unwrap_or('h');
-        self.help_short = Some(c);
-    }
-
-    pub fn version_short(&mut self, s: &str) {
-        let c = s.trim_left_matches(|c| c == '-')
-            .chars()
-            .nth(0)
-            .unwrap_or('V');
-        self.version_short = Some(c);
-    }
-
-    pub fn gen_completions_to<W: Write>(&mut self, for_shell: Shell, buf: &mut W) {
-        if !self.is_set(AS::Propogated) {
-            self.propogate_help_version();
-            self.build_bin_names();
-            self.propogate_globals();
-            self.propogate_settings();
-            self.set(AS::Propogated);
-        }
-
-        ComplGen::new(self).generate(for_shell, buf)
-    }
-
-    pub fn gen_completions(&mut self, for_shell: Shell, od: OsString) {
-        use std::error::Error;
-
-        let out_dir = PathBuf::from(od);
-        let name = &*self.meta.bin_name.as_ref().unwrap().clone();
-        let file_name = match for_shell {
-            Shell::Bash => format!("{}.bash-completion", name),
-            Shell::Fish => format!("{}.fish", name),
-            Shell::Zsh => format!("_{}", name),
-            Shell::PowerShell => format!("_{}.ps1", name),
-        };
-
-        let mut file = match File::create(out_dir.join(file_name)) {
-            Err(why) => panic!("couldn't create completion file: {}", why.description()),
-            Ok(file) => file,
-        };
-        self.gen_completions_to(for_shell, &mut file)
-    }
-
-    #[inline]
-    fn app_debug_asserts(&mut self) -> bool {
-        assert!(self.verify_positionals());
-        let should_err = self.groups
-            .iter()
-            .all(|g| {
-                g.args
-                    .iter()
-                    .all(|arg| {
-                             (self.flags.iter().any(|f| &f.b.name == arg) ||
-                              self.opts.iter().any(|o| &o.b.name == arg) ||
-                              self.positionals.values().any(|p| &p.b.name == arg) ||
-                              self.groups.iter().any(|g| &g.name == arg))
-                         })
-            });
-        let g = self.groups
-            .iter()
-            .find(|g| {
-                g.args
-                    .iter()
-                    .any(|arg| {
-                             !(self.flags.iter().any(|f| &f.b.name == arg) ||
-                               self.opts.iter().any(|o| &o.b.name == arg) ||
-                               self.positionals.values().any(|p| &p.b.name == arg) ||
-                               self.groups.iter().any(|g| &g.name == arg))
-                         })
-            });
-        assert!(should_err,
-                "The group '{}' contains the arg '{}' that doesn't actually exist.",
-                g.unwrap().name,
-                g.unwrap()
-                    .args
-                    .iter()
-                    .find(|arg| {
-                              !(self.flags.iter().any(|f| &&f.b.name == arg) ||
-                                self.opts.iter().any(|o| &&o.b.name == arg) ||
-                                self.positionals.values().any(|p| &&p.b.name == arg) ||
-                                self.groups.iter().any(|g| &&g.name == arg))
-                          })
-                    .unwrap());
-        true
-    }
-
-    #[inline]
-    fn debug_asserts(&self, a: &Arg) -> bool {
-        assert!(!arg_names!(self).any(|name| name == a.b.name),
-                format!("Non-unique argument name: {} is already in use", a.b.name));
-        if let Some(l) = a.s.long {
-            assert!(!self.contains_long(l),
-                    "Argument long must be unique\n\n\t--{} is already in use",
-                    l);
-        }
-        if let Some(s) = a.s.short {
-            assert!(!self.contains_short(s),
-                    "Argument short must be unique\n\n\t-{} is already in use",
-                    s);
-        }
-        let i = if a.index.is_none() {
-            (self.positionals.len() + 1)
-        } else {
-            a.index.unwrap() as usize
-        };
-        assert!(!self.positionals.contains_key(i),
-                "Argument \"{}\" has the same index as another positional \
-                    argument\n\n\tPerhaps try .multiple(true) to allow one positional argument \
-                    to take multiple values",
-                a.b.name);
-        assert!(!(a.is_set(ArgSettings::Required) && a.is_set(ArgSettings::Global)),
-                "Global arguments cannot be required.\n\n\t'{}' is marked as \
-                          global and required",
-                a.b.name);
-        if a.b.is_set(ArgSettings::Last) {
-            assert!(!self.positionals
-                         .values()
-                         .any(|p| p.b.is_set(ArgSettings::Last)),
-                    "Only one positional argument may have last(true) set. Found two.");
-            assert!(a.s.long.is_none(),
-                    "Flags or Options may not have last(true) set. {} has both a long and last(true) set.",
-                    a.b.name);
-            assert!(a.s.short.is_none(),
-                    "Flags or Options may not have last(true) set. {} has both a short and last(true) set.",
-                    a.b.name);
-        }
-        true
-    }
-
-    #[inline]
-    fn add_conditional_reqs(&mut self, a: &Arg<'a, 'b>) {
-        if let Some(ref r_ifs) = a.r_ifs {
-            for &(arg, val) in r_ifs {
-                self.r_ifs.push((arg, val, a.b.name));
-            }
-        }
-    }
-
-    #[inline]
-    fn add_arg_groups(&mut self, a: &Arg<'a, 'b>) {
-        if let Some(ref grps) = a.b.groups {
-            for g in grps {
-                let mut found = false;
-                if let Some(ref mut ag) = self.groups.iter_mut().find(|grp| &grp.name == g) {
-                    ag.args.push(a.b.name);
-                    found = true;
-                }
-                if !found {
-                    let mut ag = ArgGroup::with_name(g);
-                    ag.args.push(a.b.name);
-                    self.groups.push(ag);
-                }
-            }
-        }
-    }
-
-    #[inline]
-    fn add_reqs(&mut self, a: &Arg<'a, 'b>) {
-        if a.is_set(ArgSettings::Required) {
-            // If the arg is required, add all it's requirements to master required list
-            if let Some(ref areqs) = a.b.requires {
-                for name in areqs
-                        .iter()
-                        .filter(|&&(val, _)| val.is_none())
-                        .map(|&(_, name)| name) {
-                    self.required.push(name);
-                }
-            }
-            self.required.push(a.b.name);
-        }
-    }
-
-    #[inline]
-    fn implied_settings(&mut self, a: &Arg<'a, 'b>) {
-        if a.is_set(ArgSettings::Last) {
-            // if an arg has `Last` set, we need to imply DontCollapseArgsInUsage so that args
-            // in the usage string don't get confused or left out.
-            self.set(AS::DontCollapseArgsInUsage);
-            self.set(AS::ContainsLast);
-        }
-        if let Some(l) = a.s.long {
-            if l == "version" {
-                self.unset(AS::NeedsLongVersion);
-            } else if l == "help" {
-                self.unset(AS::NeedsLongHelp);
-            }
-        }
-    }
-
-    // actually adds the arguments
-    pub fn add_arg(&mut self, a: Arg<'a, 'b>) {
-        // if it's global we have to clone anyways
-        if a.is_set(ArgSettings::Global) {
-            return self.add_arg_ref(&a);
-        }
-        debug_assert!(self.debug_asserts(&a));
-        self.add_conditional_reqs(&a);
-        self.add_arg_groups(&a);
-        self.add_reqs(&a);
-        self.implied_settings(&a);
-        if a.index.is_some() || (a.s.short.is_none() && a.s.long.is_none()) {
-            let i = if a.index.is_none() {
-                (self.positionals.len() + 1)
-            } else {
-                a.index.unwrap() as usize
-            };
-            self.positionals
-                .insert(i, PosBuilder::from_arg(a, i as u64));
-        } else if a.is_set(ArgSettings::TakesValue) {
-            let mut ob = OptBuilder::from(a);
-            ob.s.unified_ord = self.flags.len() + self.opts.len();
-            self.opts.push(ob);
-        } else {
-            let mut fb = FlagBuilder::from(a);
-            fb.s.unified_ord = self.flags.len() + self.opts.len();
-            self.flags.push(fb);
-        }
-    }
-    // actually adds the arguments but from a borrow (which means we have to do some clonine)
-    pub fn add_arg_ref(&mut self, a: &Arg<'a, 'b>) {
-        debug_assert!(self.debug_asserts(a));
-        self.add_conditional_reqs(a);
-        self.add_arg_groups(a);
-        self.add_reqs(a);
-        self.implied_settings(a);
-        if a.index.is_some() || (a.s.short.is_none() && a.s.long.is_none()) {
-            let i = if a.index.is_none() {
-                (self.positionals.len() + 1)
-            } else {
-                a.index.unwrap() as usize
-            };
-            let pb = PosBuilder::from_arg_ref(a, i as u64);
-            self.positionals.insert(i, pb);
-        } else if a.is_set(ArgSettings::TakesValue) {
-            let mut ob = OptBuilder::from(a);
-            ob.s.unified_ord = self.flags.len() + self.opts.len();
-            self.opts.push(ob);
-        } else {
-            let mut fb = FlagBuilder::from(a);
-            fb.s.unified_ord = self.flags.len() + self.opts.len();
-            self.flags.push(fb);
-        }
-        if a.is_set(ArgSettings::Global) {
-            self.global_args.push(a.into());
-        }
-    }
-
-    pub fn add_group(&mut self, group: ArgGroup<'a>) {
-        if group.required {
-            self.required.push(group.name);
-            if let Some(ref reqs) = group.requires {
-                self.required.extend_from_slice(reqs);
-            }
-            if let Some(ref bl) = group.conflicts {
-                self.blacklist.extend_from_slice(bl);
-            }
-        }
-        if self.groups.iter().any(|g| g.name == group.name) {
-            let grp = self.groups
-                .iter_mut()
-                .find(|g| g.name == group.name)
-                .expect(INTERNAL_ERROR_MSG);
-            grp.args.extend_from_slice(&group.args);
-            grp.requires = group.requires.clone();
-            grp.conflicts = group.conflicts.clone();
-            grp.required = group.required;
-        } else {
-            self.groups.push(group);
-        }
-    }
-
-    pub fn add_subcommand(&mut self, mut subcmd: App<'a, 'b>) {
-        debugln!("Parser::add_subcommand: term_w={:?}, name={}",
-                 self.meta.term_w,
-                 subcmd.p.meta.name);
-        subcmd.p.meta.term_w = self.meta.term_w;
-        if subcmd.p.meta.name == "help" {
-            self.unset(AS::NeedsSubcommandHelp);
-        }
-
-        self.subcommands.push(subcmd);
-    }
-
-    pub fn propogate_settings(&mut self) {
-        debugln!("Parser::propogate_settings: self={}, g_settings={:#?}",
-                 self.meta.name,
-                 self.g_settings);
-        for sc in &mut self.subcommands {
-            debugln!("Parser::propogate_settings: sc={}, settings={:#?}, g_settings={:#?}",
-                     sc.p.meta.name,
-                     sc.p.settings,
-                     sc.p.g_settings);
-            // We have to create a new scope in order to tell rustc the borrow of `sc` is
-            // done and to recursively call this method
-            {
-                let vsc = self.settings.is_set(AS::VersionlessSubcommands);
-                let gv = self.settings.is_set(AS::GlobalVersion);
-
-                if vsc {
-                    sc.p.set(AS::DisableVersion);
-                }
-                if gv && sc.p.meta.version.is_none() && self.meta.version.is_some() {
-                    sc.p.set(AS::GlobalVersion);
-                    sc.p.meta.version = Some(self.meta.version.unwrap());
-                }
-                sc.p.settings = sc.p.settings | self.g_settings;
-                sc.p.g_settings = sc.p.g_settings | self.g_settings;
-                sc.p.meta.term_w = self.meta.term_w;
-                sc.p.meta.max_w = self.meta.max_w;
-            }
-            sc.p.propogate_settings();
-        }
-    }
-
-    #[cfg_attr(feature = "lints", allow(needless_borrow))]
-    pub fn derive_display_order(&mut self) {
-        if self.is_set(AS::DeriveDisplayOrder) {
-            let unified = self.is_set(AS::UnifiedHelpMessage);
-            for (i, o) in self.opts
-                    .iter_mut()
-                    .enumerate()
-                    .filter(|&(_, ref o)| o.s.disp_ord == 999) {
-                o.s.disp_ord = if unified { o.s.unified_ord } else { i };
-            }
-            for (i, f) in self.flags
-                    .iter_mut()
-                    .enumerate()
-                    .filter(|&(_, ref f)| f.s.disp_ord == 999) {
-                f.s.disp_ord = if unified { f.s.unified_ord } else { i };
-            }
-            for (i, sc) in &mut self.subcommands
-                                    .iter_mut()
-                                    .enumerate()
-                                    .filter(|&(_, ref sc)| sc.p.meta.disp_ord == 999) {
-                sc.p.meta.disp_ord = i;
-            }
-        }
-        for sc in &mut self.subcommands {
-            sc.p.derive_display_order();
-        }
-    }
-
-    pub fn required(&self) -> Iter<&str> { self.required.iter() }
-
-    #[cfg_attr(feature = "lints", allow(needless_borrow))]
-    #[inline]
-    pub fn has_args(&self) -> bool {
-        !(self.flags.is_empty() && self.opts.is_empty() && self.positionals.is_empty())
-    }
-
-    #[inline]
-    pub fn has_opts(&self) -> bool { !self.opts.is_empty() }
-
-    #[inline]
-    pub fn has_flags(&self) -> bool { !self.flags.is_empty() }
-
-    #[inline]
-    pub fn has_positionals(&self) -> bool { !self.positionals.is_empty() }
-
-    #[inline]
-    pub fn has_subcommands(&self) -> bool { !self.subcommands.is_empty() }
-
-    #[inline]
-    pub fn has_visible_opts(&self) -> bool {
-        if self.opts.is_empty() {
-            return false;
-        }
-        self.opts.iter().any(|o| !o.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_flags(&self) -> bool {
-        if self.flags.is_empty() {
-            return false;
-        }
-        self.flags.iter().any(|f| !f.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_positionals(&self) -> bool {
-        if self.positionals.is_empty() {
-            return false;
-        }
-        self.positionals
-            .values()
-            .any(|p| !p.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_subcommands(&self) -> bool {
-        if self.subcommands.is_empty() {
-            return false;
-        }
-        self.subcommands.iter().any(|s| !s.p.is_set(AS::Hidden))
-    }
-
-    #[inline]
-    pub fn is_set(&self, s: AS) -> bool { self.settings.is_set(s) }
-
-    #[inline]
-    pub fn set(&mut self, s: AS) { self.settings.set(s) }
-
-    #[inline]
-    pub fn unset(&mut self, s: AS) { self.settings.unset(s) }
-
-    #[cfg_attr(feature = "lints", allow(block_in_if_condition_stmt))]
-    pub fn verify_positionals(&mut self) -> bool {
-        // Because you must wait until all arguments have been supplied, this is the first chance
-        // to make assertions on positional argument indexes
-        //
-        // Firt we verify that the index highest supplied index, is equal to the number of
-        // positional arguments to verify there are no gaps (i.e. supplying an index of 1 and 3
-        // but no 2)
-        if let Some((idx, p)) = self.positionals.iter().rev().next() {
-            assert!(!(idx != self.positionals.len()),
-                    "Found positional argument \"{}\" whose index is {} but there \
-                          are only {} positional arguments defined",
-                    p.b.name,
-                    idx,
-                    self.positionals.len());
-        }
-
-        // Next we verify that only the highest index has a .multiple(true) (if any)
-        if self.positionals
-               .values()
-               .any(|a| {
-                        a.b.is_set(ArgSettings::Multiple) &&
-                        (a.index as usize != self.positionals.len())
-                    }) {
-            let mut it = self.positionals.values().rev();
-            let last = it.next().unwrap();
-            let second_to_last = it.next().unwrap();
-            // Either the final positional is required
-            // Or the second to last has a terminator or .last(true) set
-            let ok = last.is_set(ArgSettings::Required) ||
-                     (second_to_last.v.terminator.is_some() ||
-                      second_to_last.b.is_set(ArgSettings::Last)) ||
-                     last.is_set(ArgSettings::Last);
-            assert!(ok,
-                    "When using a positional argument with .multiple(true) that is *not the \
-                          last* positional argument, the last positional argument (i.e the one \
-                          with the highest index) *must* have .required(true) or .last(true) set.");
-            let ok = second_to_last.is_set(ArgSettings::Multiple) || last.is_set(ArgSettings::Last);
-            assert!(ok,
-                    "Only the last positional argument, or second to last positional \
-                          argument may be set to .multiple(true)");
-
-            let count = self.positionals
-                .values()
-                .filter(|p| p.b.settings.is_set(ArgSettings::Multiple) && p.v.num_vals.is_none())
-                .count();
-            let ok = count <= 1 ||
-                     (last.is_set(ArgSettings::Last) && last.is_set(ArgSettings::Multiple) &&
-                      second_to_last.is_set(ArgSettings::Multiple) &&
-                      count == 2);
-            assert!(ok,
-                    "Only one positional argument with .multiple(true) set is allowed per \
-                        command, unless the second one also has .last(true) set");
-        }
-
-
-        if self.is_set(AS::AllowMissingPositional) {
-            // Check that if a required positional argument is found, all positions with a lower
-            // index are also required.
-            let mut found = false;
-            let mut foundx2 = false;
-            for p in self.positionals.values().rev() {
-                if foundx2 && !p.b.settings.is_set(ArgSettings::Required) {
-                    assert!(p.b.is_set(ArgSettings::Required),
-                            "Found positional argument which is not required with a lower \
-                                  index than a required positional argument by two or more: {:?} \
-                                  index {}",
-                            p.b.name,
-                            p.index);
-                } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
-                    // Args that .last(true) don't count since they can be required and have
-                    // positionals with a lower index that aren't required
-                    // Imagine: prog <req1> [opt1] -- <req2>
-                    // Both of these are valid invocations:
-                    //      $ prog r1 -- r2
-                    //      $ prog r1 o1 -- r2
-                    if found {
-                        foundx2 = true;
-                        continue;
-                    }
-                    found = true;
-                    continue;
-                } else {
-                    found = false;
-                }
-            }
-        } else {
-            // Check that if a required positional argument is found, all positions with a lower
-            // index are also required
-            let mut found = false;
-            for p in self.positionals.values().rev() {
-                if found {
-                    assert!(p.b.is_set(ArgSettings::Required),
-                            "Found positional argument which is not required with a lower \
-                                  index than a required positional argument: {:?} index {}",
-                            p.b.name,
-                            p.index);
-                } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
-                    // Args that .last(true) don't count since they can be required and have
-                    // positionals with a lower index that aren't required
-                    // Imagine: prog <req1> [opt1] -- <req2>
-                    // Both of these are valid invocations:
-                    //      $ prog r1 -- r2
-                    //      $ prog r1 o1 -- r2
-                    found = true;
-                    continue;
-                }
-            }
-        }
-        if self.positionals
-               .values()
-               .any(|p| {
-                        p.b.is_set(ArgSettings::Last) && p.b.is_set(ArgSettings::Required)
-                    }) && self.has_subcommands() &&
-           !self.is_set(AS::SubcommandsNegateReqs) {
-            panic!("Having a required positional argument with .last(true) set *and* child \
-            subcommands without setting SubcommandsNegateReqs isn't compatible.");
-        }
-
-        true
-    }
-
-    pub fn propogate_globals(&mut self) {
-        for sc in &mut self.subcommands {
-            // We have to create a new scope in order to tell rustc the borrow of `sc` is
-            // done and to recursively call this method
-            {
-                for a in &self.global_args {
-                    sc.p.add_arg_ref(a);
-                }
-            }
-            sc.p.propogate_globals();
-        }
-    }
-
-    // Checks if the arg matches a subcommand name, or any of it's aliases (if defined)
-    fn possible_subcommand(&self, arg_os: &OsStr) -> (bool, Option<&str>) {
-        debugln!("Parser::possible_subcommand: arg={:?}", arg_os);
-        fn starts(h: &str, n: &OsStr) -> bool {
-            #[cfg(not(target_os = "windows"))]
-            use std::os::unix::ffi::OsStrExt;
-            #[cfg(target_os = "windows")]
-            use osstringext::OsStrExt3;
-
-            let n_bytes = n.as_bytes();
-            let h_bytes = OsStr::new(h).as_bytes();
-
-            h_bytes.starts_with(n_bytes)
-        }
-
-        if self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound) {
-            return (false, None);
-        }
-        if !self.is_set(AS::InferSubcommands) {
-            if let Some(sc) = find_subcmd!(self, arg_os) {
-                return (true, Some(&sc.p.meta.name));
-            }
-        } else {
-            let v = self.subcommands
-                .iter()
-                .filter(|s| {
-                    starts(&s.p.meta.name[..], &*arg_os) ||
-                    (s.p.meta.aliases.is_some() &&
-                     s.p
-                         .meta
-                         .aliases
-                         .as_ref()
-                         .unwrap()
-                         .iter()
-                         .filter(|&&(a, _)| starts(a, &*arg_os))
-                         .count() == 1)
-                })
-                .map(|sc| &sc.p.meta.name)
-                .collect::<Vec<_>>();
-
-            if v.len() == 1 {
-                return (true, Some(v[0]));
-            }
-        }
-        (false, None)
-    }
-
-    fn parse_help_subcommand<I, T>(&self, it: &mut I) -> ClapResult<ParseResult<'a>>
-        where I: Iterator<Item = T>,
-              T: Into<OsString>
-    {
-        debugln!("Parser::parse_help_subcommand;");
-        let cmds: Vec<OsString> = it.map(|c| c.into()).collect();
-        let mut help_help = false;
-        let mut bin_name = self.meta
-            .bin_name
-            .as_ref()
-            .unwrap_or(&self.meta.name)
-            .clone();
-        let mut sc = {
-            let mut sc: &Parser = self;
-            for (i, cmd) in cmds.iter().enumerate() {
-                if &*cmd.to_string_lossy() == "help" {
-                    // cmd help help
-                    help_help = true;
-                }
-                if let Some(c) = sc.subcommands
-                       .iter()
-                       .find(|s| &*s.p.meta.name == cmd)
-                       .map(|sc| &sc.p) {
-                    sc = c;
-                    if i == cmds.len() - 1 {
-                        break;
-                    }
-                } else if let Some(c) = sc.subcommands
-                              .iter()
-                              .find(|s| if let Some(ref als) = s.p.meta.aliases {
-                                        als.iter().any(|&(a, _)| a == &*cmd.to_string_lossy())
-                                    } else {
-                                        false
-                                    })
-                              .map(|sc| &sc.p) {
-                    sc = c;
-                    if i == cmds.len() - 1 {
-                        break;
-                    }
-                } else {
-                    return Err(Error::unrecognized_subcommand(cmd.to_string_lossy().into_owned(),
-                                                              self.meta
-                                                                  .bin_name
-                                                                  .as_ref()
-                                                                  .unwrap_or(&self.meta.name),
-                                                              self.color()));
-                }
-                bin_name = format!("{} {}", bin_name, &*sc.meta.name);
-            }
-            sc.clone()
-        };
-        if help_help {
-            let mut pb = PosBuilder::new("subcommand", 1);
-            pb.b.help = Some("The subcommand whose help message to display");
-            pb.set(ArgSettings::Multiple);
-            sc.positionals.insert(1, pb);
-            sc.settings = sc.settings | self.g_settings;
-        } else {
-            sc.create_help_and_version();
-        }
-        if sc.meta.bin_name != self.meta.bin_name {
-            sc.meta.bin_name = Some(format!("{} {}", bin_name, sc.meta.name));
-        }
-        Err(sc._help(false))
-    }
-
-    // allow wrong self convention due to self.valid_neg_num = true and it's a private method
-    #[cfg_attr(feature = "lints", allow(wrong_self_convention))]
-    fn is_new_arg(&mut self, arg_os: &OsStr, needs_val_of: ParseResult<'a>) -> bool {
-        debugln!("Parser::is_new_arg: arg={:?}, Needs Val of={:?}",
-                 arg_os,
-                 needs_val_of);
-        let app_wide_settings = if self.is_set(AS::AllowLeadingHyphen) {
-            true
-        } else if self.is_set(AS::AllowNegativeNumbers) {
-            let a = arg_os.to_string_lossy();
-            if a.parse::<i64>().is_ok() || a.parse::<f64>().is_ok() {
-                self.set(AS::ValidNegNumFound);
-                true
-            } else {
-                false
-            }
-        } else {
-            false
-        };
-        let arg_allows_tac = match needs_val_of {
-            ParseResult::Opt(name) => {
-                let o = self.opts
-                    .iter()
-                    .find(|o| o.b.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                (o.is_set(ArgSettings::AllowLeadingHyphen) || app_wide_settings)
-            }
-            ParseResult::Pos(name) => {
-                let p = self.positionals
-                    .values()
-                    .find(|p| p.b.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                (p.is_set(ArgSettings::AllowLeadingHyphen) || app_wide_settings)
-            }
-            _ => false,
-        };
-        debugln!("Parser::is_new_arg: Arg::allow_leading_hyphen({:?})",
-                 arg_allows_tac);
-
-        // Is this a new argument, or values from a previous option?
-        let mut ret = if arg_os.starts_with(b"--") {
-            debugln!("Parser::is_new_arg: -- found");
-            if arg_os.len_() == 2 && !arg_allows_tac {
-                return true; // We have to return true so override everything else
-            } else if arg_allows_tac {
-                return false;
-            }
-            true
-        } else if arg_os.starts_with(b"-") {
-            debugln!("Parser::is_new_arg: - found");
-            // a singe '-' by itself is a value and typically means "stdin" on unix systems
-            !(arg_os.len_() == 1)
-        } else {
-            debugln!("Parser::is_new_arg: probably value");
-            false
-        };
-
-        ret = ret && !arg_allows_tac;
-
-        debugln!("Parser::is_new_arg: starts_new_arg={:?}", ret);
-        ret
-    }
-
-    // The actual parsing function
-    #[cfg_attr(feature = "lints", allow(while_let_on_iterator, collapsible_if))]
-    pub fn get_matches_with<I, T>(&mut self,
-                                  matcher: &mut ArgMatcher<'a>,
-                                  it: &mut Peekable<I>)
-                                  -> ClapResult<()>
-        where I: Iterator<Item = T>,
-              T: Into<OsString> + Clone
-    {
-        debugln!("Parser::get_matches_with;");
-        // Verify all positional assertions pass
-        debug_assert!(self.app_debug_asserts());
-        if self.positionals
-               .values()
-               .any(|a| {
-                        a.b.is_set(ArgSettings::Multiple) &&
-                        (a.index as usize != self.positionals.len())
-                    }) &&
-           self.positionals
-               .values()
-               .last()
-               .map_or(false, |p| !p.is_set(ArgSettings::Last)) {
-            self.settings.set(AS::LowIndexMultiplePositional);
-        }
-        let has_args = self.has_args();
-
-        // Next we create the `--help` and `--version` arguments and add them if
-        // necessary
-        self.create_help_and_version();
-
-        let mut subcmd_name: Option<String> = None;
-        let mut needs_val_of: ParseResult<'a> = ParseResult::NotFound;
-        let mut pos_counter = 1;
-        while let Some(arg) = it.next() {
-            let arg_os = arg.into();
-            debugln!("Parser::get_matches_with: Begin parsing '{:?}' ({:?})",
-                     arg_os,
-                     &*arg_os.as_bytes());
-
-            self.unset(AS::ValidNegNumFound);
-            // Is this a new argument, or values from a previous option?
-            let starts_new_arg = self.is_new_arg(&arg_os, needs_val_of);
-            if arg_os.starts_with(b"--") && arg_os.len_() == 2 && starts_new_arg {
-                debugln!("Parser::get_matches_with: setting TrailingVals=true");
-                self.set(AS::TrailingValues);
-                continue;
-            }
-
-            // Has the user already passed '--'? Meaning only positional args follow
-            if !self.is_set(AS::TrailingValues) {
-                // Does the arg match a subcommand name, or any of it's aliases (if defined)
-                {
-                    let (is_match, sc_name) = self.possible_subcommand(&arg_os);
-                    debugln!("Parser::get_matches_with: possible_sc={:?}, sc={:?}",
-                             is_match,
-                             sc_name);
-                    if is_match {
-                        let sc_name = sc_name.expect(INTERNAL_ERROR_MSG);
-                        if sc_name == "help" && self.is_set(AS::NeedsSubcommandHelp) {
-                            try!(self.parse_help_subcommand(it));
-                        }
-                        subcmd_name = Some(sc_name.to_owned());
-                        break;
-                    }
-                }
-
-                if !starts_new_arg {
-                    if let ParseResult::Opt(name) = needs_val_of {
-                            // Check to see if parsing a value from a previous arg
-                            let arg = self.opts
-                                .iter()
-                                .find(|o| o.b.name == name)
-                                .expect(INTERNAL_ERROR_MSG);
-                            // get the OptBuilder so we can check the settings
-                            needs_val_of = try!(self.add_val_to_arg(arg, &arg_os, matcher));
-                            // get the next value from the iterator
-                            continue;
-                    }
-                } else if arg_os.starts_with(b"--") {
-                    needs_val_of = try!(self.parse_long_arg(matcher, &arg_os));
-                    debugln!("Parser:get_matches_with: After parse_long_arg {:?}",
-                             needs_val_of);
-                    match needs_val_of {
-                        ParseResult::Flag |
-                            ParseResult::Opt(..) |
-                            ParseResult::ValuesDone => continue,
-                        _ => (),
-                    }
-                } else if arg_os.starts_with(b"-") && arg_os.len_() != 1 {
-                    // Try to parse short args like normal, if AllowLeadingHyphen or
-                    // AllowNegativeNumbers is set, parse_short_arg will *not* throw
-                    // an error, and instead return Ok(None)
-                    needs_val_of = try!(self.parse_short_arg(matcher, &arg_os));
-                    // If it's None, we then check if one of those two AppSettings was set
-                    debugln!("Parser:get_matches_with: After parse_short_arg {:?}",
-                             needs_val_of);
-                    match needs_val_of {
-                        ParseResult::MaybeNegNum => {
-                            if !(arg_os.to_string_lossy().parse::<i64>().is_ok() ||
-                                 arg_os.to_string_lossy().parse::<f64>().is_ok()) {
-                                return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                "",
-                                &*usage::create_error_usage(self, matcher, None),
-                                self.color()));
-                            }
-                        }
-                        ParseResult::Opt(..) |
-                            ParseResult::Flag |
-                            ParseResult::ValuesDone => continue,
-                        _ => (),
-                    }
-                }
-
-                if !(self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound)) &&
-                   !self.is_set(AS::InferSubcommands) {
-                    if let Some(cdate) = suggestions::did_you_mean(&*arg_os.to_string_lossy(),
-                                                                   sc_names!(self)) {
-                        return Err(Error::invalid_subcommand(arg_os
-                                                                 .to_string_lossy()
-                                                                 .into_owned(),
-                                                             cdate,
-                                                             self.meta
-                                                                 .bin_name
-                                                                 .as_ref()
-                                                                 .unwrap_or(&self.meta.name),
-                                                             &*usage::create_error_usage(self,
-                                                                                         matcher,
-                                                                                         None),
-                                                             self.color()));
-                    }
-                }
-            }
-
-            let low_index_mults = self.is_set(AS::LowIndexMultiplePositional) &&
-                                  pos_counter == (self.positionals.len() - 1);
-            let missing_pos = self.is_set(AS::AllowMissingPositional) &&
-                              pos_counter == (self.positionals.len() - 1);
-            debugln!("Parser::get_matches_with: Positional counter...{}",
-                     pos_counter);
-            debugln!("Parser::get_matches_with: Low index multiples...{:?}",
-                     low_index_mults);
-            if low_index_mults || missing_pos {
-                if let Some(na) = it.peek() {
-                    let n = (*na).clone().into();
-                    needs_val_of = if needs_val_of != ParseResult::ValuesDone {
-                        if let Some(p) = self.positionals.get(pos_counter) {
-                            ParseResult::Pos(p.b.name)
-                        } else {
-                            ParseResult::ValuesDone
-                        }
-                    } else {
-                        ParseResult::ValuesDone
-                    };
-                    let sc_match = {
-                        self.possible_subcommand(&n).0
-                    };
-                    if self.is_new_arg(&n, needs_val_of) || sc_match ||
-                       suggestions::did_you_mean(&n.to_string_lossy(), sc_names!(self)).is_some() {
-                        debugln!("Parser::get_matches_with: Bumping the positional counter...");
-                        pos_counter += 1;
-                    }
-                } else {
-                    debugln!("Parser::get_matches_with: Bumping the positional counter...");
-                    pos_counter += 1;
-                }
-            } else if self.is_set(AS::ContainsLast) && self.is_set(AS::TrailingValues) {
-                // Came to -- and one postional has .last(true) set, so we go immediately
-                // to the last (highest index) positional
-                debugln!("Parser::get_matches_with: .last(true) and --, setting last pos");
-                pos_counter = self.positionals.len();
-            }
-            if let Some(p) = self.positionals.get(pos_counter) {
-                if p.is_set(ArgSettings::Last) && !self.is_set(AS::TrailingValues) {
-                    return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                                       "",
-                                                       &*usage::create_error_usage(self,
-                                                                                   matcher,
-                                                                                   None),
-                                                       self.color()));
-                }
-                parse_positional!(self, p, arg_os, pos_counter, matcher);
-                self.settings.set(AS::ValidArgFound);
-            } else if self.is_set(AS::AllowExternalSubcommands) {
-                // Get external subcommand name
-                let sc_name = match arg_os.to_str() {
-                    Some(s) => s.to_string(),
-                    None => {
-                        if !self.is_set(AS::StrictUtf8) {
-                            return Err(Error::invalid_utf8(&*usage::create_error_usage(self,
-                                                                                       matcher,
-                                                                                       None),
-                                                           self.color()));
-                        }
-                        arg_os.to_string_lossy().into_owned()
-                    }
-                };
-
-                // Collect the external subcommand args
-                let mut sc_m = ArgMatcher::new();
-                while let Some(v) = it.next() {
-                    let a = v.into();
-                    if a.to_str().is_none() && !self.is_set(AS::StrictUtf8) {
-                        return Err(Error::invalid_utf8(&*usage::create_error_usage(self,
-                                                                                   matcher,
-                                                                                   None),
-                                                       self.color()));
-                    }
-                    sc_m.add_val_to("", &a);
-                }
-
-                matcher.subcommand(SubCommand {
-                                       name: sc_name,
-                                       matches: sc_m.into(),
-                                   });
-            } else if !(self.is_set(AS::AllowLeadingHyphen) ||
-                        self.is_set(AS::AllowNegativeNumbers)) &&
-                      !self.is_set(AS::InferSubcommands) {
-                return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                                   "",
-                                                   &*usage::create_error_usage(self,
-                                                                               matcher,
-                                                                               None),
-                                                   self.color()));
-            } else if !has_args || self.is_set(AS::InferSubcommands) && self.has_subcommands() {
-                if let Some(cdate) = suggestions::did_you_mean(&*arg_os.to_string_lossy(),
-                                                               sc_names!(self)) {
-                    return Err(Error::invalid_subcommand(arg_os.to_string_lossy().into_owned(),
-                                                         cdate,
-                                                         self.meta
-                                                             .bin_name
-                                                             .as_ref()
-                                                             .unwrap_or(&self.meta.name),
-                                                         &*usage::create_error_usage(self,
-                                                                                     matcher,
-                                                                                     None),
-                                                         self.color()));
-                } else {
-                    return Err(Error::unrecognized_subcommand(arg_os
-                                                                  .to_string_lossy()
-                                                                  .into_owned(),
-                                                              self.meta
-                                                                  .bin_name
-                                                                  .as_ref()
-                                                                  .unwrap_or(&self.meta.name),
-                                                              self.color()));
-                }
-            }
-        }
-
-        if let Some(ref pos_sc_name) = subcmd_name {
-            let sc_name = {
-                find_subcmd!(self, pos_sc_name)
-                    .expect(INTERNAL_ERROR_MSG)
-                    .p
-                    .meta
-                    .name
-                    .clone()
-            };
-            try!(self.parse_subcommand(&*sc_name, matcher, it));
-        } else if self.is_set(AS::SubcommandRequired) {
-            let bn = self.meta.bin_name.as_ref().unwrap_or(&self.meta.name);
-            return Err(Error::missing_subcommand(bn,
-                                                 &usage::create_error_usage(self, matcher, None),
-                                                 self.color()));
-        } else if self.is_set(AS::SubcommandRequiredElseHelp) {
-            debugln!("Parser::get_matches_with: SubcommandRequiredElseHelp=true");
-            let mut out = vec![];
-            try!(self.write_help_err(&mut out));
-            return Err(Error {
-                           message: String::from_utf8_lossy(&*out).into_owned(),
-                           kind: ErrorKind::MissingArgumentOrSubcommand,
-                           info: None,
-                       });
-        }
-
-        Validator::new(self).validate(needs_val_of, subcmd_name, matcher)
-    }
-
-
-    fn propogate_help_version(&mut self) {
-        debugln!("Parser::propogate_help_version;");
-        self.create_help_and_version();
-        for sc in &mut self.subcommands {
-            sc.p.propogate_help_version();
-        }
-    }
-
-    fn build_bin_names(&mut self) {
-        debugln!("Parser::build_bin_names;");
-        for sc in &mut self.subcommands {
-            debug!("Parser::build_bin_names:iter: bin_name set...");
-            if sc.p.meta.bin_name.is_none() {
-                sdebugln!("No");
-                let bin_name = format!("{}{}{}",
-                                       self.meta
-                                           .bin_name
-                                           .as_ref()
-                                           .unwrap_or(&self.meta.name.clone()),
-                                       if self.meta.bin_name.is_some() {
-                                           " "
-                                       } else {
-                                           ""
-                                       },
-                                       &*sc.p.meta.name);
-                debugln!("Parser::build_bin_names:iter: Setting bin_name of {} to {}",
-                         self.meta.name,
-                         bin_name);
-                sc.p.meta.bin_name = Some(bin_name);
-            } else {
-                sdebugln!("yes ({:?})", sc.p.meta.bin_name);
-            }
-            debugln!("Parser::build_bin_names:iter: Calling build_bin_names from...{}",
-                     sc.p.meta.name);
-            sc.p.build_bin_names();
-        }
-    }
-
-    fn parse_subcommand<I, T>(&mut self,
-                              sc_name: &str,
-                              matcher: &mut ArgMatcher<'a>,
-                              it: &mut Peekable<I>)
-                              -> ClapResult<()>
-        where I: Iterator<Item = T>,
-              T: Into<OsString> + Clone
-    {
-        use std::fmt::Write;
-        debugln!("Parser::parse_subcommand;");
-        let mut mid_string = String::new();
-        if !self.is_set(AS::SubcommandsNegateReqs) {
-            let mut hs: Vec<&str> = self.required.iter().map(|n| &**n).collect();
-            for k in matcher.arg_names() {
-                hs.push(k);
-            }
-            let reqs = usage::get_required_usage_from(self, &hs, Some(matcher), None, false);
-
-            for s in &reqs {
-                write!(&mut mid_string, " {}", s).expect(INTERNAL_ERROR_MSG);
-            }
-        }
-        mid_string.push_str(" ");
-        if let Some(ref mut sc) = self.subcommands
-               .iter_mut()
-               .find(|s| s.p.meta.name == sc_name) {
-            let mut sc_matcher = ArgMatcher::new();
-            // bin_name should be parent's bin_name + [<reqs>] + the sc's name separated by
-            // a space
-            sc.p.meta.usage = Some(format!("{}{}{}",
-                                           self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                                           if self.meta.bin_name.is_some() {
-                                               &*mid_string
-                                           } else {
-                                               ""
-                                           },
-                                           &*sc.p.meta.name));
-            sc.p.meta.bin_name =
-                Some(format!("{}{}{}",
-                             self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                             if self.meta.bin_name.is_some() {
-                                 " "
-                             } else {
-                                 ""
-                             },
-                             &*sc.p.meta.name));
-            debugln!("Parser::parse_subcommand: About to parse sc={}",
-                     sc.p.meta.name);
-            debugln!("Parser::parse_subcommand: sc settings={:#?}", sc.p.settings);
-            try!(sc.p.get_matches_with(&mut sc_matcher, it));
-            matcher.subcommand(SubCommand {
-                                   name: sc.p.meta.name.clone(),
-                                   matches: sc_matcher.into(),
-                               });
-        }
-        Ok(())
-    }
-
-    pub fn groups_for_arg(&self, name: &str) -> Option<Vec<&'a str>> {
-        debugln!("Parser::groups_for_arg: name={}", name);
-
-        if self.groups.is_empty() {
-            debugln!("Parser::groups_for_arg: No groups defined");
-            return None;
-        }
-        let mut res = vec![];
-        debugln!("Parser::groups_for_arg: Searching through groups...");
-        for grp in &self.groups {
-            for a in &grp.args {
-                if a == &name {
-                    sdebugln!("\tFound '{}'", grp.name);
-                    res.push(&*grp.name);
-                }
-            }
-        }
-        if res.is_empty() {
-            return None;
-        }
-
-        Some(res)
-    }
-
-    pub fn args_in_group(&self, group: &str) -> Vec<String> {
-        let mut g_vec = vec![];
-        let mut args = vec![];
-
-        for n in &self.groups
-                      .iter()
-                      .find(|g| g.name == group)
-                      .expect(INTERNAL_ERROR_MSG)
-                      .args {
-            if let Some(f) = self.flags.iter().find(|f| &f.b.name == n) {
-                args.push(f.to_string());
-            } else if let Some(f) = self.opts.iter().find(|o| &o.b.name == n) {
-                args.push(f.to_string());
-            } else if let Some(p) = self.positionals.values().find(|p| &p.b.name == n) {
-                args.push(p.b.name.to_owned());
-            } else {
-                g_vec.push(*n);
-            }
-        }
-
-        for av in g_vec.iter().map(|g| self.args_in_group(g)) {
-            args.extend(av);
-        }
-        args.dedup();
-        args.iter().map(ToOwned::to_owned).collect()
-    }
-
-    pub fn arg_names_in_group(&self, group: &str) -> Vec<&'a str> {
-        let mut g_vec = vec![];
-        let mut args = vec![];
-
-        for n in &self.groups
-                      .iter()
-                      .find(|g| g.name == group)
-                      .expect(INTERNAL_ERROR_MSG)
-                      .args {
-            if self.groups.iter().any(|g| g.name == *n) {
-                args.extend(self.arg_names_in_group(n));
-                g_vec.push(*n);
-            } else if !args.contains(n) {
-                args.push(*n);
-            }
-        }
-
-        args.iter().map(|s| *s).collect()
-    }
-
-    pub fn create_help_and_version(&mut self) {
-        debugln!("Parser::create_help_and_version;");
-        // name is "hclap_help" because flags are sorted by name
-        if !self.contains_long("help") {
-            debugln!("Parser::create_help_and_version: Building --help");
-            if self.help_short.is_none() && !self.contains_short('h') {
-                self.help_short = Some('h');
-            }
-            let arg = FlagBuilder {
-                b: Base {
-                    name: "hclap_help",
-                    help: self.help_message.or(Some("Prints help information")),
-                    ..Default::default()
-                },
-                s: Switched {
-                    short: self.help_short,
-                    long: Some("help"),
-                    ..Default::default()
-                },
-            };
-            self.flags.push(arg);
-        }
-        if !self.is_set(AS::DisableVersion) && !self.contains_long("version") {
-            debugln!("Parser::create_help_and_version: Building --version");
-            if self.version_short.is_none() && !self.contains_short('V') {
-                self.version_short = Some('V');
-            }
-            // name is "vclap_version" because flags are sorted by name
-            let arg = FlagBuilder {
-                b: Base {
-                    name: "vclap_version",
-                    help: self.version_message.or(Some("Prints version information")),
-                    ..Default::default()
-                },
-                s: Switched {
-                    short: self.version_short,
-                    long: Some("version"),
-                    ..Default::default()
-                },
-            };
-            self.flags.push(arg);
-        }
-        if !self.subcommands.is_empty() && !self.is_set(AS::DisableHelpSubcommand) &&
-           self.is_set(AS::NeedsSubcommandHelp) {
-            debugln!("Parser::create_help_and_version: Building help");
-            self.subcommands
-                .push(App::new("help")
-                          .about("Prints this message or the help of the given subcommand(s)"));
-        }
-    }
-
-    // Retrieves the names of all args the user has supplied thus far, except required ones
-    // because those will be listed in self.required
-    fn check_for_help_and_version_str(&self, arg: &OsStr) -> ClapResult<()> {
-        debugln!("Parser::check_for_help_and_version_str;");
-        debug!("Parser::check_for_help_and_version_str: Checking if --{} is help or version...",
-               arg.to_str().unwrap());
-        if arg == "help" && self.is_set(AS::NeedsLongHelp) {
-            sdebugln!("Help");
-            return Err(self._help(true));
-        }
-        if arg == "version" && self.is_set(AS::NeedsLongVersion) {
-            sdebugln!("Version");
-            return Err(self._version(true));
-        }
-        sdebugln!("Neither");
-
-        Ok(())
-    }
-
-    fn check_for_help_and_version_char(&self, arg: char) -> ClapResult<()> {
-        debugln!("Parser::check_for_help_and_version_char;");
-        debug!("Parser::check_for_help_and_version_char: Checking if -{} is help or version...",
-               arg);
-        if let Some(h) = self.help_short {
-            if arg == h && self.is_set(AS::NeedsLongHelp) {
-                sdebugln!("Help");
-                return Err(self._help(false));
-            }
-        }
-        if let Some(v) = self.version_short {
-            if arg == v && self.is_set(AS::NeedsLongVersion) {
-                sdebugln!("Version");
-                return Err(self._version(false));
-            }
-        }
-        sdebugln!("Neither");
-        Ok(())
-    }
-
-    #[cfg_attr(feature = "cargo-clippy", allow(let_and_return))]
-    fn use_long_help(&self) -> bool {
-        let ul = self.flags.iter().any(|f| f.b.long_help.is_some()) ||
-                 self.opts.iter().any(|o| o.b.long_help.is_some()) ||
-                 self.positionals.values().any(|p| p.b.long_help.is_some()) ||
-                 self.subcommands
-                     .iter()
-                     .any(|s| s.p.meta.long_about.is_some());
-        debugln!("Parser::use_long_help: ret={:?}", ul);
-        ul
-    }
-
-    fn _help(&self, mut use_long: bool) -> Error {
-        debugln!("Parser::_help: use_long={:?}", use_long);
-        use_long = use_long && self.use_long_help();
-        let mut buf = vec![];
-        match Help::write_parser_help(&mut buf, self, use_long) {
-            Err(e) => e,
-            _ => Error {
-                message: unsafe { String::from_utf8_unchecked(buf) },
-                kind: ErrorKind::HelpDisplayed,
-                info: None,
-            }
-        }
-    }
-
-    fn _version(&self, use_long: bool) -> Error {
-        debugln!("Parser::_version: ");
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        match self.print_version(&mut buf_w, use_long) {
-            Err(e) => e,
-            _ => Error {
-                message: String::new(),
-                kind: ErrorKind::VersionDisplayed,
-                info: None,
-            }
-        }
-    }
-
-    fn parse_long_arg(&mut self,
-                      matcher: &mut ArgMatcher<'a>,
-                      full_arg: &OsStr)
-                      -> ClapResult<ParseResult<'a>> {
-        // maybe here lifetime should be 'a
-        debugln!("Parser::parse_long_arg;");
-        let mut val = None;
-        debug!("Parser::parse_long_arg: Does it contain '='...");
-        let arg = if full_arg.contains_byte(b'=') {
-            let (p0, p1) = full_arg.trim_left_matches(b'-').split_at_byte(b'=');
-            sdebugln!("Yes '{:?}'", p1);
-            val = Some(p1);
-            p0
-        } else {
-            sdebugln!("No");
-            full_arg.trim_left_matches(b'-')
-        };
-
-        if let Some(opt) = find_opt_by_long!(@os self, arg) {
-            debugln!("Parser::parse_long_arg: Found valid opt '{}'",
-                     opt.to_string());
-            self.settings.set(AS::ValidArgFound);
-            let ret = try!(self.parse_opt(val, opt, val.is_some(), matcher));
-            if self.cache.map_or(true, |name| name != opt.b.name) {
-                arg_post_processing!(self, opt, matcher);
-                self.cache = Some(opt.b.name);
-            }
-
-            return Ok(ret);
-        } else if let Some(flag) = find_flag_by_long!(@os self, arg) {
-            debugln!("Parser::parse_long_arg: Found valid flag '{}'",
-                     flag.to_string());
-            self.settings.set(AS::ValidArgFound);
-            // Only flags could be help or version, and we need to check the raw long
-            // so this is the first point to check
-            try!(self.check_for_help_and_version_str(arg));
-
-            try!(self.parse_flag(flag, matcher));
-
-            // Handle conflicts, requirements, etc.
-            // if self.cache.map_or(true, |name| name != flag.b.name) {
-            arg_post_processing!(self, flag, matcher);
-            // self.cache = Some(flag.b.name);
-            // }
-
-            return Ok(ParseResult::Flag);
-        } else if self.is_set(AS::AllowLeadingHyphen) {
-            return Ok(ParseResult::MaybeHyphenValue);
-        } else if self.is_set(AS::ValidNegNumFound) {
-            return Ok(ParseResult::MaybeNegNum);
-        }
-
-        debugln!("Parser::parse_long_arg: Didn't match anything");
-        self.did_you_mean_error(arg.to_str().expect(INVALID_UTF8), matcher)
-            .map(|_| ParseResult::NotFound)
-    }
-
-    #[cfg_attr(feature = "lints", allow(len_zero))]
-    fn parse_short_arg(&mut self,
-                       matcher: &mut ArgMatcher<'a>,
-                       full_arg: &OsStr)
-                       -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_short_arg: full_arg={:?}", full_arg);
-        let arg_os = full_arg.trim_left_matches(b'-');
-        let arg = arg_os.to_string_lossy();
-
-        // If AllowLeadingHyphen is set, we want to ensure `-val` gets parsed as `-val` and not
-        // `-v` `-a` `-l` assuming `v` `a` and `l` are all, or mostly, valid shorts.
-        if self.is_set(AS::AllowLeadingHyphen) {
-            if arg.chars().any(|c| !self.contains_short(c)) {
-                debugln!("Parser::parse_short_arg: LeadingHyphenAllowed yet -{} isn't valid",
-                         arg);
-                return Ok(ParseResult::MaybeHyphenValue);
-            }
-        } else if self.is_set(AS::ValidNegNumFound) {
-            // TODO: Add docs about having AllowNegativeNumbers and `-2` as a valid short
-            // May be better to move this to *after* not finding a valid flag/opt?
-            debugln!("Parser::parse_short_arg: Valid negative num...");
-            return Ok(ParseResult::MaybeNegNum);
-        }
-
-        let mut ret = ParseResult::NotFound;
-        for c in arg.chars() {
-            debugln!("Parser::parse_short_arg:iter:{}", c);
-            // Check for matching short options, and return the name if there is no trailing
-            // concatenated value: -oval
-            // Option: -o
-            // Value: val
-            if let Some(opt) = find_opt_by_short!(self, c) {
-                debugln!("Parser::parse_short_arg:iter:{}: Found valid opt", c);
-                self.settings.set(AS::ValidArgFound);
-                // Check for trailing concatenated value
-                let p: Vec<_> = arg.splitn(2, c).collect();
-                debugln!("Parser::parse_short_arg:iter:{}: p[0]={:?}, p[1]={:?}",
-                         c,
-                         p[0].as_bytes(),
-                         p[1].as_bytes());
-                let i = p[0].as_bytes().len() + 1;
-                let val = if p[1].as_bytes().len() > 0 {
-                    debugln!("Parser::parse_short_arg:iter:{}: val={:?} (bytes), val={:?} (ascii)",
-                             c,
-                             arg_os.split_at(i).1.as_bytes(),
-                             arg_os.split_at(i).1);
-                    Some(arg_os.split_at(i).1)
-                } else {
-                    None
-                };
-
-                // Default to "we're expecting a value later"
-                let ret = try!(self.parse_opt(val, opt, false, matcher));
-
-                if self.cache.map_or(true, |name| name != opt.b.name) {
-                    arg_post_processing!(self, opt, matcher);
-                    self.cache = Some(opt.b.name);
-                }
-
-                return Ok(ret);
-            } else if let Some(flag) = find_flag_by_short!(self, c) {
-                debugln!("Parser::parse_short_arg:iter:{}: Found valid flag", c);
-                self.settings.set(AS::ValidArgFound);
-                // Only flags can be help or version
-                try!(self.check_for_help_and_version_char(c));
-                ret = try!(self.parse_flag(flag, matcher));
-
-                // Handle conflicts, requirements, overrides, etc.
-                // Must be called here due to mutablilty
-                if self.cache.map_or(true, |name| name != flag.b.name) {
-                    arg_post_processing!(self, flag, matcher);
-                    self.cache = Some(flag.b.name);
-                }
-            } else {
-                let arg = format!("-{}", c);
-                return Err(Error::unknown_argument(&*arg,
-                                                   "",
-                                                   &*usage::create_error_usage(self,
-                                                                               matcher,
-                                                                               None),
-                                                   self.color()));
-            }
-        }
-        Ok(ret)
-    }
-
-    fn parse_opt(&self,
-                 val: Option<&OsStr>,
-                 opt: &OptBuilder<'a, 'b>,
-                 had_eq: bool,
-                 matcher: &mut ArgMatcher<'a>)
-                 -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_opt; opt={}, val={:?}", opt.b.name, val);
-        debugln!("Parser::parse_opt; opt.settings={:?}", opt.b.settings);
-        let mut has_eq = false;
-
-        debug!("Parser::parse_opt; Checking for val...");
-        if let Some(fv) = val {
-            has_eq = fv.starts_with(&[b'=']) || had_eq;
-            let v = fv.trim_left_matches(b'=');
-            if !opt.is_set(ArgSettings::EmptyValues) &&
-               (v.len_() == 0 || (opt.is_set(ArgSettings::RequireEquals) && !has_eq)) {
-                sdebugln!("Found Empty - Error");
-                return Err(Error::empty_value(opt,
-                                              &*usage::create_error_usage(self, matcher, None),
-                                              self.color()));
-            }
-            sdebugln!("Found - {:?}, len: {}", v, v.len_());
-            debugln!("Parser::parse_opt: {:?} contains '='...{:?}",
-                     fv,
-                     fv.starts_with(&[b'=']));
-            try!(self.add_val_to_arg(opt, v, matcher));
-        } else if opt.is_set(ArgSettings::RequireEquals) && !opt.is_set(ArgSettings::EmptyValues) {
-            sdebugln!("None, but requires equals...Error");
-            return Err(Error::empty_value(opt,
-                                          &*usage::create_error_usage(self, matcher, None),
-                                          self.color()));
-
-        } else {
-            sdebugln!("None");
-        }
-
-        matcher.inc_occurrence_of(opt.b.name);
-        // Increment or create the group "args"
-        self.groups_for_arg(opt.b.name)
-            .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
-
-        if val.is_none() ||
-           !has_eq &&
-           (opt.is_set(ArgSettings::Multiple) && !opt.is_set(ArgSettings::RequireDelimiter) &&
-            matcher.needs_more_vals(opt)) {
-            debugln!("Parser::parse_opt: More arg vals required...");
-            return Ok(ParseResult::Opt(opt.b.name));
-        }
-        debugln!("Parser::parse_opt: More arg vals not required...");
-        Ok(ParseResult::ValuesDone)
-    }
-
-    fn add_val_to_arg<A>(&self,
-                         arg: &A,
-                         val: &OsStr,
-                         matcher: &mut ArgMatcher<'a>)
-                         -> ClapResult<ParseResult<'a>>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Parser::add_val_to_arg; arg={}, val={:?}", arg.name(), val);
-        debugln!("Parser::add_val_to_arg; trailing_vals={:?}, DontDelimTrailingVals={:?}",
-                 self.is_set(AS::TrailingValues),
-                 self.is_set(AS::DontDelimitTrailingValues));
-        if !(self.is_set(AS::TrailingValues) && self.is_set(AS::DontDelimitTrailingValues)) {
-            if let Some(delim) = arg.val_delim() {
-                if val.is_empty_() {
-                    Ok(try!(self.add_single_val_to_arg(arg, val, matcher)))
-                } else {
-                    let mut iret = ParseResult::ValuesDone;
-                    for v in val.split(delim as u32 as u8) {
-                        iret = try!(self.add_single_val_to_arg(arg, v, matcher));
-                    }
-                    // If there was a delimiter used, we're not looking for more values
-                    if val.contains_byte(delim as u32 as u8) ||
-                        arg.is_set(ArgSettings::RequireDelimiter) {
-                            iret = ParseResult::ValuesDone;
-                        }
-                    Ok(iret)
-                }
-            } else {
-                self.add_single_val_to_arg(arg, val, matcher)
-            }
-        } else {
-            self.add_single_val_to_arg(arg, val, matcher)
-        }
-    }
-
-    fn add_single_val_to_arg<A>(&self,
-                                arg: &A,
-                                v: &OsStr,
-                                matcher: &mut ArgMatcher<'a>)
-                                -> ClapResult<ParseResult<'a>>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Parser::add_single_val_to_arg;");
-        debugln!("Parser::add_single_val_to_arg: adding val...{:?}", v);
-        if let Some(t) = arg.val_terminator() {
-            if t == v {
-                return Ok(ParseResult::ValuesDone);
-            }
-        }
-        matcher.add_val_to(arg.name(), v);
-
-        // Increment or create the group "args"
-        if let Some(grps) = self.groups_for_arg(arg.name()) {
-            for grp in grps {
-                matcher.add_val_to(&*grp, v);
-            }
-        }
-
-        if matcher.needs_more_vals(arg) {
-            return Ok(ParseResult::Opt(arg.name()));
-        }
-        Ok(ParseResult::ValuesDone)
-    }
-
-
-    fn parse_flag(&self,
-                  flag: &FlagBuilder<'a, 'b>,
-                  matcher: &mut ArgMatcher<'a>)
-                  -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_flag;");
-
-        matcher.inc_occurrence_of(flag.b.name);
-        // Increment or create the group "args"
-        self.groups_for_arg(flag.b.name)
-            .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
-
-        Ok(ParseResult::Flag)
-    }
-
-    fn did_you_mean_error(&self, arg: &str, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-
-        // Didn't match a flag or option
-        let suffix =
-            suggestions::did_you_mean_flag_suffix(arg, longs!(self), &self.subcommands);
-
-        // Add the arg to the matches to build a proper usage string
-        if let Some(name) = suffix.1 {
-            if let Some(opt) = find_opt_by_long!(self, name) {
-                self.groups_for_arg(&*opt.b.name)
-                    .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
-                matcher.insert(&*opt.b.name);
-            } else if let Some(flg) = find_flag_by_long!(self, name) {
-                self.groups_for_arg(&*flg.b.name)
-                    .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
-                matcher.insert(&*flg.b.name);
-            }
-        }
-
-        let used_arg = format!("--{}", arg);
-        Err(Error::unknown_argument(&*used_arg,
-                                    &*suffix.0,
-                                    &*usage::create_error_usage(self, matcher, None),
-                                    self.color()))
-    }
-
-    // Prints the version to the user and exits if quit=true
-    fn print_version<W: Write>(&self, w: &mut W, use_long: bool) -> ClapResult<()> {
-        try!(self.write_version(w, use_long));
-        w.flush().map_err(Error::from)
-    }
-
-    pub fn write_version<W: Write>(&self, w: &mut W, use_long: bool) -> io::Result<()> {
-        let ver = if use_long {
-            self.meta
-                .long_version
-                .unwrap_or_else(|| self.meta.version.unwrap_or(""))
-        } else {
-            self.meta
-                .version
-                .unwrap_or_else(|| self.meta.long_version.unwrap_or(""))
-        };
-        if let Some(bn) = self.meta.bin_name.as_ref() {
-            if bn.contains(' ') {
-                // Incase we're dealing with subcommands i.e. git mv is translated to git-mv
-                write!(w, "{} {}", bn.replace(" ", "-"), ver)
-            } else {
-                write!(w, "{} {}", &self.meta.name[..], ver)
-            }
-        } else {
-            write!(w, "{} {}", &self.meta.name[..], ver)
-        }
-    }
-
-    pub fn print_help(&self) -> ClapResult<()> {
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_help(&mut buf_w)
-    }
-
-    pub fn write_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help(w, self, false)
-    }
-
-    pub fn write_long_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help(w, self, true)
-    }
-
-    pub fn write_help_err<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help_to_stderr(w, self)
-    }
-
-    pub fn add_defaults(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-        macro_rules! add_val {
-            (@default $_self:ident, $a:ident, $m:ident) => {
-                if let Some(ref val) = $a.v.default_val {
-                    if $m.get($a.b.name).is_none() {
-                        try!($_self.add_val_to_arg($a, OsStr::new(val), $m));
-
-                        if $_self.cache.map_or(true, |name| name != $a.name()) {
-                            arg_post_processing!($_self, $a, $m);
-                            $_self.cache = Some($a.name());
-                        }
-                    }
-                }
-            };
-            ($_self:ident, $a:ident, $m:ident) => {
-                if let Some(ref vm) = $a.v.default_vals_ifs {
-                    let mut done = false;
-                    if $m.get($a.b.name).is_none() {
-                        for &(arg, val, default) in vm.values() {
-                            let add = if let Some(a) = $m.get(arg) {
-                                if let Some(v) = val {
-                                    a.vals.iter().any(|value| v == value)
-                                } else {
-                                    true
-                                }
-                            } else {
-                                false
-                            };
-                            if add {
-                                try!($_self.add_val_to_arg($a, OsStr::new(default), $m));
-                                if $_self.cache.map_or(true, |name| name != $a.name()) {
-                                    arg_post_processing!($_self, $a, $m);
-                                    $_self.cache = Some($a.name());
-                                }
-                                done = true;
-                                break;
-                            }
-                        }
-                    }
-
-                    if done {
-                        continue; // outer loop (outside macro)
-                    }
-                }
-                add_val!(@default $_self, $a, $m)
-            };
-        }
-
-        for o in &self.opts {
-            add_val!(self, o, matcher);
-        }
-        for p in self.positionals.values() {
-            add_val!(self, p, matcher);
-        }
-        Ok(())
-    }
-
-    pub fn flags(&self) -> Iter<FlagBuilder<'a, 'b>> { self.flags.iter() }
-
-    pub fn opts(&self) -> Iter<OptBuilder<'a, 'b>> { self.opts.iter() }
-
-    pub fn positionals(&self) -> vec_map::Values<PosBuilder<'a, 'b>> { self.positionals.values() }
-
-    pub fn subcommands(&self) -> Iter<App> { self.subcommands.iter() }
-
-    // Should we color the output? None=determined by output location, true=yes, false=no
-    #[doc(hidden)]
-    pub fn color(&self) -> ColorWhen {
-        debugln!("Parser::color;");
-        debug!("Parser::color: Color setting...");
-        if self.is_set(AS::ColorNever) {
-            sdebugln!("Never");
-            ColorWhen::Never
-        } else if self.is_set(AS::ColorAlways) {
-            sdebugln!("Always");
-            ColorWhen::Always
-        } else {
-            sdebugln!("Auto");
-            ColorWhen::Auto
-        }
-    }
-
-    pub fn find_any_arg(&self, name: &str) -> Option<&AnyArg> {
-        if let Some(f) = find_by_name!(self, name, flags, iter) {
-            return Some(f);
-        }
-        if let Some(o) = find_by_name!(self, name, opts, iter) {
-            return Some(o);
-        }
-        if let Some(p) = find_by_name!(self, name, positionals, values) {
-            return Some(p);
-        }
-        None
-    }
-
-    /// Check is a given string matches the binary name for this parser
-    fn is_bin_name(&self, value: &str) -> bool {
-        self.meta.bin_name
-            .as_ref()
-            .and_then(|name| Some(value == name))
-            .unwrap_or(false)
-    }
-
-    /// Check is a given string is an alias for this parser
-    fn is_alias(&self, value: &str) -> bool {
-        self.meta.aliases
-            .as_ref()
-            .and_then(|aliases| {
-                for alias in aliases {
-                    if alias.0 == value {
-                        return Some(true);
-                    }
-                }
-                Some(false)
-            })
-            .unwrap_or(false)
-    }
-
-    // Only used for completion scripts due to bin_name messiness
-    #[cfg_attr(feature = "lints", allow(block_in_if_condition_stmt))]
-    pub fn find_subcommand(&'b self, sc: &str) -> Option<&'b App<'a, 'b>> {
-        debugln!("Parser::find_subcommand: sc={}", sc);
-        debugln!("Parser::find_subcommand: Currently in Parser...{}",
-                 self.meta.bin_name.as_ref().unwrap());
-        for s in &self.subcommands {
-            if s.p.is_bin_name(sc) {
-                return Some(s);
-            }
-            // XXX: why do we split here?
-            // isn't `sc` supposed to be single word already?
-            let last = sc.split(' ').rev().next().expect(INTERNAL_ERROR_MSG);
-            if s.p.is_alias(last) {
-                return Some(s);
-            }
-
-            if let Some(app) = s.p.find_subcommand(sc) {
-                return Some(app);
-            }
-        }
-        None
-    }
-
-    #[inline]
-    fn contains_long(&self, l: &str) -> bool { longs!(self).any(|al| al == &l) }
-
-    #[inline]
-    fn contains_short(&self, s: char) -> bool { shorts!(self).any(|arg_s| arg_s == &s) }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/settings.rs
+++ /dev/null
@@ -1,987 +0,0 @@
-// Std
-use std::ascii::AsciiExt;
-use std::str::FromStr;
-use std::ops::BitOr;
-
-bitflags! {
-    struct Flags: u64 {
-        const SC_NEGATE_REQS       = 1;
-        const SC_REQUIRED          = 1 << 1;
-        const A_REQUIRED_ELSE_HELP = 1 << 2;
-        const GLOBAL_VERSION       = 1 << 3;
-        const VERSIONLESS_SC       = 1 << 4;
-        const UNIFIED_HELP         = 1 << 5;
-        const WAIT_ON_ERROR        = 1 << 6;
-        const SC_REQUIRED_ELSE_HELP= 1 << 7;
-        const NEEDS_LONG_HELP      = 1 << 8;
-        const NEEDS_LONG_VERSION   = 1 << 9;
-        const NEEDS_SC_HELP        = 1 << 10;
-        const DISABLE_VERSION      = 1 << 11;
-        const HIDDEN               = 1 << 12;
-        const TRAILING_VARARG      = 1 << 13;
-        const NO_BIN_NAME          = 1 << 14;
-        const ALLOW_UNK_SC         = 1 << 15;
-        const UTF8_STRICT          = 1 << 16;
-        const UTF8_NONE            = 1 << 17;
-        const LEADING_HYPHEN       = 1 << 18;
-        const NO_POS_VALUES        = 1 << 19;
-        const NEXT_LINE_HELP       = 1 << 20;
-        const DERIVE_DISP_ORDER    = 1 << 21;
-        const COLORED_HELP         = 1 << 22;
-        const COLOR_ALWAYS         = 1 << 23;
-        const COLOR_AUTO           = 1 << 24;
-        const COLOR_NEVER          = 1 << 25;
-        const DONT_DELIM_TRAIL     = 1 << 26;
-        const ALLOW_NEG_NUMS       = 1 << 27;
-        const LOW_INDEX_MUL_POS    = 1 << 28;
-        const DISABLE_HELP_SC      = 1 << 29;
-        const DONT_COLLAPSE_ARGS   = 1 << 30;
-        const ARGS_NEGATE_SCS      = 1 << 31;
-        const PROPAGATE_VALS_DOWN  = 1 << 32;
-        const ALLOW_MISSING_POS    = 1 << 33;
-        const TRAILING_VALUES      = 1 << 34;
-        const VALID_NEG_NUM_FOUND  = 1 << 35;
-        const PROPOGATED           = 1 << 36;
-        const VALID_ARG_FOUND      = 1 << 37;
-        const INFER_SUBCOMMANDS    = 1 << 38;
-        const CONTAINS_LAST        = 1 << 39;
-    }
-}
-
-#[doc(hidden)]
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub struct AppFlags(Flags);
-
-impl BitOr for AppFlags {
-    type Output = Self;
-    fn bitor(self, rhs: Self) -> Self { AppFlags(self.0 | rhs.0) }
-}
-
-impl Default for AppFlags {
-    fn default() -> Self {
-        AppFlags(NEEDS_LONG_VERSION | NEEDS_LONG_HELP | NEEDS_SC_HELP | UTF8_NONE | COLOR_AUTO)
-    }
-}
-
-impl AppFlags {
-    pub fn new() -> Self { AppFlags::default() }
-
-    impl_settings! { AppSettings,
-        ArgRequiredElseHelp => A_REQUIRED_ELSE_HELP,
-        ArgsNegateSubcommands => ARGS_NEGATE_SCS,
-        AllowExternalSubcommands => ALLOW_UNK_SC,
-        AllowInvalidUtf8 => UTF8_NONE,
-        AllowLeadingHyphen => LEADING_HYPHEN,
-        AllowNegativeNumbers => ALLOW_NEG_NUMS,
-        AllowMissingPositional => ALLOW_MISSING_POS,
-        ColoredHelp => COLORED_HELP,
-        ColorAlways => COLOR_ALWAYS,
-        ColorAuto => COLOR_AUTO,
-        ColorNever => COLOR_NEVER,
-        DontDelimitTrailingValues => DONT_DELIM_TRAIL,
-        DontCollapseArgsInUsage => DONT_COLLAPSE_ARGS,
-        DeriveDisplayOrder => DERIVE_DISP_ORDER,
-        DisableHelpSubcommand => DISABLE_HELP_SC,
-        DisableVersion => DISABLE_VERSION,
-        GlobalVersion => GLOBAL_VERSION,
-        HidePossibleValuesInHelp => NO_POS_VALUES,
-        Hidden => HIDDEN,
-        LowIndexMultiplePositional => LOW_INDEX_MUL_POS,
-        NeedsLongHelp => NEEDS_LONG_HELP,
-        NeedsLongVersion => NEEDS_LONG_VERSION,
-        NeedsSubcommandHelp => NEEDS_SC_HELP,
-        NoBinaryName => NO_BIN_NAME,
-        PropagateGlobalValuesDown=> PROPAGATE_VALS_DOWN,
-        StrictUtf8 => UTF8_STRICT,
-        SubcommandsNegateReqs => SC_NEGATE_REQS,
-        SubcommandRequired => SC_REQUIRED,
-        SubcommandRequiredElseHelp => SC_REQUIRED_ELSE_HELP,
-        TrailingVarArg => TRAILING_VARARG,
-        UnifiedHelpMessage => UNIFIED_HELP,
-        NextLineHelp => NEXT_LINE_HELP,
-        VersionlessSubcommands => VERSIONLESS_SC,
-        WaitOnError => WAIT_ON_ERROR,
-        TrailingValues => TRAILING_VALUES,
-        ValidNegNumFound => VALID_NEG_NUM_FOUND,
-        Propogated => PROPOGATED,
-        ValidArgFound => VALID_ARG_FOUND,
-        InferSubcommands => INFER_SUBCOMMANDS,
-        ContainsLast => CONTAINS_LAST
-    }
-}
-
-/// Application level settings, which affect how [`App`] operates
-///
-/// **NOTE:** When these settings are used, they apply only to current command, and are *not*
-/// propagated down or up through child or parent subcommands
-///
-/// [`App`]: ./struct.App.html
-#[derive(Debug, PartialEq, Copy, Clone)]
-pub enum AppSettings {
-    /// Specifies that any invalid UTF-8 code points should *not* be treated as an error.
-    /// This is the default behavior of `clap`.
-    ///
-    /// **NOTE:** Using argument values with invalid UTF-8 code points requires using
-    /// [`ArgMatches::os_value_of`], [`ArgMatches::os_values_of`], [`ArgMatches::lossy_value_of`],
-    /// or [`ArgMatches::lossy_values_of`] for those particular arguments which may contain invalid
-    /// UTF-8 values
-    ///
-    /// **NOTE:** This rule only applies to  argument values, as flags, options, and
-    /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
-    ///
-    /// # Platform Specific
-    ///
-    /// Non Windows systems only
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, AppSettings};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let r = App::new("myprog")
-    ///   //.setting(AppSettings::AllowInvalidUtf8)
-    ///     .arg_from_usage("<arg> 'some positional arg'")
-    ///     .get_matches_from_safe(
-    ///         vec![
-    ///             OsString::from("myprog"),
-    ///             OsString::from_vec(vec![0xe9])]);
-    ///
-    /// assert!(r.is_ok());
-    /// let m = r.unwrap();
-    /// assert_eq!(m.value_of_os("arg").unwrap().as_bytes(), &[0xe9]);
-    /// ```
-    /// [`ArgMatches::os_value_of`]: ./struct.ArgMatches.html#method.os_value_of
-    /// [`ArgMatches::os_values_of`]: ./struct.ArgMatches.html#method.os_values_of
-    /// [`ArgMatches::lossy_value_of`]: ./struct.ArgMatches.html#method.lossy_value_of
-    /// [`ArgMatches::lossy_values_of`]: ./struct.ArgMatches.html#method.lossy_values_of
-    AllowInvalidUtf8,
-
-    /// Specifies that leading hyphens are allowed in argument *values*, such as negative numbers
-    /// like `-10`. (which would otherwise be parsed as another flag or option)
-    ///
-    /// **NOTE:** Use this setting with caution as it silences certain circumstances which would
-    /// otherwise be an error (such as accidentally forgetting to specify a value for leading
-    /// option). It is preferred to set this on a per argument basis, via [`Arg::allow_hyphen_values`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{Arg, App, AppSettings};
-    /// // Imagine you needed to represent negative numbers as well, such as -10
-    /// let m = App::new("nums")
-    ///     .setting(AppSettings::AllowLeadingHyphen)
-    ///     .arg(Arg::with_name("neg").index(1))
-    ///     .get_matches_from(vec![
-    ///         "nums", "-20"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("neg"), Some("-20"));
-    /// # ;
-    /// ```
-    /// [`Arg::allow_hyphen_values`]: ./struct.Arg.html#method.allow_hyphen_values
-    AllowLeadingHyphen,
-
-    /// Allows negative numbers to pass as values. This is similar to
-    /// `AllowLeadingHyphen` except that it only allows numbers, all
-    /// other undefined leading hyphens will fail to parse.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::AllowNegativeNumbers)
-    ///     .arg(Arg::with_name("num"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "-20"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// assert_eq!(m.value_of("num").unwrap(), "-20");
-    /// ```
-    /// [`AllowLeadingHyphen`]: ./enum.AppSettings.html#variant.AllowLeadingHyphen
-    AllowNegativeNumbers,
-
-    /// Allows one to implement a CLI where the second to last positional argument is optional, but
-    /// the final positional argument is required. Such as `$ prog [optional] <required>` where one
-    /// of the two following usages is allowed:
-    ///
-    /// * `$ prog [optional] <required>`
-    /// * `$ prog <required>`
-    ///
-    /// This would otherwise not be allowed. This is useful when `[optional]` has a default value.
-    ///
-    /// **Note:** In addition to using this setting, the second positional argument *must* be
-    /// [required]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowMissingPositional)
-    ///     .arg(Arg::with_name("arg1")
-    ///         .default_value("something"))
-    ///     .arg(Arg::with_name("arg2")
-    ///         .required(true))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "other"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("arg1"), Some("something"));
-    /// assert_eq!(m.value_of("arg2"), Some("other"));
-    /// ```
-    /// [required]: ./struct.Arg.html#method.required
-    AllowMissingPositional,
-
-    /// Specifies that an unexpected positional argument,
-    /// which would otherwise cause a [`ErrorKind::UnknownArgument`] error,
-    /// should instead be treated as a [`SubCommand`] within the [`ArgMatches`] struct.
-    ///
-    /// **NOTE:** Use this setting with caution,
-    /// as a truly unexpected argument (i.e. one that is *NOT* an external subcommand)
-    /// will **not** cause an error and instead be treated as a potential subcommand.
-    /// One should check for such cases manually and inform the user appropriately.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowExternalSubcommands)
-    ///     .get_matches_from(vec![
-    ///         "myprog", "subcmd", "--option", "value", "-fff", "--flag"
-    ///     ]);
-    ///
-    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
-    /// // string argument name
-    /// match m.subcommand() {
-    ///     (external, Some(ext_m)) => {
-    ///          let ext_args: Vec<&str> = ext_m.values_of("").unwrap().collect();
-    ///          assert_eq!(external, "subcmd");
-    ///          assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
-    ///     },
-    ///     _ => {},
-    /// }
-    /// ```
-    /// [`ErrorKind::UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    AllowExternalSubcommands,
-
-    /// Specifies that use of a valid [argument] negates [subcomands] being used after. By default
-    /// `clap` allows arguments between subcommands such as
-    /// `<cmd> [cmd_args] <cmd2> [cmd2_args] <cmd3> [cmd3_args]`. This setting disables that
-    /// functionality and says that arguments can only follow the *final* subcommand. For instance
-    /// using this setting makes only the following invocations possible:
-    ///
-    /// * `<cmd> <cmd2> <cmd3> [cmd3_args]`
-    /// * `<cmd> <cmd2> [cmd2_args]`
-    /// * `<cmd> [cmd_args]`
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ArgsNegateSubcommands)
-    /// # ;
-    /// ```
-    /// [subcommands]: ./struct.SubCommand.html
-    /// [argument]: ./struct.Arg.html
-    ArgsNegateSubcommands,
-
-    /// Specifies that the help text should be displayed (and then exit gracefully),
-    /// if no arguments are present at runtime (i.e. an empty run such as, `$ myprog`.
-    ///
-    /// **NOTE:** [`SubCommand`]s count as arguments
-    ///
-    /// **NOTE:** Setting [`Arg::default_value`] effectively disables this option as it will
-    /// ensure that some argument is always present.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ArgRequiredElseHelp)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    ArgRequiredElseHelp,
-
-    /// Uses colorized help messages.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and OSX (i.e. non-Windows platforms)
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColoredHelp)
-    ///     .get_matches();
-    /// ```
-    ColoredHelp,
-
-    /// Enables colored output only when the output is going to a terminal or TTY.
-    ///
-    /// **NOTE:** This is the default behavior of `clap`.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature.
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and OSX (i.e. non-Windows platforms).
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorAuto)
-    ///     .get_matches();
-    /// ```
-    ColorAuto,
-
-    /// Enables colored output regardless of whether or not the output is going to a terminal/TTY.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature.
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and OSX (i.e. non-Windows platforms).
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorAlways)
-    ///     .get_matches();
-    /// ```
-    ColorAlways,
-
-    /// Disables colored output no matter if the output is going to a terminal/TTY, or not.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and OSX (i.e. non-Windows platforms)
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorNever)
-    ///     .get_matches();
-    /// ```
-    ColorNever,
-
-    /// Disables the automatic collapsing of positional args into `[ARGS]` inside the usage string
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DontCollapseArgsInUsage)
-    ///     .get_matches();
-    /// ```
-    DontCollapseArgsInUsage,
-
-    /// Disables the automatic delimiting of values when `--` or [`AppSettings::TrailingVarArg`]
-    /// was used.
-    ///
-    /// **NOTE:** The same thing can be done manually by setting the final positional argument to
-    /// [`Arg::use_delimiter(false)`]. Using this setting is safer, because it's easier to locate
-    /// when making changes.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DontDelimitTrailingValues)
-    ///     .get_matches();
-    /// ```
-    /// [`AppSettings::TrailingVarArg`]: ./enum.AppSettings.html#variant.TrailingVarArg
-    /// [`Arg::use_delimiter(false)`]: ./struct.Arg.html#method.use_delimiter
-    DontDelimitTrailingValues,
-
-    /// Disables the `help` subcommand
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, ErrorKind, SubCommand};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableHelpSubcommand)
-    ///     // Normally, creating a subcommand causes a `help` subcommand to automaticaly
-    ///     // be generated as well
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "help"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    DisableHelpSubcommand,
-
-    /// Disables `-V` and `--version` [`App`] without affecting any of the [`SubCommand`]s
-    /// (Defaults to `false`; application *does* have a version flag)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableVersion)
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableVersion)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::VersionDisplayed);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    DisableVersion,
-
-    /// Displays the arguments and [`SubCommand`]s in the help message in the order that they were
-    /// declared in, and not alphabetically which is the default.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DeriveDisplayOrder)
-    ///     .get_matches();
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    DeriveDisplayOrder,
-
-    /// Specifies to use the version of the current command for all child [`SubCommand`]s.
-    /// (Defaults to `false`; subcommands have independant version strings from their parents.)
-    ///
-    /// **NOTE:** The version for the current command **and** this setting must be set **prior** to
-    /// adding any child subcommands
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::GlobalVersion)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches();
-    /// // running `$ myprog test --version` will display
-    /// // "myprog-test v1.1"
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    GlobalVersion,
-
-    /// Specifies that this [`SubCommand`] should be hidden from help messages
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("test")
-    ///     .setting(AppSettings::Hidden))
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    Hidden,
-
-    /// Tells `clap` *not* to print possible values when displaying help information.
-    /// This can be useful if there are many values, or they are explained elsewhere.
-    HidePossibleValuesInHelp,
-
-    /// Tries to match unknown args to partial [`subcommands`] or their [aliases]. For example to
-    /// match a subcommand named `test`, one could use `t`, `te`, `tes`, and `test`.
-    ///
-    /// **NOTE:** The match *must not* be ambiguous at all in order to succeed. i.e. to match `te`
-    /// to `test` there could not also be a subcommand or alias `temp` because both start with `te`
-    ///
-    /// **CAUTION:** This setting can interfere with [positional/free arguments], take care when
-    /// designing CLIs which allow inferred subcommands and have potential positional/free
-    /// arguments whose values could start with the same characters as subcommands. If this is the
-    /// case, it's recommended to use settings such as [`AppSeettings::ArgsNegateSubcommands`] in
-    /// conjuction with this setting.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// let m = App::new("prog")
-    ///     .setting(AppSettings::InferSubcommands)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "te"
-    ///     ]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`subcommands`]: ./struct.SubCommand.html
-    /// [positional/free arguments]: ./struct.Arg.html#method.index
-    /// [aliases]: ./struct.App.html#method.alias
-    /// [`AppSeettings::ArgsNegateSubcommands`]: ./enum.AppSettings.html#variant.ArgsNegateSubcommands
-    InferSubcommands,
-
-    /// Specifies that the parser should not assume the first argument passed is the binary name.
-    /// This is normally the case when using a "daemon" style mode, or an interactive CLI where one
-    /// one would not normally type the binary or program name for each command.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::NoBinaryName)
-    ///     .arg(Arg::from_usage("<cmd>... 'commands to run'"))
-    ///     .get_matches_from(vec!["command", "set"]);
-    ///
-    /// let cmds: Vec<&str> = m.values_of("cmd").unwrap().collect();
-    /// assert_eq!(cmds, ["command", "set"]);
-    /// ```
-    NoBinaryName,
-
-    /// Places the help string for all arguments on the line after the argument.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::NextLineHelp)
-    ///     .get_matches();
-    /// ```
-    NextLineHelp,
-
-    /// Specifies that the parser should propagate global arg's values down through any *used* child
-    /// subcommands. Meaning, if a subcommand wasn't used, the values won't be propagated down to
-    /// said subcommand.
-    ///
-    /// **NOTE:** Values are only propagated *down* through futher child commands, not up
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::PropagateGlobalValuesDown)
-    ///     .arg(Arg::from_usage("[cmd] 'command to run'")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("foo"))
-    ///     .get_matches_from(vec!["myprog", "set", "foo"]);
-    ///
-    /// assert_eq!(m.value_of("cmd"), Some("set"));
-    ///
-    /// let sub_m = m.subcommand_matches("foo").unwrap();
-    /// assert_eq!(sub_m.value_of("cmd"), Some("set"));
-    /// ```
-    /// Now doing the same thing, but *not* using any subcommands will result in the value not being
-    /// propagated down.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::PropagateGlobalValuesDown)
-    ///     .arg(Arg::from_usage("[cmd] 'command to run'")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("foo"))
-    ///     .get_matches_from(vec!["myprog", "set"]);
-    ///
-    /// assert_eq!(m.value_of("cmd"), Some("set"));
-    ///
-    /// assert!(m.subcommand_matches("foo").is_none());
-    /// ```
-    PropagateGlobalValuesDown,
-
-    /// Allows [`SubCommand`]s to override all requirements of the parent command.
-    /// For example if you had a subcommand or top level application with a required argument
-    /// that is only required as long as there is no subcommand present,
-    /// using this setting would allow you to set those arguments to [`Arg::required(true)`]
-    /// and yet receive no error so long as the user uses a valid subcommand instead.
-    ///
-    /// **NOTE:** This defaults to false (using subcommand does *not* negate requirements)
-    ///
-    /// # Examples
-    ///
-    /// This first example shows that it is an error to not use a required argument
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandsNegateReqs)
-    ///     .arg(Arg::with_name("opt").required(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog"
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// # ;
-    /// ```
-    ///
-    /// This next example shows that it is no longer error to not use a required argument if a
-    /// valid subcommand is used.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
-    /// let noerr = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandsNegateReqs)
-    ///     .arg(Arg::with_name("opt").required(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test"
-    ///     ]);
-    /// assert!(noerr.is_ok());
-    /// # ;
-    /// ```
-    /// [`Arg::required(true)`]: ./struct.Arg.html#method.required
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    SubcommandsNegateReqs,
-
-    /// Specifies that the help text should be displayed (before exiting gracefully) if no
-    /// [`SubCommand`]s are present at runtime (i.e. an empty run such as `$ myprog`).
-    ///
-    /// **NOTE:** This should *not* be used with [`AppSettings::SubcommandRequired`] as they do
-    /// nearly same thing; this prints the help text, and the other prints an error.
-    ///
-    /// **NOTE:** If the user specifies arguments at runtime, but no subcommand the help text will
-    /// still be displayed and exit. If this is *not* the desired result, consider using
-    /// [`AppSettings::ArgRequiredElseHelp`] instead.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequiredElseHelp)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings::SubcommandRequired`]: ./enum.AppSettings.html#variant.SubcommandRequired
-    /// [`AppSettings::ArgRequiredElseHelp`]: ./enum.AppSettings.html#variant.ArgRequiredElseHelp
-    SubcommandRequiredElseHelp,
-
-    /// Specifies that any invalid UTF-8 code points should be treated as an error and fail
-    /// with a [`ErrorKind::InvalidUtf8`] error.
-    ///
-    /// **NOTE:** This rule only applies to argument values; Things such as flags, options, and
-    /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
-    ///
-    /// # Platform Specific
-    ///
-    /// Non Windows systems only
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, AppSettings, ErrorKind};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::OsStringExt;
-    ///
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::StrictUtf8)
-    ///     .arg_from_usage("<arg> 'some positional arg'")
-    ///     .get_matches_from_safe(
-    ///         vec![
-    ///             OsString::from("myprog"),
-    ///             OsString::from_vec(vec![0xe9])]);
-    ///
-    /// assert!(m.is_err());
-    /// assert_eq!(m.unwrap_err().kind, ErrorKind::InvalidUtf8);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ErrorKind::InvalidUtf8`]: ./enum.ErrorKind.html#variant.InvalidUtf8
-    StrictUtf8,
-
-    /// Allows specifying that if no [`SubCommand`] is present at runtime,
-    /// error and exit gracefully.
-    ///
-    /// **NOTE:** This defaults to `false` (subcommands do *not* need to be present)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog",
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingSubcommand);
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    SubcommandRequired,
-
-    /// Specifies that the final positional argument is a "VarArg" and that `clap` should not
-    /// attempt to parse any further args.
-    ///
-    /// The values of the trailing positional argument will contain all args from itself on.
-    ///
-    /// **NOTE:** The final positional argument **must** have [`Arg::multiple(true)`] or the usage
-    /// string equivalent.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::TrailingVarArg)
-    ///     .arg(Arg::from_usage("<cmd>... 'commands to run'"))
-    ///     .get_matches_from(vec!["myprog", "arg1", "-r", "val1"]);
-    ///
-    /// let trail: Vec<&str> = m.values_of("cmd").unwrap().collect();
-    /// assert_eq!(trail, ["arg1", "-r", "val1"]);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    TrailingVarArg,
-
-    /// Groups flags and options together, presenting a more unified help message
-    /// (a la `getopts` or `docopt` style).
-    ///
-    /// The default is that the auto-generated help message will group flags, and options
-    /// separately.
-    ///
-    /// **NOTE:** This setting is cosmetic only and does not affect any functionality.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::UnifiedHelpMessage)
-    ///     .get_matches();
-    /// // running `myprog --help` will display a unified "docopt" or "getopts" style help message
-    /// ```
-    UnifiedHelpMessage,
-
-    /// Disables `-V` and `--version` for all [`SubCommand`]s
-    /// (Defaults to `false`; subcommands *do* have version flags.)
-    ///
-    /// **NOTE:** This setting must be set **prior** adding any subcommands
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::VersionlessSubcommands)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    VersionlessSubcommands,
-
-    /// Will display a message "Press [ENTER]/[RETURN] to continue..." and wait for user before
-    /// exiting
-    ///
-    /// This is most useful when writing an application which is run from a GUI shortcut, or on
-    /// Windows where a user tries to open the binary by double-clicking instead of using the
-    /// command line.
-    ///
-    /// **NOTE:** This setting is **not** recursive with [`SubCommand`]s, meaning if you wish this
-    /// behavior for all subcommands, you must set this on each command (needing this is extremely
-    /// rare)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::WaitOnError)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    WaitOnError,
-
-    #[doc(hidden)]
-    NeedsLongVersion,
-
-    #[doc(hidden)]
-    NeedsLongHelp,
-
-    #[doc(hidden)]
-    NeedsSubcommandHelp,
-
-    #[doc(hidden)]
-    LowIndexMultiplePositional,
-
-    #[doc(hidden)]
-    TrailingValues,
-
-    #[doc(hidden)]
-    ValidNegNumFound,
-
-    #[doc(hidden)]
-    Propogated,
-
-    #[doc(hidden)]
-    ValidArgFound,
-
-    #[doc(hidden)]
-    ContainsLast,
-}
-
-impl FromStr for AppSettings {
-    type Err = String;
-    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
-        match &*s.to_ascii_lowercase() {
-            "argrequiredelsehelp" => Ok(AppSettings::ArgRequiredElseHelp),
-            "argsnegatesubcommands" => Ok(AppSettings::ArgsNegateSubcommands),
-            "allowinvalidutf8" => Ok(AppSettings::AllowInvalidUtf8),
-            "allowleadinghyphen" => Ok(AppSettings::AllowLeadingHyphen),
-            "allowexternalsubcommands" => Ok(AppSettings::AllowExternalSubcommands),
-            "allownegativenumbers" => Ok(AppSettings::AllowNegativeNumbers),
-            "colorauto" => Ok(AppSettings::ColorAuto),
-            "coloralways" => Ok(AppSettings::ColorAlways),
-            "colornever" => Ok(AppSettings::ColorNever),
-            "coloredhelp" => Ok(AppSettings::ColoredHelp),
-            "derivedisplayorder" => Ok(AppSettings::DeriveDisplayOrder),
-            "dontcollapseargsinusage" => Ok(AppSettings::DontCollapseArgsInUsage),
-            "dontdelimittrailingvalues" => Ok(AppSettings::DontDelimitTrailingValues),
-            "disablehelpsubcommand" => Ok(AppSettings::DisableHelpSubcommand),
-            "disableversion" => Ok(AppSettings::DisableVersion),
-            "globalversion" => Ok(AppSettings::GlobalVersion),
-            "hidden" => Ok(AppSettings::Hidden),
-            "hidepossiblevaluesinhelp" => Ok(AppSettings::HidePossibleValuesInHelp),
-            "infersubcommands" => Ok(AppSettings::InferSubcommands),
-            "lowindexmultiplepositional" => Ok(AppSettings::LowIndexMultiplePositional),
-            "nobinaryname" => Ok(AppSettings::NoBinaryName),
-            "nextlinehelp" => Ok(AppSettings::NextLineHelp),
-            "strictutf8" => Ok(AppSettings::StrictUtf8),
-            "subcommandsnegatereqs" => Ok(AppSettings::SubcommandsNegateReqs),
-            "subcommandrequired" => Ok(AppSettings::SubcommandRequired),
-            "subcommandrequiredelsehelp" => Ok(AppSettings::SubcommandRequiredElseHelp),
-            "trailingvararg" => Ok(AppSettings::TrailingVarArg),
-            "unifiedhelpmessage" => Ok(AppSettings::UnifiedHelpMessage),
-            "versionlesssubcommands" => Ok(AppSettings::VersionlessSubcommands),
-            "waitonerror" => Ok(AppSettings::WaitOnError),
-            "validnegnumfound" => Ok(AppSettings::ValidNegNumFound),
-            "validargfound" => Ok(AppSettings::ValidArgFound),
-            "propogated" => Ok(AppSettings::Propogated),
-            "trailingvalues" => Ok(AppSettings::TrailingValues),
-            _ => Err("unknown AppSetting, cannot convert from str".to_owned()),
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::AppSettings;
-
-    #[test]
-    fn app_settings_fromstr() {
-        assert_eq!("argsnegatesubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::ArgsNegateSubcommands);
-        assert_eq!("argrequiredelsehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::ArgRequiredElseHelp);
-        assert_eq!("allowexternalsubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowExternalSubcommands);
-        assert_eq!("allowinvalidutf8".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowInvalidUtf8);
-        assert_eq!("allowleadinghyphen".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowLeadingHyphen);
-        assert_eq!("allownegativenumbers".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowNegativeNumbers);
-        assert_eq!("coloredhelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColoredHelp);
-        assert_eq!("colorauto".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorAuto);
-        assert_eq!("coloralways".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorAlways);
-        assert_eq!("colornever".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorNever);
-        assert_eq!("disablehelpsubcommand".parse::<AppSettings>().unwrap(),
-                   AppSettings::DisableHelpSubcommand);
-        assert_eq!("disableversion".parse::<AppSettings>().unwrap(),
-                   AppSettings::DisableVersion);
-        assert_eq!("dontcollapseargsinusage".parse::<AppSettings>().unwrap(),
-                   AppSettings::DontCollapseArgsInUsage);
-        assert_eq!("dontdelimittrailingvalues".parse::<AppSettings>().unwrap(),
-                   AppSettings::DontDelimitTrailingValues);
-        assert_eq!("derivedisplayorder".parse::<AppSettings>().unwrap(),
-                   AppSettings::DeriveDisplayOrder);
-        assert_eq!("globalversion".parse::<AppSettings>().unwrap(),
-                   AppSettings::GlobalVersion);
-        assert_eq!("hidden".parse::<AppSettings>().unwrap(),
-                   AppSettings::Hidden);
-        assert_eq!("hidepossiblevaluesinhelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::HidePossibleValuesInHelp);
-        assert_eq!("lowindexmultiplePositional".parse::<AppSettings>().unwrap(),
-                   AppSettings::LowIndexMultiplePositional);
-        assert_eq!("nobinaryname".parse::<AppSettings>().unwrap(),
-                   AppSettings::NoBinaryName);
-        assert_eq!("nextlinehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::NextLineHelp);
-        assert_eq!("subcommandsnegatereqs".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandsNegateReqs);
-        assert_eq!("subcommandrequired".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandRequired);
-        assert_eq!("subcommandrequiredelsehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandRequiredElseHelp);
-        assert_eq!("strictutf8".parse::<AppSettings>().unwrap(),
-                   AppSettings::StrictUtf8);
-        assert_eq!("trailingvararg".parse::<AppSettings>().unwrap(),
-                   AppSettings::TrailingVarArg);
-        assert_eq!("unifiedhelpmessage".parse::<AppSettings>().unwrap(),
-                   AppSettings::UnifiedHelpMessage);
-        assert_eq!("versionlesssubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::VersionlessSubcommands);
-        assert_eq!("waitonerror".parse::<AppSettings>().unwrap(),
-                   AppSettings::WaitOnError);
-        assert_eq!("validnegnumfound".parse::<AppSettings>().unwrap(),
-                   AppSettings::ValidNegNumFound);
-        assert_eq!("validargfound".parse::<AppSettings>().unwrap(),
-                   AppSettings::ValidArgFound);
-        assert_eq!("propogated".parse::<AppSettings>().unwrap(),
-                   AppSettings::Propogated);
-        assert_eq!("trailingvalues".parse::<AppSettings>().unwrap(),
-                   AppSettings::TrailingValues);
-        assert_eq!("infersubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::InferSubcommands);
-        assert!("hahahaha".parse::<AppSettings>().is_err());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/usage.rs
+++ /dev/null
@@ -1,439 +0,0 @@
-// std
-use std::collections::{BTreeMap, VecDeque};
-
-// Internal
-use INTERNAL_ERROR_MSG;
-use args::{AnyArg, ArgMatcher, PosBuilder};
-use args::settings::ArgSettings;
-use app::settings::AppSettings as AS;
-use app::parser::Parser;
-
-// Creates a usage string for display. This happens just after all arguments were parsed, but before
-// any subcommands have been parsed (so as to give subcommands their own usage recursively)
-pub fn create_usage_with_title(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::create_usage_with_title;");
-    let mut usage = String::with_capacity(75);
-    usage.push_str("USAGE:\n    ");
-    usage.push_str(&*create_usage_no_title(p, used));
-    usage
-}
-
-// Creates a usage string to be used in error message (i.e. one with currently used args)
-pub fn create_error_usage<'a, 'b>(p: &Parser<'a, 'b>,
-                                  matcher: &'b ArgMatcher<'a>,
-                                  extra: Option<&str>)
-                                  -> String {
-    let mut args: Vec<_> = matcher.arg_names()
-        .iter()
-        .filter(|n| {
-            if let Some(o) = find_by_name!(p, **n, opts, iter) {
-                !o.b.is_set(ArgSettings::Required) && !o.b.is_set(ArgSettings::Hidden)
-            } else if let Some(p) = find_by_name!(p, **n, positionals, values) {
-                !p.b.is_set(ArgSettings::Required) && p.b.is_set(ArgSettings::Hidden)
-            } else {
-                true // flags can't be required, so they're always true
-            }
-        })
-        .map(|&n| n)
-        .collect();
-    if let Some(r) = extra {
-        args.push(r);
-    }
-    create_usage_with_title(p, &*args)
-}
-
-// Creates a usage string (*without title*) if one was not provided by the user manually.
-pub fn create_usage_no_title(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::create_usage_no_title;");
-    if let Some(u) = p.meta.usage_str {
-        String::from(&*u)
-    } else if used.is_empty() {
-        create_help_usage(p, true)
-    } else {
-        create_smart_usage(p, used)
-    }
-}
-
-// Creates a usage string for display in help messages (i.e. not for errors)
-pub fn create_help_usage(p: &Parser, incl_reqs: bool) -> String {
-    let mut usage = String::with_capacity(75);
-    let name = p.meta
-        .usage
-        .as_ref()
-        .unwrap_or_else(|| {
-                            p.meta
-                                .bin_name
-                                .as_ref()
-                                .unwrap_or(&p.meta.name)
-                        });
-    usage.push_str(&*name);
-    let req_string = if incl_reqs {
-        let mut reqs: Vec<&str> = p.required().map(|r| &**r).collect();
-        reqs.sort();
-        reqs.dedup();
-        get_required_usage_from(p, &reqs, None, None, false).iter().fold(String::new(), |a, s| {
-            a + &format!(" {}", s)[..]
-        })
-    } else {
-        String::new()
-    };
-
-    let flags = needs_flags_tag(p);
-    if flags && !p.is_set(AS::UnifiedHelpMessage) {
-        usage.push_str(" [FLAGS]");
-    } else if flags {
-        usage.push_str(" [OPTIONS]");
-    }
-    if !p.is_set(AS::UnifiedHelpMessage) &&
-       p.opts.iter().any(|o| !o.is_set(ArgSettings::Required) && !o.is_set(ArgSettings::Hidden)) {
-        usage.push_str(" [OPTIONS]");
-    }
-
-    usage.push_str(&req_string[..]);
-
-    let has_last = p.positionals.values().any(|p| p.is_set(ArgSettings::Last));
-    // places a '--' in the usage string if there are args and options
-    // supporting multiple values
-    if p.opts.iter().any(|o| o.is_set(ArgSettings::Multiple)) &&
-       p.positionals.values().any(|p| !p.is_set(ArgSettings::Required)) &&
-       !p.has_visible_subcommands() && !has_last {
-        usage.push_str(" [--]");
-    }
-    let not_req_or_hidden =
-        |p: &PosBuilder| (!p.is_set(ArgSettings::Required) || p.is_set(ArgSettings::Last)) && !p.is_set(ArgSettings::Hidden);
-    if p.has_positionals() && p.positionals.values().any(not_req_or_hidden) {
-        if let Some(args_tag) = get_args_tag(p, incl_reqs) {
-            usage.push_str(&*args_tag);
-        } else {
-            usage.push_str(" [ARGS]");
-        }
-        if has_last && incl_reqs {
-            let pos = p.positionals
-                .values()
-                .find(|p| p.b.is_set(ArgSettings::Last))
-                .expect(INTERNAL_ERROR_MSG);
-            debugln!("usage::create_help_usage: '{}' has .last(true)", pos.name());
-            let req = pos.is_set(ArgSettings::Required);
-            if req && p.positionals.values().any(|p| !p.is_set(ArgSettings::Required)) {
-                usage.push_str(" -- <");
-            } else if req {
-                usage.push_str(" [--] <");
-            } else {
-                usage.push_str(" [-- <");
-            }
-            usage.push_str(&*pos.name_no_brackets());
-            usage.push_str(">");
-            usage.push_str(pos.multiple_str());
-            if !req {
-                usage.push_str("]");
-            }
-        }
-    }
-
-    // incl_reqs is only false when this function is called recursively
-    if p.has_visible_subcommands() && incl_reqs {
-        if p.is_set(AS::SubcommandsNegateReqs) || p.is_set(AS::ArgsNegateSubcommands) {
-            if !p.is_set(AS::ArgsNegateSubcommands) {
-                usage.push_str("\n    ");
-                usage.push_str(&*create_help_usage(p, false));
-                usage.push_str(" <SUBCOMMAND>");
-            } else {
-                usage.push_str("\n    ");
-                usage.push_str(&*name);
-                usage.push_str(" <SUBCOMMAND>");
-            }
-        } else if p.is_set(AS::SubcommandRequired) || p.is_set(AS::SubcommandRequiredElseHelp) {
-            usage.push_str(" <SUBCOMMAND>");
-        } else {
-            usage.push_str(" [SUBCOMMAND]");
-        }
-    }
-    usage.shrink_to_fit();
-    debugln!("usage::create_help_usage: usage={}", usage);
-    usage
-}
-
-// Creates a context aware usage string, or "smart usage" from currently used
-// args, and requirements
-fn create_smart_usage(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::smart_usage;");
-    let mut usage = String::with_capacity(75);
-    let mut hs: Vec<&str> = p.required().map(|s| &**s).collect();
-    hs.extend_from_slice(used);
-
-    let r_string =
-        get_required_usage_from(p, &hs, None, None, false).iter().fold(String::new(), |acc, s| {
-            acc + &format!(" {}", s)[..]
-        });
-
-    usage.push_str(&p.meta
-                        .usage
-                        .as_ref()
-                        .unwrap_or_else(|| {
-                                            p.meta
-                                                .bin_name
-                                                .as_ref()
-                                                .unwrap_or(&p.meta.name)
-                                        })
-                        [..]);
-    usage.push_str(&*r_string);
-    if p.is_set(AS::SubcommandRequired) {
-        usage.push_str(" <SUBCOMMAND>");
-    }
-    usage.shrink_to_fit();
-    usage
-}
-
-// Gets the `[ARGS]` tag for the usage string
-fn get_args_tag(p: &Parser, incl_reqs: bool) -> Option<String> {
-    debugln!("usage::get_args_tag;");
-    let mut count = 0;
-    'outer: for pos in p.positionals
-                    .values()
-                    .filter(|pos| !pos.is_set(ArgSettings::Required))
-                    .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                    .filter(|pos| !pos.is_set(ArgSettings::Last)) {
-        debugln!("usage::get_args_tag:iter:{}:", pos.b.name);
-        if let Some(g_vec) = p.groups_for_arg(pos.b.name) {
-            for grp_s in &g_vec {
-                debugln!("usage::get_args_tag:iter:{}:iter:{};", pos.b.name, grp_s);
-                // if it's part of a required group we don't want to count it
-                if p.groups.iter().any(|g| g.required && (&g.name == grp_s)) {
-                    continue 'outer;
-                }
-            }
-        }
-        count += 1;
-        debugln!("usage::get_args_tag:iter: {} Args not required or hidden",
-                 count);
-    }
-    if !p.is_set(AS::DontCollapseArgsInUsage) && count > 1 {
-        debugln!("usage::get_args_tag:iter: More than one, returning [ARGS]");
-        return None; // [ARGS]
-    } else if count == 1 && incl_reqs {
-        let pos = p.positionals
-            .values()
-            .find(|pos| {
-                      !pos.is_set(ArgSettings::Required) && !pos.is_set(ArgSettings::Hidden) &&
-                      !pos.is_set(ArgSettings::Last)
-                  })
-            .expect(INTERNAL_ERROR_MSG);
-        debugln!("usage::get_args_tag:iter: Exactly one, returning '{}'",
-                 pos.name());
-        return Some(format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()));
-    } else if p.is_set(AS::DontCollapseArgsInUsage) && !p.positionals.is_empty() && incl_reqs {
-        debugln!("usage::get_args_tag:iter: Don't collapse returning all");
-        return Some(p.positionals
-                        .values()
-                        .filter(|pos| !pos.is_set(ArgSettings::Required))
-                        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                        .filter(|pos| !pos.is_set(ArgSettings::Last))
-                        .map(|pos| {
-                                 format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
-                             })
-                        .collect::<Vec<_>>()
-                        .join(""));
-    } else if !incl_reqs {
-        debugln!("usage::get_args_tag:iter: incl_reqs=false, building secondary usage string");
-        let highest_req_pos = p.positionals
-            .iter()
-            .filter_map(|(idx, pos)| if pos.b.is_set(ArgSettings::Required) &&
-                                        !pos.b.is_set(ArgSettings::Last) {
-                            Some(idx)
-                        } else {
-                            None
-                        })
-            .max()
-            .unwrap_or_else(|| p.positionals.len());
-        return Some(p.positionals
-                        .iter()
-                        .filter_map(|(idx, pos)| if idx <= highest_req_pos {
-                                        Some(pos)
-                                    } else {
-                                        None
-                                    })
-                        .filter(|pos| !pos.is_set(ArgSettings::Required))
-                        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                        .filter(|pos| !pos.is_set(ArgSettings::Last))
-                        .map(|pos| {
-                                 format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
-                             })
-                        .collect::<Vec<_>>()
-                        .join(""));
-    }
-    Some("".into())
-}
-
-// Determines if we need the `[FLAGS]` tag in the usage string
-fn needs_flags_tag(p: &Parser) -> bool {
-    debugln!("usage::needs_flags_tag;");
-    'outer: for f in &p.flags {
-        debugln!("usage::needs_flags_tag:iter: f={};", f.b.name);
-        if let Some(l) = f.s.long {
-            if l == "help" || l == "version" {
-                // Don't print `[FLAGS]` just for help or version
-                continue;
-            }
-        }
-        if let Some(g_vec) = p.groups_for_arg(f.b.name) {
-            for grp_s in &g_vec {
-                debugln!("usage::needs_flags_tag:iter:iter: grp_s={};", grp_s);
-                if p.groups.iter().any(|g| &g.name == grp_s && g.required) {
-                    debugln!("usage::needs_flags_tag:iter:iter: Group is required");
-                    continue 'outer;
-                }
-            }
-        }
-        if f.is_set(ArgSettings::Hidden) {
-            continue;
-        }
-        debugln!("usage::needs_flags_tag:iter: [FLAGS] required");
-        return true;
-    }
-
-    debugln!("usage::needs_flags_tag: [FLAGS] not required");
-    false
-}
-
-// Returns the required args in usage string form by fully unrolling all groups
-pub fn get_required_usage_from<'a, 'b>(p: &Parser<'a, 'b>,
-                                       reqs: &[&'a str],
-                                       matcher: Option<&ArgMatcher<'a>>,
-                                       extra: Option<&str>,
-                                       incl_last: bool)
-                                       -> VecDeque<String> {
-    debugln!("usage::get_required_usage_from: reqs={:?}, extra={:?}",
-             reqs,
-             extra);
-    let mut desc_reqs: Vec<&str> = vec![];
-    desc_reqs.extend(extra);
-    let mut new_reqs: Vec<&str> = vec![];
-    macro_rules! get_requires {
-        (@group $a: ident, $v:ident, $p:ident) => {{
-            if let Some(rl) = p.groups.iter()
-                                            .filter(|g| g.requires.is_some())
-                                            .find(|g| &g.name == $a)
-                                            .map(|g| g.requires.as_ref().unwrap()) {
-                for r in rl {
-                    if !$p.contains(&r) {
-                        debugln!("usage::get_required_usage_from:iter:{}: adding group req={:?}",
-                            $a, r);
-                        $v.push(r);
-                    }
-                }
-            }
-        }};
-        ($a:ident, $what:ident, $how:ident, $v:ident, $p:ident) => {{
-            if let Some(rl) = p.$what.$how()
-                                        .filter(|a| a.b.requires.is_some())
-                                        .find(|arg| &arg.b.name == $a)
-                                        .map(|a| a.b.requires.as_ref().unwrap()) {
-                for &(_, r) in rl.iter() {
-                    if !$p.contains(&r) {
-                        debugln!("usage::get_required_usage_from:iter:{}: adding arg req={:?}",
-                            $a, r);
-                        $v.push(r);
-                    }
-                }
-            }
-        }};
-    }
-    // initialize new_reqs
-    for a in reqs {
-        get_requires!(a, flags, iter, new_reqs, reqs);
-        get_requires!(a, opts, iter, new_reqs, reqs);
-        get_requires!(a, positionals, values, new_reqs, reqs);
-        get_requires!(@group a, new_reqs, reqs);
-    }
-    desc_reqs.extend_from_slice(&*new_reqs);
-    debugln!("usage::get_required_usage_from: after init desc_reqs={:?}",
-             desc_reqs);
-    loop {
-        let mut tmp = vec![];
-        for a in &new_reqs {
-            get_requires!(a, flags, iter, tmp, desc_reqs);
-            get_requires!(a, opts, iter, tmp, desc_reqs);
-            get_requires!(a, positionals, values, tmp, desc_reqs);
-            get_requires!(@group a, tmp, desc_reqs);
-        }
-        if tmp.is_empty() {
-            debugln!("usage::get_required_usage_from: no more children");
-            break;
-        } else {
-            debugln!("usage::get_required_usage_from: after iter tmp={:?}", tmp);
-            debugln!("usage::get_required_usage_from: after iter new_reqs={:?}",
-                     new_reqs);
-            desc_reqs.extend_from_slice(&*new_reqs);
-            new_reqs.clear();
-            new_reqs.extend_from_slice(&*tmp);
-            debugln!("usage::get_required_usage_from: after iter desc_reqs={:?}",
-                     desc_reqs);
-        }
-    }
-    desc_reqs.extend_from_slice(reqs);
-    desc_reqs.sort();
-    desc_reqs.dedup();
-    debugln!("usage::get_required_usage_from: final desc_reqs={:?}",
-             desc_reqs);
-    let mut ret_val = VecDeque::new();
-    let args_in_groups = p.groups
-        .iter()
-        .filter(|gn| desc_reqs.contains(&gn.name))
-        .flat_map(|g| p.arg_names_in_group(g.name))
-        .collect::<Vec<_>>();
-
-    let pmap = if let Some(m) = matcher {
-        desc_reqs.iter()
-            .filter(|a| p.positionals.values().any(|p| &&p.b.name == a))
-            .filter(|&pos| !m.contains(pos))
-            .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
-            .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
-            .filter(|pos| !args_in_groups.contains(&pos.b.name))
-            .map(|pos| (pos.index, pos))
-            .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
-    } else {
-        desc_reqs.iter()
-            .filter(|a| p.positionals.values().any(|pos| &&pos.b.name == a))
-            .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
-            .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
-            .filter(|pos| !args_in_groups.contains(&pos.b.name))
-            .map(|pos| (pos.index, pos))
-            .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
-    };
-    debugln!("usage::get_required_usage_from: args_in_groups={:?}",
-             args_in_groups);
-    for &p in pmap.values() {
-        let s = p.to_string();
-        if args_in_groups.is_empty() || !args_in_groups.contains(&&*s) {
-            ret_val.push_back(s);
-        }
-    }
-    for a in desc_reqs.iter()
-            .filter(|name| !p.positionals.values().any(|p| &&p.b.name == name))
-            .filter(|name| !p.groups.iter().any(|g| &&g.name == name))
-            .filter(|name| !args_in_groups.contains(name))
-            .filter(|name| !(matcher.is_some() && matcher.as_ref().unwrap().contains(name))) {
-        debugln!("usage::get_required_usage_from:iter:{}:", a);
-        let arg = find_by_name!(p, *a, flags, iter)
-            .map(|f| f.to_string())
-            .unwrap_or_else(|| {
-                                find_by_name!(p, *a, opts, iter)
-                                    .map(|o| o.to_string())
-                                    .expect(INTERNAL_ERROR_MSG)
-                            });
-        ret_val.push_back(arg);
-    }
-    let mut g_vec: Vec<String> = vec![];
-    for g in desc_reqs.iter().filter(|n| p.groups.iter().any(|g| &&g.name == n)) {
-        let g_string = p.args_in_group(g).join("|");
-        let elem = format!("<{}>", &g_string[..g_string.len()]);
-        if !g_vec.contains(&elem) {
-            g_vec.push(elem);
-        }
-    }
-    for g in g_vec {
-        ret_val.push_back(g);
-    }
-
-    ret_val
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/app/validator.rs
+++ /dev/null
@@ -1,456 +0,0 @@
-// std
-use std::fmt::Display;
-
-// Internal
-use INTERNAL_ERROR_MSG;
-use INVALID_UTF8;
-use args::{AnyArg, ArgMatcher, MatchedArg};
-use args::settings::ArgSettings;
-use errors::{Error, ErrorKind};
-use errors::Result as ClapResult;
-use osstringext::OsStrExt2;
-use app::settings::AppSettings as AS;
-use app::parser::{Parser, ParseResult};
-use fmt::{Colorizer, ColorizerOption};
-use app::usage;
-
-pub struct Validator<'a, 'b, 'z>(&'z mut Parser<'a, 'b>)
-    where 'a: 'b,
-          'b: 'z;
-
-impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
-    pub fn new(p: &'z mut Parser<'a, 'b>) -> Self { Validator(p) }
-
-    pub fn validate(&mut self,
-                    needs_val_of: ParseResult<'a>,
-                    subcmd_name: Option<String>,
-                    matcher: &mut ArgMatcher<'a>)
-                    -> ClapResult<()> {
-        debugln!("Validator::validate;");
-        let mut reqs_validated = false;
-        try!(self.0.add_defaults(matcher));
-        if let ParseResult::Opt(a) = needs_val_of {
-            debugln!("Validator::validate: needs_val_of={:?}", a);
-            let o = self.0
-                .opts
-                .iter()
-                .find(|o| o.b.name == a)
-                .expect(INTERNAL_ERROR_MSG);
-            try!(self.validate_required(matcher));
-            reqs_validated = true;
-            let should_err = if let Some(v) = matcher.0.args.get(&*o.b.name) {
-                v.vals.is_empty() && !(o.v.min_vals.is_some() && o.v.min_vals.unwrap() == 0)
-            } else {
-                true
-            };
-            if should_err {
-                return Err(Error::empty_value(o,
-                                              &*usage::create_error_usage(self.0, matcher, None),
-                                              self.0.color()));
-            }
-        }
-
-        if matcher.is_empty() && matcher.subcommand_name().is_none() &&
-           self.0.is_set(AS::ArgRequiredElseHelp) {
-            let mut out = vec![];
-            try!(self.0.write_help_err(&mut out));
-            return Err(Error {
-                           message: String::from_utf8_lossy(&*out).into_owned(),
-                           kind: ErrorKind::MissingArgumentOrSubcommand,
-                           info: None,
-                       });
-        }
-        try!(self.validate_blacklist(matcher));
-        if !(self.0.is_set(AS::SubcommandsNegateReqs) && subcmd_name.is_some()) && !reqs_validated {
-            try!(self.validate_required(matcher));
-        }
-        try!(self.validate_matched_args(matcher));
-        matcher.usage(usage::create_usage_with_title(self.0, &[]));
-
-        Ok(())
-    }
-
-    fn validate_values<A>(&self,
-                          arg: &A,
-                          ma: &MatchedArg,
-                          matcher: &ArgMatcher<'a>)
-                          -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Validator::validate_values: arg={:?}", arg.name());
-        for val in &ma.vals {
-            if self.0.is_set(AS::StrictUtf8) && val.to_str().is_none() {
-                debugln!("Validator::validate_values: invalid UTF-8 found in val {:?}",
-                         val);
-                return Err(Error::invalid_utf8(&*usage::create_error_usage(self.0, matcher, None),
-                                               self.0.color()));
-            }
-            if let Some(p_vals) = arg.possible_vals() {
-                debugln!("Validator::validate_values: possible_vals={:?}", p_vals);
-                let val_str = val.to_string_lossy();
-                if !p_vals.contains(&&*val_str) {
-                    return Err(Error::invalid_value(val_str,
-                                                    p_vals,
-                                                    arg,
-                                                    &*usage::create_error_usage(self.0,
-                                                                                matcher,
-                                                                                None),
-                                                    self.0.color()));
-                }
-            }
-            if !arg.is_set(ArgSettings::EmptyValues) && val.is_empty_() &&
-               matcher.contains(&*arg.name()) {
-                debugln!("Validator::validate_values: illegal empty val found");
-                return Err(Error::empty_value(arg,
-                                              &*usage::create_error_usage(self.0, matcher, None),
-                                              self.0.color()));
-            }
-            if let Some(vtor) = arg.validator() {
-                debug!("Validator::validate_values: checking validator...");
-                if let Err(e) = vtor(val.to_string_lossy().into_owned()) {
-                    sdebugln!("error");
-                    return Err(Error::value_validation(Some(arg), e, self.0.color()));
-                } else {
-                    sdebugln!("good");
-                }
-            }
-            if let Some(vtor) = arg.validator_os() {
-                debug!("Validator::validate_values: checking validator_os...");
-                if let Err(e) = vtor(val) {
-                    sdebugln!("error");
-                    return Err(Error::value_validation(Some(arg),
-                                                       (*e).to_string_lossy().to_string(),
-                                                       self.0.color()));
-                } else {
-                    sdebugln!("good");
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_blacklist(&self, matcher: &mut ArgMatcher) -> ClapResult<()> {
-        debugln!("Validator::validate_blacklist: blacklist={:?}",
-                 self.0.blacklist);
-        macro_rules! build_err {
-            ($p:expr, $name:expr, $matcher:ident) => ({
-                debugln!("build_err!: name={}", $name);
-                let mut c_with = find_from!($p, &$name, blacklist, &$matcher);
-                c_with = c_with.or(
-                    $p.find_any_arg(&$name).map_or(None, |aa| aa.blacklist())
-                                           .map_or(None, 
-                                                |bl| bl.iter().find(|arg| $matcher.contains(arg)))
-                                           .map_or(None, |an| $p.find_any_arg(an))
-                                           .map_or(None, |aa| Some(format!("{}", aa)))
-                );
-                debugln!("build_err!: '{:?}' conflicts with '{}'", c_with, &$name);
-                $matcher.remove(&$name);
-                let usg = usage::create_error_usage($p, $matcher, None);
-                if let Some(f) = find_by_name!($p, $name, flags, iter) {
-                    debugln!("build_err!: It was a flag...");
-                    Error::argument_conflict(f, c_with, &*usg, self.0.color())
-                } else if let Some(o) = find_by_name!($p, $name, opts, iter) {
-                   debugln!("build_err!: It was an option...");
-                    Error::argument_conflict(o, c_with, &*usg, self.0.color())
-                } else {
-                    match find_by_name!($p, $name, positionals, values) {
-                        Some(p) => {
-                            debugln!("build_err!: It was a positional...");
-                            Error::argument_conflict(p, c_with, &*usg, self.0.color())
-                        },
-                        None    => panic!(INTERNAL_ERROR_MSG)
-                    }
-                }
-            });
-        }
-
-        for name in &self.0.blacklist {
-            debugln!("Validator::validate_blacklist:iter: Checking blacklisted name: {}",
-                     name);
-            if self.0.groups.iter().any(|g| &g.name == name) {
-                debugln!("Validator::validate_blacklist:iter: groups contains it...");
-                for n in self.0.arg_names_in_group(name) {
-                    debugln!("Validator::validate_blacklist:iter:iter: Checking arg '{}' in group...",
-                             n);
-                    if matcher.contains(n) {
-                        debugln!("Validator::validate_blacklist:iter:iter: matcher contains it...");
-                        return Err(build_err!(self.0, n, matcher));
-                    }
-                }
-            } else if matcher.contains(name) {
-                debugln!("Validator::validate_blacklist:iter: matcher contains it...");
-                return Err(build_err!(self.0, *name, matcher));
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_matched_args(&self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-        debugln!("Validator::validate_matched_args;");
-        for (name, ma) in matcher.iter() {
-            debugln!("Validator::validate_matched_args:iter:{}: vals={:#?}",
-                     name,
-                     ma.vals);
-            if let Some(opt) = find_by_name!(self.0, *name, opts, iter) {
-                try!(self.validate_arg_num_vals(opt, ma, matcher));
-                try!(self.validate_values(opt, ma, matcher));
-                try!(self.validate_arg_requires(opt, ma, matcher));
-                try!(self.validate_arg_num_occurs(opt, ma, matcher));
-            } else if let Some(flag) = find_by_name!(self.0, *name, flags, iter) {
-                try!(self.validate_arg_requires(flag, ma, matcher));
-                try!(self.validate_arg_num_occurs(flag, ma, matcher));
-            } else if let Some(pos) = find_by_name!(self.0, *name, positionals, values) {
-                try!(self.validate_arg_num_vals(pos, ma, matcher));
-                try!(self.validate_arg_num_occurs(pos, ma, matcher));
-                try!(self.validate_values(pos, ma, matcher));
-                try!(self.validate_arg_requires(pos, ma, matcher));
-            } else {
-                let grp = self.0
-                    .groups
-                    .iter()
-                    .find(|g| &g.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                if let Some(ref g_reqs) = grp.requires {
-                    if g_reqs.iter().any(|&n| !matcher.contains(n)) {
-                        return self.missing_required_error(matcher, None);
-                    }
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_arg_num_occurs<A>(&self,
-                                  a: &A,
-                                  ma: &MatchedArg,
-                                  matcher: &ArgMatcher)
-                                  -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Validator::validate_arg_num_occurs: a={};", a.name());
-        if ma.occurs > 1 && !a.is_set(ArgSettings::Multiple) {
-            // Not the first time, and we don't allow multiples
-            return Err(Error::unexpected_multiple_usage(a,
-                                                        &*usage::create_error_usage(self.0,
-                                                                                    matcher,
-                                                                                    None),
-                                                        self.0.color()));
-        }
-        Ok(())
-    }
-
-    fn validate_arg_num_vals<A>(&self,
-                                a: &A,
-                                ma: &MatchedArg,
-                                matcher: &ArgMatcher)
-                                -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Validator::validate_arg_num_vals;");
-        if let Some(num) = a.num_vals() {
-            debugln!("Validator::validate_arg_num_vals: num_vals set...{}", num);
-            let should_err = if a.is_set(ArgSettings::Multiple) {
-                ((ma.vals.len() as u64) % num) != 0
-            } else {
-                num != (ma.vals.len() as u64)
-            };
-            if should_err {
-                debugln!("Validator::validate_arg_num_vals: Sending error WrongNumberOfValues");
-                return Err(Error::wrong_number_of_values(a,
-                                                         num,
-                                                         if a.is_set(ArgSettings::Multiple) {
-                                                             (ma.vals.len() % num as usize)
-                                                         } else {
-                                                             ma.vals.len()
-                                                         },
-                                                         if ma.vals.len() == 1 ||
-                                                            (a.is_set(ArgSettings::Multiple) &&
-                                                             (ma.vals.len() % num as usize) ==
-                                                             1) {
-                                                             "as"
-                                                         } else {
-                                                             "ere"
-                                                         },
-                                                         &*usage::create_error_usage(self.0,
-                                                                                     matcher,
-                                                                                     None),
-                                                         self.0.color()));
-            }
-        }
-        if let Some(num) = a.max_vals() {
-            debugln!("Validator::validate_arg_num_vals: max_vals set...{}", num);
-            if (ma.vals.len() as u64) > num {
-                debugln!("Validator::validate_arg_num_vals: Sending error TooManyValues");
-                return Err(Error::too_many_values(ma.vals
-                                                      .iter()
-                                                      .last()
-                                                      .expect(INTERNAL_ERROR_MSG)
-                                                      .to_str()
-                                                      .expect(INVALID_UTF8),
-                                                  a,
-                                                  &*usage::create_error_usage(self.0,
-                                                                              matcher,
-                                                                              None),
-                                                  self.0.color()));
-            }
-        }
-        if let Some(num) = a.min_vals() {
-            debugln!("Validator::validate_arg_num_vals: min_vals set: {}", num);
-            if (ma.vals.len() as u64) < num {
-                debugln!("Validator::validate_arg_num_vals: Sending error TooFewValues");
-                return Err(Error::too_few_values(a,
-                                                 num,
-                                                 ma.vals.len(),
-                                                 &*usage::create_error_usage(self.0,
-                                                                             matcher,
-                                                                             None),
-                                                 self.0.color()));
-            }
-        }
-        // Issue 665 (https://github.com/kbknapp/clap-rs/issues/665)
-        if a.takes_value() && !a.is_set(ArgSettings::EmptyValues) && ma.vals.is_empty() {
-            return Err(Error::empty_value(a,
-                                          &*usage::create_error_usage(self.0, matcher, None),
-                                          self.0.color()));
-        }
-        Ok(())
-    }
-
-    fn validate_arg_requires<A>(&self,
-                                a: &A,
-                                ma: &MatchedArg,
-                                matcher: &ArgMatcher)
-                                -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
-    {
-        debugln!("Validator::validate_arg_requires;");
-        if let Some(a_reqs) = a.requires() {
-            for &(val, name) in a_reqs.iter().filter(|&&(val, _)| val.is_some()) {
-                let missing_req =
-                    |v| v == val.expect(INTERNAL_ERROR_MSG) && !matcher.contains(name);
-                if ma.vals.iter().any(missing_req) {
-                    return self.missing_required_error(matcher, None);
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_required(&self, matcher: &ArgMatcher) -> ClapResult<()> {
-        debugln!("Validator::validate_required: required={:?};",
-                 self.0.required);
-        'outer: for name in &self.0.required {
-            debugln!("Validator::validate_required:iter:{}:", name);
-            if matcher.contains(name) {
-                continue 'outer;
-            }
-            if let Some(a) = find_by_name!(self.0, *name, flags, iter) {
-                if self.is_missing_required_ok(a, matcher) {
-                    continue 'outer;
-                }
-            } else if let Some(a) = find_by_name!(self.0, *name, opts, iter) {
-                if self.is_missing_required_ok(a, matcher) {
-                    continue 'outer;
-                }
-            } else if let Some(a) = find_by_name!(self.0, *name, positionals, values) {
-                if self.is_missing_required_ok(a, matcher) {
-                    continue 'outer;
-                }
-            }
-            return self.missing_required_error(matcher, None);
-        }
-
-        // Validate the conditionally required args
-        for &(a, v, r) in &self.0.r_ifs {
-            if let Some(ma) = matcher.get(a) {
-                if matcher.get(r).is_none() && ma.vals.iter().any(|val| val == v) {
-                    return self.missing_required_error(matcher, Some(r));
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_conflicts<A>(&self, a: &A, matcher: &ArgMatcher) -> Option<bool>
-        where A: AnyArg<'a, 'b>
-    {
-        debugln!("Validator::validate_conflicts: a={:?};", a.name());
-        a.blacklist()
-            .map(|bl| {
-                bl.iter()
-                    .any(|conf| {
-                        matcher.contains(conf) ||
-                        self.0
-                            .groups
-                            .iter()
-                            .find(|g| &g.name == conf)
-                            .map_or(false, |g| g.args.iter().any(|arg| matcher.contains(arg)))
-                    })
-            })
-    }
-
-    fn validate_required_unless<A>(&self, a: &A, matcher: &ArgMatcher) -> Option<bool>
-        where A: AnyArg<'a, 'b>
-    {
-        debugln!("Validator::validate_required_unless: a={:?};", a.name());
-        macro_rules! check {
-            ($how:ident, $_self:expr, $a:ident, $m:ident) => {{
-                $a.required_unless().map(|ru| {
-                    ru.iter().$how(|n| {
-                        $m.contains(n) || {
-                            if let Some(grp) = $_self.groups.iter().find(|g| &g.name == n) {
-                                     grp.args.iter().any(|arg| $m.contains(arg))
-                            } else {
-                                false
-                            }
-                        }
-                    })
-                })
-            }}; 
-        }
-        if a.is_set(ArgSettings::RequiredUnlessAll) {
-            check!(all, self.0, a, matcher)
-        } else {
-            check!(any, self.0, a, matcher)
-        }
-    }
-
-    fn missing_required_error(&self, matcher: &ArgMatcher, extra: Option<&str>) -> ClapResult<()> {
-        debugln!("Validator::missing_required_error: extra={:?}", extra);
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: self.0.color(),
-        });
-        let mut reqs = self.0
-            .required
-            .iter()
-            .map(|&r| &*r)
-            .collect::<Vec<_>>();
-        if let Some(r) = extra {
-            reqs.push(r);
-        }
-        reqs.retain(|n| !matcher.contains(n));
-        reqs.dedup();
-        debugln!("Validator::missing_required_error: reqs={:#?}", reqs);
-        let req_args =
-            usage::get_required_usage_from(self.0, &reqs[..], Some(matcher), extra, true)
-                .iter()
-                .fold(String::new(),
-                      |acc, s| acc + &format!("\n    {}", c.error(s))[..]);
-        debugln!("Validator::missing_required_error: req_args={:#?}",
-                 req_args);
-        Err(Error::missing_required_argument(&*req_args,
-                                             &*usage::create_error_usage(self.0, matcher, extra),
-                                             self.0.color()))
-    }
-
-    #[inline]
-    fn is_missing_required_ok<A>(&self, a: &A, matcher: &ArgMatcher) -> bool
-        where A: AnyArg<'a, 'b>
-    {
-        debugln!("Validator::is_missing_required_ok: a={}", a.name());
-        self.validate_conflicts(a, matcher).unwrap_or(false) ||
-        self.validate_required_unless(a, matcher)
-            .unwrap_or(false)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/any_arg.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-// Std
-use std::rc::Rc;
-use std::fmt as std_fmt;
-use std::ffi::{OsStr, OsString};
-
-// Third Party
-use vec_map::{self, VecMap};
-
-// Internal
-use args::settings::ArgSettings;
-
-#[doc(hidden)]
-pub trait AnyArg<'n, 'e>: std_fmt::Display {
-    fn name(&self) -> &'n str;
-    fn overrides(&self) -> Option<&[&'e str]>;
-    fn aliases(&self) -> Option<Vec<&'e str>>;
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]>;
-    fn blacklist(&self) -> Option<&[&'e str]>;
-    fn required_unless(&self) -> Option<&[&'e str]>;
-    fn is_set(&self, ArgSettings) -> bool;
-    fn set(&mut self, ArgSettings);
-    fn has_switch(&self) -> bool;
-    fn max_vals(&self) -> Option<u64>;
-    fn min_vals(&self) -> Option<u64>;
-    fn num_vals(&self) -> Option<u64>;
-    fn possible_vals(&self) -> Option<&[&'e str]>;
-    fn validator(&self) -> Option<&Rc<Fn(String) -> Result<(), String>>>;
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> Result<(), OsString>>>;
-    fn short(&self) -> Option<char>;
-    fn long(&self) -> Option<&'e str>;
-    fn val_delim(&self) -> Option<char>;
-    fn takes_value(&self) -> bool;
-    fn val_names(&self) -> Option<&VecMap<&'e str>>;
-    fn help(&self) -> Option<&'e str>;
-    fn long_help(&self) -> Option<&'e str>;
-    fn default_val(&self) -> Option<&'e OsStr>;
-    fn default_vals_ifs(&self) -> Option<vec_map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>>;
-    fn longest_filter(&self) -> bool;
-    fn val_terminator(&self) -> Option<&'e str>;
-}
-
-pub trait DispOrder {
-    fn disp_ord(&self) -> usize;
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg.rs
+++ /dev/null
@@ -1,3469 +0,0 @@
-#[cfg(feature = "yaml")]
-use std::collections::BTreeMap;
-use std::rc::Rc;
-use std::ffi::{OsString, OsStr};
-#[cfg(target_os="windows")]
-use osstringext::OsStrExt3;
-#[cfg(not(target_os="windows"))]
-use std::os::unix::ffi::OsStrExt;
-
-
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-use vec_map::VecMap;
-
-use usage_parser::UsageParser;
-use args::settings::ArgSettings;
-use args::arg_builder::{Base, Valued, Switched};
-
-/// The abstract representation of a command line argument. Used to set all the options and
-/// relationships that define a valid argument for the program.
-///
-/// There are two methods for constructing [`Arg`]s, using the builder pattern and setting options
-/// manually, or using a usage string which is far less verbose but has fewer options. You can also
-/// use a combination of the two methods to achieve the best of both worlds.
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::Arg;
-/// // Using the traditional builder pattern and setting each option manually
-/// let cfg = Arg::with_name("config")
-///       .short("c")
-///       .long("config")
-///       .takes_value(true)
-///       .value_name("FILE")
-///       .help("Provides a config file to myprog");
-/// // Using a usage string (setting a similar argument to the one above)
-/// let input = Arg::from_usage("-i, --input=[FILE] 'Provides an input file to the program'");
-/// ```
-/// [`Arg`]: ./struct.Arg.html
-#[allow(missing_debug_implementations)]
-#[derive(Default, Clone)]
-pub struct Arg<'a, 'b>
-    where 'a: 'b
-{
-    #[doc(hidden)]
-    pub b: Base<'a, 'b>,
-    #[doc(hidden)]
-    pub s: Switched<'b>,
-    #[doc(hidden)]
-    pub v: Valued<'a, 'b>,
-    #[doc(hidden)]
-    pub index: Option<u64>,
-    #[doc(hidden)]
-    pub r_ifs: Option<Vec<(&'a str, &'b str)>>,
-}
-
-impl<'a, 'b> Arg<'a, 'b> {
-    /// Creates a new instance of [`Arg`] using a unique string name. The name will be used to get
-    /// information about whether or not the argument was used at runtime, get values, set
-    /// relationships with other args, etc..
-    ///
-    /// **NOTE:** In the case of arguments that take values (i.e. [`Arg::takes_value(true)`])
-    /// and positional arguments (i.e. those without a preceding `-` or `--`) the name will also
-    /// be displayed when the user prints the usage/help information of the program.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    /// # ;
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn with_name(n: &'a str) -> Self { Arg { b: Base::new(n), ..Default::default() } }
-
-    /// Creates a new instance of [`Arg`] from a .yml (YAML) file.
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::Arg;
-    /// # fn main() {
-    /// let yml = load_yaml!("arg.yml");
-    /// let arg = Arg::from_yaml(yml);
-    /// # }
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(y: &BTreeMap<Yaml, Yaml>) -> Arg {
-        // We WANT this to panic on error...so expect() is good.
-        let name_yml = y.keys().nth(0).unwrap();
-        let name_str = name_yml.as_str().unwrap();
-        let mut a = Arg::with_name(name_str);
-        let arg_settings = y.get(name_yml).unwrap().as_hash().unwrap();
-
-        for (k, v) in arg_settings.iter() {
-            a = match k.as_str().unwrap() {
-                "short" => yaml_to_str!(a, v, short),
-                "long" => yaml_to_str!(a, v, long),
-                "aliases" => yaml_vec_or_str!(v, a, alias),
-                "help" => yaml_to_str!(a, v, help),
-                "long_help" => yaml_to_str!(a, v, long_help),
-                "required" => yaml_to_bool!(a, v, required),
-                "required_if" => yaml_tuple2!(a, v, required_if),
-                "required_ifs" => yaml_tuple2!(a, v, required_if),
-                "takes_value" => yaml_to_bool!(a, v, takes_value),
-                "index" => yaml_to_u64!(a, v, index),
-                "global" => yaml_to_bool!(a, v, global),
-                "multiple" => yaml_to_bool!(a, v, multiple),
-                "hidden" => yaml_to_bool!(a, v, hidden),
-                "next_line_help" => yaml_to_bool!(a, v, next_line_help),
-                "empty_values" => yaml_to_bool!(a, v, empty_values),
-                "group" => yaml_to_str!(a, v, group),
-                "number_of_values" => yaml_to_u64!(a, v, number_of_values),
-                "max_values" => yaml_to_u64!(a, v, max_values),
-                "min_values" => yaml_to_u64!(a, v, min_values),
-                "value_name" => yaml_to_str!(a, v, value_name),
-                "use_delimiter" => yaml_to_bool!(a, v, use_delimiter),
-                "allow_hyphen_values" => yaml_to_bool!(a, v, allow_hyphen_values),
-                "require_delimiter" => yaml_to_bool!(a, v, require_delimiter),
-                "value_delimiter" => yaml_to_str!(a, v, value_delimiter),
-                "required_unless" => yaml_to_str!(a, v, required_unless),
-                "display_order" => yaml_to_usize!(a, v, display_order),
-                "default_value" => yaml_to_str!(a, v, default_value),
-                "default_value_if" => yaml_tuple3!(a, v, default_value_if),
-                "default_value_ifs" => yaml_tuple3!(a, v, default_value_if),
-                "value_names" => yaml_vec_or_str!(v, a, value_name),
-                "groups" => yaml_vec_or_str!(v, a, group),
-                "requires" => yaml_vec_or_str!(v, a, requires),
-                "requires_if" => yaml_tuple2!(a, v, requires_if),
-                "requires_ifs" => yaml_tuple2!(a, v, requires_if),
-                "conflicts_with" => yaml_vec_or_str!(v, a, conflicts_with),
-                "overrides_with" => yaml_vec_or_str!(v, a, overrides_with),
-                "possible_values" => yaml_vec_or_str!(v, a, possible_value),
-                "required_unless_one" => yaml_vec_or_str!(v, a, required_unless),
-                "required_unless_all" => {
-                    a = yaml_vec_or_str!(v, a, required_unless);
-                    a.setb(ArgSettings::RequiredUnlessAll);
-                    a
-                }
-                s => {
-                    panic!("Unknown Arg setting '{}' in YAML file for arg '{}'",
-                           s,
-                           name_str)
-                }
-            }
-        }
-
-        a
-    }
-
-    /// Creates a new instance of [`Arg`] from a usage string. Allows creation of basic settings
-    /// for the [`Arg`]. The syntax is flexible, but there are some rules to follow.
-    ///
-    /// **NOTE**: Not all settings may be set using the usage string method. Some properties are
-    /// only available via the builder pattern.
-    ///
-    /// **NOTE**: Only ASCII values are officially supported in [`Arg::from_usage`] strings. Some
-    /// UTF-8 codepoints may work just fine, but this is not guaranteed.
-    ///
-    /// # Syntax
-    ///
-    /// Usage strings typically following the form:
-    ///
-    /// ```notrust
-    /// [explicit name] [short] [long] [value names] [help string]
-    /// ```
-    ///
-    /// This is not a hard rule as the attributes can appear in other orders. There are also
-    /// several additional sigils which denote additional settings. Below are the details of each
-    /// portion of the string.
-    ///
-    /// ### Explicit Name
-    ///
-    /// This is an optional field, if it's omitted the argument will use one of the additional
-    /// fields as the name using the following priority order:
-    ///
-    ///  * Explicit Name (This always takes precedence when present)
-    ///  * Long
-    ///  * Short
-    ///  * Value Name
-    ///
-    /// `clap` determines explicit names as the first string of characters between either `[]` or
-    /// `<>` where `[]` has the dual notation of meaning the argument is optional, and `<>` meaning
-    /// the argument is required.
-    ///
-    /// Explicit names may be followed by:
-    ///  * The multiple denotation `...`
-    ///
-    /// Example explicit names as follows (`ename` for an optional argument, and `rname` for a
-    /// required argument):
-    ///
-    /// ```notrust
-    /// [ename] -s, --long 'some flag'
-    /// <rname> -r, --longer 'some other flag'
-    /// ```
-    ///
-    /// ### Short
-    ///
-    /// This is set by placing a single character after a leading `-`.
-    ///
-    /// Shorts may be followed by
-    ///  * The multiple denotation `...`
-    ///  * An optional comma `,` which is cosmetic only
-    ///  * Value notation
-    ///
-    /// Example shorts are as follows (`-s`, and `-r`):
-    ///
-    /// ```notrust
-    /// -s, --long 'some flag'
-    /// <rname> -r [val], --longer 'some option'
-    /// ```
-    ///
-    /// ### Long
-    ///
-    /// This is set by placing a word (no spaces) after a leading `--`.
-    ///
-    /// Shorts may be followed by
-    ///  * The multiple denotation `...`
-    ///  * Value notation
-    ///
-    /// Example longs are as follows (`--some`, and `--rapid`):
-    ///
-    /// ```notrust
-    /// -s, --some 'some flag'
-    /// --rapid=[FILE] 'some option'
-    /// ```
-    ///
-    /// ### Values (Value Notation)
-    ///
-    /// This is set by placing a word(s) between `[]` or `<>` optionally after `=` (although this
-    /// is cosmetic only and does not affect functionality). If an explicit name has **not** been
-    /// set, using `<>` will denote a required argument, and `[]` will denote an optional argument
-    ///
-    /// Values may be followed by
-    ///  * The multiple denotation `...`
-    ///  * More Value notation
-    ///
-    /// More than one value will also implicitly set the arguments number of values, i.e. having
-    /// two values, `--option [val1] [val2]` specifies that in order for option to be satisified it
-    /// must receive exactly two values
-    ///
-    /// Example values are as follows (`FILE`, and `SPEED`):
-    ///
-    /// ```notrust
-    /// -s, --some [FILE] 'some option'
-    /// --rapid=<SPEED>... 'some required multiple option'
-    /// ```
-    ///
-    /// ### Help String
-    ///
-    /// The help string is denoted between a pair of single quotes `''` and may contain any
-    /// characters.
-    ///
-    /// Example help strings are as follows:
-    ///
-    /// ```notrust
-    /// -s, --some [FILE] 'some option'
-    /// --rapid=<SPEED>... 'some required multiple option'
-    /// ```
-    ///
-    /// ### Additional Sigils
-    ///
-    /// Multiple notation `...` (three consecutive dots/periods) specifies that this argument may
-    /// be used multiple times. Do not confuse multiple occurrences (`...`) with multiple values.
-    /// `--option val1 val2` is a single occurrence with multiple values. `--flag --flag` is
-    /// multiple occurrences (and then you can obviously have instances of both as well)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// App::new("prog")
-    ///     .args(&[
-    ///         Arg::from_usage("--config <FILE> 'a required file for the configuration and no short'"),
-    ///         Arg::from_usage("-d, --debug... 'turns on debugging information and allows multiples'"),
-    ///         Arg::from_usage("[input] 'an optional input file to use'")
-    /// ])
-    /// # ;
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    pub fn from_usage(u: &'a str) -> Self {
-        let parser = UsageParser::from_usage(u);
-        parser.parse()
-    }
-
-    /// Sets the short version of the argument without the preceding `-`.
-    ///
-    /// By default `clap` automatically assigns `V` and `h` to the auto-generated `version` and
-    /// `help` arguments respectively. You may use the uppercase `V` or lowercase `h` for your own
-    /// arguments, in which case `clap` simply will not assign those to the auto-generated
-    /// `version` or `help` arguments.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the [`short`] version
-    ///
-    /// # Examples
-    ///
-    /// To set [`short`] use a single valid UTF-8 code point. If you supply a leading `-` such as
-    /// `-c`, the `-` will be stripped.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .short("c")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`short`] allows using the argument via a single hyphen (`-`) such as `-c`
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .short("c"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-c"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("config"));
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn short<S: AsRef<str>>(mut self, s: S) -> Self {
-        self.s.short = s.as_ref().trim_left_matches(|c| c == '-').chars().nth(0);
-        self
-    }
-
-    /// Sets the long version of the argument without the preceding `--`.
-    ///
-    /// By default `clap` automatically assigns `version` and `help` to the auto-generated
-    /// `version` and `help` arguments respectively. You may use the word `version` or `help` for
-    /// the long form of your own arguments, in which case `clap` simply will not assign those to
-    /// the auto-generated `version` or `help` arguments.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped
-    ///
-    /// # Examples
-    ///
-    /// To set `long` use a word containing valid UTF-8 codepoints. If you supply a double leading
-    /// `--` such as `--config` they will be stripped. Hyphens in the middle of the word, however,
-    /// will *not* be stripped (i.e. `config-file` is allowed)
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("cfg")
-    ///     .long("config")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `long` allows using the argument via a double hyphen (`--`) such as `--config`
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--config"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("cfg"));
-    /// ```
-    pub fn long(mut self, l: &'b str) -> Self {
-        self.s.long = Some(l.trim_left_matches(|c| c == '-'));
-        self
-    }
-
-    /// Allows adding a [`Arg`] alias, which function as "hidden" arguments that
-    /// automatically dispatch as if this argument was used. This is more efficient, and easier
-    /// than creating multiple hidden arguments as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///             .long("test")
-    ///             .alias("alias")
-    ///             .takes_value(true))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--alias", "cool"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// assert_eq!(m.value_of("test"), Some("cool"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            als.push((name.into(), false));
-        } else {
-            self.s.aliases = Some(vec![(name.into(), false)]);
-        }
-        self
-    }
-
-    /// Allows adding [`Arg`] aliases, which function as "hidden" arguments that
-    /// automatically dispatch as if this argument was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                     .long("test")
-    ///                     .aliases(&["do-stuff", "do-tests", "tests"])
-    ///                     .help("the file to add")
-    ///                     .required(false))
-    ///             .get_matches_from(vec![
-    ///                 "prog", "--do-tests"
-    ///             ]);
-    /// assert!(m.is_present("test"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            for n in names {
-                als.push((n, false));
-            }
-        } else {
-            self.s.aliases = Some(names.iter().map(|n| (*n, false)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Allows adding a [`Arg`] alias that functions exactly like those defined with
-    /// [`Arg::alias`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                 .visible_alias("something-awesome")
-    ///                 .long("test")
-    ///                 .takes_value(true))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--something-awesome", "coffee"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// assert_eq!(m.value_of("test"), Some("coffee"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`App::alias`]: ./struct.Arg.html#method.alias
-    pub fn visible_alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            als.push((name.into(), true));
-        } else {
-            self.s.aliases = Some(vec![(name.into(), true)]);
-        }
-        self
-    }
-
-    /// Allows adding multiple [`Arg`] aliases that functions exactly like those defined
-    /// with [`Arg::aliases`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                 .long("test")
-    ///                 .visible_aliases(&["something", "awesome", "cool"]))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--awesome"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`App::aliases`]: ./struct.Arg.html#method.aliases
-    pub fn visible_aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            for n in names {
-                als.push((n, true));
-            }
-        } else {
-            self.s.aliases = Some(names.iter().map(|n| (*n, true)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets the short help text of the argument that will be displayed to the user when they print
-    /// the help information with `-h`. Typically, this is a short (one line) description of the
-    /// arg.
-    ///
-    /// **NOTE:** If only `Arg::help` is provided, and not [`Arg::long_help`] but the user requests
-    /// `--help` clap will still display the contents of `help` appropriately
-    ///
-    /// **NOTE:** Only `Arg::help` is used in completion script generation in order to be concise
-    ///
-    /// # Examples
-    ///
-    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
-    /// include a newline in the help text and have the following text be properly aligned with all
-    /// the other help text.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .help("The config file used by the myprog")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `help` displays a short message to the side of the argument when the user passes
-    /// `-h` or `--help` (by default).
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///     --config     Some help text describing the --config arg
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    /// [`Arg::long_help`]: ./struct.Arg.html#method.long_help
-    pub fn help(mut self, h: &'b str) -> Self {
-        self.b.help = Some(h);
-        self
-    }
-
-    /// Sets the long help text of the argument that will be displayed to the user when they print
-    /// the help information with `--help`. Typically this a more detailed (multi-line) message
-    /// that describes the arg.
-    ///
-    /// **NOTE:** If only `long_help` is provided, and not [`Arg::help`] but the user requests `-h`
-    /// clap will still display the contents of `long_help` appropriately
-    ///
-    /// **NOTE:** Only [`Arg::help`] is used in completion script generation in order to be concise
-    ///
-    /// # Examples
-    ///
-    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
-    /// include a newline in the help text and have the following text be properly aligned with all
-    /// the other help text.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .long_help(
-    /// "The config file used by the myprog must be in JSON format
-    /// with only valid keys and may not contain other nonsense
-    /// that cannot be read by this program. Obviously I'm going on
-    /// and on, so I'll stop now.")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `help` displays a short message to the side of the argument when the user passes
-    /// `-h` or `--help` (by default).
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .long_help(
-    /// "The config file used by the myprog must be in JSON format
-    /// with only valid keys and may not contain other nonsense
-    /// that cannot be read by this program. Obviously I'm going on
-    /// and on, so I'll stop now."))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///    --config
-    ///         The config file used by the myprog must be in JSON format
-    ///         with only valid keys and may not contain other nonsense
-    ///         that cannot be read by this program. Obviously I'm going on
-    ///         and on, so I'll stop now.
-    ///
-    /// -h, --help       
-    ///         Prints help information
-    ///
-    /// -V, --version    
-    ///         Prints version information
-    /// ```
-    /// [`Arg::help`]: ./struct.Arg.html#method.help
-    pub fn long_help(mut self, h: &'b str) -> Self {
-        self.b.long_help = Some(h);
-        self
-    }
-
-    /// Specifies that this arg is the last, or final, positional argument (i.e. has the highest
-    /// index) and is *only* able to be accessed via the `--` syntax (i.e. `$ prog args --
-    /// last_arg`). Even, if no other arguments are left to parse, if the user omits the `--` syntax
-    /// they will receive an [`UnknownArgument`] error. Setting an argument to `.last(true)` also
-    /// allows one to access this arg early using the `--` syntax. Accessing an arg early, even with
-    /// the `--` syntax is otherwise not possible.
-    ///
-    /// **NOTE:** This will change the usage string to look like `$ prog [FLAGS] [-- <ARG>]` if 
-    /// `ARG` is marked as `.last(true)`.
-    ///
-    /// **NOTE:** This setting will imply [`AppSettings::DontCollapseArgsInUsage`] because failing
-    /// to set this can make the usage string very confusing.
-    ///
-    /// **NOTE**: This setting only applies to positional arguments, and has no affect on FLAGS / 
-    /// OPTIONS
-    ///
-    /// **CAUTION:** Setting an argument to `.last(true)` *and* having child subcommands is not
-    /// recommended with the exception of *also* using [`AppSettings::ArgsNegateSubcommands`]
-    /// (or [`AppSettings::SubcommandsNegateReqs`] if the argument marked `.last(true)` is also
-    /// marked [`.required(true)`])
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("args")
-    ///     .last(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::last(true)`] ensures the arg has the highest [index] of all positional args
-    /// and requires that the `--` syntax be used to access it early.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("first"))
-    ///     .arg(Arg::with_name("second"))
-    ///     .arg(Arg::with_name("third").last(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "one", "--", "three"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// assert_eq!(m.value_of("third"), Some("three"));
-    /// assert!(m.value_of("second").is_none());
-    /// ```
-    ///
-    /// Even if the positional argument marked `.last(true)` is the only argument left to parse,
-    /// failing to use the `--` syntax results in an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("first"))
-    ///     .arg(Arg::with_name("second"))
-    ///     .arg(Arg::with_name("third").last(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "one", "two", "three"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`Arg::last(true)`]: ./struct.Arg.html#method.last
-    /// [index]: ./struct.Arg.html#method.index
-    /// [`AppSettings::DontCollapseArgsInUsage`]: ./enum.AppSettings.html#variant.DontCollapseArgsInUsage
-    /// [`AppSettings::ArgsNegateSubcommands`]: ./enum.AppSettings.html#variant.ArgsNegateSubcommands
-    /// [`AppSettings::SubcommandsNegateReqs`]: ./enum.AppSettings.html#variant.SubcommandsNegateReqs
-    /// [`.required(true)`]: ./struct.Arg.html#method.required
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    pub fn last(self, l: bool) -> Self {
-        if l {
-            self.set(ArgSettings::Last)
-        } else {
-            self.unset(ArgSettings::Last)
-        }
-    }
-
-    /// Sets whether or not the argument is required by default. Required by default means it is
-    /// required, when no other conflicting rules have been evaluated. Conflicting rules take
-    /// precedence over being required. **Default:** `false`
-    ///
-    /// **NOTE:** Flags (i.e. not positional, or arguments that take values) cannot be required by
-    /// default. This is simply because if a flag should be required, it should simply be implied
-    /// as no additional information is required from user. Flags by their very nature are simply
-    /// yes/no, or true/false.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required(true)`] requires that the argument be used at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required(true)`] and *not* supplying that argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required(true)`]: ./struct.Arg.html#method.required
-    pub fn required(self, r: bool) -> Self {
-        if r {
-            self.set(ArgSettings::Required)
-        } else {
-            self.unset(ArgSettings::Required)
-        }
-    }
-
-    /// Requires that options use the `--option=val` syntax (i.e. an equals between the option and
-    /// associated value) **Default:** `false`
-    ///
-    /// **NOTE:** This setting also removes the default of allowing empty values and implies
-    /// [`Arg::empty_values(false)`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .long("config")
-    ///     .takes_value(true)
-    ///     .require_equals(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::require_equals(true)`] requires that the option have an equals sign between
-    /// it and the associated value.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .require_equals(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config=file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::require_equals(true)`] and *not* supplying the equals will cause an error
-    /// unless [`Arg::empty_values(true)`] is set.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .require_equals(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    /// [`Arg::require_equals(true)`]: ./struct.Arg.html#method.require_equals
-    /// [`Arg::empty_values(true)`]: ./struct.Arg.html#method.empty_values
-    /// [`Arg::empty_values(false)`]: ./struct.Arg.html#method.empty_values
-    pub fn require_equals(mut self, r: bool) -> Self {
-        if r {
-            self.unsetb(ArgSettings::EmptyValues);
-            self.set(ArgSettings::RequireEquals)
-        } else {
-            self.unset(ArgSettings::RequireEquals)
-        }
-    }
-
-    /// Allows values which start with a leading hyphen (`-`)
-    ///
-    /// **WARNING**: Take caution when using this setting, combined with [`Arg::multiple(true)`] as
-    /// it this becomes ambigous `$ prog --arg -- -- val`. All three `--, --, val` will be values
-    /// when the user may have thought the second `--` would constitute the normal, "Only
-    /// positional args follow" idiom. To fix this, consider using [`Arg::number_of_values(1)`]
-    ///
-    /// **WARNING**: When building your CLIs, consider the effects of allowing leading hyphens and
-    /// the user passing in a value that matches a valid short. For example `prog -opt -F` where
-    /// `-F` is supposed to be a value, yet `-F` is *also* a valid short for anther arg. Care should
-    /// should be taken when designing these args. This is compounded by the ability to "stack"
-    /// short args. I.e. if `-val` is supposed to be a value, but `-v`, `-a`, and `-l` are all valid
-    /// shorts.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("pattern")
-    ///     .allow_hyphen_values(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("pat")
-    ///         .allow_hyphen_values(true)
-    ///         .takes_value(true)
-    ///         .long("pattern"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--pattern", "-file"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("pat"), Some("-file"));
-    /// ```
-    ///
-    /// Not setting [`Arg::allow_hyphen_values(true)`] and supplying a value which starts with a
-    /// hyphen is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("pat")
-    ///         .takes_value(true)
-    ///         .long("pattern"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--pattern", "-file"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`Arg::allow_hyphen_values(true)`]: ./struct.Arg.html#method.allow_hyphen_values
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`Arg::number_of_values(1)`]: ./struct.Arg.html#method.number_of_values
-    pub fn allow_hyphen_values(self, a: bool) -> Self {
-        if a {
-            self.set(ArgSettings::AllowLeadingHyphen)
-        } else {
-            self.unset(ArgSettings::AllowLeadingHyphen)
-        }
-    }
-    /// Sets an arg that override this arg's required setting. (i.e. this arg will be required
-    /// unless this other argument is present).
-    ///
-    /// **Pro Tip:** Using [`Arg::required_unless`] implies [`Arg::required`] and is therefore not
-    /// mandatory to also set.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless("debug")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless(name)`] requires that the argument be used at runtime
-    /// *unless* `name` is present. In the following example, the required argument is *not*
-    /// provided, but it's not an error because the `unless` arg has been supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless("dbg")
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless(name)`] and *not* supplying `name` or this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless("dbg")
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required_unless`]: ./struct.Arg.html#method.required_unless
-    /// [`Arg::required`]: ./struct.Arg.html#method.required
-    /// [`Arg::required_unless(name)`]: ./struct.Arg.html#method.required_unless
-    pub fn required_unless(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            vec.push(name);
-        } else {
-            self.b.r_unless = Some(vec![name]);
-        }
-        self.required(true)
-    }
-
-    /// Sets args that override this arg's required setting. (i.e. this arg will be required unless
-    /// all these other arguments are present).
-    ///
-    /// **NOTE:** If you wish for this argument to only be required if *one of* these args are
-    /// present see [`Arg::required_unless_one`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless_all(&["cfg", "dbg"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_all(names)`] requires that the argument be used at runtime
-    /// *unless* *all* the args in `names` are present. In the following example, the required
-    /// argument is *not* provided, but it's not an error because all the `unless` args have been
-    /// supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_all(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug", "-i", "file"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_all(names)`] and *not* supplying *all* of `names` or this
-    /// arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_all(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required_unless_one`]: ./struct.Arg.html#method.required_unless_one
-    /// [`Arg::required_unless_all(names)`]: ./struct.Arg.html#method.required_unless_all
-    pub fn required_unless_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.r_unless = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self.setb(ArgSettings::RequiredUnlessAll);
-        self.required(true)
-    }
-
-    /// Sets args that override this arg's [required] setting. (i.e. this arg will be required
-    /// unless *at least one of* these other arguments are present).
-    ///
-    /// **NOTE:** If you wish for this argument to only be required if *all of* these args are
-    /// present see [`Arg::required_unless_all`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless_all(&["cfg", "dbg"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_one(names)`] requires that the argument be used at runtime
-    /// *unless* *at least one of* the args in `names` are present. In the following example, the
-    /// required argument is *not* provided, but it's not an error because one the `unless` args
-    /// have been supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_one(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_one(names)`] and *not* supplying *at least one of* `names`
-    /// or this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_one(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required]: ./struct.Arg.html#method.required
-    /// [`Arg::required_unless_one(names)`]: ./struct.Arg.html#method.required_unless_one
-    /// [`Arg::required_unless_all`]: ./struct.Arg.html#method.required_unless_all
-    pub fn required_unless_one(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.r_unless = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self.required(true)
-    }
-
-    /// Sets a conflicting argument by name. I.e. when using this argument,
-    /// the following argument can't be present and vice versa.
-    ///
-    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
-    /// only need to be set for one of the two arguments, they do not need to be set for each.
-    ///
-    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
-    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not need
-    /// need to also do B.conflicts_with(A))
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .conflicts_with("debug")
-    /// # ;
-    /// ```
-    ///
-    /// Setting conflicting argument, and having both arguments present at runtime is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .conflicts_with("debug")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    pub fn conflicts_with(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.blacklist {
-            vec.push(name);
-        } else {
-            self.b.blacklist = Some(vec![name]);
-        }
-        self
-    }
-
-    /// The same as [`Arg::conflicts_with`] but allows specifying multiple two-way conlicts per
-    /// argument.
-    ///
-    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
-    /// only need to be set for one of the two arguments, they do not need to be set for each.
-    ///
-    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
-    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not need
-    /// need to also do B.conflicts_with(A))
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .conflicts_with_all(&["debug", "input"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting conflicting argument, and having any of the arguments present at runtime with a
-    /// conflicting argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .conflicts_with_all(&["debug", "input"])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf", "file.txt"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [`Arg::conflicts_with`]: ./struct.Arg.html#method.conflicts_with
-    pub fn conflicts_with_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.blacklist {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.blacklist = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets a overridable argument by name. I.e. this argument and the following argument
-    /// will override each other in POSIX style (whichever argument was specified at runtime
-    /// **last** "wins")
-    ///
-    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
-    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::from_usage("-f, --flag 'some flag'")
-    ///         .conflicts_with("debug"))
-    ///     .arg(Arg::from_usage("-d, --debug 'other flag'"))
-    ///     .arg(Arg::from_usage("-c, --color 'third flag'")
-    ///         .overrides_with("flag"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-f", "-d", "-c"]);
-    ///             //    ^~~~~~~~~~~~^~~~~ flag is overridden by color
-    ///
-    /// assert!(m.is_present("color"));
-    /// assert!(m.is_present("debug")); // even though flag conflicts with debug, it's as if flag
-    ///                                 // was never used because it was overridden with color
-    /// assert!(!m.is_present("flag"));
-    /// ```
-    pub fn overrides_with(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.overrides {
-            vec.push(name.as_ref());
-        } else {
-            self.b.overrides = Some(vec![name.as_ref()]);
-        }
-        self
-    }
-
-    /// Sets multiple mutually overridable arguments by name. I.e. this argument and the following
-    /// argument will override each other in POSIX style (whichever argument was specified at
-    /// runtime **last** "wins")
-    ///
-    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
-    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::from_usage("-f, --flag 'some flag'")
-    ///         .conflicts_with("color"))
-    ///     .arg(Arg::from_usage("-d, --debug 'other flag'"))
-    ///     .arg(Arg::from_usage("-c, --color 'third flag'")
-    ///         .overrides_with_all(&["flag", "debug"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-f", "-d", "-c"]);
-    ///             //    ^~~~~~^~~~~~~~~ flag and debug are overridden by color
-    ///
-    /// assert!(m.is_present("color")); // even though flag conflicts with color, it's as if flag
-    ///                                 // and debug were never used because they were overridden
-    ///                                 // with color
-    /// assert!(!m.is_present("debug"));
-    /// assert!(!m.is_present("flag"));
-    /// ```
-    pub fn overrides_with_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.overrides {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.overrides = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets an argument by name that is required when this one is present I.e. when
-    /// using this argument, the following argument *must* be present.
-    ///
-    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires("input")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires(name)`] requires that the argument be used at runtime if the
-    /// defining argument is used. If the defining argument isn't used, the other argument isn't
-    /// required
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use cfg, so input wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires(name)`] and *not* supplying that argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            vec.push((None, name));
-        } else {
-            let mut vec = vec![];
-            vec.push((None, name));
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Allows a conditional requirement. The requirement will only become valid if this arg's value
-    /// equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// requires_if:
-    ///     - [val, arg]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_if("val", "arg")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_if(val, arg)`] requires that the `arg` be used at runtime if the
-    /// defining argument's value is equal to `val`. If the defining argument is anything other than
-    /// `val`, the other argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_if("my.cfg", "other")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "some.cfg"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --config=my.cfg, so other wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires_if(val, arg)`] and setting the value to `val` but *not* supplying
-    /// `arg` is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_if("my.cfg", "input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "my.cfg"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires_if(mut self, val: &'b str, arg: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            vec.push((Some(val), arg));
-        } else {
-            self.b.requires = Some(vec![(Some(val), arg)]);
-        }
-        self
-    }
-
-    /// Allows multiple conditional requirements. The requirement will only become valid if this arg's value
-    /// equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// requires_if:
-    ///     - [val, arg]
-    ///     - [val2, arg2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_ifs(&[
-    ///         ("val", "arg"),
-    ///         ("other_val", "arg2"),
-    ///     ])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_ifs(&["val", "arg"])`] requires that the `arg` be used at runtime if the
-    /// defining argument's value is equal to `val`. If the defining argument's value is anything other
-    /// than `val`, `arg` isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_ifs(&[
-    ///             ("special.conf", "opt"),
-    ///             ("other.conf", "other"),
-    ///         ])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("option")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "special.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err()); // We  used --config=special.conf so --option <val> is required
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires_ifs(mut self, ifs: &[(&'b str, &'a str)]) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            for &(val, arg) in ifs {
-                vec.push((Some(val), arg));
-            }
-        } else {
-            let mut vec = vec![];
-            for &(val, arg) in ifs {
-                vec.push((Some(val), arg));
-            }
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Allows specifying that an argument is [required] conditionally. The requirement will only
-    /// become valid if the specified `arg`'s value equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// required_if:
-    ///     - [arg, val]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_if("other_arg", "value")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_if(arg, val)`] makes this arg required if the `arg` is used at
-    /// runtime and it's value is equal to `val`. If the `arg`'s value is anything other than `val`,
-    /// this argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .required_if("other", "special")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--other", "not-special"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --other=special, so "cfg" wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::required_if(arg, val)`] and having `arg` used with a vaue of `val` but *not*
-    /// using this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .required_if("other", "special")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--other", "special"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [required]: ./struct.Arg.html#method.required
-    pub fn required_if(mut self, arg: &'a str, val: &'b str) -> Self {
-        if let Some(ref mut vec) = self.r_ifs {
-            vec.push((arg, val));
-        } else {
-            self.r_ifs = Some(vec![(arg, val)]);
-        }
-        self
-    }
-
-    /// Allows specifying that an argument is [required] based on multiple conditions. The
-    /// conditions are set up in a `(arg, val)` style tuple. The requirement will only become valid
-    /// if one of the specified `arg`'s value equals it's corresponding `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// required_if:
-    ///     - [arg, val]
-    ///     - [arg2, val2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_ifs(&[
-    ///         ("extra", "val"),
-    ///         ("option", "spec")
-    ///     ])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_ifs(&[(arg, val)])`] makes this arg required if any of the `arg`s
-    /// are used at runtime and it's corresponding value is equal to `val`. If the `arg`'s value is
-    /// anything other than `val`, this argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_ifs(&[
-    ///             ("extra", "val"),
-    ///             ("option", "spec")
-    ///         ])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("extra")
-    ///         .takes_value(true)
-    ///         .long("extra"))
-    ///     .arg(Arg::with_name("option")
-    ///         .takes_value(true)
-    ///         .long("option"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--option", "other"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --option=spec, or --extra=val so "cfg" isn't required
-    /// ```
-    ///
-    /// Setting [`Arg::required_ifs(&[(arg, val)])`] and having any of the `arg`s used with it's
-    /// vaue of `val` but *not* using this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_ifs(&[
-    ///             ("extra", "val"),
-    ///             ("option", "spec")
-    ///         ])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("extra")
-    ///         .takes_value(true)
-    ///         .long("extra"))
-    ///     .arg(Arg::with_name("option")
-    ///         .takes_value(true)
-    ///         .long("option"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--option", "spec"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [required]: ./struct.Arg.html#method.required
-    pub fn required_ifs(mut self, ifs: &[(&'a str, &'b str)]) -> Self {
-        if let Some(ref mut vec) = self.r_ifs {
-            for r_if in ifs {
-                vec.push((r_if.0, r_if.1));
-            }
-        } else {
-            let mut vec = vec![];
-            for r_if in ifs {
-                vec.push((r_if.0, r_if.1));
-            }
-            self.r_ifs = Some(vec);
-        }
-        self
-    }
-
-    /// Sets multiple arguments by names that are required when this one is present I.e. when
-    /// using this argument, the following arguments *must* be present.
-    ///
-    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required
-    /// by default.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_all(&["input", "output"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_all(&[arg, arg2])`] requires that all the arguments be used at
-    /// runtime if the defining argument is used. If the defining argument isn't used, the other
-    /// argument isn't required
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("output")
-    ///         .index(2))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use cfg, so input and output weren't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires_all(&[arg, arg2])`] and *not* supplying all the arguments is an
-    /// error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_all(&["input", "output"])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("output")
-    ///         .index(2))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf", "in.txt"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// // We didn't use output
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    /// [`Arg::requires_all(&[arg, arg2])`]: ./struct.Arg.html#method.requires_all
-    pub fn requires_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            for s in names {
-                vec.push((None, s));
-            }
-        } else {
-            let mut vec = vec![];
-            for s in names {
-                vec.push((None, *s));
-            }
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Specifies that the argument takes a value at run time.
-    ///
-    /// **NOTE:** values for arguments may be specified in any of the following methods
-    ///
-    /// * Using a space such as `-o value` or `--option value`
-    /// * Using an equals and no space such as `-o=value` or `--option=value`
-    /// * Use a short and no space such as `-ovalue`
-    ///
-    /// **NOTE:** By default, args which allow [multiple values] are delimited by commas, meaning
-    /// `--option=val1,val2,val3` is three values for the `--option` argument. If you wish to
-    /// change the delimiter to another character you can use [`Arg::value_delimiter(char)`],
-    /// alternatively you can turn delimiting values **OFF** by using [`Arg::use_delimiter(false)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .takes_value(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    /// [`Arg::value_delimiter(char)`]: ./struct.Arg.html#method.value_delimiter
-    /// [`Arg::use_delimiter(false)`]: ./struct.Arg.html#method.use_delimiter
-    /// [multiple values]: ./struct.Arg.html#method.multiple
-    pub fn takes_value(self, tv: bool) -> Self {
-        if tv {
-            self.set(ArgSettings::TakesValue)
-        } else {
-            self.unset(ArgSettings::TakesValue)
-        }
-    }
-
-    /// Specifies if the possible values of an argument should be displayed in the help text or
-    /// not. Defaults to `false` (i.e. show possible values)
-    ///
-    /// This is useful for args with many values, or ones which are explained elsewhere in the
-    /// help text.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .hide_possible_values(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .possible_values(&["fast", "slow"])
-    ///         .takes_value(true)
-    ///         .hide_possible_values(true));
-    ///
-    /// ```
-    ///
-    /// If we were to run the above program with `--help` the `[values: fast, slow]` portion of
-    /// the help text would be omitted.
-    pub fn hide_possible_values(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HidePossibleValues)
-        } else {
-            self.unset(ArgSettings::HidePossibleValues)
-        }
-    }
-
-    /// Specifies if the default value of an argument should be displayed in the help text or
-    /// not. Defaults to `false` (i.e. show default value)
-    ///
-    /// This is useful when default behavior of an arg is explained elsewhere in the help text.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .hide_default_value(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("connect")
-    ///     .arg(Arg::with_name("host")
-    ///         .long("host")
-    ///         .default_value("localhost")
-    ///         .hide_default_value(true));
-    ///
-    /// ```
-    ///
-    /// If we were to run the above program with `--help` the `[default: localhost]` portion of
-    /// the help text would be omitted.
-    pub fn hide_default_value(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HideDefaultValue)
-        } else {
-            self.unset(ArgSettings::HideDefaultValue)
-        }
-    }
-
-    /// Specifies the index of a positional argument **starting at** 1.
-    ///
-    /// **NOTE:** The index refers to position according to **other positional argument**. It does
-    /// not define position in the argument list as a whole.
-    ///
-    /// **NOTE:** If no [`Arg::short`], or [`Arg::long`] have been defined, you can optionally
-    /// leave off the `index` method, and the index will be assigned in order of evaluation.
-    /// Utilizing the `index` method allows for setting indexes out of order
-    ///
-    /// **NOTE:** When utilized with [`Arg::multiple(true)`], only the **last** positional argument
-    /// may be defined as multiple (i.e. with the highest index)
-    ///
-    /// # Panics
-    ///
-    /// Although not in this method directly, [`App`] will [`panic!`] if indexes are skipped (such
-    /// as defining `index(1)` and `index(3)` but not `index(2)`, or a positional argument is
-    /// defined as multiple and is not the highest index
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .index(1)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug", "fast"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast")); // notice index(1) means "first positional"
-    ///                                               // *not* first argument
-    /// ```
-    /// [`Arg::short`]: ./struct.Arg.html#method.short
-    /// [`Arg::long`]: ./struct.Arg.html#method.long
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`App`]: ./struct.App.html
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    pub fn index(mut self, idx: u64) -> Self {
-        self.index = Some(idx);
-        self
-    }
-
-    /// Specifies that the argument may appear more than once. For flags, this results
-    /// in the number of occurrences of the flag being recorded. For example `-ddd` or `-d -d -d`
-    /// would count as three occurrences. For options there is a distinct difference in multiple
-    /// occurrences vs multiple values.
-    ///
-    /// For example, `--opt val1 val2` is one occurrence, but two values. Whereas
-    /// `--opt val1 --opt val2` is two occurrences.
-    ///
-    /// **WARNING:**
-    ///
-    /// Setting `multiple(true)` for an [option] with no other details, allows multiple values
-    /// **and** multiple occurrences because it isn't possible to have more occurrences than values for
-    /// options. Because multiple values are allowed, `--option val1 val2 val3` is perfectly valid,
-    /// be careful when designing a CLI where positional arguments are expected after a option which
-    /// accepts multiple values, as `clap` will continue parsing *values* until it reaches the max
-    /// or specific number of values defined, or another flag or option.
-    ///
-    /// **Pro Tip**:
-    ///
-    /// It's possible to define an option which allows multiple occurrences, but only one value per
-    /// occurrence. To do this use [`Arg::number_of_values(1)`] in coordination with
-    /// [`Arg::multiple(true)`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .short("d")
-    ///     .multiple(true)
-    /// # ;
-    /// ```
-    /// An example with flags
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("verbose")
-    ///         .multiple(true)
-    ///         .short("v"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-v", "-v", "-v"    // note, -vvv would have same result
-    ///     ]);
-    ///
-    /// assert!(m.is_present("verbose"));
-    /// assert_eq!(m.occurrences_of("verbose"), 3);
-    /// ```
-    ///
-    /// An example with options
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// assert_eq!(m.occurrences_of("file"), 1); // notice only one occurrence
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    /// This is functionally equivilant to the example above
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "-F", "file2", "-F", "file3"
-    ///     ]);
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// assert_eq!(m.occurrences_of("file"), 3); // Notice 3 occurrences
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    ///
-    /// A common mistake is to define an option which allows multiples, and a positional argument
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "file2", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3", "word"]); // wait...what?!
-    /// assert!(!m.is_present("word")); // but we clearly used word!
-    /// ```
-    /// The problem is clap doesn't know when to stop parsing values for "files". This is further
-    /// compounded by if we'd said `word -F file1 file2` it would have worked fine, so it would
-    /// appear to only fail sometimes...not good!
-    ///
-    /// A solution for the example above is to specify that `-F` only accepts one value, but is
-    /// allowed to appear multiple times
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .number_of_values(1)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "-F", "file2", "-F", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// assert!(m.is_present("word"));
-    /// assert_eq!(m.value_of("word"), Some("word"));
-    /// ```
-    /// As a final example, notice if we define [`Arg::number_of_values(1)`] and try to run the
-    /// problem example above, it would have been a runtime error with a pretty message to the
-    /// user :)
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .number_of_values(1)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::number_of_values(1)`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn multiple(self, multi: bool) -> Self {
-        if multi {
-            self.set(ArgSettings::Multiple)
-        } else {
-            self.unset(ArgSettings::Multiple)
-        }
-    }
-
-    /// Specifies a value that *stops* parsing multiple values of a give argument. By default when
-    /// one sets [`multiple(true)`] on an argument, clap will continue parsing values for that
-    /// argument until it reaches another valid argument, or one of the other more specific settings
-    /// for multiple values is used (such as [`min_values`], [`max_values`] or
-    /// [`number_of_values`]).
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// **NOTE:** When the terminator is passed in on the command line, it is **not** stored as one
-    /// of the vaues
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("vals")
-    ///     .takes_value(true)
-    ///     .multiple(true)
-    ///     .value_terminator(";")
-    /// # ;
-    /// ```
-    /// The following example uses two arguments, a sequence of commands, and the location in which
-    /// to perform them
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cmds")
-    ///         .multiple(true)
-    ///         .allow_hyphen_values(true)
-    ///         .value_terminator(";"))
-    ///     .arg(Arg::with_name("location"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "find", "-type", "f", "-name", "special", ";", "/home/clap"
-    ///     ]);
-    /// let cmds: Vec<_> = m.values_of("cmds").unwrap().collect();
-    /// assert_eq!(&cmds, &["find", "-type", "f", "-name", "special"]);
-    /// assert_eq!(m.value_of("location"), Some("/home/clap"));
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    /// [`multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`min_values`]: ./struct.Arg.html#method.min_values
-    /// [`number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`max_values`]: ./struct.Arg.html#method.max_values
-    pub fn value_terminator(mut self, term: &'b str) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.terminator = Some(term);
-        self
-    }
-
-    /// Specifies that an argument can be matched to all child [`SubCommand`]s.
-    ///
-    /// **NOTE:** Global arguments *only* propagate down, **not** up (to parent commands)
-    ///
-    /// **NOTE:** Global arguments *cannot* be [required].
-    ///
-    /// **NOTE:** Global arguments, when matched, *only* exist in the command's matches that they
-    /// were matched to. For example, if you defined a `--flag` global argument in the top most
-    /// parent command, but the user supplied the arguments `top cmd1 cmd2 --flag` *only* `cmd2`'s
-    /// [`ArgMatches`] would return `true` if tested for [`ArgMatches::is_present("flag")`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .short("d")
-    ///     .global(true)
-    /// # ;
-    /// ```
-    ///
-    /// For example, assume an appliction with two subcommands, and you'd like to define a
-    /// `--verbose` flag that can be called on any of the subcommands and parent, but you don't
-    /// want to clutter the source with three duplicate [`Arg`] definitions.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("verb")
-    ///         .long("verbose")
-    ///         .short("v")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .subcommand(SubCommand::with_name("do-stuff"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "do-stuff", "--verbose"
-    ///     ]);
-    ///
-    /// assert_eq!(m.subcommand_name(), Some("do-stuff"));
-    /// let sub_m = m.subcommand_matches("do-stuff").unwrap();
-    /// assert!(sub_m.is_present("verb"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [required]: ./struct.Arg.html#method.required
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    /// [`ArgMatches::is_present("flag")`]: ./struct.ArgMatches.html#method.is_present
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn global(self, g: bool) -> Self {
-        if g {
-            self.set(ArgSettings::Global)
-        } else {
-            self.unset(ArgSettings::Global)
-        }
-    }
-
-    /// Allows an argument to accept explicitly empty values. An empty value must be specified at
-    /// the command line with an explicit `""`, or `''`
-    ///
-    /// **NOTE:** Defaults to `true` (Explicitly empty values are allowed)
-    ///
-    /// **NOTE:** Implicitly sets [`Arg::takes_value(true)`] when set to `false`
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .long("file")
-    ///     .empty_values(false)
-    /// # ;
-    /// ```
-    /// The default is to allow empty values, such as `--option ""` would be an empty value. But
-    /// we can change to make empty values become an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .short("v")
-    ///         .empty_values(false))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config="
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn empty_values(mut self, ev: bool) -> Self {
-        if ev {
-            self.set(ArgSettings::EmptyValues)
-        } else {
-            self = self.set(ArgSettings::TakesValue);
-            self.unset(ArgSettings::EmptyValues)
-        }
-    }
-
-    /// Hides an argument from help message output.
-    ///
-    /// **NOTE:** This does **not** hide the argument from usage strings on error
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .hidden(true)
-    /// # ;
-    /// ```
-    /// Setting `hidden(true)` will hide the argument when displaying help text
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    pub fn hidden(self, h: bool) -> Self {
-        if h {
-            self.set(ArgSettings::Hidden)
-        } else {
-            self.unset(ArgSettings::Hidden)
-        }
-    }
-
-    /// Specifies a list of possible values for this argument. At runtime, `clap` verifies that
-    /// only one of the specified values was used, or fails with an error message.
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("mode")
-    ///     .takes_value(true)
-    ///     .possible_values(&["fast", "slow", "medium"])
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_values(&["fast", "slow", "medium"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    ///
-    /// The next example shows a failed parse from using a value which wasn't defined as one of the
-    /// possible values.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_values(&["fast", "slow", "medium"]))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--mode", "wrong"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    pub fn possible_values(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut vec) = self.v.possible_vals {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.v.possible_vals = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Specifies a possible value for this argument, one at a time. At runtime, `clap` verifies
-    /// that only one of the specified values was used, or fails with error message.
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("mode")
-    ///     .takes_value(true)
-    ///     .possible_value("fast")
-    ///     .possible_value("slow")
-    ///     .possible_value("medium")
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_value("fast")
-    ///         .possible_value("slow")
-    ///         .possible_value("medium"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    ///
-    /// The next example shows a failed parse from using a value which wasn't defined as one of the
-    /// possible values.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_value("fast")
-    ///         .possible_value("slow")
-    ///         .possible_value("medium"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--mode", "wrong"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    pub fn possible_value(mut self, name: &'b str) -> Self {
-        if let Some(ref mut vec) = self.v.possible_vals {
-            vec.push(name);
-        } else {
-            self.v.possible_vals = Some(vec![name]);
-        }
-        self
-    }
-
-    /// Specifies the name of the [`ArgGroup`] the argument belongs to.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .long("debug")
-    ///     .group("mode")
-    /// # ;
-    /// ```
-    ///
-    /// Multiple arguments can be a member of a single group and then the group checked as if it
-    /// was one of said arguments.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .group("mode"))
-    ///     .arg(Arg::with_name("verbose")
-    ///         .long("verbose")
-    ///         .group("mode"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn group(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.groups {
-            vec.push(name);
-        } else {
-            self.b.groups = Some(vec![name]);
-        }
-        self
-    }
-
-    /// Specifies the names of multiple [`ArgGroup`]'s the argument belongs to.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .long("debug")
-    ///     .groups(&["mode", "verbosity"])
-    /// # ;
-    /// ```
-    ///
-    /// Arguments can be members of multiple groups and then the group checked as if it
-    /// was one of said arguments.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .groups(&["mode", "verbosity"]))
-    ///     .arg(Arg::with_name("verbose")
-    ///         .long("verbose")
-    ///         .groups(&["mode", "verbosity"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert!(m.is_present("verbosity"));
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn groups(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.groups {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.groups = Some(names.into_iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Specifies how many values are required to satisfy this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted exactly 3 'files' you would set
-    /// `.number_of_values(3)`, and this argument wouldn't be satisfied unless the user provided
-    /// 3 and only 3 values.
-    ///
-    /// **NOTE:** Does *not* require [`Arg::multiple(true)`] to be set. Setting
-    /// [`Arg::multiple(true)`] would allow `-f <file> <file> <file> -f <file> <file> <file>` where
-    /// as *not* setting [`Arg::multiple(true)`] would only allow one occurrence of this argument.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .number_of_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Not supplying the correct number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .number_of_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::WrongNumberOfValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn number_of_values(mut self, qty: u64) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.num_vals = Some(qty);
-        self
-    }
-
-    /// Allows one to perform a custom validation on the argument value. You provide a closure
-    /// which accepts a [`String`] value, and return a [`Result`] where the [`Err(String)`] is a
-    /// message displayed to the user.
-    ///
-    /// **NOTE:** The error message does *not* need to contain the `error:` portion, only the
-    /// message as all errors will appear as
-    /// `error: Invalid value for '<arg>': <YOUR MESSAGE>` where `<arg>` is replaced by the actual
-    /// arg, and `<YOUR MESSAGE>` is the `String` you return as the error.
-    ///
-    /// **NOTE:** There is a small performance hit for using validators, as they are implemented
-    /// with [`Rc`] pointers. And the value to be checked will be allocated an extra time in order
-    /// to to be passed to the closure. This performance hit is extremely minimal in the grand
-    /// scheme of things.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// fn has_at(v: String) -> Result<(), String> {
-    ///     if v.contains("@") { return Ok(()); }
-    ///     Err(String::from("The value did not contain the required @ sigil"))
-    /// }
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .index(1)
-    ///         .validator(has_at))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "some@file"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// assert_eq!(res.unwrap().value_of("file"), Some("some@file"));
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-    /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
-    /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
-    pub fn validator<F>(mut self, f: F) -> Self
-        where F: Fn(String) -> Result<(), String> + 'static
-    {
-        self.v.validator = Some(Rc::new(f));
-        self
-    }
-
-    /// Works identically to Validator but is intended to be used with values that could 
-    /// contain non UTF-8 formatted strings.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```rust")]
-    /// # use clap::{App, Arg};
-    /// # use std::ffi::{OsStr, OsString};
-    /// # use std::os::unix::ffi::OsStrExt;
-    /// fn has_ampersand(v: &OsStr) -> Result<(), OsString> {
-    ///     if v.as_bytes().iter().any(|b| *b == b'&') { return Ok(()); }
-    ///     Err(OsString::from("The value did not contain the required & sigil"))
-    /// }
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .index(1)
-    ///         .validator_os(has_ampersand))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "Fish & chips"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// assert_eq!(res.unwrap().value_of("file"), Some("Fish & chips"));
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
-    /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-    /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
-    /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
-    pub fn validator_os<F>(mut self, f: F) -> Self
-        where F: Fn(&OsStr) -> Result<(), OsString> + 'static
-    {
-        self.v.validator_os = Some(Rc::new(f));
-        self
-    }
-
-    /// Specifies the *maximum* number of values are for this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted up to 3 'files' you would set `.max_values(3)`, and
-    /// this argument would be satisfied if the user provided, 1, 2, or 3 values.
-    ///
-    /// **NOTE:** This does *not* implicitly set [`Arg::multiple(true)`]. This is because
-    /// `-o val -o val` is multiple occurrences but a single value and `-o val1 val2` is a single
-    /// occurence with multiple values. For positional arguments this **does** set
-    /// [`Arg::multiple(true)`] because there is no way to determine the difference between multiple
-    /// occurences and multiple values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .max_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Supplying less than the maximum number of values is allowed
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .max_values(3)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2"]);
-    /// ```
-    ///
-    /// Supplying more than the maximum number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .max_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::TooManyValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn max_values(mut self, qty: u64) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.max_vals = Some(qty);
-        self
-    }
-
-    /// Specifies the *minimum* number of values for this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted at least 2 'files' you would set
-    /// `.min_values(2)`, and this argument would be satisfied if the user provided, 2 or more
-    /// values.
-    ///
-    /// **NOTE:** This does not implicitly set [`Arg::multiple(true)`]. This is because
-    /// `-o val -o val` is multiple occurrences but a single value and `-o val1 val2` is a single
-    /// occurence with multiple values. For positional arguments this **does** set
-    /// [`Arg::multiple(true)`] because there is no way to determine the difference between multiple
-    /// occurences and multiple values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .min_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Supplying more than the minimum number of values is allowed
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .min_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    ///
-    /// Supplying less than the minimum number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .min_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::TooFewValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn min_values(mut self, qty: u64) -> Self {
-        self.v.min_vals = Some(qty);
-        self.set(ArgSettings::TakesValue)
-    }
-
-    /// Specifies whether or not an argument should allow grouping of multiple values via a
-    /// delimiter. I.e. should `--option=val1,val2,val3` be parsed as three values (`val1`, `val2`,
-    /// and `val3`) or as a single value (`val1,val2,val3`). Defaults to using `,` (comma) as the
-    /// value delimiter for all arguments that accept values (options and positional arguments)
-    ///
-    /// **NOTE:** The default is `false`. When set to `true` the default [`Arg::value_delimiter`]
-    /// is the comma `,`.
-    ///
-    /// # Examples
-    ///
-    /// The following example shows the default behavior.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("option")
-    ///         .long("option")
-    ///         .use_delimiter(true)
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--option=val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("option"));
-    /// assert_eq!(delims.occurrences_of("option"), 1);
-    /// assert_eq!(delims.values_of("option").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// The next example shows the difference when turning delimiters off. This is the default
-    /// behavior
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let nodelims = App::new("prog")
-    ///     .arg(Arg::with_name("option")
-    ///         .long("option")
-    ///         .use_delimiter(false)
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--option=val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(nodelims.is_present("option"));
-    /// assert_eq!(nodelims.occurrences_of("option"), 1);
-    /// assert_eq!(nodelims.value_of("option").unwrap(), "val1,val2,val3");
-    /// ```
-    /// [`Arg::value_delimiter`]: ./struct.Arg.html#method.value_delimiter
-    pub fn use_delimiter(mut self, d: bool) -> Self {
-        if d {
-            if self.v.val_delim.is_none() {
-                self.v.val_delim = Some(',');
-            }
-            self.setb(ArgSettings::TakesValue);
-            self.setb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::ValueDelimiterNotSet)
-        } else {
-            self.v.val_delim = None;
-            self.unsetb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::ValueDelimiterNotSet)
-        }
-    }
-
-    /// Specifies that *multiple values* may only be set using the delimiter. This means if an
-    /// if an option is encountered, and no delimiter is found, it automatically assumed that no
-    /// additional values for that option follow. This is unlike the default, where it is generally
-    /// assumed that more values will follow regardless of whether or not a delimiter is used.
-    ///
-    /// **NOTE:** The default is `false`.
-    ///
-    /// **NOTE:** Setting this to true implies [`Arg::use_delimiter(true)`]
-    ///
-    /// **NOTE:** It's a good idea to inform the user that use of a delimiter is required, either
-    /// through help text or other means.
-    ///
-    /// # Examples
-    ///
-    /// These examples demonstrate what happens when `require_delimiter(true)` is used. Notice
-    /// everything works in this first example, as we use a delimiter, as expected.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true)
-    ///         .require_delimiter(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-o", "val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("opt"));
-    /// assert_eq!(delims.values_of("opt").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// In this next example, we will *not* use a delimiter. Notice it's now an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true)
-    ///         .require_delimiter(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-o", "val1", "val2", "val3",
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// let err = res.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// What's happening is `-o` is getting `val1`, and because delimiters are required yet none
-    /// were present, it stops parsing `-o`. At this point it reaches `val2` and because no
-    /// positional arguments have been defined, it's an error of an unexpected argument.
-    ///
-    /// In this final example, we contrast the above with `clap`'s default behavior where the above
-    /// is *not* an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-o", "val1", "val2", "val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("opt"));
-    /// assert_eq!(delims.values_of("opt").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
-    pub fn require_delimiter(mut self, d: bool) -> Self {
-        if d {
-            self = self.use_delimiter(true);
-            self.unsetb(ArgSettings::ValueDelimiterNotSet);
-            self.setb(ArgSettings::UseValueDelimiter);
-            self.set(ArgSettings::RequireDelimiter)
-        } else {
-            self = self.use_delimiter(false);
-            self.unsetb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::RequireDelimiter)
-        }
-    }
-
-    /// Specifies the separator to use when values are clumped together, defaults to `,` (comma).
-    ///
-    /// **NOTE:** implicitly sets [`Arg::use_delimiter(true)`]
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .short("c")
-    ///         .long("config")
-    ///         .value_delimiter(";"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--config=val1;val2;val3"
-    ///     ]);
-    ///
-    /// assert_eq!(m.values_of("config").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"])
-    /// ```
-    /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn value_delimiter(mut self, d: &str) -> Self {
-        self.unsetb(ArgSettings::ValueDelimiterNotSet);
-        self.setb(ArgSettings::TakesValue);
-        self.setb(ArgSettings::UseValueDelimiter);
-        self.v.val_delim = Some(d.chars()
-            .nth(0)
-            .expect("Failed to get value_delimiter from arg"));
-        self
-    }
-
-    /// Specify multiple names for values of option arguments. These names are cosmetic only, used
-    /// for help and usage strings only. The names are **not** used to access arguments. The values
-    /// of the arguments are accessed in numeric order (i.e. if you specify two names `one` and
-    /// `two` `one` will be the first matched value, `two` will be the second).
-    ///
-    /// This setting can be very helpful when describing the type of input the user should be
-    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
-    /// use all capital letters for the value name.
-    ///
-    /// **Pro Tip:** It may help to use [`Arg::next_line_help(true)`] if there are long, or
-    /// multiple value names in order to not throw off the help text alignment of all options.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::number_of_values`] if the number of value names is
-    /// greater than one. I.e. be aware that the number of "names" you set for the values, will be
-    /// the *exact* number of values required to satisfy this argument
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// **NOTE:** Does *not* require or imply [`Arg::multiple(true)`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("speed")
-    ///     .short("s")
-    ///     .value_names(&["fast", "slow"])
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("io")
-    ///         .long("io-files")
-    ///         .value_names(&["INFILE", "OUTFILE"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    /// Running the above program produces the following output
-    ///
-    /// ```notrust
-    /// valnames
-    ///
-    /// USAGE:
-    ///    valnames [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     --io-files <INFILE> <OUTFILE>    Some help text
-    /// ```
-    /// [`Arg::next_line_help(true)`]: ./struct.Arg.html#method.next_line_help
-    /// [`Arg::number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn value_names(mut self, names: &[&'b str]) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if self.is_set(ArgSettings::ValueDelimiterNotSet) {
-            self.unsetb(ArgSettings::ValueDelimiterNotSet);
-            self.setb(ArgSettings::UseValueDelimiter);
-        }
-        if let Some(ref mut vals) = self.v.val_names {
-            let mut l = vals.len();
-            for s in names {
-                vals.insert(l, s);
-                l += 1;
-            }
-        } else {
-            let mut vm = VecMap::new();
-            for (i, n) in names.iter().enumerate() {
-                vm.insert(i, *n);
-            }
-            self.v.val_names = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies the name for value of [option] or [positional] arguments inside of help
-    /// documentation. This name is cosmetic only, the name is **not** used to access arguments.
-    /// This setting can be very helpful when describing the type of input the user should be
-    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
-    /// use all capital letters for the value name.
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("cfg")
-    ///     .long("config")
-    ///     .value_name("FILE")
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .long("config")
-    ///         .value_name("FILE"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    /// Running the above program produces the following output
-    ///
-    /// ```notrust
-    /// valnames
-    ///
-    /// USAGE:
-    ///    valnames [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     --config <FILE>     Some help text
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [positional]: ./struct.Arg.html#method.index
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn value_name(mut self, name: &'b str) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if let Some(ref mut vals) = self.v.val_names {
-            let l = vals.len();
-            vals.insert(l, name);
-        } else {
-            let mut vm = VecMap::new();
-            vm.insert(0, name);
-            self.v.val_names = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies the value of the argument when *not* specified at runtime.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime, [`ArgMatches::occurrences_of`]
-    /// will return `0` even though the [`ArgMatches::value_of`] will return the default specified.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::is_present`] will
-    /// still return `true`. If you wish to determine whether the argument was used at runtime or
-    /// not, consider [`ArgMatches::occurrences_of`] which will return `0` if the argument was *not*
-    /// used at runtmie.
-    ///
-    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value_if`] but slightly
-    /// different. `Arg::default_value` *only* takes affect when the user has not provided this arg
-    /// at runtime. `Arg::default_value_if` however only takes affect when the user has not provided
-    /// a value at runtime **and** these other conditions are met as well. If you have set
-    /// `Arg::default_value` and `Arg::default_value_if`, and the user **did not** provide a this
-    /// arg at runtime, nor did were the conditions met for `Arg::default_value_if`, the
-    /// `Arg::default_value` will be applied.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    ///
-    /// **NOTE:** This setting effectively disables `AppSettings::ArgRequiredElseHelp` if used in
-    /// conjuction as it ensures that some argument will always be present.
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value without providing any value at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("myopt")
-    ///         .default_value("myval"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("opt"), Some("myval"));
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 0);
-    /// ```
-    ///
-    /// Next we provide a value at runtime to override the default.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("myopt")
-    ///         .default_value("myval"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--myopt=non_default"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("opt"), Some("non_default"));
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 1);
-    /// ```
-    /// [`ArgMatches::occurrences_of`]: ./struct.ArgMatches.html#method.occurrences_of
-    /// [`ArgMatches::value_of`]: ./struct.ArgMatches.html#method.value_of
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`ArgMatches::is_present`]: ./struct.ArgMatches.html#method.is_present
-    /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if
-    pub fn default_value(self, val: &'a str) -> Self {
-        self.default_value_os(OsStr::from_bytes(val.as_bytes()))
-    }
-
-    /// Provides a default value in the exact same manner as [`Arg::default_value`]
-    /// only using [`OsStr`]s instead.
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    pub fn default_value_os(mut self, val: &'a OsStr) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.default_val = Some(val);
-        self
-    }
-
-    /// Specifies the value of the argument if `arg` has been used at runtime. If `val` is set to
-    /// `None`, `arg` only needs to be present. If `val` is set to `"some-val"` then `arg` must be
-    /// present at runtime **and** have the value `val`.
-    ///
-    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value`] but slightly
-    /// different. `Arg::default_value` *only* takes affect when the user has not provided this arg
-    /// at runtime. This setting however only takes affect when the user has not provided a value at
-    /// runtime **and** these other conditions are met as well. If you have set `Arg::default_value`
-    /// and `Arg::default_value_if`, and the user **did not** provide a this arg at runtime, nor did
-    /// were the conditions met for `Arg::default_value_if`, the `Arg::default_value` will be
-    /// applied.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows (`None` can be represented
-    /// as `null` in YAML)
-    ///
-    /// ```yaml
-    /// default_value_if:
-    ///     - [arg, val, default]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value only if another arg is present at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("flag", None, "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--flag"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    ///
-    /// Next we run the same test, but without providing `--flag`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("flag", None, "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    ///
-    /// Now lets only use the default value if `--opt` contains the value `special`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .takes_value(true)
-    ///         .long("opt"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("opt", Some("special"), "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "special"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    ///
-    /// We can run the same test and provide any value *other than* `special` and we won't get a
-    /// default value.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .takes_value(true)
-    ///         .long("opt"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("opt", Some("special"), "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "hahaha"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    pub fn default_value_if(self, arg: &'a str, val: Option<&'b str>, default: &'b str) -> Self {
-        self.default_value_if_os(arg,
-                                 val.map(str::as_bytes).map(OsStr::from_bytes),
-                                 OsStr::from_bytes(default.as_bytes()))
-    }
-
-    /// Provides a conditional default value in the exact same manner as [`Arg::default_value_if`]
-    /// only using [`OsStr`]s instead.
-    /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    pub fn default_value_if_os(mut self,
-                               arg: &'a str,
-                               val: Option<&'b OsStr>,
-                               default: &'b OsStr)
-                               -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if let Some(ref mut vm) = self.v.default_vals_ifs {
-            let l = vm.len();
-            vm.insert(l, (arg, val, default));
-        } else {
-            let mut vm = VecMap::new();
-            vm.insert(0, (arg, val, default));
-            self.v.default_vals_ifs = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies multiple values and conditions in the same manner as [`Arg::default_value_if`].
-    /// The method takes a slice of tuples in the `(arg, Option<val>, default)` format.
-    ///
-    /// **NOTE**: The conditions are stored in order and evaluated in the same order. I.e. the first
-    /// if multiple conditions are true, the first one found will be applied and the ultimate value.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// default_value_if:
-    ///     - [arg, val, default]
-    ///     - [arg2, null, default2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value only if another arg is present at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("opt")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "channal"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("chan"));
-    /// ```
-    ///
-    /// Next we run the same test, but without providing `--flag`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    ///
-    /// We can also see that these values are applied in order, and if more than one condition is
-    /// true, only the first evaluatd "wins"
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("opt")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "channal", "--flag"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    pub fn default_value_ifs(mut self, ifs: &[(&'a str, Option<&'b str>, &'b str)]) -> Self {
-        for &(arg, val, default) in ifs {
-            self = self.default_value_if_os(arg,
-                                            val.map(str::as_bytes).map(OsStr::from_bytes),
-                                            OsStr::from_bytes(default.as_bytes()));
-        }
-        self
-    }
-
-    /// Provides multiple conditional default values in the exact same manner as
-    /// [`Arg::default_value_ifs`] only using [`OsStr`]s instead.
-    /// [`Arg::default_value_ifs`]: ./struct.Arg.html#method.default_value_ifs
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    #[cfg_attr(feature = "lints", allow(explicit_counter_loop))]
-    pub fn default_value_ifs_os(mut self, ifs: &[(&'a str, Option<&'b OsStr>, &'b OsStr)]) -> Self {
-        for &(arg, val, default) in ifs {
-            self = self.default_value_if_os(arg, val, default);
-        }
-        self
-    }
-
-    /// When set to `true` the help string will be displayed on the line after the argument and
-    /// indented once. This can be helpful for arguments with very long or complex help messages.
-    /// This can also be helpful for arguments with very long flag names, or many/long value names.
-    ///
-    /// **NOTE:** To apply this setting to all arguments consider using
-    /// [`AppSettings::NextLineHelp`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("long-option-flag")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .value_names(&["value1", "value2"])
-    ///         .help("Some really long help and complex\n\
-    ///                help that makes more sense to be\n\
-    ///                on a line after the option")
-    ///         .next_line_help(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```notrust
-    /// nlh
-    ///
-    /// USAGE:
-    ///     nlh [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     -o, --long-option-flag <value1> <value2>
-    ///         Some really long help and complex
-    ///         help that makes more sense to be
-    ///         on a line after the option
-    /// ```
-    /// [`AppSettings::NextLineHelp`]: ./enum.AppSettings.html#variant.NextLineHelp
-    pub fn next_line_help(mut self, nlh: bool) -> Self {
-        if nlh {
-            self.setb(ArgSettings::NextLineHelp);
-        } else {
-            self.unsetb(ArgSettings::NextLineHelp);
-        }
-        self
-    }
-
-    /// Allows custom ordering of args within the help message. Args with a lower value will be
-    /// displayed first in the help message. This is helpful when one would like to emphasise
-    /// frequently used args, or prioritize those towards the top of the list. Duplicate values
-    /// **are** allowed. Args with duplicate display orders will be displayed in alphabetical
-    /// order.
-    ///
-    /// **NOTE:** The default is 999 for all arguments.
-    ///
-    /// **NOTE:** This setting is ignored for [positional arguments] which are always displayed in
-    /// [index] order.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("a") // Typically args are grouped alphabetically by name.
-    ///                              // Args without a display_order have a value of 999 and are
-    ///                              // displayed alphabetically with all other 999 valued args.
-    ///         .long("long-option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .help("Some help and text"))
-    ///     .arg(Arg::with_name("b")
-    ///         .long("other-option")
-    ///         .short("O")
-    ///         .takes_value(true)
-    ///         .display_order(1)   // In order to force this arg to appear *first*
-    ///                             // all we have to do is give it a value lower than 999.
-    ///                             // Any other args with a value of 1 will be displayed
-    ///                             // alphabetically with this one...then 2 values, then 3, etc.
-    ///         .help("I should be first!"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```notrust
-    /// cust-ord
-    ///
-    /// USAGE:
-    ///     cust-ord [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     -O, --other-option <b>    I should be first!
-    ///     -o, --long-option <a>     Some help and text
-    /// ```
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    /// [index]: ./struct.Arg.html#method.index
-    pub fn display_order(mut self, ord: usize) -> Self {
-        self.s.disp_ord = ord;
-        self
-    }
-
-    /// Checks if one of the [`ArgSettings`] settings is set for the argument
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn is_set(&self, s: ArgSettings) -> bool { self.b.is_set(s) }
-
-    /// Sets one of the [`ArgSettings`] settings for the argument
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn set(mut self, s: ArgSettings) -> Self {
-        self.setb(s);
-        self
-    }
-
-    /// Unsets one of the [`ArgSettings`] settings for the argument
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn unset(mut self, s: ArgSettings) -> Self {
-        self.unsetb(s);
-        self
-    }
-
-    #[doc(hidden)]
-    pub fn setb(&mut self, s: ArgSettings) { self.b.set(s); }
-
-    #[doc(hidden)]
-    pub fn unsetb(&mut self, s: ArgSettings) { self.b.unset(s); }
-}
-
-impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> for Arg<'a, 'b> {
-    fn from(a: &'z Arg<'a, 'b>) -> Self {
-        Arg {
-            b: a.b.clone(),
-            v: a.v.clone(),
-            s: a.s.clone(),
-            index: a.index,
-            r_ifs: a.r_ifs.clone(),
-        }
-    }
-}
-
-impl<'n, 'e> PartialEq for Arg<'n, 'e> {
-    fn eq(&self, other: &Arg<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/base.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-
-use args::{ArgSettings, Arg, ArgFlags};
-
-#[derive(Debug, Clone, Default)]
-pub struct Base<'a, 'b>
-    where 'a: 'b
-{
-    pub name: &'a str,
-    pub help: Option<&'b str>,
-    pub long_help: Option<&'b str>,
-    pub blacklist: Option<Vec<&'a str>>,
-    pub settings: ArgFlags,
-    pub r_unless: Option<Vec<&'a str>>,
-    pub overrides: Option<Vec<&'a str>>,
-    pub groups: Option<Vec<&'a str>>,
-    pub requires: Option<Vec<(Option<&'b str>, &'a str)>>,
-}
-
-impl<'n, 'e> Base<'n, 'e> {
-    pub fn new(name: &'n str) -> Self { Base { name: name, ..Default::default() } }
-
-    pub fn set(&mut self, s: ArgSettings) { self.settings.set(s); }
-    pub fn unset(&mut self, s: ArgSettings) { self.settings.unset(s); }
-    pub fn is_set(&self, s: ArgSettings) -> bool { self.settings.is_set(s) }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Base<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self { a.b.clone() }
-}
-
-impl<'n, 'e> PartialEq for Base<'n, 'e> {
-    fn eq(&self, other: &Base<'n, 'e>) -> bool {
-        self.name == other.name
-    }
-}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/flag.rs
+++ /dev/null
@@ -1,151 +0,0 @@
-// Std
-use std::convert::From;
-use std::fmt::{Display, Formatter, Result};
-use std::rc::Rc;
-use std::result::Result as StdResult;
-use std::ffi::{OsStr, OsString};
-use std::mem;
-
-// Third Party
-use vec_map::{self, VecMap};
-
-// Internal
-use Arg;
-use args::{ArgSettings, Base, Switched, AnyArg, DispOrder};
-
-#[derive(Default, Clone, Debug)]
-#[doc(hidden)]
-pub struct FlagBuilder<'n, 'e>
-    where 'n: 'e
-{
-    pub b: Base<'n, 'e>,
-    pub s: Switched<'e>,
-}
-
-impl<'n, 'e> FlagBuilder<'n, 'e> {
-    pub fn new(name: &'n str) -> Self { FlagBuilder { b: Base::new(name), ..Default::default() } }
-}
-
-impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> for FlagBuilder<'a, 'b> {
-    fn from(a: &'z Arg<'a, 'b>) -> Self {
-        FlagBuilder {
-            b: Base::from(a),
-            s: Switched::from(a),
-        }
-    }
-}
-
-impl<'a, 'b> From<Arg<'a, 'b>> for FlagBuilder<'a, 'b> {
-    fn from(mut a: Arg<'a, 'b>) -> Self {
-        FlagBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            s: mem::replace(&mut a.s, Switched::default()),
-        }
-    }
-}
-
-impl<'n, 'e> Display for FlagBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        if let Some(l) = self.s.long {
-            try!(write!(f, "--{}", l));
-        } else {
-            try!(write!(f, "-{}", self.s.short.unwrap()));
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for FlagBuilder<'n, 'e> {
-    fn name(&self) -> &'n str { self.b.name }
-    fn overrides(&self) -> Option<&[&'e str]> { self.b.overrides.as_ref().map(|o| &o[..]) }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> { self.b.blacklist.as_ref().map(|o| &o[..]) }
-    fn required_unless(&self) -> Option<&[&'e str]> { None }
-    fn is_set(&self, s: ArgSettings) -> bool { self.b.settings.is_set(s) }
-    fn has_switch(&self) -> bool { true }
-    fn takes_value(&self) -> bool { false }
-    fn set(&mut self, s: ArgSettings) { self.b.settings.set(s) }
-    fn max_vals(&self) -> Option<u64> { None }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> { None }
-    fn num_vals(&self) -> Option<u64> { None }
-    fn possible_vals(&self) -> Option<&[&'e str]> { None }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> { None }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> { None }
-    fn min_vals(&self) -> Option<u64> { None }
-    fn short(&self) -> Option<char> { self.s.short }
-    fn long(&self) -> Option<&'e str> { self.s.long }
-    fn val_delim(&self) -> Option<char> { None }
-    fn help(&self) -> Option<&'e str> { self.b.help }
-    fn long_help(&self) -> Option<&'e str> { self.b.long_help }
-    fn val_terminator(&self) -> Option<&'e str> { None }
-    fn default_val(&self) -> Option<&'e OsStr> { None }
-    fn default_vals_ifs(&self) -> Option<vec_map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        None
-    }
-    fn longest_filter(&self) -> bool { self.s.long.is_some() }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.s.aliases {
-            let vis_aliases: Vec<_> = aliases.iter()
-                .filter_map(|&(n, v)| if v { Some(n) } else { None })
-                .collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> DispOrder for FlagBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize { self.s.disp_ord }
-}
-
-impl<'n, 'e> PartialEq for FlagBuilder<'n, 'e> {
-    fn eq(&self, other: &FlagBuilder<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use args::settings::ArgSettings;
-    use super::FlagBuilder;
-
-    #[test]
-    fn flagbuilder_display() {
-        let mut f = FlagBuilder::new("flg");
-        f.b.settings.set(ArgSettings::Multiple);
-        f.s.long = Some("flag");
-
-        assert_eq!(&*format!("{}", f), "--flag");
-
-        let mut f2 = FlagBuilder::new("flg");
-        f2.s.short = Some('f');
-
-        assert_eq!(&*format!("{}", f2), "-f");
-    }
-
-    #[test]
-    fn flagbuilder_display_single_alias() {
-        let mut f = FlagBuilder::new("flg");
-        f.s.long = Some("flag");
-        f.s.aliases = Some(vec![("als", true)]);
-
-        assert_eq!(&*format!("{}", f), "--flag");
-    }
-
-    #[test]
-    fn flagbuilder_display_multiple_aliases() {
-        let mut f = FlagBuilder::new("flg");
-        f.s.short = Some('f');
-        f.s.aliases =
-            Some(vec![("alias_not_visible", false), ("f2", true), ("f3", true), ("f4", true)]);
-        assert_eq!(&*format!("{}", f), "-f");
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/mod.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-pub use self::flag::FlagBuilder;
-pub use self::option::OptBuilder;
-pub use self::positional::PosBuilder;
-pub use self::base::Base;
-pub use self::switched::Switched;
-pub use self::valued::Valued;
-
-mod flag;
-mod positional;
-mod option;
-mod base;
-mod valued;
-mod switched;
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/option.rs
+++ /dev/null
@@ -1,223 +0,0 @@
-// Std
-use std::fmt::{Display, Formatter, Result};
-use std::rc::Rc;
-use std::result::Result as StdResult;
-use std::ffi::{OsStr, OsString};
-use std::mem;
-
-// Third Party
-use vec_map::{self, VecMap};
-
-// Internal
-use args::{ArgSettings, AnyArg, Base, Switched, Valued, Arg, DispOrder};
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Default, Clone)]
-pub struct OptBuilder<'n, 'e>
-    where 'n: 'e
-{
-    pub b: Base<'n, 'e>,
-    pub s: Switched<'e>,
-    pub v: Valued<'n, 'e>,
-}
-
-impl<'n, 'e> OptBuilder<'n, 'e> {
-    pub fn new(name: &'n str) -> Self { OptBuilder { b: Base::new(name), ..Default::default() } }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for OptBuilder<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        OptBuilder {
-            b: Base::from(a),
-            s: Switched::from(a),
-            v: Valued::from(a),
-        }
-    }
-}
-
-impl<'n, 'e> From<Arg<'n, 'e>> for OptBuilder<'n, 'e> {
-    fn from(mut a: Arg<'n, 'e>) -> Self {
-        a.v.fill_in();
-        OptBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            s: mem::replace(&mut a.s, Switched::default()),
-            v: mem::replace(&mut a.v, Valued::default()),
-        }
-    }
-}
-
-impl<'n, 'e> Display for OptBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        debugln!("OptBuilder::fmt:{}", self.b.name);
-        let sep = if self.b.is_set(ArgSettings::RequireEquals) {
-            "="
-        } else {
-            " "
-        };
-        // Write the name such --long or -l
-        if let Some(l) = self.s.long {
-            try!(write!(f, "--{}{}", l, sep));
-        } else {
-            try!(write!(f, "-{}{}", self.s.short.unwrap(), sep));
-        }
-
-        // Write the values such as <name1> <name2>
-        if let Some(ref vec) = self.v.val_names {
-            let mut it = vec.iter().peekable();
-            while let Some((_, val)) = it.next() {
-                try!(write!(f, "<{}>", val));
-                if it.peek().is_some() {
-                    try!(write!(f, " "));
-                }
-            }
-            let num = vec.len();
-            if self.is_set(ArgSettings::Multiple) && num == 1 {
-                try!(write!(f, "..."));
-            }
-        } else if let Some(num) = self.v.num_vals {
-            let mut it = (0..num).peekable();
-            while let Some(_) = it.next() {
-                try!(write!(f, "<{}>", self.b.name));
-                if it.peek().is_some() {
-                    try!(write!(f, " "));
-                }
-            }
-            if self.is_set(ArgSettings::Multiple) && num == 1 {
-                try!(write!(f, "..."));
-            }
-        } else {
-            try!(write!(f,
-                        "<{}>{}",
-                        self.b.name,
-                        if self.is_set(ArgSettings::Multiple) {
-                            "..."
-                        } else {
-                            ""
-                        }));
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for OptBuilder<'n, 'e> {
-    fn name(&self) -> &'n str { self.b.name }
-    fn overrides(&self) -> Option<&[&'e str]> { self.b.overrides.as_ref().map(|o| &o[..]) }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> { self.b.blacklist.as_ref().map(|o| &o[..]) }
-    fn required_unless(&self) -> Option<&[&'e str]> { self.b.r_unless.as_ref().map(|o| &o[..]) }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> { self.v.val_names.as_ref() }
-    fn is_set(&self, s: ArgSettings) -> bool { self.b.settings.is_set(s) }
-    fn has_switch(&self) -> bool { true }
-    fn set(&mut self, s: ArgSettings) { self.b.settings.set(s) }
-    fn max_vals(&self) -> Option<u64> { self.v.max_vals }
-    fn val_terminator(&self) -> Option<&'e str> { self.v.terminator }
-    fn num_vals(&self) -> Option<u64> { self.v.num_vals }
-    fn possible_vals(&self) -> Option<&[&'e str]> { self.v.possible_vals.as_ref().map(|o| &o[..]) }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        self.v.validator.as_ref()
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        self.v.validator_os.as_ref()
-    }
-    fn min_vals(&self) -> Option<u64> { self.v.min_vals }
-    fn short(&self) -> Option<char> { self.s.short }
-    fn long(&self) -> Option<&'e str> { self.s.long }
-    fn val_delim(&self) -> Option<char> { self.v.val_delim }
-    fn takes_value(&self) -> bool { true }
-    fn help(&self) -> Option<&'e str> { self.b.help }
-    fn long_help(&self) -> Option<&'e str> { self.b.long_help }
-    fn default_val(&self) -> Option<&'e OsStr> { self.v.default_val }
-    fn default_vals_ifs(&self) -> Option<vec_map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
-    }
-    fn longest_filter(&self) -> bool { true }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.s.aliases {
-            let vis_aliases: Vec<_> = aliases.iter()
-                .filter_map(|&(n, v)| if v { Some(n) } else { None })
-                .collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> DispOrder for OptBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize { self.s.disp_ord }
-}
-
-impl<'n, 'e> PartialEq for OptBuilder<'n, 'e> {
-    fn eq(&self, other: &OptBuilder<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use args::settings::ArgSettings;
-    use super::OptBuilder;
-    use vec_map::VecMap;
-
-    #[test]
-    fn optbuilder_display1() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", o), "--option <opt>...");
-    }
-
-    #[test]
-    fn optbuilder_display2() {
-        let mut v_names = VecMap::new();
-        v_names.insert(0, "file");
-        v_names.insert(1, "name");
-
-        let mut o2 = OptBuilder::new("opt");
-        o2.s.short = Some('o');
-        o2.v.val_names = Some(v_names);
-
-        assert_eq!(&*format!("{}", o2), "-o <file> <name>");
-    }
-
-    #[test]
-    fn optbuilder_display3() {
-        let mut v_names = VecMap::new();
-        v_names.insert(0, "file");
-        v_names.insert(1, "name");
-
-        let mut o2 = OptBuilder::new("opt");
-        o2.s.short = Some('o');
-        o2.v.val_names = Some(v_names);
-        o2.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", o2), "-o <file> <name>");
-    }
-
-    #[test]
-    fn optbuilder_display_single_alias() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.s.aliases = Some(vec![("als", true)]);
-
-        assert_eq!(&*format!("{}", o), "--option <opt>");
-    }
-
-    #[test]
-    fn optbuilder_display_multiple_aliases() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.s.aliases =
-            Some(vec![("als_not_visible", false), ("als2", true), ("als3", true), ("als4", true)]);
-        assert_eq!(&*format!("{}", o), "--option <opt>");
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/positional.rs
+++ /dev/null
@@ -1,204 +0,0 @@
-// Std
-use std::borrow::Cow;
-use std::fmt::{Display, Formatter, Result};
-use std::rc::Rc;
-use std::result::Result as StdResult;
-use std::ffi::{OsStr, OsString};
-use std::mem;
-
-// Third Party
-use vec_map::{self, VecMap};
-
-// Internal
-use Arg;
-use args::{ArgSettings, Base, Valued, AnyArg, DispOrder};
-use INTERNAL_ERROR_MSG;
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Clone, Default)]
-pub struct PosBuilder<'n, 'e>
-    where 'n: 'e
-{
-    pub b: Base<'n, 'e>,
-    pub v: Valued<'n, 'e>,
-    pub index: u64,
-}
-
-impl<'n, 'e> PosBuilder<'n, 'e> {
-    pub fn new(name: &'n str, idx: u64) -> Self {
-        PosBuilder {
-            b: Base::new(name),
-            index: idx,
-            ..Default::default()
-        }
-    }
-
-    pub fn from_arg_ref(a: &Arg<'n, 'e>, idx: u64) -> Self {
-        let mut pb = PosBuilder {
-            b: Base::from(a),
-            v: Valued::from(a),
-            index: idx,
-        };
-        if a.v.max_vals.is_some() || a.v.min_vals.is_some() ||
-           (a.v.num_vals.is_some() && a.v.num_vals.unwrap() > 1) {
-            pb.b.settings.set(ArgSettings::Multiple);
-        }
-        pb
-    }
-
-    pub fn from_arg(mut a: Arg<'n, 'e>, idx: u64) -> Self {
-        if a.v.max_vals.is_some() || a.v.min_vals.is_some() ||
-           (a.v.num_vals.is_some() && a.v.num_vals.unwrap() > 1) {
-            a.b.settings.set(ArgSettings::Multiple);
-        }
-        PosBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            v: mem::replace(&mut a.v, Valued::default()),
-            index: idx,
-        }
-    }
-
-    pub fn multiple_str(&self) -> &str {
-        let mult_vals = self.v
-            .val_names
-            .as_ref()
-            .map_or(true, |names| names.len() < 2);
-        if self.is_set(ArgSettings::Multiple) && mult_vals {
-            "..."
-        } else {
-            ""
-        }
-    }
-
-    pub fn name_no_brackets(&self) -> Cow<str> {
-        debugln!("PosBuilder::name_no_brackets;");
-        if let Some(ref names) = self.v.val_names {
-            debugln!("PosBuilder:name_no_brackets: val_names={:#?}", names);
-            if names.len() > 1 {
-                Cow::Owned(names
-                               .values()
-                               .map(|n| format!("<{}>", n))
-                               .collect::<Vec<_>>()
-                               .join(" "))
-            } else {
-                Cow::Borrowed(names.values().next().expect(INTERNAL_ERROR_MSG))
-            }
-        } else {
-            debugln!("PosBuilder:name_no_brackets: just name");
-            Cow::Borrowed(self.b.name)
-        }
-    }
-}
-
-impl<'n, 'e> Display for PosBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        if let Some(ref names) = self.v.val_names {
-            try!(write!(f,
-                        "{}",
-                        names
-                            .values()
-                            .map(|n| format!("<{}>", n))
-                            .collect::<Vec<_>>()
-                            .join(" ")));
-        } else {
-            try!(write!(f, "<{}>", self.b.name));
-        }
-        if self.b.settings.is_set(ArgSettings::Multiple) && (self.v.val_names.is_none() || self.v.val_names.as_ref().unwrap().len() == 1) {
-            try!(write!(f, "..."));
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for PosBuilder<'n, 'e> {
-    fn name(&self) -> &'n str { self.b.name }
-    fn overrides(&self) -> Option<&[&'e str]> { self.b.overrides.as_ref().map(|o| &o[..]) }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> { self.b.blacklist.as_ref().map(|o| &o[..]) }
-    fn required_unless(&self) -> Option<&[&'e str]> { self.b.r_unless.as_ref().map(|o| &o[..]) }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> { self.v.val_names.as_ref() }
-    fn is_set(&self, s: ArgSettings) -> bool { self.b.settings.is_set(s) }
-    fn set(&mut self, s: ArgSettings) { self.b.settings.set(s) }
-    fn has_switch(&self) -> bool { false }
-    fn max_vals(&self) -> Option<u64> { self.v.max_vals }
-    fn val_terminator(&self) -> Option<&'e str> { self.v.terminator }
-    fn num_vals(&self) -> Option<u64> { self.v.num_vals }
-    fn possible_vals(&self) -> Option<&[&'e str]> { self.v.possible_vals.as_ref().map(|o| &o[..]) }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        self.v.validator.as_ref()
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        self.v.validator_os.as_ref()
-    }
-    fn min_vals(&self) -> Option<u64> { self.v.min_vals }
-    fn short(&self) -> Option<char> { None }
-    fn long(&self) -> Option<&'e str> { None }
-    fn val_delim(&self) -> Option<char> { self.v.val_delim }
-    fn takes_value(&self) -> bool { true }
-    fn help(&self) -> Option<&'e str> { self.b.help }
-    fn long_help(&self) -> Option<&'e str> { self.b.long_help }
-    fn default_vals_ifs(&self) -> Option<vec_map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
-    }
-    fn default_val(&self) -> Option<&'e OsStr> { self.v.default_val }
-    fn longest_filter(&self) -> bool { true }
-    fn aliases(&self) -> Option<Vec<&'e str>> { None }
-}
-
-impl<'n, 'e> DispOrder for PosBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize { self.index as usize }
-}
-
-impl<'n, 'e> PartialEq for PosBuilder<'n, 'e> {
-    fn eq(&self, other: &PosBuilder<'n, 'e>) -> bool { self.b == other.b }
-}
-
-#[cfg(test)]
-mod test {
-    use args::settings::ArgSettings;
-    use super::PosBuilder;
-    use vec_map::VecMap;
-
-    #[test]
-    fn display_mult() {
-        let mut p = PosBuilder::new("pos", 1);
-        p.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", p), "<pos>...");
-    }
-
-    #[test]
-    fn display_required() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        p2.b.settings.set(ArgSettings::Required);
-
-        assert_eq!(&*format!("{}", p2), "<pos>");
-    }
-
-    #[test]
-    fn display_val_names() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        let mut vm = VecMap::new();
-        vm.insert(0, "file1");
-        vm.insert(1, "file2");
-        p2.v.val_names = Some(vm);
-
-        assert_eq!(&*format!("{}", p2), "<file1> <file2>");
-    }
-
-    #[test]
-    fn display_val_names_req() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        p2.b.settings.set(ArgSettings::Required);
-        let mut vm = VecMap::new();
-        vm.insert(0, "file1");
-        vm.insert(1, "file2");
-        p2.v.val_names = Some(vm);
-
-        assert_eq!(&*format!("{}", p2), "<file1> <file2>");
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/switched.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-
-use Arg;
-
-#[derive(Debug)]
-pub struct Switched<'b> {
-    pub short: Option<char>,
-    pub long: Option<&'b str>,
-    pub aliases: Option<Vec<(&'b str, bool)>>, // (name, visible)
-    pub disp_ord: usize,
-    pub unified_ord: usize,
-}
-
-impl<'e> Default for Switched<'e> {
-    fn default() -> Self {
-        Switched {
-            short: None,
-            long: None,
-            aliases: None,
-            disp_ord: 999,
-            unified_ord: 999,
-        }
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Switched<'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self { a.s.clone() }
-}
-
-impl<'e> Clone for Switched<'e> {
-    fn clone(&self) -> Self {
-        Switched {
-            short: self.short,
-            long: self.long,
-            aliases: self.aliases.clone(),
-            disp_ord: self.disp_ord,
-            unified_ord: self.unified_ord,
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_builder/valued.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-use std::rc::Rc;
-use std::ffi::{OsStr, OsString};
-
-use vec_map::VecMap;
-
-use Arg;
-
-#[allow(missing_debug_implementations)]
-#[derive(Clone)]
-pub struct Valued<'a, 'b>
-    where 'a: 'b
-{
-    pub possible_vals: Option<Vec<&'b str>>,
-    pub val_names: Option<VecMap<&'b str>>,
-    pub num_vals: Option<u64>,
-    pub max_vals: Option<u64>,
-    pub min_vals: Option<u64>,
-    pub validator: Option<Rc<Fn(String) -> Result<(), String>>>,
-    pub validator_os: Option<Rc<Fn(&OsStr) -> Result<(), OsString>>>,
-    pub val_delim: Option<char>,
-    pub default_val: Option<&'b OsStr>,
-    pub default_vals_ifs: Option<VecMap<(&'a str, Option<&'b OsStr>, &'b OsStr)>>,
-    pub terminator: Option<&'b str>,
-}
-
-impl<'n, 'e> Default for Valued<'n, 'e> {
-    fn default() -> Self {
-        Valued {
-            possible_vals: None,
-            num_vals: None,
-            min_vals: None,
-            max_vals: None,
-            val_names: None,
-            validator: None,
-            validator_os: None,
-            val_delim: None,
-            default_val: None,
-            default_vals_ifs: None,
-            terminator: None,
-        }
-    }
-}
-
-impl<'n, 'e> Valued<'n, 'e> {
-    pub fn fill_in(&mut self) {
-        if let Some(ref vec) = self.val_names {
-            if vec.len() > 1 {
-                self.num_vals = Some(vec.len() as u64);
-            }
-        }
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Valued<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        let mut v = a.v.clone();
-        if let Some(ref vec) = a.v.val_names {
-            if vec.len() > 1 {
-                v.num_vals = Some(vec.len() as u64);
-            }
-        }
-        v
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_matcher.rs
+++ /dev/null
@@ -1,134 +0,0 @@
-// Std
-use std::collections::hash_map::{Entry, Iter};
-use std::ffi::OsStr;
-use std::ops::Deref;
-use std::mem;
-
-// Internal
-use args::{ArgMatches, MatchedArg, SubCommand};
-use args::AnyArg;
-use args::settings::ArgSettings;
-
-#[doc(hidden)]
-#[allow(missing_debug_implementations)]
-pub struct ArgMatcher<'a>(pub ArgMatches<'a>);
-
-impl<'a> Default for ArgMatcher<'a> {
-    fn default() -> Self { ArgMatcher(ArgMatches::default()) }
-}
-
-impl<'a> ArgMatcher<'a> {
-    pub fn new() -> Self { ArgMatcher::default() }
-
-    pub fn propagate(&mut self, arg: &'a str) {
-        debugln!("ArgMatcher::propagate: arg={}", arg);
-        let vals: Vec<_> = if let Some(ma) = self.get(arg) {
-            ma.vals.clone()
-        } else {
-            debugln!("ArgMatcher::propagate: arg wasn't used");
-            return;
-        };
-        if let Some(ref mut sc) = self.0.subcommand {
-            {
-                let sma = (*sc).matches.args.entry(arg).or_insert_with(|| {
-                    let mut gma = MatchedArg::new();
-                    gma.occurs += 1;
-                    gma.vals = vals.clone();
-                    gma
-                });
-                if sma.vals.is_empty() {
-                    sma.vals = vals.clone();
-                }
-            }
-            let mut am = ArgMatcher(mem::replace(&mut sc.matches, ArgMatches::new()));
-            am.propagate(arg);
-            mem::swap(&mut am.0, &mut sc.matches);
-        } else {
-            debugln!("ArgMatcher::propagate: Subcommand wasn't used");
-        }
-    }
-
-    pub fn get_mut(&mut self, arg: &str) -> Option<&mut MatchedArg> { self.0.args.get_mut(arg) }
-
-    pub fn get(&self, arg: &str) -> Option<&MatchedArg> { self.0.args.get(arg) }
-
-    pub fn remove(&mut self, arg: &str) { self.0.args.remove(arg); }
-
-    pub fn remove_all(&mut self, args: &[&str]) {
-        for &arg in args {
-            self.0.args.remove(arg);
-        }
-    }
-
-    pub fn insert(&mut self, name: &'a str) { self.0.args.insert(name, MatchedArg::new()); }
-
-    pub fn contains(&self, arg: &str) -> bool { self.0.args.contains_key(arg) }
-
-    pub fn is_empty(&self) -> bool { self.0.args.is_empty() }
-
-    pub fn usage(&mut self, usage: String) { self.0.usage = Some(usage); }
-
-    pub fn arg_names(&'a self) -> Vec<&'a str> { self.0.args.keys().map(Deref::deref).collect() }
-
-    pub fn entry(&mut self, arg: &'a str) -> Entry<&'a str, MatchedArg> { self.0.args.entry(arg) }
-
-    pub fn subcommand(&mut self, sc: SubCommand<'a>) { self.0.subcommand = Some(Box::new(sc)); }
-
-    pub fn subcommand_name(&self) -> Option<&str> { self.0.subcommand_name() }
-
-    pub fn iter(&self) -> Iter<&str, MatchedArg> { self.0.args.iter() }
-
-    pub fn inc_occurrence_of(&mut self, arg: &'a str) {
-        debugln!("ArgMatcher::inc_occurrence_of: arg={}", arg);
-        if let Some(a) = self.get_mut(arg) {
-            a.occurs += 1;
-            return;
-        }
-        debugln!("ArgMatcher::inc_occurrence_of: first instance");
-        self.insert(arg);
-    }
-
-    pub fn inc_occurrences_of(&mut self, args: &[&'a str]) {
-        debugln!("ArgMatcher::inc_occurrences_of: args={:?}", args);
-        for arg in args {
-            self.inc_occurrence_of(arg);
-        }
-    }
-
-    pub fn add_val_to(&mut self, arg: &'a str, val: &OsStr) {
-        let ma = self.entry(arg).or_insert(MatchedArg {
-            occurs: 0,
-            vals: Vec::with_capacity(1),
-        });
-        // let len = ma.vals.len() + 1;
-        ma.vals.push(val.to_owned());
-    }
-
-    pub fn needs_more_vals<'b, A>(&self, o: &A) -> bool
-        where A: AnyArg<'a, 'b>
-    {
-        debugln!("ArgMatcher::needs_more_vals: o={}", o.name());
-        if let Some(ma) = self.get(o.name()) {
-            if let Some(num) = o.num_vals() {
-                debugln!("ArgMatcher::needs_more_vals: num_vals...{}", num);
-                return if o.is_set(ArgSettings::Multiple) {
-                    ((ma.vals.len() as u64) % num) != 0
-                } else {
-                    num != (ma.vals.len() as u64)
-                };
-            } else if let Some(num) = o.max_vals() {
-                debugln!("ArgMatcher::needs_more_vals: max_vals...{}", num);
-                return !((ma.vals.len() as u64) > num);
-            } else if o.min_vals().is_some() {
-                debugln!("ArgMatcher::needs_more_vals: min_vals...true");
-                return true;
-            }
-            return o.is_set(ArgSettings::Multiple);
-        }
-        true
-    }
-}
-
-impl<'a> Into<ArgMatches<'a>> for ArgMatcher<'a> {
-    fn into(self) -> ArgMatches<'a> { self.0 }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/arg_matches.rs
+++ /dev/null
@@ -1,638 +0,0 @@
-// Std
-use std::borrow::Cow;
-use std::collections::HashMap;
-use std::ffi::{OsStr, OsString};
-use std::iter::Map;
-use std::slice::Iter;
-
-// Internal
-use INVALID_UTF8;
-use args::MatchedArg;
-use args::SubCommand;
-
-/// Used to get information about the arguments that where supplied to the program at runtime by
-/// the user. New instances of this struct are obtained by using the [`App::get_matches`] family of
-/// methods.
-///
-/// # Examples
-///
-/// ```no_run
-/// # use clap::{App, Arg};
-/// let matches = App::new("MyApp")
-///     .arg(Arg::with_name("out")
-///         .long("output")
-///         .required(true)
-///         .takes_value(true))
-///     .arg(Arg::with_name("debug")
-///         .short("d")
-///         .multiple(true))
-///     .arg(Arg::with_name("cfg")
-///         .short("c")
-///         .takes_value(true))
-///     .get_matches(); // builds the instance of ArgMatches
-///
-/// // to get information about the "cfg" argument we created, such as the value supplied we use
-/// // various ArgMatches methods, such as ArgMatches::value_of
-/// if let Some(c) = matches.value_of("cfg") {
-///     println!("Value for -c: {}", c);
-/// }
-///
-/// // The ArgMatches::value_of method returns an Option because the user may not have supplied
-/// // that argument at runtime. But if we specified that the argument was "required" as we did
-/// // with the "out" argument, we can safely unwrap because `clap` verifies that was actually
-/// // used at runtime.
-/// println!("Value for --output: {}", matches.value_of("out").unwrap());
-///
-/// // You can check the presence of an argument
-/// if matches.is_present("out") {
-///     // Another way to check if an argument was present, or if it occurred multiple times is to
-///     // use occurrences_of() which returns 0 if an argument isn't found at runtime, or the
-///     // number of times that it occurred, if it was. To allow an argument to appear more than
-///     // once, you must use the .multiple(true) method, otherwise it will only return 1 or 0.
-///     if matches.occurrences_of("debug") > 2 {
-///         println!("Debug mode is REALLY on, don't be crazy");
-///     } else {
-///         println!("Debug mode kind of on");
-///     }
-/// }
-/// ```
-/// [`App::get_matches`]: ./struct.App.html#method.get_matches
-#[derive(Debug, Clone)]
-pub struct ArgMatches<'a> {
-    #[doc(hidden)]
-    pub args: HashMap<&'a str, MatchedArg>,
-    #[doc(hidden)]
-    pub subcommand: Option<Box<SubCommand<'a>>>,
-    #[doc(hidden)]
-    pub usage: Option<String>,
-}
-
-impl<'a> Default for ArgMatches<'a> {
-    fn default() -> Self {
-        ArgMatches {
-            args: HashMap::new(),
-            subcommand: None,
-            usage: None,
-        }
-    }
-}
-
-impl<'a> ArgMatches<'a> {
-    #[doc(hidden)]
-    pub fn new() -> Self { ArgMatches { ..Default::default() } }
-
-    /// Gets the value of a specific [option] or [positional] argument (i.e. an argument that takes
-    /// an additional value at runtime). If the option wasn't present at runtime
-    /// it returns `None`.
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`ArgMatches::values_of`] as `ArgMatches::value_of` will only return the *first*
-    /// value.
-    ///
-    /// # Panics
-    ///
-    /// This method will [`panic!`] if the value contains invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("output")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec!["myapp", "something"]);
-    ///
-    /// assert_eq!(m.value_of("output"), Some("something"));
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [positional]: ./struct.Arg.html#method.index
-    /// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    pub fn value_of<S: AsRef<str>>(&self, name: S) -> Option<&str> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            if let Some(v) = arg.vals.get(0) {
-                return Some(v.to_str().expect(INVALID_UTF8));
-            }
-        }
-        None
-    }
-
-    /// Gets the lossy value of a specific argument. If the argument wasn't present at runtime
-    /// it returns `None`. A lossy value is one which contains invalid UTF-8 code points, those
-    /// invalid points will be replaced with `\u{FFFD}`
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`Arg::values_of_lossy`] as `value_of_lossy()` will only return the *first* value.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg> 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi {0xe9}!"
-    ///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-    /// assert_eq!(&*m.value_of_lossy("arg").unwrap(), "Hi \u{FFFD}!");
-    /// ```
-    /// [`Arg::values_of_lossy`]: ./struct.ArgMatches.html#method.values_of_lossy
-    pub fn value_of_lossy<S: AsRef<str>>(&'a self, name: S) -> Option<Cow<'a, str>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            if let Some(v) = arg.vals.get(0) {
-                return Some(v.to_string_lossy());
-            }
-        }
-        None
-    }
-
-    /// Gets the OS version of a string value of a specific argument. If the option wasn't present
-    /// at runtime it returns `None`. An OS value on Unix-like systems is any series of bytes,
-    /// regardless of whether or not they contain valid UTF-8 code points. Since [`String`]s in
-    /// Rust are guaranteed to be valid UTF-8, a valid filename on a Unix system as an argument
-    /// value may contain invalid UTF-8 code points.
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`ArgMatches::values_of_os`] as `Arg::value_of_os` will only return the *first*
-    /// value.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg> 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi {0xe9}!"
-    ///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-    /// assert_eq!(&*m.value_of_os("arg").unwrap().as_bytes(), [b'H', b'i', b' ', 0xe9, b'!']);
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`ArgMatches::values_of_os`]: ./struct.ArgMatches.html#method.values_of_os
-    pub fn value_of_os<S: AsRef<str>>(&self, name: S) -> Option<&OsStr> {
-        self.args
-            .get(name.as_ref())
-            .map_or(None, |arg| arg.vals.get(0).map(|v| v.as_os_str()))
-    }
-
-    /// Gets a [`Values`] struct which implements [`Iterator`] for values of a specific argument
-    /// (i.e. an argument that takes multiple values at runtime). If the option wasn't present at
-    /// runtime it returns `None`
-    ///
-    /// # Panics
-    ///
-    /// This method will panic if any of the values contain invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("output")
-    ///         .multiple(true)
-    ///         .short("o")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-o", "val1", "val2", "val3"
-    ///     ]);
-    /// let vals: Vec<&str> = m.values_of("output").unwrap().collect();
-    /// assert_eq!(vals, ["val1", "val2", "val3"]);
-    /// ```
-    /// [`Values`]: ./struct.Values.html
-    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
-    pub fn values_of<S: AsRef<str>>(&'a self, name: S) -> Option<Values<'a>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            fn to_str_slice(o: &OsString) -> &str { o.to_str().expect(INVALID_UTF8) }
-            let to_str_slice: fn(&OsString) -> &str = to_str_slice; // coerce to fn pointer
-            return Some(Values { iter: arg.vals.iter().map(to_str_slice) });
-        }
-        None
-    }
-
-    /// Gets the lossy values of a specific argument. If the option wasn't present at runtime
-    /// it returns `None`. A lossy value is one where if it contains invalid UTF-8 code points,
-    /// those invalid points will be replaced with `\u{FFFD}`
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::OsStringExt;
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi"
-    ///                             OsString::from_vec(vec![b'H', b'i']),
-    ///                             // "{0xe9}!"
-    ///                             OsString::from_vec(vec![0xe9, b'!'])]);
-    /// let mut itr = m.values_of_lossy("arg").unwrap().into_iter();
-    /// assert_eq!(&itr.next().unwrap()[..], "Hi");
-    /// assert_eq!(&itr.next().unwrap()[..], "\u{FFFD}!");
-    /// assert_eq!(itr.next(), None);
-    /// ```
-    pub fn values_of_lossy<S: AsRef<str>>(&'a self, name: S) -> Option<Vec<String>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(arg.vals
-                .iter()
-                .map(|v| v.to_string_lossy().into_owned())
-                .collect());
-        }
-        None
-    }
-
-    /// Gets a [`OsValues`] struct which is implements [`Iterator`] for [`OsString`] values of a
-    /// specific argument. If the option wasn't present at runtime it returns `None`. An OS value
-    /// on Unix-like systems is any series of bytes, regardless of whether or not they contain
-    /// valid UTF-8 code points. Since [`String`]s in Rust are guaranteed to be valid UTF-8, a valid
-    /// filename as an argument value on Linux (for example) may contain invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::{OsStr,OsString};
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                                 // "Hi"
-    ///                                 OsString::from_vec(vec![b'H', b'i']),
-    ///                                 // "{0xe9}!"
-    ///                                 OsString::from_vec(vec![0xe9, b'!'])]);
-    ///
-    /// let mut itr = m.values_of_os("arg").unwrap().into_iter();
-    /// assert_eq!(itr.next(), Some(OsStr::new("Hi")));
-    /// assert_eq!(itr.next(), Some(OsStr::from_bytes(&[0xe9, b'!'])));
-    /// assert_eq!(itr.next(), None);
-    /// ```
-    /// [`OsValues`]: ./struct.OsValues.html
-    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
-    /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    pub fn values_of_os<S: AsRef<str>>(&'a self, name: S) -> Option<OsValues<'a>> {
-        fn to_str_slice(o: &OsString) -> &OsStr { &*o }
-        let to_str_slice: fn(&'a OsString) -> &'a OsStr = to_str_slice; // coerce to fn pointer
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(OsValues { iter: arg.vals.iter().map(to_str_slice) });
-        }
-        None
-    }
-
-    /// Returns `true` if an argument was present at runtime, otherwise `false`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("debug"));
-    /// ```
-    pub fn is_present<S: AsRef<str>>(&self, name: S) -> bool {
-        if let Some(ref sc) = self.subcommand {
-            if sc.name == name.as_ref() {
-                return true;
-            }
-        }
-        self.args.contains_key(name.as_ref())
-    }
-
-    /// Returns the number of times an argument was used at runtime. If an argument isn't present
-    /// it will return `0`.
-    ///
-    /// **NOTE:** This returns the number of times the argument was used, *not* the number of
-    /// values. For example, `-o val1 val2 val3 -o val4` would return `2` (2 occurrences, but 4
-    /// values).
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d")
-    ///         .multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d", "-d", "-d"
-    ///     ]);
-    ///
-    /// assert_eq!(m.occurrences_of("debug"), 3);
-    /// ```
-    ///
-    /// This next example shows that counts actual uses of the argument, not just `-`'s
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d")
-    ///         .multiple(true))
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-ddfd"
-    ///     ]);
-    ///
-    /// assert_eq!(m.occurrences_of("debug"), 3);
-    /// assert_eq!(m.occurrences_of("flag"), 1);
-    /// ```
-    pub fn occurrences_of<S: AsRef<str>>(&self, name: S) -> u64 {
-        self.args.get(name.as_ref()).map_or(0, |a| a.occurs)
-    }
-
-    /// Because [`Subcommand`]s are essentially "sub-[`App`]s" they have their own [`ArgMatches`]
-    /// as well. This method returns the [`ArgMatches`] for a particular subcommand or `None` if
-    /// the subcommand wasn't present at runtime.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let app_m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .subcommand(SubCommand::with_name("test")
-    ///         .arg(Arg::with_name("opt")
-    ///             .long("option")
-    ///             .takes_value(true)))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d", "test", "--option", "val"
-    ///     ]);
-    ///
-    /// // Both parent commands, and child subcommands can have arguments present at the same times
-    /// assert!(app_m.is_present("debug"));
-    ///
-    /// // Get the subcommand's ArgMatches instance
-    /// if let Some(sub_m) = app_m.subcommand_matches("test") {
-    ///     // Use the struct like normal
-    ///     assert_eq!(sub_m.value_of("opt"), Some("val"));
-    /// }
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    pub fn subcommand_matches<S: AsRef<str>>(&self, name: S) -> Option<&ArgMatches<'a>> {
-        if let Some(ref s) = self.subcommand {
-            if s.name == name.as_ref() {
-                return Some(&s.matches);
-            }
-        }
-        None
-    }
-
-    /// Because [`Subcommand`]s are essentially "sub-[`App`]s" they have their own [`ArgMatches`]
-    /// as well.But simply getting the sub-[`ArgMatches`] doesn't help much if we don't also know
-    /// which subcommand was actually used. This method returns the name of the subcommand that was
-    /// used at runtime, or `None` if one wasn't.
-    ///
-    /// *NOTE*: Subcommands form a hierarchy, where multiple subcommands can be used at runtime,
-    /// but only a single subcommand from any group of sibling commands may used at once.
-    ///
-    /// An ASCII art depiction may help explain this better...Using a fictional version of `git` as
-    /// the demo subject. Imagine the following are all subcommands of `git` (note, the author is
-    /// aware these aren't actually all subcommands in the real `git` interface, but it makes
-    /// explanation easier)
-    ///
-    /// ```notrust
-    ///              Top Level App (git)                         TOP
-    ///                              |
-    ///       -----------------------------------------
-    ///      /             |                \          \
-    ///   clone          push              add       commit      LEVEL 1
-    ///     |           /    \            /    \       |
-    ///    url      origin   remote    ref    name   message     LEVEL 2
-    ///             /                  /\
-    ///          path            remote  local                   LEVEL 3
-    /// ```
-    ///
-    /// Given the above fictional subcommand hierarchy, valid runtime uses would be (not an all
-    /// inclusive list, and not including argument options per command for brevity and clarity):
-    ///
-    /// ```sh
-    /// $ git clone url
-    /// $ git push origin path
-    /// $ git add ref local
-    /// $ git commit message
-    /// ```
-    ///
-    /// Notice only one command per "level" may be used. You could not, for example, do `$ git
-    /// clone url push origin path`
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    ///  let app_m = App::new("git")
-    ///      .subcommand(SubCommand::with_name("clone"))
-    ///      .subcommand(SubCommand::with_name("push"))
-    ///      .subcommand(SubCommand::with_name("commit"))
-    ///      .get_matches();
-    ///
-    /// match app_m.subcommand_name() {
-    ///     Some("clone")  => {}, // clone was used
-    ///     Some("push")   => {}, // push was used
-    ///     Some("commit") => {}, // commit was used
-    ///     _              => {}, // Either no subcommand or one not tested for...
-    /// }
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    pub fn subcommand_name(&self) -> Option<&str> {
-        self.subcommand.as_ref().map(|sc| &sc.name[..])
-    }
-
-    /// This brings together [`ArgMatches::subcommand_matches`] and [`ArgMatches::subcommand_name`]
-    /// by returning a tuple with both pieces of information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    ///  let app_m = App::new("git")
-    ///      .subcommand(SubCommand::with_name("clone"))
-    ///      .subcommand(SubCommand::with_name("push"))
-    ///      .subcommand(SubCommand::with_name("commit"))
-    ///      .get_matches();
-    ///
-    /// match app_m.subcommand() {
-    ///     ("clone",  Some(sub_m)) => {}, // clone was used
-    ///     ("push",   Some(sub_m)) => {}, // push was used
-    ///     ("commit", Some(sub_m)) => {}, // commit was used
-    ///     _                       => {}, // Either no subcommand or one not tested for...
-    /// }
-    /// ```
-    ///
-    /// Another useful scenario is when you want to support third party, or external, subcommands.
-    /// In these cases you can't know the subcommand name ahead of time, so use a variable instead
-    /// with pattern matching!
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let app_m = App::new("myprog")
-    ///     .setting(AppSettings::AllowExternalSubcommands)
-    ///     .get_matches_from(vec![
-    ///         "myprog", "subcmd", "--option", "value", "-fff", "--flag"
-    ///     ]);
-    ///
-    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
-    /// // string argument name
-    /// match app_m.subcommand() {
-    ///     (external, Some(sub_m)) => {
-    ///          let ext_args: Vec<&str> = sub_m.values_of("").unwrap().collect();
-    ///          assert_eq!(external, "subcmd");
-    ///          assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
-    ///     },
-    ///     _ => {},
-    /// }
-    /// ```
-    /// [`ArgMatches::subcommand_matches`]: ./struct.ArgMatches.html#method.subcommand_matches
-    /// [`ArgMatches::subcommand_name`]: ./struct.ArgMatches.html#method.subcommand_name
-    pub fn subcommand(&self) -> (&str, Option<&ArgMatches<'a>>) {
-        self.subcommand.as_ref().map_or(("", None), |sc| (&sc.name[..], Some(&sc.matches)))
-    }
-
-    /// Returns a string slice of the usage statement for the [`App`] or [`SubCommand`]
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let app_m = App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches();
-    ///
-    /// println!("{}", app_m.usage());
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    pub fn usage(&self) -> &str { self.usage.as_ref().map_or("", |u| &u[..]) }
-}
-
-
-// The following were taken and adapated from vec_map source
-// repo: https://github.com/contain-rs/vec-map
-// commit: be5e1fa3c26e351761b33010ddbdaf5f05dbcc33
-// license: MIT - Copyright (c) 2015 The Rust Project Developers
-
-/// An iterator for getting multiple values out of an argument via the [`ArgMatches::values_of`]
-/// method.
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::{App, Arg};
-/// let m = App::new("myapp")
-///     .arg(Arg::with_name("output")
-///         .takes_value(true))
-///     .get_matches_from(vec!["myapp", "something"]);
-///
-/// assert_eq!(m.value_of("output"), Some("something"));
-/// ```
-/// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-#[derive(Clone)]
-#[allow(missing_debug_implementations)]
-pub struct Values<'a> {
-    iter: Map<Iter<'a, OsString>, fn(&'a OsString) -> &'a str>,
-}
-
-impl<'a> Iterator for Values<'a> {
-    type Item = &'a str;
-
-    fn next(&mut self) -> Option<&'a str> { self.iter.next() }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
-}
-
-impl<'a> DoubleEndedIterator for Values<'a> {
-    fn next_back(&mut self) -> Option<&'a str> { self.iter.next_back() }
-}
-
-impl<'a> ExactSizeIterator for Values<'a> {}
-
-/// Creates an empty iterator.
-impl Default for Values<'static> {
-    fn default() -> Self {
-        static EMPTY: [OsString; 0] = [];
-        // This is never called because the iterator is empty:
-        fn to_str_slice(_: &OsString) -> &str { unreachable!() };
-        Values { iter: EMPTY[..].iter().map(to_str_slice) }
-    }
-}
-
-#[test]
-fn test_default_values() {
-    let mut values: Values = Values::default();
-    assert_eq!(values.next(), None);
-}
-
-/// An iterator for getting multiple values out of an argument via the [`ArgMatches::values_of_os`]
-/// method. Usage of this iterator allows values which contain invalid UTF-8 code points unlike
-/// [`Values`].
-///
-/// # Examples
-///
-#[cfg_attr(not(unix), doc=" ```ignore")]
-#[cfg_attr(    unix , doc=" ```")]
-/// # use clap::{App, Arg};
-/// use std::ffi::OsString;
-/// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-///
-/// let m = App::new("utf8")
-///     .arg(Arg::from_usage("<arg> 'some arg'"))
-///     .get_matches_from(vec![OsString::from("myprog"),
-///                             // "Hi {0xe9}!"
-///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-/// assert_eq!(&*m.value_of_os("arg").unwrap().as_bytes(), [b'H', b'i', b' ', 0xe9, b'!']);
-/// ```
-/// [`ArgMatches::values_of_os`]: ./struct.ArgMatches.html#method.values_of_os
-/// [`Values`]: ./struct.Values.html
-#[derive(Clone)]
-#[allow(missing_debug_implementations)]
-pub struct OsValues<'a> {
-    iter: Map<Iter<'a, OsString>, fn(&'a OsString) -> &'a OsStr>,
-}
-
-impl<'a> Iterator for OsValues<'a> {
-    type Item = &'a OsStr;
-
-    fn next(&mut self) -> Option<&'a OsStr> { self.iter.next() }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
-}
-
-impl<'a> DoubleEndedIterator for OsValues<'a> {
-    fn next_back(&mut self) -> Option<&'a OsStr> { self.iter.next_back() }
-}
-
-/// Creates an empty iterator.
-impl Default for OsValues<'static> {
-    fn default() -> Self {
-        static EMPTY: [OsString; 0] = [];
-        // This is never called because the iterator is empty:
-        fn to_str_slice(_: &OsString) -> &OsStr { unreachable!() };
-        OsValues { iter: EMPTY[..].iter().map(to_str_slice) }
-    }
-}
-
-#[test]
-fn test_default_osvalues() {
-    let mut values: OsValues = OsValues::default();
-    assert_eq!(values.next(), None);
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/group.rs
+++ /dev/null
@@ -1,634 +0,0 @@
-#[cfg(feature = "yaml")]
-use std::collections::BTreeMap;
-use std::fmt::{Debug, Formatter, Result};
-
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-/// `ArgGroup`s are a family of related [arguments] and way for you to express, "Any of these
-/// arguments". By placing arguments in a logical group, you can create easier requirement and
-/// exclusion rules instead of having to list each argument individually, or when you want a rule
-/// to apply "any but not all" arguments.
-///
-/// For instance, you can make an entire `ArgGroup` required. If [`ArgGroup::multiple(true)`] is
-/// set, this means that at least one argument from that group must be present. If
-/// [`ArgGroup::multiple(false)`] is set (the default), one and *only* one must be present.
-///
-/// You can also do things such as name an entire `ArgGroup` as a [conflict] or [requirement] for
-/// another argument, meaning any of the arguments that belong to that group will cause a failure
-/// if present, or must present respectively.
-///
-/// Perhaps the most common use of `ArgGroup`s is to require one and *only* one argument to be
-/// present out of a given set. Imagine that you had multiple arguments, and you want one of them
-/// to be required, but making all of them required isn't feasible because perhaps they conflict
-/// with each other. For example, lets say that you were building an application where one could
-/// set a given version number by supplying a string with an option argument, i.e.
-/// `--set-ver v1.2.3`, you also wanted to support automatically using a previous version number
-/// and simply incrementing one of the three numbers. So you create three flags `--major`,
-/// `--minor`, and `--patch`. All of these arguments shouldn't be used at one time but you want to
-/// specify that *at least one* of them is used. For this, you can create a group.
-///
-/// Finally, you may use `ArgGroup`s to pull a value from a group of arguments when you don't care
-/// exactly which argument was actually used at runtime.
-///
-/// # Examples
-///
-/// The following example demonstrates using an `ArgGroup` to ensure that one, and only one, of
-/// the arguments from the specified group is present at runtime.
-///
-/// ```rust
-/// # use clap::{App, ArgGroup, ErrorKind};
-/// let result = App::new("app")
-///     .args_from_usage(
-///         "--set-ver [ver] 'set the version manually'
-///          --major         'auto increase major'
-///          --minor         'auto increase minor'
-///          --patch         'auto increase patch'")
-///     .group(ArgGroup::with_name("vers")
-///          .args(&["set-ver", "major", "minor","patch"])
-///          .required(true))
-///     .get_matches_from_safe(vec!["app", "--major", "--patch"]);
-/// // Because we used two args in the group it's an error
-/// assert!(result.is_err());
-/// let err = result.unwrap_err();
-/// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-/// ```
-/// This next example shows a passing parse of the same scenario
-///
-/// ```rust
-/// # use clap::{App, ArgGroup};
-/// let result = App::new("app")
-///     .args_from_usage(
-///         "--set-ver [ver] 'set the version manually'
-///          --major         'auto increase major'
-///          --minor         'auto increase minor'
-///          --patch         'auto increase patch'")
-///     .group(ArgGroup::with_name("vers")
-///          .args(&["set-ver", "major", "minor","patch"])
-///          .required(true))
-///     .get_matches_from_safe(vec!["app", "--major"]);
-/// assert!(result.is_ok());
-/// let matches = result.unwrap();
-/// // We may not know which of the args was used, so we can test for the group...
-/// assert!(matches.is_present("vers"));
-/// // we could also alternatively check each arg individually (not shown here)
-/// ```
-/// [`ArgGroup::multiple(true)`]: ./struct.ArgGroup.html#method.multiple
-/// [arguments]: ./struct.Arg.html
-/// [conflict]: ./struct.Arg.html#method.conflicts_with
-/// [requirement]: ./struct.Arg.html#method.requires
-#[derive(Default)]
-pub struct ArgGroup<'a> {
-    #[doc(hidden)]
-    pub name: &'a str,
-    #[doc(hidden)]
-    pub args: Vec<&'a str>,
-    #[doc(hidden)]
-    pub required: bool,
-    #[doc(hidden)]
-    pub requires: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub conflicts: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub multiple: bool,
-}
-
-impl<'a> ArgGroup<'a> {
-    /// Creates a new instance of `ArgGroup` using a unique string name. The name will be used to
-    /// get values from the group or refer to the group inside of conflict and requirement rules.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, ArgGroup};
-    /// ArgGroup::with_name("config")
-    /// # ;
-    /// ```
-    pub fn with_name(n: &'a str) -> Self {
-        ArgGroup {
-            name: n,
-            required: false,
-            args: vec![],
-            requires: None,
-            conflicts: None,
-            multiple: false,
-        }
-    }
-
-    /// Creates a new instance of `ArgGroup` from a .yml (YAML) file.
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::ArgGroup;
-    /// # fn main() {
-    /// let yml = load_yaml!("group.yml");
-    /// let ag = ArgGroup::from_yaml(yml);
-    /// # }
-    /// ```
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(y: &'a Yaml) -> ArgGroup<'a> { ArgGroup::from(y.as_hash().unwrap()) }
-
-    /// Adds an [argument] to this group by name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .arg("flag")
-    ///         .arg("color"))
-    ///     .get_matches_from(vec!["myprog", "-f"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// // but we can also check individually if needed
-    /// assert!(m.is_present("flag"));
-    /// ```
-    /// [argument]: ./struct.Arg.html
-    #[cfg_attr(feature = "lints", allow(should_assert_eq))]
-    pub fn arg(mut self, n: &'a str) -> Self {
-        assert!(self.name != n,
-                "ArgGroup '{}' can not have same name as arg inside it",
-                &*self.name);
-        self.args.push(n);
-        self
-    }
-
-    /// Adds multiple [arguments] to this group by name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"]))
-    ///     .get_matches_from(vec!["myprog", "-f"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// // but we can also check individually if needed
-    /// assert!(m.is_present("flag"));
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    pub fn args(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.arg(n);
-        }
-        self
-    }
-
-    /// Allows more than one of the ['Arg']s in this group to be used. (Default: `false`)
-    ///
-    /// # Examples
-    ///
-    /// Notice in this example we use *both* the `-f` and `-c` flags which are both part of the
-    /// group
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myprog", "-f", "-c"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// ```
-    /// In this next example, we show the default behavior (i.e. `multiple(false)) which will throw
-    /// an error if more than one of the args in the group was used.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-f", "-c"]);
-    /// // Because we used both args in the group it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// ['Arg']: ./struct.Arg.html
-    pub fn multiple(mut self, m: bool) -> Self {
-        self.multiple = m;
-        self
-    }
-
-    /// Sets the group as required or not. A required group will be displayed in the usage string
-    /// of the application in the format `<arg|arg2|arg3>`. A required `ArgGroup` simply states
-    /// that one argument from this group *must* be present at runtime (unless
-    /// conflicting with another argument).
-    ///
-    /// **NOTE:** This setting only applies to the current [`App`] / [`SubCommand`], and not
-    /// globally.
-    ///
-    /// **NOTE:** By default, [`ArgGroup::multiple`] is set to `false` which when combined with
-    /// `ArgGroup::required(true)` states, "One and *only one* arg must be used from this group.
-    /// Use of more than one arg is an error." Vice setting `ArgGroup::multiple(true)` which
-    /// states, '*At least* one arg from this group must be used. Using multiple is OK."
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .required(true))
-    ///     .get_matches_from_safe(vec!["myprog"]);
-    /// // Because we didn't use any of the args in the group, it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ArgGroup::multiple`]: ./struct.ArgGroup.html#method.multiple
-    pub fn required(mut self, r: bool) -> Self {
-        self.required = r;
-        self
-    }
-
-    /// Sets the requirement rules of this group. This is not to be confused with a
-    /// [required group]. Requirement rules function just like [argument requirement rules], you
-    /// can name other arguments or groups that must be present when any one of the arguments from
-    /// this group is used.
-    ///
-    /// **NOTE:** The name provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .requires("debug"))
-    ///     .get_matches_from_safe(vec!["myprog", "-c"]);
-    /// // because we used an arg from the group, and the group requires "-d" to be used, it's an
-    /// // error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required group]: ./struct.ArgGroup.html#method.required
-    /// [argument requirement rules]: ./struct.Arg.html#method.requires
-    pub fn requires(mut self, n: &'a str) -> Self {
-        if let Some(ref mut reqs) = self.requires {
-            reqs.push(n);
-        } else {
-            self.requires = Some(vec![n]);
-        }
-        self
-    }
-
-    /// Sets the requirement rules of this group. This is not to be confused with a
-    /// [required group]. Requirement rules function just like [argument requirement rules], you
-    /// can name other arguments or groups that must be present when one of the arguments from this
-    /// group is used.
-    ///
-    /// **NOTE:** The names provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .arg(Arg::with_name("verb")
-    ///         .short("v"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .requires_all(&["debug", "verb"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-d"]);
-    /// // because we used an arg from the group, and the group requires "-d" and "-v" to be used,
-    /// // yet we only used "-d" it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required group]: ./struct.ArgGroup.html#method.required
-    /// [argument requirement rules]: ./struct.Arg.html#method.requires_all
-    pub fn requires_all(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.requires(n);
-        }
-        self
-    }
-
-    /// Sets the exclusion rules of this group. Exclusion (aka conflict) rules function just like
-    /// [argument exclusion rules], you can name other arguments or groups that must *not* be
-    /// present when one of the arguments from this group are used.
-    ///
-    /// **NOTE:** The name provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .conflicts_with("debug"))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-d"]);
-    /// // because we used an arg from the group, and the group conflicts with "-d", it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [argument exclusion rules]: ./struct.Arg.html#method.conflicts_with
-    pub fn conflicts_with(mut self, n: &'a str) -> Self {
-        if let Some(ref mut confs) = self.conflicts {
-            confs.push(n);
-        } else {
-            self.conflicts = Some(vec![n]);
-        }
-        self
-    }
-
-    /// Sets the exclusion rules of this group. Exclusion rules function just like
-    /// [argument exclusion rules], you can name other arguments or groups that must *not* be
-    /// present when one of the arguments from this group are used.
-    ///
-    /// **NOTE:** The names provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .arg(Arg::with_name("verb")
-    ///         .short("v"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .conflicts_with_all(&["debug", "verb"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-v"]);
-    /// // because we used an arg from the group, and the group conflicts with either "-v" or "-d"
-    /// // it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [argument exclusion rules]: ./struct.Arg.html#method.conflicts_with_all
-    pub fn conflicts_with_all(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.conflicts_with(n);
-        }
-        self
-    }
-}
-
-impl<'a> Debug for ArgGroup<'a> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        write!(f,
-               "{{\n\
-                   \tname: {:?},\n\
-                   \targs: {:?},\n\
-                   \trequired: {:?},\n\
-                   \trequires: {:?},\n\
-                   \tconflicts: {:?},\n\
-                }}",
-               self.name,
-               self.args,
-               self.required,
-               self.requires,
-               self.conflicts)
-    }
-}
-
-impl<'a, 'z> From<&'z ArgGroup<'a>> for ArgGroup<'a> {
-    fn from(g: &'z ArgGroup<'a>) -> Self {
-        ArgGroup {
-            name: g.name,
-            required: g.required,
-            args: g.args.clone(),
-            requires: g.requires.clone(),
-            conflicts: g.conflicts.clone(),
-            multiple: g.multiple,
-        }
-    }
-}
-
-#[cfg(feature = "yaml")]
-impl<'a> From<&'a BTreeMap<Yaml, Yaml>> for ArgGroup<'a> {
-    fn from(b: &'a BTreeMap<Yaml, Yaml>) -> Self {
-        // We WANT this to panic on error...so expect() is good.
-        let mut a = ArgGroup::default();
-        let group_settings = if b.len() == 1 {
-            let name_yml = b.keys().nth(0).expect("failed to get name");
-            let name_str = name_yml.as_str().expect("failed to convert arg YAML name to str");
-            a.name = name_str;
-            b.get(name_yml)
-                .expect("failed to get name_str")
-                .as_hash()
-                .expect("failed to convert to a hash")
-        } else {
-            b
-        };
-
-        for (k, v) in group_settings {
-            a = match k.as_str().unwrap() {
-                "required" => a.required(v.as_bool().unwrap()),
-                "multiple" => a.multiple(v.as_bool().unwrap()),
-                "args" => yaml_vec_or_str!(v, a, arg),
-                "arg" => {
-                    if let Some(ys) = v.as_str() {
-                        a = a.arg(ys);
-                    }
-                    a
-                }
-                "requires" => yaml_vec_or_str!(v, a, requires),
-                "conflicts_with" => yaml_vec_or_str!(v, a, conflicts_with),
-                "name" => {
-                    if let Some(ys) = v.as_str() {
-                        a.name = ys;
-                    }
-                    a
-                }
-                s => {
-                    panic!("Unknown ArgGroup setting '{}' in YAML file for \
-                             ArgGroup '{}'",
-                           s,
-                           a.name)
-                }
-            }
-        }
-
-        a
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::ArgGroup;
-    #[cfg(feature = "yaml")]
-    use yaml_rust::YamlLoader;
-
-    #[test]
-    fn groups() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        assert_eq!(g.args, args);
-        assert_eq!(g.requires, Some(reqs));
-        assert_eq!(g.conflicts, Some(confs));
-    }
-
-    #[test]
-    fn test_debug() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        let debug_str = format!("{{\n\
-                   \tname: \"test\",\n\
-                   \targs: {:?},\n\
-                   \trequired: {:?},\n\
-                   \trequires: {:?},\n\
-                   \tconflicts: {:?},\n\
-               }}",
-                                args,
-                                true,
-                                Some(reqs),
-                                Some(confs));
-        assert_eq!(&*format!("{:?}", g), &*debug_str);
-    }
-
-    #[test]
-    fn test_from() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        let g2 = ArgGroup::from(&g);
-        assert_eq!(g2.args, args);
-        assert_eq!(g2.requires, Some(reqs));
-        assert_eq!(g2.conflicts, Some(confs));
-    }
-
-    #[cfg(feature="yaml")]
-    #[cfg_attr(feature = "yaml", test)]
-    fn test_yaml() {
-
-        let g_yaml = "name: test
-args:
-- a1
-- a4
-- a2
-- a3
-conflicts_with:
-- c1
-- c2
-- c3
-- c4
-requires:
-- r1
-- r2
-- r3
-- r4";
-        let yml = &YamlLoader::load_from_str(g_yaml).expect("failed to load YAML file")[0];
-        let g = ArgGroup::from_yaml(yml);
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-        assert_eq!(g.args, args);
-        assert_eq!(g.requires, Some(reqs));
-        assert_eq!(g.conflicts, Some(confs));
-    }
-}
-
-impl<'a> Clone for ArgGroup<'a> {
-    fn clone(&self) -> Self {
-        ArgGroup {
-            name: self.name,
-            required: self.required,
-            args: self.args.clone(),
-            requires: self.requires.clone(),
-            conflicts: self.conflicts.clone(),
-            multiple: self.multiple,
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/macros.rs
+++ /dev/null
@@ -1,109 +0,0 @@
-#[cfg(feature = "yaml")]
-macro_rules! yaml_tuple2 {
-    ($a:ident, $v:ident, $c:ident) => {{
-            if let Some(vec) = $v.as_vec() {
-                for ys in vec {
-                    if let Some(tup) = ys.as_vec() {
-                        debug_assert_eq!(2, tup.len());
-                        $a = $a.$c(yaml_str!(tup[0]), yaml_str!(tup[1]));
-                    } else {
-                        panic!("Failed to convert YAML value to vec");
-                    }
-                }
-            } else {
-                panic!("Failed to convert YAML value to vec");
-            }
-            $a
-        }
-    };
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_tuple3 {
-    ($a:ident, $v:ident, $c:ident) => {{
-            if let Some(vec) = $v.as_vec() {
-                for ys in vec {
-                    if let Some(tup) = ys.as_vec() {
-                        debug_assert_eq!(3, tup.len());
-                        $a = $a.$c(yaml_str!(tup[0]), yaml_opt_str!(tup[1]), yaml_str!(tup[2]));
-                    } else {
-                        panic!("Failed to convert YAML value to vec");
-                    }
-                }
-            } else {
-                panic!("Failed to convert YAML value to vec");
-            }
-            $a
-        }
-    };
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_vec_or_str {
-    ($v:ident, $a:ident, $c:ident) => {{
-            let maybe_vec = $v.as_vec();
-            if let Some(vec) = maybe_vec {
-                for ys in vec {
-                    if let Some(s) = ys.as_str() {
-                        $a = $a.$c(s);
-                    } else {
-                        panic!("Failed to convert YAML value {:?} to a string", ys);
-                    }
-                }
-            } else {
-                if let Some(s) = $v.as_str() {
-                    $a = $a.$c(s);
-                } else {
-                    panic!("Failed to convert YAML value {:?} to either a vec or string", $v);
-                }
-            }
-            $a
-        }
-    };
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_opt_str {
-    ($v:expr) => {{
-        if $v.is_null() {
-            Some($v.as_str().unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)))
-        } else {
-            None
-        }
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_str {
-    ($v:expr) => {{
-        $v.as_str().unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_str {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c(yaml_str!($v))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_bool {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v.as_bool().unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_u64 {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v.as_i64().unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)) as u64)
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_usize {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v.as_i64().unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)) as usize)
-    }};
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/matched_arg.rs
+++ /dev/null
@@ -1,24 +0,0 @@
-// Std
-use std::ffi::OsString;
-
-#[doc(hidden)]
-#[derive(Debug, Clone)]
-pub struct MatchedArg {
-    #[doc(hidden)]
-    pub occurs: u64,
-    #[doc(hidden)]
-    pub vals: Vec<OsString>,
-}
-
-impl Default for MatchedArg {
-    fn default() -> Self {
-        MatchedArg {
-            occurs: 1,
-            vals: Vec::with_capacity(1),
-        }
-    }
-}
-
-impl MatchedArg {
-    pub fn new() -> Self { MatchedArg::default() }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/mod.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-pub use self::any_arg::{AnyArg, DispOrder};
-pub use self::arg::Arg;
-pub use self::arg_builder::{Base, Switched, Valued, FlagBuilder, OptBuilder, PosBuilder};
-pub use self::arg_matcher::ArgMatcher;
-pub use self::arg_matches::{Values, OsValues, ArgMatches};
-pub use self::group::ArgGroup;
-pub use self::matched_arg::MatchedArg;
-pub use self::settings::{ArgFlags, ArgSettings};
-pub use self::subcommand::SubCommand;
-
-#[macro_use]
-mod macros;
-mod arg;
-pub mod any_arg;
-mod arg_matches;
-mod arg_matcher;
-mod subcommand;
-mod arg_builder;
-mod matched_arg;
-mod group;
-pub mod settings;
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/settings.rs
+++ /dev/null
@@ -1,165 +0,0 @@
-// Std
-use std::ascii::AsciiExt;
-use std::str::FromStr;
-
-bitflags! {
-    struct Flags: u16 {
-        const REQUIRED         = 1;
-        const MULTIPLE         = 1 << 1;
-        const EMPTY_VALS       = 1 << 2;
-        const GLOBAL           = 1 << 3;
-        const HIDDEN           = 1 << 4;
-        const TAKES_VAL        = 1 << 5;
-        const USE_DELIM        = 1 << 6;
-        const NEXT_LINE_HELP   = 1 << 7;
-        const R_UNLESS_ALL     = 1 << 8;
-        const REQ_DELIM        = 1 << 9;
-        const DELIM_NOT_SET    = 1 << 10;
-        const HIDE_POS_VALS    = 1 << 11;
-        const ALLOW_TAC_VALS   = 1 << 12;
-        const REQUIRE_EQUALS   = 1 << 13;
-        const LAST             = 1 << 14;
-        const HIDE_DEFAULT_VAL = 1 << 15;
-    }
-}
-
-#[doc(hidden)]
-#[derive(Debug, Clone, Copy)]
-pub struct ArgFlags(Flags);
-
-impl ArgFlags {
-    pub fn new() -> Self { ArgFlags::default() }
-
-    impl_settings!{ArgSettings,
-        Required => REQUIRED,
-        Multiple => MULTIPLE,
-        EmptyValues => EMPTY_VALS,
-        Global => GLOBAL,
-        Hidden => HIDDEN,
-        TakesValue => TAKES_VAL,
-        UseValueDelimiter => USE_DELIM,
-        NextLineHelp => NEXT_LINE_HELP,
-        RequiredUnlessAll => R_UNLESS_ALL,
-        RequireDelimiter => REQ_DELIM,
-        ValueDelimiterNotSet => DELIM_NOT_SET,
-        HidePossibleValues => HIDE_POS_VALS,
-        AllowLeadingHyphen => ALLOW_TAC_VALS,
-        RequireEquals => REQUIRE_EQUALS,
-        Last => LAST,
-        HideDefaultValue => HIDE_DEFAULT_VAL
-    }
-}
-
-impl Default for ArgFlags {
-    fn default() -> Self { ArgFlags(EMPTY_VALS | DELIM_NOT_SET) }
-}
-
-/// Various settings that apply to arguments and may be set, unset, and checked via getter/setter
-/// methods [`Arg::set`], [`Arg::unset`], and [`Arg::is_set`]
-/// [`Arg::set`]: ./struct.Arg.html#method.set
-/// [`Arg::unset`]: ./struct.Arg.html#method.unset
-/// [`Arg::is_set`]: ./struct.Arg.html#method.is_set
-#[derive(Debug, PartialEq, Copy, Clone)]
-pub enum ArgSettings {
-    /// The argument must be used
-    Required,
-    /// The argument may be used multiple times such as `--flag --flag`
-    Multiple,
-    /// The argument allows empty values such as `--option ""`
-    EmptyValues,
-    /// The argument should be propagated down through all child [`SubCommands`]
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    Global,
-    /// The argument should **not** be shown in help text
-    Hidden,
-    /// The argument accepts a value, such as `--option <value>`
-    TakesValue,
-    /// Determines if the argument allows values to be grouped via a delimter
-    UseValueDelimiter,
-    /// Prints the help text on the line after the argument
-    NextLineHelp,
-    /// Requires the use of a value delimiter for all multiple values
-    RequireDelimiter,
-    /// Hides the possible values from the help string
-    HidePossibleValues,
-    /// Allows vals that start with a '-'
-    AllowLeadingHyphen,
-    /// Require options use `--option=val` syntax
-    RequireEquals,
-    /// Specifies that the arg is the last positional argument and may be accessed early via `--`
-    /// syntax
-    Last,
-    /// Hides the default value from the help string
-    HideDefaultValue,
-    #[doc(hidden)]
-    RequiredUnlessAll,
-    #[doc(hidden)]
-    ValueDelimiterNotSet,
-}
-
-impl FromStr for ArgSettings {
-    type Err = String;
-    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
-        match &*s.to_ascii_lowercase() {
-            "required" => Ok(ArgSettings::Required),
-            "multiple" => Ok(ArgSettings::Multiple),
-            "global" => Ok(ArgSettings::Global),
-            "emptyvalues" => Ok(ArgSettings::EmptyValues),
-            "hidden" => Ok(ArgSettings::Hidden),
-            "takesvalue" => Ok(ArgSettings::TakesValue),
-            "usevaluedelimiter" => Ok(ArgSettings::UseValueDelimiter),
-            "nextlinehelp" => Ok(ArgSettings::NextLineHelp),
-            "requiredunlessall" => Ok(ArgSettings::RequiredUnlessAll),
-            "requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
-            "valuedelimiternotset" => Ok(ArgSettings::ValueDelimiterNotSet),
-            "hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
-            "allowleadinghyphen" => Ok(ArgSettings::AllowLeadingHyphen),
-            "requireequals" => Ok(ArgSettings::RequireEquals),
-            "last" => Ok(ArgSettings::Last),
-            "hidedefaultvalue" => Ok(ArgSettings::HideDefaultValue),
-            _ => Err("unknown ArgSetting, cannot convert from str".to_owned()),
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::ArgSettings;
-
-    #[test]
-    fn arg_settings_fromstr() {
-        assert_eq!("allowleadinghyphen".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::AllowLeadingHyphen);
-        assert_eq!("emptyvalues".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::EmptyValues);
-        assert_eq!("global".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Global);
-        assert_eq!("hidepossiblevalues".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::HidePossibleValues);
-        assert_eq!("hidden".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Hidden);
-        assert_eq!("multiple".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Multiple);
-        assert_eq!("nextlinehelp".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::NextLineHelp);
-        assert_eq!("requiredunlessall".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequiredUnlessAll);
-        assert_eq!("requiredelimiter".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequireDelimiter);
-        assert_eq!("required".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Required);
-        assert_eq!("takesvalue".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::TakesValue);
-        assert_eq!("usevaluedelimiter".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::UseValueDelimiter);
-        assert_eq!("valuedelimiternotset".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::ValueDelimiterNotSet);
-        assert_eq!("requireequals".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequireEquals);
-        assert_eq!("last".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Last);
-        assert_eq!("hidedefaultvalue".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::HideDefaultValue);
-        assert!("hahahaha".parse::<ArgSettings>().is_err());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/args/subcommand.rs
+++ /dev/null
@@ -1,68 +0,0 @@
-// Third Party
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-// Internal
-use App;
-use ArgMatches;
-
-/// The abstract representation of a command line subcommand.
-///
-/// This struct describes all the valid options of the subcommand for the program. Subcommands are
-/// essentially "sub-[`App`]s" and contain all the same possibilities (such as their own
-/// [arguments], subcommands, and settings).
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::{App, Arg, SubCommand};
-/// App::new("myprog")
-///     .subcommand(
-///         SubCommand::with_name("config")
-///             .about("Used for configuration")
-///             .arg(Arg::with_name("config_file")
-///                 .help("The configuration file to use")
-///                 .index(1)))
-/// # ;
-/// ```
-/// [`App`]: ./struct.App.html
-/// [arguments]: ./struct.Arg.html
-#[derive(Debug, Clone)]
-pub struct SubCommand<'a> {
-    #[doc(hidden)]
-    pub name: String,
-    #[doc(hidden)]
-    pub matches: ArgMatches<'a>,
-}
-
-impl<'a> SubCommand<'a> {
-    /// Creates a new instance of a subcommand requiring a name. The name will be displayed
-    /// to the user when they print version or help and usage information.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(
-    ///         SubCommand::with_name("config"))
-    /// # ;
-    /// ```
-    pub fn with_name<'b>(name: &str) -> App<'a, 'b> { App::new(name) }
-
-    /// Creates a new instance of a subcommand from a YAML (.yml) document
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::Subcommand;
-    /// # fn main() {
-    /// let sc_yaml = load_yaml!("test_subcommand.yml");
-    /// let sc = SubCommand::from_yaml(sc_yaml);
-    /// # }
-    /// ```
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(yaml: &Yaml) -> App { App::from_yaml(yaml) }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/bash.rs
+++ /dev/null
@@ -1,230 +0,0 @@
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use args::{ArgSettings, OptBuilder};
-use completions;
-
-pub struct BashGen<'a, 'b>
-    where 'a: 'b
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> BashGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self { BashGen { p: p } }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-
-        w!(buf,
-           format!("_{name}() {{
-    local i cur prev opts cmds
-    COMPREPLY=()
-    cur=\"${{COMP_WORDS[COMP_CWORD]}}\"
-    prev=\"${{COMP_WORDS[COMP_CWORD-1]}}\"
-    cmd=\"\"
-    opts=\"\"
-
-    for i in ${{COMP_WORDS[@]}}
-    do
-        case \"${{i}}\" in
-            {name})
-                cmd=\"{name}\"
-                ;;
-            {subcmds}
-            *)
-                ;;
-        esac
-    done
-
-    case \"${{cmd}}\" in
-        {name})
-            opts=\"{name_opts}\"
-            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq 1 ]] ; then
-                COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
-                return 0
-            fi
-            case \"${{prev}}\" in
-                {name_opts_details}
-                *)
-                    COMPREPLY=()
-                    ;;
-            esac
-            COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
-            return 0
-            ;;
-        {subcmd_details}
-    esac
-}}
-
-complete -F _{name} -o bashdefault -o default {name}
-",
-                   name = self.p.meta.bin_name.as_ref().unwrap(),
-                   name_opts = self.all_options_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                   name_opts_details =
-                       self.option_details_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                   subcmds = self.all_subcommands(),
-                   subcmd_details = self.subcommand_details())
-               .as_bytes());
-    }
-
-    fn all_subcommands(&self) -> String {
-        debugln!("BashGen::all_subcommands;");
-        let mut subcmds = String::new();
-        let scs = completions::all_subcommand_names(self.p);
-
-        for sc in &scs {
-            subcmds = format!("{}
-            {name})
-                cmd+=\"__{name}\"
-                ;;",
-                              subcmds,
-                              name = sc.replace("-", "__"));
-        }
-
-        subcmds
-    }
-
-    fn subcommand_details(&self) -> String {
-        debugln!("BashGen::subcommand_details;");
-        let mut subcmd_dets = String::new();
-        let mut scs = completions::get_all_subcommand_paths(self.p, true);
-        scs.sort();
-        scs.dedup();
-
-        for sc in &scs {
-            subcmd_dets = format!("{}
-        {subcmd})
-            opts=\"{sc_opts}\"
-            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq {level} ]] ; then
-                COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
-                return 0
-            fi
-            case \"${{prev}}\" in
-                {opts_details}
-                *)
-                    COMPREPLY=()
-                    ;;
-            esac
-            COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
-            return 0
-            ;;",
-                                  subcmd_dets,
-                                  subcmd = sc.replace("-", "__"),
-                                  sc_opts = self.all_options_for_path(&*sc),
-                                  level = sc.split("__").map(|_| 1).fold(0, |acc, n| acc + n),
-                                  opts_details = self.option_details_for_path(&*sc));
-        }
-
-        subcmd_dets
-    }
-
-    fn option_details_for_path(&self, path: &str) -> String {
-        debugln!("BashGen::option_details_for_path: path={}", path);
-        let mut p = self.p;
-        for sc in path.split("__").skip(1) {
-            debugln!("BashGen::option_details_for_path:iter: sc={}", sc);
-            p = &find_subcmd!(p, sc).unwrap().p;
-        }
-        let mut opts = String::new();
-        for o in p.opts() {
-            if let Some(l) = o.s.long {
-                opts = format!("{}
-                --{})
-                    COMPREPLY=({})
-                    return 0
-                    ;;",
-                               opts,
-                               l,
-                               self.vals_for(o));
-            }
-            if let Some(s) = o.s.short {
-                opts = format!("{}
-                    -{})
-                    COMPREPLY=({})
-                    return 0
-                    ;;",
-                               opts,
-                               s,
-                               self.vals_for(o));
-            }
-        }
-        opts
-    }
-
-    fn vals_for(&self, o: &OptBuilder) -> String {
-        debugln!("BashGen::vals_for: o={}", o.b.name);
-        use args::AnyArg;
-        let mut ret = String::new();
-        let mut needs_quotes = true;
-        if let Some(vals) = o.possible_vals() {
-            needs_quotes = false;
-            ret = format!("$(compgen -W \"{}\" -- ${{cur}})", vals.join(" "));
-        } else if let Some(vec) = o.val_names() {
-            let mut it = vec.iter().peekable();
-            while let Some((_, val)) = it.next() {
-                ret = format!("{}<{}>{}",
-                              ret,
-                              val,
-                              if it.peek().is_some() { " " } else { "" });
-            }
-            let num = vec.len();
-            if o.is_set(ArgSettings::Multiple) && num == 1 {
-                ret = format!("{}...", ret);
-            }
-        } else if let Some(num) = o.num_vals() {
-            let mut it = (0..num).peekable();
-            while let Some(_) = it.next() {
-                ret = format!("{}<{}>{}",
-                              ret,
-                              o.name(),
-                              if it.peek().is_some() { " " } else { "" });
-            }
-            if o.is_set(ArgSettings::Multiple) && num == 1 {
-                ret = format!("{}...", ret);
-            }
-        } else {
-            ret = format!("<{}>", o.name());
-            if o.is_set(ArgSettings::Multiple) {
-                ret = format!("{}...", ret);
-            }
-        }
-        if needs_quotes {
-            ret = format!("\"{}\"", ret);
-        }
-        ret
-    }
-    fn all_options_for_path(&self, path: &str) -> String {
-        debugln!("BashGen::all_options_for_path: path={}", path);
-        let mut p = self.p;
-        for sc in path.split("__").skip(1) {
-            debugln!("BashGen::all_options_for_path:iter: sc={}", sc);
-            p = &find_subcmd!(p, sc).unwrap().p;
-        }
-        let mut opts = shorts!(p).fold(String::new(), |acc, s| format!("{} -{}", acc, s));
-        opts = format!("{} {}",
-                       opts,
-                       longs!(p).fold(String::new(), |acc, l| format!("{} --{}", acc, l)));
-        opts = format!("{} {}",
-                       opts,
-                       p.positionals
-                           .values()
-                           .fold(String::new(), |acc, p| format!("{} {}", acc, p)));
-        opts = format!("{} {}",
-                       opts,
-                       p.subcommands
-                           .iter()
-                           .fold(String::new(), |acc, s| format!("{} {}", acc, s.p.meta.name)));
-        for sc in &p.subcommands {
-            if let Some(ref aliases) = sc.p.meta.aliases {
-                opts = format!("{} {}",
-                               opts,
-                               aliases.iter()
-                                   .map(|&(n, _)| n)
-                                   .fold(String::new(), |acc, a| format!("{} {}", acc, a)));
-            }
-        }
-        opts
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/fish.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-
-pub struct FishGen<'a, 'b>
-    where 'a: 'b
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> FishGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self { FishGen { p: p } }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        let command = self.p.meta.bin_name.as_ref().unwrap();
-
-        // function to detect subcommand
-        let detect_subcommand_function = r#"function __fish_using_command
-    set cmd (commandline -opc)
-    if [ (count $cmd) -eq (count $argv) ]
-        for i in (seq (count $argv))
-            if [ $cmd[$i] != $argv[$i] ]
-                return 1
-            end
-        end
-        return 0
-    end
-    return 1
-end
-
-"#
-            .to_string();
-
-        let mut buffer = detect_subcommand_function;
-        gen_fish_inner(command, self, &command.to_string(), &mut buffer);
-        w!(buf, buffer.as_bytes());
-    }
-}
-
-fn gen_fish_inner(root_command: &str, comp_gen: &FishGen, parent_cmds: &str, buffer: &mut String) {
-    debugln!("FishGen::gen_fish_inner;");
-    // example :
-    //
-    // complete
-    //      -c {command}
-    //      -d "{description}"
-    //      -s {short}
-    //      -l {long}
-    //      -a "{possible_arguments}"
-    //      -r # if require parameter
-    //      -f # don't use file completion
-    //      -n "__fish_using_command myprog subcmd1" # complete for command "myprog subcmd1"
-
-    let basic_template = format!("complete -c {} -n \"__fish_using_command {}\"",
-                                 root_command,
-                                 parent_cmds);
-
-    for option in comp_gen.p.opts() {
-        let mut template = basic_template.clone();
-        if let Some(data) = option.s.short {
-            template.push_str(format!(" -s {}", data).as_str());
-        }
-        if let Some(data) = option.s.long {
-            template.push_str(format!(" -l {}", data).as_str());
-        }
-        if let Some(data) = option.b.help {
-            template.push_str(format!(" -d \"{}\"", data).as_str());
-        }
-        if let Some(ref data) = option.v.possible_vals {
-            template.push_str(format!(" -r -f -a \"{}\"", data.join(" ")).as_str());
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    for flag in comp_gen.p.flags() {
-        let mut template = basic_template.clone();
-        if let Some(data) = flag.s.short {
-            template.push_str(format!(" -s {}", data).as_str());
-        }
-        if let Some(data) = flag.s.long {
-            template.push_str(format!(" -l {}", data).as_str());
-        }
-        if let Some(data) = flag.b.help {
-            template.push_str(format!(" -d \"{}\"", data).as_str());
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    for subcommand in &comp_gen.p.subcommands {
-        let mut template = basic_template.clone();
-        template.push_str(" -f");
-        template.push_str(format!(" -a \"{}\"", &subcommand.p.meta.name).as_str());
-        if let Some(data) = subcommand.p.meta.about {
-            template.push_str(format!(" -d \"{}\"", &data).as_str())
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    // generate options of subcommands
-    for subcommand in &comp_gen.p.subcommands {
-        let sub_comp_gen = FishGen::new(&subcommand.p);
-        // make new "parent_cmds" for different subcommands
-        let mut sub_parent_cmds = parent_cmds.to_string();
-        if !sub_parent_cmds.is_empty() {
-            sub_parent_cmds.push_str(" ");
-        }
-        sub_parent_cmds.push_str(&subcommand.p.meta.name);
-        gen_fish_inner(root_command, &sub_comp_gen, &sub_parent_cmds, buffer);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/macros.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-
-macro_rules! w {
-    ($buf:expr, $to_w:expr) => {
-        match $buf.write_all($to_w) {
-            Ok(..) => (),
-            Err(..) => panic!("Failed to write to completions file"),
-        }
-    };
-}
-
-macro_rules! get_zsh_arg_conflicts {
-    ($p:ident, $arg:ident, $msg:ident) => {
-        if let Some(conf_vec) = $arg.blacklist() {
-            let mut v = vec![];
-            for arg_name in conf_vec {
-                let arg = $p.find_any_arg(arg_name).expect($msg);
-                if let Some(s) = arg.short() {
-                    v.push(format!("-{}", s));
-                }
-                if let Some(l) = arg.long() {
-                    v.push(format!("--{}", l));
-                }
-            } 
-            v.join(" ")
-        } else {
-            String::new()
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/mod.rs
+++ /dev/null
@@ -1,153 +0,0 @@
-#[macro_use]
-mod macros;
-mod bash;
-mod fish;
-mod zsh;
-mod powershell;
-mod shell;
-
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use self::bash::BashGen;
-use self::fish::FishGen;
-use self::zsh::ZshGen;
-use self::powershell::PowerShellGen;
-pub use self::shell::Shell;
-
-pub struct ComplGen<'a, 'b>
-    where 'a: 'b
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> ComplGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self { ComplGen { p: p } }
-
-    pub fn generate<W: Write>(&self, for_shell: Shell, buf: &mut W) {
-        match for_shell {
-            Shell::Bash => BashGen::new(self.p).generate_to(buf),
-            Shell::Fish => FishGen::new(self.p).generate_to(buf),
-            Shell::Zsh => ZshGen::new(self.p).generate_to(buf),
-            Shell::PowerShell => PowerShellGen::new(self.p).generate_to(buf),
-        }
-    }
-}
-
-// Gets all subcommands including child subcommands in the form of 'name' where the name
-// is a single word (i.e. "install")  of the path to said subcommand (i.e.
-// "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn all_subcommand_names(p: &Parser) -> Vec<String> {
-    debugln!("all_subcommand_names;");
-    let mut subcmds: Vec<_> = subcommands_of(p).iter().map(|&(ref n, _)| n.clone()).collect();
-    for sc_v in p.subcommands.iter().map(|s| all_subcommand_names(&s.p)) {
-        subcmds.extend(sc_v);
-    }
-    subcmds.sort();
-    subcmds.dedup();
-    subcmds
-}
-
-// Gets all subcommands including child subcommands in the form of ('name', 'bin_name') where the name
-// is a single word (i.e. "install") of the path and full bin_name of said subcommand (i.e.
-// "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn all_subcommands(p: &Parser) -> Vec<(String, String)> {
-    debugln!("all_subcommands;");
-    let mut subcmds: Vec<_> = subcommands_of(p);
-    for sc_v in p.subcommands.iter().map(|s| all_subcommands(&s.p)) {
-        subcmds.extend(sc_v);
-    }
-    subcmds
-}
-
-// Gets all subcommands exlcuding child subcommands in the form of (name, bin_name) where the name
-// is a single word (i.e. "install") and the bin_name is a space deliniated list of the path to said
-// subcommand (i.e. "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn subcommands_of(p: &Parser) -> Vec<(String, String)> {
-    debugln!("subcommands_of: name={}, bin_name={}",
-             p.meta.name,
-             p.meta.bin_name.as_ref().unwrap());
-    let mut subcmds = vec![];
-
-    debugln!("subcommands_of: Has subcommands...{:?}", p.has_subcommands());
-    if !p.has_subcommands() {
-        let mut ret = vec![(p.meta.name.clone(), p.meta.bin_name.as_ref().unwrap().clone())];
-        debugln!("subcommands_of: Looking for aliases...");
-        if let Some(ref aliases) = p.meta.aliases {
-            for &(n, _) in aliases {
-                debugln!("subcommands_of:iter:iter: Found alias...{}", n);
-                let mut als_bin_name: Vec<_> =
-                    p.meta.bin_name.as_ref().unwrap().split(' ').collect();
-                als_bin_name.push(n);
-                let old = als_bin_name.len() - 2;
-                als_bin_name.swap_remove(old);
-                ret.push((n.to_owned(), als_bin_name.join(" ")));
-            }
-        }
-        return ret;
-    }
-    for sc in &p.subcommands {
-        debugln!("subcommands_of:iter: name={}, bin_name={}",
-                 sc.p.meta.name,
-                 sc.p.meta.bin_name.as_ref().unwrap());
-
-        debugln!("subcommands_of:iter: Looking for aliases...");
-        if let Some(ref aliases) = sc.p.meta.aliases {
-            for &(n, _) in aliases {
-                debugln!("subcommands_of:iter:iter: Found alias...{}", n);
-                let mut als_bin_name: Vec<_> =
-                    p.meta.bin_name.as_ref().unwrap().split(' ').collect();
-                als_bin_name.push(n);
-                let old = als_bin_name.len() - 2;
-                als_bin_name.swap_remove(old);
-                subcmds.push((n.to_owned(), als_bin_name.join(" ")));
-            }
-        }
-        subcmds.push((sc.p.meta.name.clone(), sc.p.meta.bin_name.as_ref().unwrap().clone()));
-    }
-    subcmds
-}
-
-pub fn get_all_subcommand_paths(p: &Parser, first: bool) -> Vec<String> {
-    debugln!("get_all_subcommand_paths;");
-    let mut subcmds = vec![];
-    if !p.has_subcommands() {
-        if !first {
-            let name = &*p.meta.name;
-            let path = p.meta.bin_name.as_ref().unwrap().clone().replace(" ", "__");
-            let mut ret = vec![path.clone()];
-            if let Some(ref aliases) = p.meta.aliases {
-                for &(n, _) in aliases {
-                    ret.push(path.replace(name, n));
-                }
-            }
-            return ret;
-        }
-        return vec![];
-    }
-    for sc in &p.subcommands {
-        let name = &*sc.p.meta.name;
-        let path = sc.p.meta.bin_name.as_ref().unwrap().clone().replace(" ", "__");
-        subcmds.push(path.clone());
-        if let Some(ref aliases) = sc.p.meta.aliases {
-            for &(n, _) in aliases {
-                subcmds.push(path.replace(name, n));
-            }
-        }
-    }
-    for sc_v in p.subcommands.iter().map(|s| get_all_subcommand_paths(&s.p, false)) {
-        subcmds.extend(sc_v);
-    }
-    subcmds
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/powershell.rs
+++ /dev/null
@@ -1,125 +0,0 @@
-
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use INTERNAL_ERROR_MSG;
-
-pub struct PowerShellGen<'a, 'b>
-    where 'a: 'b
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> PowerShellGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self { PowerShellGen { p: p } }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        let bin_name = self.p.meta.bin_name.as_ref().unwrap();
-
-        let mut names = vec![];
-        let (subcommands_detection_cases, subcommands_cases) = generate_inner(self.p, "", &mut names);
-
-        let mut bin_names = vec![bin_name.to_string(), format!("./{0}", bin_name)];
-        if cfg!(windows) {
-            bin_names.push(format!("{0}.exe", bin_name));
-            bin_names.push(format!(r".\{0}", bin_name));
-            bin_names.push(format!(r".\{0}.exe", bin_name));
-            bin_names.push(format!(r"./{0}.exe", bin_name));
-        }
-
-        let bin_names = bin_names.iter().fold(String::new(), |previous, current| {
-            format!("{0}, '{1}'", previous, current)
-        });
-        let bin_names = bin_names.trim_left_matches(", ");
-
-        let result = format!(r#"
-@({bin_names}) | %{{
-    Register-ArgumentCompleter -Native -CommandName $_ -ScriptBlock {{
-        param($wordToComplete, $commandAst, $cursorPosition)
-
-        $command = '_{bin_name}'
-        $commandAst.CommandElements |
-            Select-Object -Skip 1 |
-            %{{
-                switch ($_.ToString()) {{
-{subcommands_detection_cases}
-                    default {{ 
-                        break
-                    }}
-                }}
-            }}
-
-        $completions = @()
-
-        switch ($command) {{
-{subcommands_cases}
-        }}
-
-        $completions |
-            ?{{ $_ -like "$wordToComplete*" }} |
-            Sort-Object |
-            %{{ New-Object System.Management.Automation.CompletionResult $_, $_, 'ParameterValue', $_ }}
-    }}
-}}
-"#,
-            bin_names = bin_names,
-            bin_name = bin_name,
-            subcommands_detection_cases = subcommands_detection_cases,
-            subcommands_cases = subcommands_cases
-        );
-
-        w!(buf, result.as_bytes());
-    }
-}
-
-fn generate_inner<'a, 'b, 'p>(p: &'p Parser<'a, 'b>, previous_command_name: &str, names: &mut Vec<&'p str>) -> (String, String) {
-    debugln!("PowerShellGen::generate_inner;");
-    let command_name = if previous_command_name.is_empty() {
-        format!("{}_{}", previous_command_name, &p.meta.bin_name.as_ref().expect(INTERNAL_ERROR_MSG))
-    } else {
-        format!("{}_{}", previous_command_name, &p.meta.name)
-    };
-
-    let mut subcommands_detection_cases = if !names.contains(&&*p.meta.name) {
-        names.push(&*p.meta.name);
-        format!(r"
-                    '{0}' {{
-                        $command += '_{0}'
-                        break
-                    }}
-",
-                &p.meta.name)
-    } else {
-        String::new()
-    };
-
-    let mut completions = String::new();
-    for subcommand in &p.subcommands {
-        completions.push_str(&format!("'{}', ", &subcommand.p.meta.name));
-    }
-    for short in shorts!(p) {
-        completions.push_str(&format!("'-{}', ", short));
-    }
-    for long in longs!(p) {
-        completions.push_str(&format!("'--{}', ", long));
-    }
-
-    let mut subcommands_cases = format!(r"
-            '{}' {{
-                $completions = @({})
-            }}
-",
-                                        &command_name,
-                                        completions.trim_right_matches(", "));
-
-    for subcommand in &p.subcommands {
-        let (subcommand_subcommands_detection_cases, subcommand_subcommands_cases) =
-            generate_inner(&subcommand.p, &command_name, names);
-        subcommands_detection_cases.push_str(&subcommand_subcommands_detection_cases);
-        subcommands_cases.push_str(&subcommand_subcommands_cases);
-    }
-
-    (subcommands_detection_cases, subcommands_cases)
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/shell.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use std::ascii::AsciiExt;
-use std::str::FromStr;
-use std::fmt;
-
-/// Describes which shell to produce a completions file for
-#[cfg_attr(feature = "lints", allow(enum_variant_names))]
-#[derive(Debug, Copy, Clone)]
-pub enum Shell {
-    /// Generates a .bash-completion completion file for the Bourne Again SHell (BASH)
-    Bash,
-    /// Generates a .fish completion file for the Friendly Interactive SHell (fish)
-    Fish,
-    /// Generates a completion file for the Z SHell (ZSH)
-    Zsh,
-    /// Generates a completion file for PowerShell
-    PowerShell,
-}
-
-impl Shell {
-    /// A list of possible variants in `&'static str` form
-    pub fn variants() -> [&'static str; 4] { ["zsh", "bash", "fish", "powershell"] }
-}
-
-impl FromStr for Shell {
-    type Err = String;
-
-    fn from_str(s: &str) -> Result<Self, Self::Err> {
-        match s {
-
-            "ZSH" | _ if s.eq_ignore_ascii_case("zsh") => Ok(Shell::Zsh),
-            "FISH" | _ if s.eq_ignore_ascii_case("fish") => Ok(Shell::Fish),
-            "BASH" | _ if s.eq_ignore_ascii_case("bash") => Ok(Shell::Bash),
-            "POWERSHELL" | _ if s.eq_ignore_ascii_case("powershell") => Ok(Shell::PowerShell),
-            _ => Err(String::from("[valid values: bash, fish, zsh, powershell]")),
-        }
-    }
-}
-
-impl fmt::Display for Shell {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            Shell::Bash => write!(f, "BASH"),
-            Shell::Fish => write!(f, "FISH"),
-            Shell::Zsh => write!(f, "ZSH"),
-            Shell::PowerShell => write!(f, "POWERSHELL"),
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/completions/zsh.rs
+++ /dev/null
@@ -1,387 +0,0 @@
-
-// Std
-use std::io::Write;
-use std::ascii::AsciiExt;
-
-// Internal
-use app::App;
-use app::parser::Parser;
-use args::{ArgSettings, AnyArg};
-use completions;
-use INTERNAL_ERROR_MSG;
-
-pub struct ZshGen<'a, 'b>
-    where 'a: 'b
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> ZshGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        debugln!("ZshGen::new;");
-        ZshGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        debugln!("ZshGen::generate_to;");
-        w!(buf,
-            format!("\
-#compdef {name}
-
-_{name}() {{
-    typeset -A opt_args
-    local ret=1
-
-    local context curcontext=\"$curcontext\" state line
-    {initial_args}
-    {subcommands}
-}}
-
-{subcommand_details}
-
-_{name} \"$@\"",
-                   name = self.p.meta.bin_name.as_ref().unwrap(),
-                   initial_args = get_args_of(self.p),
-                   subcommands = get_subcommands_of(self.p),
-                   subcommand_details = subcommand_details(self.p)).as_bytes());
-
-    }
-}
-
-// Displays the positional args and commands of a subcommand
-// (( $+functions[_[bin_name_underscore]_commands] )) ||
-// _[bin_name_underscore]_commands() {
-// 	local commands; commands=(
-// 		'[arg_name]:[arg_help]'
-// 	)
-// 	_describe -t commands '[bin_name] commands' commands "$@"
-//
-// Where the following variables are present:
-//    [bin_name_underscore]: The full space deliniated bin_name, where spaces have been replaced by
-//                           underscore characters
-//    [arg_name]: The name of the positional arg or subcommand
-//    [arg_help]: The help message of the arg or subcommand
-//    [bin_name]: The full space deliniated bin_name
-//
-// Here's a snippet from rustup:
-//
-// (( $+functions[_rustup_commands] )) ||
-// _rustup_commands() {
-// 	local commands; commands=(
-// 		'show:Show the active and installed toolchains'
-//      'update:Update Rust toolchains'
-//      # ... snip for brevity
-//      'help:Prints this message or the help of the given subcommand(s)'
-// 	)
-// 	_describe -t commands 'rustup commands' commands "$@"
-//
-fn subcommand_details(p: &Parser) -> String {
-    debugln!("ZshGen::subcommand_details;");
-    // First we do ourself
-    let mut ret = vec![format!("\
-(( $+functions[_{bin_name_underscore}_commands] )) ||
-_{bin_name_underscore}_commands() {{
-    local commands; commands=(
-        {subcommands_and_args}
-    )
-    _describe -t commands '{bin_name} commands' commands \"$@\"
-}}",
-            bin_name_underscore = p.meta.bin_name.as_ref().unwrap().replace(" ", "__"),
-            bin_name = p.meta.bin_name.as_ref().unwrap(),
-            subcommands_and_args = subcommands_and_args_of(p))];
-
-    // Next we start looping through all the children, grandchildren, etc.
-    let mut all_subcommands = completions::all_subcommands(p);
-    all_subcommands.sort();
-    all_subcommands.dedup();
-    for &(_, ref bin_name) in &all_subcommands {
-        debugln!("ZshGen::subcommand_details:iter: bin_name={}", bin_name);
-        ret.push(format!("\
-(( $+functions[_{bin_name_underscore}_commands] )) ||
-_{bin_name_underscore}_commands() {{
-    local commands; commands=(
-        {subcommands_and_args}
-    )
-    _describe -t commands '{bin_name} commands' commands \"$@\"
-}}",
-            bin_name_underscore = bin_name.replace(" ", "__"),
-            bin_name = bin_name,
-            subcommands_and_args = subcommands_and_args_of(parser_of(p, bin_name))));
-    }
-
-    ret.join("\n")
-}
-
-// Generates subcommand and positional argument completions in form of
-//
-// 		'[arg_name]:[arg_help]'
-//
-// Where:
-//    [arg_name]: the argument or subcommand's name
-//    [arg_help]: the help message of the argument or subcommand
-//
-// A snippet from rustup:
-// 		'show:Show the active and installed toolchains'
-//      'update:Update Rust toolchains'
-fn subcommands_and_args_of(p: &Parser) -> String {
-    debugln!("ZshGen::subcommands_and_args_of;");
-    let mut ret = vec![];
-    fn add_sc(sc: &App, n: &str, ret: &mut Vec<String>) {
-        debugln!("ZshGen::add_sc;");
-        let s = format!("\"{name}:{help}\" \\", 
-            name = n, 
-            help = sc.p.meta.about.unwrap_or("").replace("[", "\\[").replace("]", "\\]"));
-        if !s.is_empty() {
-            ret.push(s);
-        }
-    }
-
-    // First the subcommands
-    for sc in p.subcommands() {
-        debugln!("ZshGen::subcommands_and_args_of:iter: subcommand={}", sc.p.meta.name);
-        add_sc(sc, &sc.p.meta.name, &mut ret);
-        if let Some(ref v) = sc.p.meta.aliases {
-            for alias in v.iter().filter(|&&(_, vis)| vis).map(|&(n, _)| n) {
-                add_sc(sc, alias, &mut ret);
-            }
-        }
-    }
-
-    // Then the positional args
-    for arg in p.positionals() {
-        debugln!("ZshGen::subcommands_and_args_of:iter: arg={}", arg.b.name);
-        let a = format!("\"{name}:{help}\" \\", 
-            name = arg.b.name.to_ascii_uppercase(), 
-            help = arg.b.help.unwrap_or("").replace("[", "\\[").replace("]", "\\]"));
-
-        if !a.is_empty() {
-            ret.push(a);
-        }
-    }
-
-    ret.join("\n")
-}
-
-// Get's the subcommand section of a completion file
-// This looks roughly like:
-//
-// case $state in
-// ([bin_name]_args)
-//     curcontext=\"${curcontext%:*:*}:[name_hyphen]-command-$words[1]:\"
-//     case $line[1] in
-//
-//         ([name])
-//         _arguments -C -s -S \
-//             [subcommand_args]
-//         && ret=0
-//
-//         [RECURSIVE_CALLS]
-//
-//         ;;",
-//
-//         [repeat]
-//
-//     esac
-// ;;
-// esac",
-//
-// Where the following variables are present:
-//    [name] = The subcommand name in the form of "install" for "rustup toolchain install"
-//    [bin_name] = The full space deliniated bin_name such as "rustup toolchain install"
-//    [name_hyphen] = The full space deliniated bin_name, but replace spaces with hyphens
-//    [repeat] = From the same recursive calls, but for all subcommands
-//    [subcommand_args] = The same as zsh::get_args_of
-fn get_subcommands_of(p: &Parser) -> String {
-    debugln!("get_subcommands_of;");
-
-    debugln!("get_subcommands_of: Has subcommands...{:?}", p.has_subcommands());
-    if !p.has_subcommands() {
-        return String::new();
-    }
-
-    let sc_names = completions::subcommands_of(p);
-
-    let mut subcmds = vec![];
-    for &(ref name, ref bin_name) in &sc_names {
-        let mut v = vec![format!("({})", name)];
-        let subcommand_args = get_args_of(parser_of(p, &*bin_name));
-        if !subcommand_args.is_empty() {
-            v.push(subcommand_args);
-        }
-        let subcommands = get_subcommands_of(parser_of(p, &*bin_name));
-        if !subcommands.is_empty() {
-            v.push(subcommands);
-        }
-        v.push(String::from(";;"));
-        subcmds.push(v.join("\n"));
-    }
-
-    format!(
-"case $state in
-    ({name})
-        curcontext=\"${{curcontext%:*:*}}:{name_hyphen}-command-$words[1]:\"
-        case $line[1] in
-            {subcommands}
-        esac
-    ;;
-esac", 
-        name = p.meta.name,
-        name_hyphen = p.meta.bin_name.as_ref().unwrap().replace(" ", "-"),
-        subcommands = subcmds.join("\n"))
-}
-
-fn parser_of<'a, 'b>(p: &'b Parser<'a, 'b>, sc: &str) -> &'b Parser<'a, 'b> {
-    debugln!("parser_of: sc={}", sc);
-    if sc == p.meta.bin_name.as_ref().unwrap_or(&String::new()) {
-        return p;
-    }
-    &p.find_subcommand(sc).expect(INTERNAL_ERROR_MSG).p
-}
-
-// Writes out the args section, which ends up being the flags and opts, and a jump to
-// another ZSH function if there are positional args or subcommands.
-// The structer works like this:
-//    ([conflicting_args]) [multiple] arg [takes_value] [[help]] [: :(possible_values)]
-//       ^-- list '-v -h'    ^--'*'          ^--'+'                   ^-- list 'one two three'
-//
-// An example from the rustup command:
-//
-// _arguments -C -s -S \
-// 		'(-h --help --verbose)-v[Enable verbose output]' \
-// 		'(-V -v --version --verbose --help)-h[Prints help information]' \
-//      # ... snip for brevity
-// 		'1:: :_rustup_commands' \   # <-- displays positional args and subcommands
-// 		'*:: :->rustup' \           # <-- displays subcommand args and child subcommands
-// 	&& ret=0
-//
-// The args used for _arguments are as follows:
-//    -C: modify the $context internal variable
-//    -s: Allow stacking of short args (i.e. -a -b -c => -abc)
-//    -S: Do not complete anything after '--' and treat those as argument values
-fn get_args_of(p: &Parser) -> String {
-    debugln!("get_args_of;");
-    let mut ret = vec![String::from("_arguments -s -S -C \\")];
-    let opts = write_opts_of(p);
-    let flags = write_flags_of(p);
-    let sc_or_a = if p.has_subcommands() || p.has_positionals() {
-        format!("\"1:: :_{name}_commands\" \\", 
-                name = p.meta.bin_name.as_ref().unwrap().replace(" ", "__"))
-    } else {
-        String::new()
-    };
-    let sc = if p.has_subcommands() {
-        format!("\"*:: :->{name}\" \\", name = p.meta.name)
-    } else {
-        String::new()
-    };
-
-    if !opts.is_empty() {
-        ret.push(opts);
-    }
-    if !flags.is_empty() {
-        ret.push(flags);
-    }
-    if !sc_or_a.is_empty() {
-        ret.push(sc_or_a);
-    }
-    if !sc.is_empty() {
-        ret.push(sc);
-    }
-    ret.push(String::from("&& ret=0"));
-
-    ret.join("\n")
-}
-
-fn write_opts_of(p: &Parser) -> String {
-    debugln!("write_opts_of;");
-    let mut ret = vec![];
-    for o in p.opts() {
-        debugln!("write_opts_of:iter: o={}", o.name());
-        let help = o.help().unwrap_or("").replace("[", "\\[").replace("]", "\\]");
-        let mut conflicts = get_zsh_arg_conflicts!(p, o, INTERNAL_ERROR_MSG);
-        conflicts = if conflicts.is_empty() {
-            String::new()
-        } else {
-            format!("({})", conflicts)
-        };
-
-        let multiple = if o.is_set(ArgSettings::Multiple) {
-            "*"
-        } else {
-            ""
-        };
-        let pv = if let Some(pv_vec) = o.possible_vals() {
-            format!(": :({})", pv_vec.join(" "))
-        } else {
-            String::new()
-        };
-        if let Some(short) = o.short() {
-            let s = format!("\"{conflicts}{multiple}-{arg}+[{help}]{possible_values}\" \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = short,
-                possible_values = pv,
-                help = help);
-
-            debugln!("write_opts_of:iter: Wrote...{}", &*s);
-            ret.push(s);
-        }
-        if let Some(long) = o.long() {
-            let l = format!("\"{conflicts}{multiple}--{arg}+[{help}]{possible_values}\" \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = long,
-                possible_values = pv,
-                help = help);
-
-            debugln!("write_opts_of:iter: Wrote...{}", &*l);
-            ret.push(l);
-        }
-    }
-
-    ret.join("\n")
-}
-
-fn write_flags_of(p: &Parser) -> String {
-    debugln!("write_flags_of;");
-    let mut ret = vec![];
-    for f in p.flags() {
-        debugln!("write_flags_of:iter: f={}", f.name());
-        let help = f.help().unwrap_or("").replace("[", "\\[").replace("]", "\\]");
-        let mut conflicts = get_zsh_arg_conflicts!(p, f, INTERNAL_ERROR_MSG);
-        conflicts = if conflicts.is_empty() {
-            String::new()
-        } else {
-            format!("({})", conflicts)
-        };
-
-        let multiple = if f.is_set(ArgSettings::Multiple) {
-            "*"
-        } else {
-            ""
-        };
-        if let Some(short) = f.short() {
-            let s = format!("\"{conflicts}{multiple}-{arg}[{help}]\" \\",
-                multiple = multiple,
-                conflicts = conflicts,
-                arg = short,
-                help = help);
-
-            debugln!("write_flags_of:iter: Wrote...{}", &*s);
-            ret.push(s);
-        }
-
-        if let Some(long) = f.long() {
-            let l = format!("\"{conflicts}{multiple}--{arg}[{help}]\" \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = long,
-                help = help);
-
-            debugln!("write_flags_of:iter: Wrote...{}", &*l);
-            ret.push(l);
-        }
-    }
-
-    ret.join("\n")
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/errors.rs
+++ /dev/null
@@ -1,884 +0,0 @@
-// Std
-use std::convert::From;
-use std::error::Error as StdError;
-use std::fmt as std_fmt;
-use std::fmt::Display;
-use std::io::{self, Write};
-use std::process;
-use std::result::Result as StdResult;
-
-// Internal
-use args::{FlagBuilder, AnyArg};
-use fmt::{Colorizer, ColorizerOption, ColorWhen};
-use suggestions;
-
-/// Short hand for [`Result`] type
-/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-pub type Result<T> = StdResult<T, Error>;
-
-/// Command line argument parser kind of error
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub enum ErrorKind {
-    /// Occurs when an [`Arg`] has a set of possible values,
-    /// and the user provides a value which isn't in that set.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("speed")
-    ///         .possible_value("fast")
-    ///         .possible_value("slow"))
-    ///     .get_matches_from_safe(vec!["prog", "other"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    InvalidValue,
-
-    /// Occurs when a user provides a flag, option, argument or subcommand which isn't defined.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::from_usage("--flag 'some flag'"))
-    ///     .get_matches_from_safe(vec!["prog", "--other"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    UnknownArgument,
-
-    /// Occurs when the user provides an unrecognized [`SubCommand`] which meets the threshold for
-    /// being similar enough to an existing subcommand.
-    /// If it doesn't meet the threshold, or the 'suggestions' feature is disabled,
-    /// the more general [`UnknownArgument`] error is returned.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(feature="suggestions"), doc=" ```no_run")]
-    #[cfg_attr(    feature="suggestions" , doc=" ```")]
-    /// # use clap::{App, Arg, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")
-    ///             .index(1)))
-    ///     .get_matches_from_safe(vec!["prog", "confi"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    InvalidSubcommand,
-
-    /// Occurs when the user provides an unrecognized [`SubCommand`] which either
-    /// doesn't meet the threshold for being similar enough to an existing subcommand,
-    /// or the 'sggestions' feature is disabled.
-    /// Otherwise the more detailed [`InvalidSubcommand`] error is returned.
-    ///
-    /// This error typically happens when passing additional subcommand names to the `help`
-    /// subcommand. Otherwise, the more general [`UnknownArgument`] error is used.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")
-    ///             .index(1)))
-    ///     .get_matches_from_safe(vec!["prog", "help", "nothing"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnrecognizedSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`InvalidSubcommand`]: ./enum.ErrorKind.html#variant.InvalidSubcommand
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    UnrecognizedSubcommand,
-
-    /// Occurs when the user provides an empty value for an option that does not allow empty
-    /// values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("color")
-    ///          .long("color")
-    ///          .empty_values(false))
-    ///     .get_matches_from_safe(vec!["prog", "--color="]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    EmptyValue,
-
-    /// Occurs when the user provides a value for an argument with a custom validation and the
-    /// value fails that validation.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// fn is_numeric(val: String) -> Result<(), String> {
-    ///     match val.parse::<i64>() {
-    ///         Ok(..) => Ok(()),
-    ///         Err(..) => Err(String::from("Value wasn't a number!")),
-    ///     }
-    /// }
-    ///
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("num")
-    ///          .validator(is_numeric))
-    ///     .get_matches_from_safe(vec!["prog", "NotANumber"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::ValueValidation);
-    /// ```
-    ValueValidation,
-
-    /// Occurs when a user provides more values for an argument than were defined by setting
-    /// [`Arg::max_values`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("arg")
-    ///         .multiple(true)
-    ///         .max_values(2))
-    ///     .get_matches_from_safe(vec!["prog", "too", "many", "values"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::TooManyValues);
-    /// ```
-    /// [`Arg::max_values`]: ./struct.Arg.html#method.max_values
-    TooManyValues,
-
-    /// Occurs when the user provides fewer values for an argument than were defined by setting
-    /// [`Arg::min_values`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("some_opt")
-    ///         .long("opt")
-    ///         .min_values(3))
-    ///     .get_matches_from_safe(vec!["prog", "--opt", "too", "few"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::TooFewValues);
-    /// ```
-    /// [`Arg::min_values`]: ./struct.Arg.html#method.min_values
-    TooFewValues,
-
-    /// Occurs when the user provides a different number of values for an argument than what's
-    /// been defined by setting [`Arg::number_of_values`] or than was implicitly set by
-    /// [`Arg::value_names`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("some_opt")
-    ///         .long("opt")
-    ///         .takes_value(true)
-    ///         .number_of_values(2))
-    ///     .get_matches_from_safe(vec!["prog", "--opt", "wrong"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::WrongNumberOfValues);
-    /// ```
-    /// [`Arg::number_of_values`]
-    /// [`Arg::number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::value_names`]: ./struct.Arg.html#method.value_names
-    WrongNumberOfValues,
-
-    /// Occurs when the user provides two values which conflict with each other and can't be used
-    /// together.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .conflicts_with("color"))
-    ///     .arg(Arg::with_name("color")
-    ///         .long("color"))
-    ///     .get_matches_from_safe(vec!["prog", "--debug", "--color"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    ArgumentConflict,
-
-    /// Occurs when the user does not provide one or more required arguments.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .required(true))
-    ///     .get_matches_from_safe(vec!["prog"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    MissingRequiredArgument,
-
-    /// Occurs when a subcommand is required (as defined by [`AppSettings::SubcommandRequired`]),
-    /// but the user does not provide one.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("prog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog",
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingSubcommand);
-    /// # ;
-    /// ```
-    /// [`AppSettings::SubcommandRequired`]: ./enum.AppSettings.html#variant.SubcommandRequired
-    MissingSubcommand,
-
-    /// Occurs when either an argument or [`SubCommand`] is required, as defined by
-    /// [`AppSettings::ArgRequiredElseHelp`], but the user did not provide one.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .setting(AppSettings::ArgRequiredElseHelp)
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")))
-    ///     .get_matches_from_safe(vec!["prog"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::MissingArgumentOrSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings::ArgRequiredElseHelp`]: ./enum.AppSettings.html#variant.ArgRequiredElseHelp
-    MissingArgumentOrSubcommand,
-
-    /// Occurs when the user provides multiple values to an argument which doesn't allow that.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .multiple(false))
-    ///     .get_matches_from_safe(vec!["prog", "--debug", "--debug"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnexpectedMultipleUsage);
-    /// ```
-    UnexpectedMultipleUsage,
-
-    /// Occurs when the user provides a value containing invalid UTF-8 for an argument and
-    /// [`AppSettings::StrictUtf8`] is set.
-    ///
-    /// # Platform Speicific
-    ///
-    /// Non-Windows platforms only (such as Linux, Unix, OSX, etc.)
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
-    /// # use clap::{App, Arg, ErrorKind, AppSettings};
-    /// # use std::os::unix::ffi::OsStringExt;
-    /// # use std::ffi::OsString;
-    /// let result = App::new("prog")
-    ///     .setting(AppSettings::StrictUtf8)
-    ///     .arg(Arg::with_name("utf8")
-    ///         .short("u")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![OsString::from("myprog"),
-    ///                                 OsString::from("-u"),
-    ///                                 OsString::from_vec(vec![0xE9])]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidUtf8);
-    /// ```
-    /// [`AppSettings::StrictUtf8`]: ./enum.AppSettings.html#variant.StrictUtf8
-    InvalidUtf8,
-
-    /// Not a true "error" as it means `--help` or similar was used.
-    /// The help message will be sent to `stdout`.
-    ///
-    /// **Note**: If the help is displayed due to an error (such as missing subcommands) it will
-    /// be sent to `stderr` instead of `stdout`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .get_matches_from_safe(vec!["prog", "--help"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::HelpDisplayed);
-    /// ```
-    HelpDisplayed,
-
-    /// Not a true "error" as it means `--version` or similar was used.
-    /// The message will be sent to `stdout`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .get_matches_from_safe(vec!["prog", "--version"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::VersionDisplayed);
-    /// ```
-    VersionDisplayed,
-
-    /// Occurs when using the [`value_t!`] and [`values_t!`] macros to convert an argument value
-    /// into type `T`, but the argument you requested wasn't used. I.e. you asked for an argument
-    /// with name `config` to be converted, but `config` wasn't used by the user.
-    /// [`value_t!`]: ./macro.value_t!.html
-    /// [`values_t!`]: ./macro.values_t!.html
-    ArgumentNotFound,
-
-    /// Represents an [I/O error].
-    /// Can occur when writing to `stderr` or `stdout` or reading a configuration file.
-    /// [I/O error]: https://doc.rust-lang.org/std/io/struct.Error.html
-    Io,
-
-    /// Represents a [Format error] (which is a part of [`Display`]).
-    /// Typically caused by writing to `stderr` or `stdout`.
-    /// [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-    /// [Format error]: https://doc.rust-lang.org/std/fmt/struct.Error.html
-    Format,
-}
-
-/// Command Line Argument Parser Error
-#[derive(Debug)]
-pub struct Error {
-    /// Formated error message
-    pub message: String,
-    /// The type of error
-    pub kind: ErrorKind,
-    /// Any additional information passed along, such as the argument name that caused the error
-    pub info: Option<Vec<String>>,
-}
-
-impl Error {
-    /// Should the message be written to `stdout` or not
-    pub fn use_stderr(&self) -> bool {
-        match self.kind {
-            ErrorKind::HelpDisplayed |
-            ErrorKind::VersionDisplayed => false,
-            _ => true,
-        }
-    }
-
-    /// Prints the error to `stderr` and exits with a status of `1`
-    pub fn exit(&self) -> ! {
-        if self.use_stderr() {
-            wlnerr!("{}", self.message);
-            process::exit(1);
-        }
-        let out = io::stdout();
-        writeln!(&mut out.lock(), "{}", self.message).expect("Error writing Error to stdout");
-        process::exit(0);
-    }
-
-    #[doc(hidden)]
-    pub fn write_to<W: Write>(&self, w: &mut W) -> io::Result<()> { write!(w, "{}", self.message) }
-
-    #[doc(hidden)]
-    pub fn argument_conflict<'a, 'b, A, O, U>(arg: &A,
-                                              other: Option<O>,
-                                              usage: U,
-                                              color: ColorWhen)
-                                              -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              O: Into<String>,
-              U: Display
-    {
-        let mut v = vec![arg.name().to_owned()];
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The argument '{}' cannot be used with {}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*arg.to_string()),
-                             match other {
-                                 Some(name) => {
-                                     let n = name.into();
-                                     v.push(n.clone());
-                                     c.warning(format!("'{}'", n))
-                                 }
-                                 None => {
-                                     c.none("one or more of the other specified arguments"
-                                         .to_owned())
-                                 }
-                             },
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::ArgumentConflict,
-            info: Some(v),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn empty_value<'a, 'b, A, U>(arg: &A, usage: U, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The argument '{}' requires a value but none was supplied\
-                            \n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::EmptyValue,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn invalid_value<'a, 'b, B, G, A, U>(bad_val: B,
-                                             good_vals: &[G],
-                                             arg: &A,
-                                             usage: U,
-                                             color: ColorWhen)
-                                             -> Self
-        where B: AsRef<str>,
-              G: AsRef<str> + Display,
-              A: AnyArg<'a, 'b> + Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        let suffix =
-            suggestions::did_you_mean_value_suffix(
-                bad_val.as_ref(),
-                good_vals.iter());
-
-        let mut sorted = vec![];
-        for v in good_vals {
-            let val = format!("{}", c.good(v));
-            sorted.push(val);
-        }
-        sorted.sort();
-        let valid_values = sorted.join(", ");
-        Error {
-            message: format!("{} '{}' isn't a valid value for '{}'\n\t\
-                            [values: {}]\n\
-                            {}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(bad_val.as_ref()),
-                             c.warning(arg.to_string()),
-                             valid_values,
-                             suffix.0,
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::InvalidValue,
-            info: Some(vec![arg.name().to_owned(), bad_val.as_ref().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn invalid_subcommand<S, D, N, U>(subcmd: S,
-                                          did_you_mean: D,
-                                          name: N,
-                                          usage: U,
-                                          color: ColorWhen)
-                                          -> Self
-        where S: Into<String>,
-              D: AsRef<str> + Display,
-              N: Display,
-              U: Display
-    {
-        let s = subcmd.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The subcommand '{}' wasn't recognized\n\t\
-                            Did you mean '{}'?\n\n\
-                            If you believe you received this message in error, try \
-                            re-running with '{} {} {}'\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*s),
-                             c.good(did_you_mean.as_ref()),
-                             name,
-                             c.good("--"),
-                             &*s,
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::InvalidSubcommand,
-            info: Some(vec![s]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unrecognized_subcommand<S, N>(subcmd: S, name: N, color: ColorWhen) -> Self
-        where S: Into<String>,
-              N: Display
-    {
-        let s = subcmd.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The subcommand '{}' wasn't recognized\n\n\
-                            {}\n\t\
-                                {} help <subcommands>...\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*s),
-                             c.warning("USAGE:"),
-                             name,
-                             c.good("--help")),
-            kind: ErrorKind::UnrecognizedSubcommand,
-            info: Some(vec![s]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn missing_required_argument<R, U>(required: R, usage: U, color: ColorWhen) -> Self
-        where R: Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The following required arguments were not provided:{}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             required,
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::MissingRequiredArgument,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn missing_subcommand<N, U>(name: N, usage: U, color: ColorWhen) -> Self
-        where N: AsRef<str> + Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} '{}' requires a subcommand, but one was not provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(name),
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::MissingSubcommand,
-            info: None,
-        }
-    }
-
-
-    #[doc(hidden)]
-    pub fn invalid_utf8<U>(usage: U, color: ColorWhen) -> Self
-        where U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} Invalid UTF-8 was detected in one or more arguments\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::InvalidUtf8,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn too_many_values<'a, 'b, V, A, U>(val: V,
-                                            arg: &A,
-                                            usage: U,
-                                            color: ColorWhen)
-                                            -> Self
-        where V: AsRef<str> + Display + ToOwned,
-              A: AnyArg<'a, 'b> + Display,
-              U: Display
-    {
-        let v = val.as_ref();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The value '{}' was provided to '{}', but it wasn't expecting \
-                            any more values\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(v),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::TooManyValues,
-            info: Some(vec![arg.name().to_owned(), v.to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn too_few_values<'a, 'b, A, U>(arg: &A,
-                                        min_vals: u64,
-                                        curr_vals: usize,
-                                        usage: U,
-                                        color: ColorWhen)
-                                        -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The argument '{}' requires at least {} values, but only {} w{} \
-                            provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             c.warning(min_vals.to_string()),
-                             c.warning(curr_vals.to_string()),
-                             if curr_vals > 1 { "ere" } else { "as" },
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::TooFewValues,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn value_validation<'a, 'b, A>(arg: Option<&A>, err: String, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} Invalid value{}: {}",
-                             c.error("error:"),
-                             if let Some(a) = arg {
-                                 format!(" for '{}'", c.warning(a.to_string()))
-                             } else {
-                                 "".to_string()
-                             },
-                             err),
-            kind: ErrorKind::ValueValidation,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn value_validation_auto(err: String) -> Self {
-        let n: Option<&FlagBuilder> = None; 
-        Error::value_validation(n, err, ColorWhen::Auto)
-    }
-
-    #[doc(hidden)]
-    pub fn wrong_number_of_values<'a, 'b, A, S, U>(arg: &A,
-                                                   num_vals: u64,
-                                                   curr_vals: usize,
-                                                   suffix: S,
-                                                   usage: U,
-                                                   color: ColorWhen)
-                                                   -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              S: Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The argument '{}' requires {} values, but {} w{} \
-                            provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             c.warning(num_vals.to_string()),
-                             c.warning(curr_vals.to_string()),
-                             suffix,
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::WrongNumberOfValues,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unexpected_multiple_usage<'a, 'b, A, U>(arg: &A, usage: U, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} The argument '{}' was provided more than once, but cannot \
-                            be used multiple times\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::UnexpectedMultipleUsage,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unknown_argument<A, U>(arg: A,
-                                  did_you_mean: &str,
-                                  usage: U,
-                                  color: ColorWhen)
-                                  -> Self
-        where A: Into<String>,
-              U: Display
-    {
-        let a = arg.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} Found argument '{}' which wasn't expected, or isn't valid in \
-            this context{}\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*a),
-                             if did_you_mean.is_empty() {
-                                 "\n".to_owned()
-                             } else {
-                                 format!("{}\n", did_you_mean)
-                             },
-                             usage,
-                             c.good("--help")),
-            kind: ErrorKind::UnknownArgument,
-            info: Some(vec![a]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn io_error(e: &Error, color: ColorWhen) -> Self {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} {}", c.error("error:"), e.description()),
-            kind: ErrorKind::Io,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn argument_not_found_auto<A>(arg: A) -> Self
-        where A: Into<String>
-    {
-        let a = arg.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        });
-        Error {
-            message: format!("{} The argument '{}' wasn't found",
-                             c.error("error:"),
-                             a.clone()),
-            kind: ErrorKind::ArgumentNotFound,
-            info: Some(vec![a]),
-        }
-    }
-
-    /// Create an error with a custom description.
-    ///
-    /// This can be used in combination with `Error::exit` to exit your program
-    /// with a custom error message.
-    pub fn with_description(description: &str, kind: ErrorKind) -> Self {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        });
-        Error {
-            message: format!("{} {}", c.error("error:"), description),
-            kind: kind,
-            info: None,
-        }
-    }
-}
-
-impl StdError for Error {
-    fn description(&self) -> &str { &*self.message }
-}
-
-impl Display for Error {
-    fn fmt(&self, f: &mut std_fmt::Formatter) -> std_fmt::Result { writeln!(f, "{}", self.message) }
-}
-
-impl From<io::Error> for Error {
-    fn from(e: io::Error) -> Self { Error::with_description(e.description(), ErrorKind::Io) }
-}
-
-impl From<std_fmt::Error> for Error {
-    fn from(e: std_fmt::Error) -> Self {
-        Error::with_description(e.description(), ErrorKind::Format)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/fmt.rs
+++ /dev/null
@@ -1,181 +0,0 @@
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-use ansi_term::ANSIString;
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-use ansi_term::Colour::{Green, Red, Yellow};
-
-#[cfg(feature = "color")]
-use atty;
-use std::fmt;
-use std::env;
-
-#[doc(hidden)]
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub enum ColorWhen {
-    Auto,
-    Always,
-    Never,
-}
-
-#[cfg(feature = "color")]
-pub fn is_a_tty(stderr: bool) -> bool {
-    debugln!("is_a_tty: stderr={:?}", stderr);
-    let stream = if stderr {
-        atty::Stream::Stderr
-    } else {
-        atty::Stream::Stdout
-    };
-    atty::is(stream)
-}
-
-#[cfg(not(feature = "color"))]
-pub fn is_a_tty(_: bool) -> bool {
-    debugln!("is_a_tty;");
-    false
-}
-
-pub fn is_term_dumb() -> bool { env::var("TERM").ok() == Some(String::from("dumb")) }
-
-#[doc(hidden)]
-pub struct ColorizerOption {
-    pub use_stderr: bool,
-    pub when: ColorWhen,
-}
-
-#[doc(hidden)]
-pub struct Colorizer {
-    when: ColorWhen,
-}
-
-macro_rules! color {
-    ($_self:ident, $c:ident, $m:expr) => {
-        match $_self.when {
-            ColorWhen::Auto => Format::$c($m),
-            ColorWhen::Always => Format::$c($m),
-            ColorWhen::Never => Format::None($m),
-        }
-    };
-}
-
-impl Colorizer {
-    pub fn new(option: ColorizerOption) -> Colorizer {
-        let is_a_tty = is_a_tty(option.use_stderr);
-        let is_term_dumb = is_term_dumb();
-        Colorizer {
-            when: if is_a_tty && !is_term_dumb {
-                option.when
-            } else {
-                ColorWhen::Never
-            },
-        }
-    }
-
-    pub fn good<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
-    {
-        debugln!("Colorizer::good;");
-        color!(self, Good, msg)
-    }
-
-    pub fn warning<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
-    {
-        debugln!("Colorizer::warning;");
-        color!(self, Warning, msg)
-    }
-
-    pub fn error<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
-    {
-        debugln!("Colorizer::error;");
-        color!(self, Error, msg)
-    }
-
-    pub fn none<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
-    {
-        debugln!("Colorizer::none;");
-        Format::None(msg)
-    }
-}
-
-impl Default for Colorizer {
-    fn default() -> Self {
-        Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        })
-    }
-}
-
-/// Defines styles for different types of error messages. Defaults to Error=Red, Warning=Yellow,
-/// and Good=Green
-#[derive(Debug)]
-#[doc(hidden)]
-pub enum Format<T> {
-    /// Defines the style used for errors, defaults to Red
-    Error(T),
-    /// Defines the style used for warnings, defaults to Yellow
-    Warning(T),
-    /// Defines the style used for good values, defaults to Green
-    Good(T),
-    /// Defines no formatting style
-    None(T),
-}
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-impl<T: AsRef<str>> Format<T> {
-    fn format(&self) -> ANSIString {
-        match *self {
-            Format::Error(ref e) => Red.bold().paint(e.as_ref()),
-            Format::Warning(ref e) => Yellow.paint(e.as_ref()),
-            Format::Good(ref e) => Green.paint(e.as_ref()),
-            Format::None(ref e) => ANSIString::from(e.as_ref()),
-        }
-    }
-}
-
-#[cfg(any(not(feature = "color"), target_os = "windows"))]
-#[cfg_attr(feature="lints", allow(match_same_arms))]
-impl<T: fmt::Display> Format<T> {
-    fn format(&self) -> &T {
-        match *self {
-            Format::Error(ref e) => e,
-            Format::Warning(ref e) => e,
-            Format::Good(ref e) => e,
-            Format::None(ref e) => e,
-        }
-    }
-}
-
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-impl<T: AsRef<str>> fmt::Display for Format<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", &self.format()) }
-}
-
-#[cfg(any(not(feature = "color"), target_os = "windows"))]
-impl<T: fmt::Display> fmt::Display for Format<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", &self.format()) }
-}
-
-#[cfg(all(test, feature = "color", not(target_os = "windows")))]
-mod test {
-    use ansi_term::ANSIString;
-    use ansi_term::Colour::{Green, Red, Yellow};
-    use super::Format;
-
-    #[test]
-    fn colored_output() {
-        let err = Format::Error("error");
-        assert_eq!(&*format!("{}", err),
-                   &*format!("{}", Red.bold().paint("error")));
-        let good = Format::Good("good");
-        assert_eq!(&*format!("{}", good), &*format!("{}", Green.paint("good")));
-        let warn = Format::Warning("warn");
-        assert_eq!(&*format!("{}", warn), &*format!("{}", Yellow.paint("warn")));
-        let none = Format::None("none");
-        assert_eq!(&*format!("{}", none),
-                   &*format!("{}", ANSIString::from("none")));
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/lib.rs
+++ /dev/null
@@ -1,571 +0,0 @@
-// Copyright ⓒ 2015-2016 Kevin B. Knapp and [`clap-rs` contributors](https://github.com/kbknapp/clap-rs/blob/master/CONTRIBUTORS.md).
-// Licensed under the MIT license
-// (see LICENSE or <http://opensource.org/licenses/MIT>) All files in the project carrying such
-// notice may not be copied, modified, or distributed except according to those terms.
-
-//! `clap` is a simple-to-use, efficient, and full-featured library for parsing command line
-//! arguments and subcommands when writing console/terminal applications.
-//!
-//! ## About
-//!
-//! `clap` is used to parse *and validate* the string of command line arguments provided by the user
-//! at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means
-//! you focus on your *applications* functionality, and less on the parsing and validating of
-//! arguments.
-//!
-//! `clap` also provides the traditional version and help switches (or flags) 'for free' meaning
-//! automatically with no configuration. It does this by checking list of valid possibilities you
-//! supplied and adding only the ones you haven't already defined. If you are using subcommands,
-//! `clap` will also auto-generate a `help` subcommand for you in addition to the traditional flags.
-//!
-//! Once `clap` parses the user provided string of arguments, it returns the matches along with any
-//! applicable values. If the user made an error or typo, `clap` informs them of the mistake and
-//! exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to
-//! exit). Because of this, you can make reasonable assumptions in your code about the validity of
-//! the arguments.
-//!
-//!
-//! ## Quick Example
-//!
-//! The following examples show a quick example of some of the very basic functionality of `clap`.
-//! For more advanced usage, such as requirements, conflicts, groups, multiple values and
-//! occurrences see the [documentation](https://docs.rs/clap/), [examples/](examples) directory of
-//! this repository or the [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-//!
-//! **NOTE:** All of these examples are functionally the same, but show different styles in which to
-//! use `clap`
-//!
-//! The first example shows a method that allows more advanced configuration options (not shown in
-//! this small example), or even dynamically generating arguments when desired. The downside is it's
-//! more verbose.
-//! 
-//! ```no_run
-//! // (Full example with detailed comments in examples/01b_quick_example.rs)
-//! //
-//! // This example demonstrates clap's full 'builder pattern' style of creating arguments which is
-//! // more verbose, but allows easier editing, and at times more advanced options, or the possibility
-//! // to generate arguments dynamically.
-//! extern crate clap;
-//! use clap::{Arg, App, SubCommand};
-//! 
-//! fn main() {
-//!     let matches = App::new("My Super Program")
-//!                           .version("1.0")
-//!                           .author("Kevin K. <kbknapp@gmail.com>")
-//!                           .about("Does awesome things")
-//!                           .arg(Arg::with_name("config")
-//!                                .short("c")
-//!                                .long("config")
-//!                                .value_name("FILE")
-//!                                .help("Sets a custom config file")
-//!                                .takes_value(true))
-//!                           .arg(Arg::with_name("INPUT")
-//!                                .help("Sets the input file to use")
-//!                                .required(true)
-//!                                .index(1))
-//!                           .arg(Arg::with_name("v")
-//!                                .short("v")
-//!                                .multiple(true)
-//!                                .help("Sets the level of verbosity"))
-//!                           .subcommand(SubCommand::with_name("test")
-//!                                       .about("controls testing features")
-//!                                       .version("1.3")
-//!                                       .author("Someone E. <someone_else@other.com>")
-//!                                       .arg(Arg::with_name("debug")
-//!                                           .short("d")
-//!                                           .help("print debug information verbosely")))
-//!                           .get_matches();
-//! 
-//!     // Gets a value for config if supplied by user, or defaults to "default.conf"
-//!     let config = matches.value_of("config").unwrap_or("default.conf");
-//!     println!("Value for config: {}", config);
-//! 
-//!     // Calling .unwrap() is safe here because "INPUT" is required (if "INPUT" wasn't
-//!     // required we could have used an 'if let' to conditionally get the value)
-//!     println!("Using input file: {}", matches.value_of("INPUT").unwrap());
-//! 
-//!     // Vary the output based on how many times the user used the "verbose" flag
-//!     // (i.e. 'myprog -v -v -v' or 'myprog -vvv' vs 'myprog -v'
-//!     match matches.occurrences_of("v") {
-//!         0 => println!("No verbose info"),
-//!         1 => println!("Some verbose info"),
-//!         2 => println!("Tons of verbose info"),
-//!         3 | _ => println!("Don't be crazy"),
-//!     }
-//! 
-//!     // You can handle information about subcommands by requesting their matches by name
-//!     // (as below), requesting just the name used, or both at the same time
-//!     if let Some(matches) = matches.subcommand_matches("test") {
-//!         if matches.is_present("debug") {
-//!             println!("Printing debug info...");
-//!         } else {
-//!             println!("Printing normally...");
-//!         }
-//!     }
-//! 
-//!     // more program logic goes here...
-//! }
-//! ```
-//! 
-//! The next example shows a far less verbose method, but sacrifices some of the advanced
-//! configuration options (not shown in this small example). This method also takes a *very* minor
-//! runtime penalty.
-//! 
-//! ```no_run
-//! // (Full example with detailed comments in examples/01a_quick_example.rs)
-//! //
-//! // This example demonstrates clap's "usage strings" method of creating arguments
-//! // which is less verbose
-//! extern crate clap;
-//! use clap::{Arg, App, SubCommand};
-//! 
-//! fn main() {
-//!     let matches = App::new("myapp")
-//!                           .version("1.0")
-//!                           .author("Kevin K. <kbknapp@gmail.com>")
-//!                           .about("Does awesome things")
-//!                           .args_from_usage(
-//!                               "-c, --config=[FILE] 'Sets a custom config file'
-//!                               <INPUT>              'Sets the input file to use'
-//!                               -v...                'Sets the level of verbosity'")
-//!                           .subcommand(SubCommand::with_name("test")
-//!                                       .about("controls testing features")
-//!                                       .version("1.3")
-//!                                       .author("Someone E. <someone_else@other.com>")
-//!                                       .arg_from_usage("-d, --debug 'Print debug information'"))
-//!                           .get_matches();
-//! 
-//!     // Same as previous example...
-//! }
-//! ```
-//! 
-//! This third method shows how you can use a YAML file to build your CLI and keep your Rust source
-//! tidy or support multiple localized translations by having different YAML files for each
-//! localization.
-//!
-//! First, create the `cli.yml` file to hold your CLI options, but it could be called anything we
-//! like:
-//! 
-//! ```yaml
-//! name: myapp
-//! version: "1.0"
-//! author: Kevin K. <kbknapp@gmail.com>
-//! about: Does awesome things
-//! args:
-//!     - config:
-//!         short: c
-//!         long: config
-//!         value_name: FILE
-//!         help: Sets a custom config file
-//!         takes_value: true
-//!     - INPUT:
-//!         help: Sets the input file to use
-//!         required: true
-//!         index: 1
-//!     - verbose:
-//!         short: v
-//!         multiple: true
-//!         help: Sets the level of verbosity
-//! subcommands:
-//!     - test:
-//!         about: controls testing features
-//!         version: "1.3"
-//!         author: Someone E. <someone_else@other.com>
-//!         args:
-//!             - debug:
-//!                 short: d
-//!                 help: print debug information
-//! ```
-//! 
-//! Since this feature requires additional dependencies that not everyone may want, it is *not*
-//! compiled in by default and we need to enable a feature flag in Cargo.toml:
-//!
-//! Simply change your `clap = "~2.19.0"` to `clap = {version = "~2.19.0", features = ["yaml"]}`.
-//!
-//! At last we create our `main.rs` file just like we would have with the previous two examples:
-//! 
-//! ```ignore
-//! // (Full example with detailed comments in examples/17_yaml.rs)
-//! //
-//! // This example demonstrates clap's building from YAML style of creating arguments which is far
-//! // more clean, but takes a very small performance hit compared to the other two methods.
-//! #[macro_use]
-//! extern crate clap;
-//! use clap::App;
-//! 
-//! fn main() {
-//!     // The YAML file is found relative to the current file, similar to how modules are found
-//!     let yaml = load_yaml!("cli.yml");
-//!     let matches = App::from_yaml(yaml).get_matches();
-//! 
-//!     // Same as previous examples...
-//! }
-//! ```
-//! 
-//! Finally there is a macro version, which is like a hybrid approach offering the speed of the
-//! builder pattern (the first example), but without all the verbosity.
-//! 
-//! ```no_run
-//! #[macro_use]
-//! extern crate clap;
-//! 
-//! fn main() {
-//!     let matches = clap_app!(myapp =>
-//!         (version: "1.0")
-//!         (author: "Kevin K. <kbknapp@gmail.com>")
-//!         (about: "Does awesome things")
-//!         (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
-//!         (@arg INPUT: +required "Sets the input file to use")
-//!         (@arg debug: -d ... "Sets the level of debugging information")
-//!         (@subcommand test =>
-//!             (about: "controls testing features")
-//!             (version: "1.3")
-//!             (author: "Someone E. <someone_else@other.com>")
-//!             (@arg verbose: -v --verbose "Print test information verbosely")
-//!         )
-//!     ).get_matches();
-//! 
-//!     // Same as before...
-//! }
-//! ```
-//! 
-//! If you were to compile any of the above programs and run them with the flag `--help` or `-h` (or
-//! `help` subcommand, since we defined `test` as a subcommand) the following would be output
-//! 
-//! ```text
-//! $ myprog --help
-//! My Super Program 1.0
-//! Kevin K. <kbknapp@gmail.com>
-//! Does awesome things
-//! 
-//! USAGE:
-//!     MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
-//! 
-//! FLAGS:
-//!     -h, --help       Prints this message
-//!     -v               Sets the level of verbosity
-//!     -V, --version    Prints version information
-//! 
-//! OPTIONS:
-//!     -c, --config <FILE>    Sets a custom config file
-//! 
-//! ARGS:
-//!     INPUT    The input file to use
-//! 
-//! SUBCOMMANDS:
-//!     help    Prints this message
-//!     test    Controls testing features
-//! ```
-//! 
-//! **NOTE:** You could also run `myapp test --help` to see similar output and options for the
-//! `test` subcommand.
-//! 
-//! ## Try it!
-//! 
-//! ### Pre-Built Test
-//! 
-//! To try out the pre-built example, use the following steps:
-//! 
-//! * Clone the repository `$ git clone https://github.com/kbknapp/clap-rs && cd clap-rs/tests`
-//! * Compile the example `$ cargo build --release`
-//! * Run the help info `$ ./target/release/claptests --help`
-//! * Play with the arguments!
-//! 
-//! ### BYOB (Build Your Own Binary)
-//! 
-//! To test out `clap`'s default auto-generated help/version follow these steps:
-//!
-//! * Create a new cargo project `$ cargo new fake --bin && cd fake`
-//! * Add `clap` to your `Cargo.toml`
-//!
-//! ```toml
-//! [dependencies]
-//! clap = "2"
-//! ```
-//! 
-//! * Add the following to your `src/main.rs`
-//! 
-//! ```no_run
-//! extern crate clap;
-//! use clap::App;
-//! 
-//! fn main() {
-//!   App::new("fake").version("v1.0-beta").get_matches();
-//! }
-//! ```
-//! 
-//! * Build your program `$ cargo build --release`
-//! * Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake
-//! --version`
-//! 
-//! ## Usage
-//! 
-//! For full usage, add `clap` as a dependency in your `Cargo.toml` (it is **highly** recommended to
-//! use the `~major.minor.patch` style versions in your `Cargo.toml`, for more information see
-//! [Compatibility Policy](#compatibility-policy)) to use from crates.io:
-//! 
-//! ```toml
-//! [dependencies]
-//! clap = "~2.19.0"
-//! ```
-//! 
-//! Or get the latest changes from the master branch at github:
-//! 
-//! ```toml
-//! [dependencies.clap]
-//! git = "https://github.com/kbknapp/clap-rs.git"
-//! ```
-//! 
-//! Add `extern crate clap;` to your crate root.
-//! 
-//! Define a list of valid arguments for your program (see the 
-//! [documentation](https://docs.rs/clap/) or [examples/](examples) directory of this repo)
-//! 
-//! Then run `cargo build` or `cargo update && cargo build` for your project.
-//! 
-//! ### Optional Dependencies / Features
-//! 
-//! #### Features enabled by default
-//! 
-//! * `suggestions`: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
-//! * `color`: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term` and `atty`)
-//! * `wrap_help`: Wraps the help at the actual terminal width when available, instead of 120 chracters. (builds dependency `term_size`)
-//! 
-//! To disable these, add this to your `Cargo.toml`:
-//! 
-//! ```toml
-//! [dependencies.clap]
-//! version = "~2.19.0"
-//! default-features = false
-//! ```
-//! 
-//! You can also selectively enable only the features you'd like to include, by adding:
-//! 
-//! ```toml
-//! [dependencies.clap]
-//! version = "~2.19.0"
-//! default-features = false
-//! 
-//! # Cherry-pick the features you'd like to use
-//! features = [ "suggestions", "color" ]
-//! ```
-//! 
-//! #### Opt-in features
-//! 
-//! * **"yaml"**: Enables building CLIs from YAML documents. (builds dependency `yaml-rust`)
-//! * **"unstable"**: Enables unstable `clap` features that may change from release to release
-//! 
-//! ### Dependencies Tree
-//! 
-//! The following graphic depicts `clap`s dependency graph (generated using 
-//! [cargo-graph](https://github.com/kbknapp/cargo-graph)).
-//! 
-//!  * **Dashed** Line: Optional dependency
-//!  * **Red** Color: **NOT** included by default (must use cargo `features` to enable)
-//!  * **Blue** Color: Dev dependency, only used while developing.
-//! 
-//! ![clap dependencies](clap_dep_graph.png)
-//! 
-//! ### More Information
-//! 
-//! You can find complete documentation on the [docs.rs](https://docs.rs/clap/) for this project.
-//! 
-//! You can also find usage examples in the [examples/](examples) directory of this repo.
-//! 
-//! #### Video Tutorials
-//! 
-//! There's also the video tutorial series [Argument Parsing with Rust v2](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-//! 
-//! These videos slowly trickle out as I finish them and currently a work in progress.
-//! 
-//! ## How to Contribute
-//! 
-//! Contributions are always welcome! And there is a multitude of ways in which you can help
-//! depending on what you like to do, or are good at. Anything from documentation, code cleanup,
-//! issue completion, new features, you name it, even filing issues is contributing and greatly
-//! appreciated!
-//!
-//! Another really great way to help is if you find an interesting, or helpful way in which to use
-//! `clap`. You can either add it to the [examples/](examples) directory, or file an issue and tell
-//! me. I'm all about giving credit where credit is due :)
-//! 
-//! Please read [CONTRIBUTING.md](.github/CONTRIBUTING.md) before you start contributing.
-//! 
-//! 
-//! ### Testing Code
-//! 
-//! To test with all features both enabled and disabled, you can run theese commands:
-//! 
-//! ```text
-//! $ cargo test --no-default-features
-//! $ cargo test --features "yaml unstable"
-//! ```
-//! 
-//! Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the
-//! prebuilt recipies. *Not* using `just` is prfeclty fine as well, it simply bundles commands
-//! automatically.
-//! 
-//! For example, to test the code, as above simply run:
-//! 
-//! ```text
-//! $ just run-tests`
-//! ```
-//! 
-//! From here on, I will lis the appropriate `cargo` command as well as the `just` command.
-//! 
-//! Sometimes it's helpful to only run a subset of the tests, which can be done via:
-//! 
-//! ```text
-//! $ cargo test --test <test_name>
-//! 
-//! # Or
-//! 
-//! $ just run-test <test_name>
-//! ```
-//! 
-//! ### Linting Code
-//! 
-//! During the CI process `clap` runs against many different lints using
-//! [`clippy`](https://github.com/Manishearth/rust-clippy). In order to check if these lints pass on
-//! your own computer prior to submitting a PR you'll need a nightly compiler.
-//! 
-//! In order to check the code for lints run either:
-//! 
-//! ```text
-//! $ rustup override add nightly
-//! $ cargo build --features lints
-//! $ rustup override remove
-//! 
-//! # Or
-//! 
-//! $ just lint
-//! ```
-//! 
-//! ### Debugging Code
-//! 
-//! Another helpful technique is to see the `clap` debug output while developing features. In order
-//! to see the debug output while running the full test suite or individual tests, run:
-//! 
-//! ```text
-//! $ cargo test --features debug
-//! 
-//! # Or for individual tests
-//! $ cargo test --test <test_name> --features debug
-//! 
-//! # The corresponding just command for individual debugging tests is:
-//! $ just debug <test_name>
-//! ```
-//! 
-//! ### Goals
-//! 
-//! There are a few goals of `clap` that I'd like to maintain throughout contributions. If your
-//! proposed changes break, or go against any of these goals we'll discuss the changes further
-//! before merging (but will *not* be ignored, all contributes are welcome!). These are by no means
-//! hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by
-//! mistake or ignorance).
-//! 
-//! * Remain backwards compatible when possible
-//!   - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before
-//!   removing legacy code - This does not apply for security concerns
-//! * Parse arguments quickly
-//!   - Parsing of arguments shouldn't slow down usage of the main program - This is also true of
-//!   generating help and usage information (although *slightly* less stringent, as the program is about
-//!   to exit)
-//! * Try to be cognizant of memory usage
-//!   - Once parsing is complete, the memory footprint of `clap` should be low since the  main program
-//!   is the star of the show
-//! * `panic!` on *developer* error, exit gracefully on *end-user* error
-//! 
-//! ### Compatibility Policy
-//!
-//! Because `clap` takes `SemVer` and compatibility seriously, this is the official policy regarding
-//! breaking changes and previous versions of Rust.
-//!
-//! `clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum
-//! version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version
-//! of `clap` will be bumped.
-//!
-//! In order to keep from being suprised of breaking changes, it is **highly** recommended to use
-//! the `~major.minor.patch` style in your `Cargo.toml`:
-//!
-//! ```toml 
-//! [dependencies] clap = "~2.19.0"
-//! ```
-//!
-//! This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore
-//! cannot break due to new features, or bumped minimum versions of Rust.
-//!
-//! #### Minimum Version of Rust
-//!
-//! `clap` will officially support current stable Rust, minus two releases, but may work with prior
-//! releases as well. For example, current stable Rust at the time of this writing is 1.13.0,
-//! meaning `clap` is guaranteed to compile with 1.11.0 and beyond. At the 1.14.0 release, `clap`
-//! will be guaranteed to compile with 1.12.0 and beyond, etc.
-//! 
-//! Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be
-//! clearly annotated in the `CHANGELOG.md`
-//! 
-//! ## License
-//! 
-//! `clap` is licensed under the MIT license. Please read the [LICENSE-MIT](LICENSE-MIT) file in
-//! this repository for more information.
-
-#![crate_type= "lib"]
-#![deny(
-        missing_docs,
-        missing_debug_implementations,
-        missing_copy_implementations,
-        trivial_casts,
-        unused_import_braces,
-        unused_allocation)]
-// Lints we'd like to deny but are currently failing for upstream crates
-//      unused_qualifications       (bitflags, clippy)
-//      trivial_numeric_casts       (bitflags)
-#![cfg_attr(not(any(feature = "lints", feature = "nightly")), forbid(unstable_features))]
-#![cfg_attr(feature = "lints", feature(plugin))]
-#![cfg_attr(feature = "lints", plugin(clippy))]
-#![cfg_attr(feature = "lints", deny(warnings))]
-#![cfg_attr(feature = "lints", allow(cyclomatic_complexity))]
-#![cfg_attr(feature = "lints", allow(doc_markdown))]
-#![cfg_attr(feature = "lints", allow(explicit_iter_loop))]
-
-#[cfg(feature = "suggestions")]
-extern crate strsim;
-#[cfg(feature = "color")]
-extern crate ansi_term;
-#[cfg(feature = "yaml")]
-extern crate yaml_rust;
-extern crate unicode_width;
-#[macro_use]
-extern crate bitflags;
-extern crate vec_map;
-#[cfg(feature = "wrap_help")]
-extern crate term_size;
-extern crate textwrap;
-extern crate unicode_segmentation;
-#[cfg(feature = "color")]
-extern crate atty;
-
-#[cfg(feature = "yaml")]
-pub use yaml_rust::YamlLoader;
-pub use args::{Arg, ArgGroup, ArgMatches, ArgSettings, SubCommand, Values, OsValues};
-pub use app::{App, AppSettings};
-pub use fmt::Format;
-pub use errors::{Error, ErrorKind, Result};
-pub use completions::Shell;
-
-#[macro_use]
-mod macros;
-mod app;
-mod args;
-mod usage_parser;
-mod fmt;
-mod suggestions;
-mod errors;
-mod osstringext;
-mod strext;
-mod completions;
-
-const INTERNAL_ERROR_MSG: &'static str = "Fatal internal error. Please consider filing a bug \
-                                          report at https://github.com/kbknapp/clap-rs/issues";
-const INVALID_UTF8: &'static str = "unexpected invalid UTF-8 code point";
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/macros.rs
+++ /dev/null
@@ -1,1030 +0,0 @@
-/// A convenience macro for loading the YAML file at compile time (relative to the current file,
-/// like modules work). That YAML object can then be passed to this function.
-///
-/// # Panics
-///
-/// The YAML file must be properly formatted or this function will panic!(). A good way to
-/// ensure this doesn't happen is to run your program with the `--help` switch. If this passes
-/// without error, you needn't worry because the YAML is properly formatted.
-///
-/// # Examples
-///
-/// The following example shows how to load a properly formatted YAML file to build an instnace
-/// of an `App` struct.
-///
-/// ```ignore
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let yml = load_yaml!("app.yml");
-/// let app = App::from_yaml(yml);
-///
-/// // continued logic goes here, such as `app.get_matches()` etc.
-/// # }
-/// ```
-#[cfg(feature = "yaml")]
-#[macro_export]
-macro_rules! load_yaml {
-    ($yml:expr) => (
-        &::clap::YamlLoader::load_from_str(include_str!($yml)).expect("failed to load YAML file")[0]
-    );
-}
-
-/// Convenience macro getting a typed value `T` where `T` implements [`std::str::FromStr`] from an
-/// argument value. This macro returns a `Result<T,String>` which allows you as the developer to
-/// decide what you'd like to do on a failed parse. There are two types of errors, parse failures
-/// and those where the argument wasn't present (such as a non-required argument). You can use
-/// it to get a single value, or a iterator as with the [`ArgMatches::values_of`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[length] 'Set the length to use as a pos whole num, i.e. 20'")
-///               .get_matches();
-///
-/// let len      = value_t!(matches.value_of("length"), u32).unwrap_or_else(|e| e.exit());
-/// let also_len = value_t!(matches, "length", u32).unwrap_or_else(|e| e.exit());
-///
-/// println!("{} + 2: {}", len, len + 2);
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-/// [`Result<T,String>`]: https://doc.rust-lang.org/std/result/enum.Result.html
-#[macro_export]
-macro_rules! value_t {
-    ($m:ident, $v:expr, $t:ty) => {
-        value_t!($m.value_of($v), $t)
-    };
-    ($m:ident.value_of($v:expr), $t:ty) => {
-        if let Some(v) = $m.value_of($v) {
-            match v.parse::<$t>() {
-                Ok(val) => Ok(val),
-                Err(_)  =>
-                    Err(::clap::Error::value_validation_auto(
-                        format!("The argument '{}' isn't a valid value", v))),
-            }
-        } else {
-            Err(::clap::Error::argument_not_found_auto($v))
-        }
-    };
-}
-
-/// Convenience macro getting a typed value `T` where `T` implements [`std::str::FromStr`] or
-/// exiting upon error, instead of returning a [`Result`] type.
-///
-/// **NOTE:** This macro is for backwards compatibility sake. Prefer
-/// [`value_t!(/* ... */).unwrap_or_else(|e| e.exit())`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[length] 'Set the length to use as a pos whole num, i.e. 20'")
-///               .get_matches();
-///
-/// let len      = value_t_or_exit!(matches.value_of("length"), u32);
-/// let also_len = value_t_or_exit!(matches, "length", u32);
-///
-/// println!("{} + 2: {}", len, len + 2);
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-/// [`value_t!(/* ... */).unwrap_or_else(|e| e.exit())`]: ./macro.value_t!.html
-#[macro_export]
-macro_rules! value_t_or_exit {
-    ($m:ident, $v:expr, $t:ty) => {
-        value_t_or_exit!($m.value_of($v), $t)
-    };
-    ($m:ident.value_of($v:expr), $t:ty) => {
-        if let Some(v) = $m.value_of($v) {
-            match v.parse::<$t>() {
-                Ok(val) => val,
-                Err(_)  =>
-                    ::clap::Error::value_validation_auto(
-                        format!("The argument '{}' isn't a valid value", v)).exit(),
-            }
-        } else {
-            ::clap::Error::argument_not_found_auto($v).exit()
-        }
-    };
-}
-
-/// Convenience macro getting a typed value [`Vec<T>`] where `T` implements [`std::str::FromStr`]
-/// This macro returns a [`clap::Result<Vec<T>>`] which allows you as the developer to decide
-/// what you'd like to do on a failed parse.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[seq]... 'A sequence of pos whole nums, i.e. 20 45'")
-///               .get_matches();
-///
-/// let vals = values_t!(matches.values_of("seq"), u32).unwrap_or_else(|e| e.exit());
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-///
-/// let vals = values_t!(matches, "seq", u32).unwrap_or_else(|e| e.exit());
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Vec<T>`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-/// [`clap::Result<Vec<T>>`]: ./type.Result.html
-#[macro_export]
-macro_rules! values_t {
-    ($m:ident, $v:expr, $t:ty) => {
-        values_t!($m.values_of($v), $t)
-    };
-    ($m:ident.values_of($v:expr), $t:ty) => {
-        if let Some(vals) = $m.values_of($v) {
-            let mut tmp = vec![];
-            let mut err = None;
-            for pv in vals {
-                match pv.parse::<$t>() {
-                    Ok(rv) => tmp.push(rv),
-                    Err(..) => {
-                        err = Some(::clap::Error::value_validation_auto(
-                                format!("The argument '{}' isn't a valid value", pv)));
-                        break
-                    }
-                }
-            }
-            match err {
-                Some(e) => Err(e),
-                None => Ok(tmp),
-            }
-        } else {
-            Err(::clap::Error::argument_not_found_auto($v))
-        }
-    };
-}
-
-/// Convenience macro getting a typed value [`Vec<T>`] where `T` implements [`std::str::FromStr`]
-/// or exiting upon error.
-///
-/// **NOTE:** This macro is for backwards compatibility sake. Prefer
-/// [`values_t!(/* ... */).unwrap_or_else(|e| e.exit())`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[seq]... 'A sequence of pos whole nums, i.e. 20 45'")
-///               .get_matches();
-///
-/// let vals = values_t_or_exit!(matches.values_of("seq"), u32);
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-///
-/// // type for example only
-/// let vals: Vec<u32> = values_t_or_exit!(matches, "seq", u32);
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-/// # }
-/// ```
-/// [`values_t!(/* ... */).unwrap_or_else(|e| e.exit())`]: ./macro.values_t!.html
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Vec<T>`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-#[macro_export]
-macro_rules! values_t_or_exit {
-    ($m:ident, $v:expr, $t:ty) => {
-        values_t_or_exit!($m.values_of($v), $t)
-    };
-    ($m:ident.values_of($v:expr), $t:ty) => {
-        if let Some(vals) = $m.values_of($v) {
-            vals.map(|v| v.parse::<$t>().unwrap_or_else(|_|{
-                ::clap::Error::value_validation_auto(
-                    format!("One or more arguments aren't valid values")).exit()
-            })).collect::<Vec<$t>>()
-        } else {
-            ::clap::Error::argument_not_found_auto($v).exit()
-        }
-    };
-}
-
-// _clap_count_exprs! is derived from https://github.com/DanielKeep/rust-grabbag
-// commit: 82a35ca5d9a04c3b920622d542104e3310ee5b07
-// License: MIT
-// Copyright ⓒ 2015 grabbag contributors.
-// Licensed under the MIT license (see LICENSE or <http://opensource.org
-// /licenses/MIT>) or the Apache License, Version 2.0 (see LICENSE of
-// <http://www.apache.org/licenses/LICENSE-2.0>), at your option. All
-// files in the project carrying such notice may not be copied, modified,
-// or distributed except according to those terms.
-//
-/// Counts the number of comma-delimited expressions passed to it.  The result is a compile-time
-/// evaluable expression, suitable for use as a static array size, or the value of a `const`.
-///
-/// # Examples
-///
-/// ```
-/// # #[macro_use] extern crate clap;
-/// # fn main() {
-/// const COUNT: usize = _clap_count_exprs!(a, 5+1, "hi there!".into_string());
-/// assert_eq!(COUNT, 3);
-/// # }
-/// ```
-#[macro_export]
-macro_rules! _clap_count_exprs {
-    () => { 0 };
-    ($e:expr) => { 1 };
-    ($e:expr, $($es:expr),+) => { 1 + _clap_count_exprs!($($es),*) };
-}
-
-/// Convenience macro to generate more complete enums with variants to be used as a type when
-/// parsing arguments. This enum also provides a `variants()` function which can be used to
-/// retrieve a `Vec<&'static str>` of the variant names, as well as implementing [`FromStr`] and
-/// [`Display`] automatically.
-///
-/// **NOTE:** Case insensitivity is supported for ASCII characters only
-///
-/// **NOTE:** This macro automatically implements [`std::str::FromStr`] and [`std::fmt::Display`]
-///
-/// **NOTE:** These enums support pub (or not) and uses of the #[derive()] traits
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::{App, Arg};
-/// arg_enum!{
-///     #[derive(Debug)]
-///     pub enum Foo {
-///         Bar,
-///         Baz,
-///         Qux
-///     }
-/// }
-/// // Foo enum can now be used via Foo::Bar, or Foo::Baz, etc
-/// // and implements std::str::FromStr to use with the value_t! macros
-/// fn main() {
-///     let m = App::new("app")
-///                 .arg_from_usage("<foo> 'the foo'")
-///                 .get_matches();
-///     let f = value_t!(m, "foo", Foo).unwrap_or_else(|e| e.exit());
-///
-///     // Use f like any other Foo variant...
-/// }
-/// ```
-/// [`FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-/// [`std::fmt::Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-#[macro_export]
-macro_rules! arg_enum {
-    (@as_item $($i:item)*) => ($($i)*);
-    (@impls ( $($tts:tt)* ) -> ($e:ident, $($v:ident),+)) => {
-        arg_enum!(@as_item
-        $($tts)*
-
-        impl ::std::str::FromStr for $e {
-            type Err = String;
-
-            fn from_str(s: &str) -> ::std::result::Result<Self,Self::Err> {
-                use ::std::ascii::AsciiExt;
-                match s {
-                    $(stringify!($v) |
-                    _ if s.eq_ignore_ascii_case(stringify!($v)) => Ok($e::$v)),+,
-                    _ => Err({
-                        let v = vec![
-                            $(stringify!($v),)+
-                        ];
-                        format!("valid values: {}",
-                            v.join(" ,"))
-                    }),
-                }
-            }
-        }
-        impl ::std::fmt::Display for $e {
-            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-                match *self {
-                    $($e::$v => write!(f, stringify!($v)),)+
-                }
-            }
-        }
-        impl $e {
-            #[allow(dead_code)]
-            pub fn variants() -> [&'static str; _clap_count_exprs!($(stringify!($v)),+)] {
-                [
-                    $(stringify!($v),)+
-                ]
-            }
-        });
-    };
-    ($(#[$($m:meta),+])+ pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-            pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*),+  } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-            enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            (pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            (enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-}
-
-/// Allows you to pull the version from your Cargo.toml at compile time as
-/// `MAJOR.MINOR.PATCH_PKGVERSION_PRE`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .version(crate_version!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature="no_cargo"))]
-#[macro_export]
-macro_rules! crate_version {
-    () => {
-        env!("CARGO_PKG_VERSION")
-    };
-}
-
-/// Allows you to pull the authors for the app from your Cargo.toml at
-/// compile time in the form:
-/// `"author1 lastname <author1@example.com>:author2 lastname <author2@example.com>"`
-///
-/// You can replace the colons with a custom separator by supplying a
-/// replacement string, so, for example,
-/// `crate_authors!(",\n")` would become
-/// `"author1 lastname <author1@example.com>,\nauthor2 lastname <author2@example.com>,\nauthor3 lastname <author3@example.com>"`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .author(crate_authors!("\n"))
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature="no_cargo"))]
-#[macro_export]
-macro_rules! crate_authors {
-    ($sep:expr) => {{
-        use std::ops::Deref;
-        use std::sync::{ONCE_INIT, Once};
-
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        struct CARGO_AUTHORS {__private_field: ()}
-        static CARGO_AUTHORS: CARGO_AUTHORS = CARGO_AUTHORS {__private_field: ()};
-
-        impl Deref for CARGO_AUTHORS {
-            type Target = String;
-
-            #[allow(unsafe_code)]
-            fn deref<'a>(&'a self) -> &'a String {
-                unsafe {
-                    static mut LAZY: (*const String, Once) = (0 as *const String, ONCE_INIT);
-
-                    LAZY.1.call_once(|| LAZY.0 = Box::into_raw(Box::new(env!("CARGO_PKG_AUTHORS").replace(':', $sep))));
-                    &*LAZY.0
-                }
-            }
-        }
-
-        &CARGO_AUTHORS[..]
-    }};
-    () => {
-        env!("CARGO_PKG_AUTHORS")
-    };
-}
-
-/// Allows you to pull the description from your Cargo.toml at compile time.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .about(crate_description!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature="no_cargo"))]
-#[macro_export]
-macro_rules! crate_description {
-    () => {
-        env!("CARGO_PKG_DESCRIPTION")
-    };
-}
-
-/// Allows you to pull the name from your Cargo.toml at compile time.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new(crate_name!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature="no_cargo"))]
-#[macro_export]
-macro_rules! crate_name {
-    () => {
-        env!("CARGO_PKG_NAME")
-    };
-}
-
-/// Allows you to build the `App` instance from your Cargo.toml at compile time.
-///
-/// Equivalent to using the `crate_*!` macros with their respective fields.
-///
-/// Provided separator is for the [`crate_authors!`](macro.crate_authors.html) macro,
-/// refer to the documentation therefor.
-///
-/// **NOTE:** Changing the values in your `Cargo.toml` does not trigger a re-build automatically,
-/// and therefore won't change the generated output until you recompile.
-///
-/// **Pro Tip:** In some cases you can "trick" the compiler into triggering a rebuild when your
-/// `Cargo.toml` is changed by including this in your `src/main.rs` file
-/// `include_str!("../Cargo.toml");`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # fn main() {
-/// let m = app_from_crate!().get_matches();
-/// # }
-/// ```
-#[cfg(not(feature="no_cargo"))]
-#[macro_export]
-macro_rules! app_from_crate {
-    () => {
-        $crate::App::new(crate_name!())
-            .version(crate_version!())
-            .author(crate_authors!())
-            .about(crate_description!())
-    };
-    ($sep:expr) => {
-        $crate::App::new(crate_name!())
-            .version(crate_version!())
-            .author(crate_authors!($sep))
-            .about(crate_description!())
-    };
-}
-
-/// Build `App`, `Arg`s, `SubCommand`s and `Group`s with Usage-string like input
-/// but without the associated parsing runtime cost.
-///
-/// `clap_app!` also supports several shorthand syntaxes.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # fn main() {
-/// let matches = clap_app!(myapp =>
-///     (version: "1.0")
-///     (author: "Kevin K. <kbknapp@gmail.com>")
-///     (about: "Does awesome things")
-///     (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
-///     (@arg INPUT: +required "Sets the input file to use")
-///     (@arg debug: -d ... "Sets the level of debugging information")
-///     (@group difficulty =>
-///         (@arg hard: -h --hard "Sets hard mode")
-///         (@arg normal: -n --normal "Sets normal mode")
-///         (@arg easy: -e --easy "Sets easy mode")
-///     )
-///     (@subcommand test =>
-///         (about: "controls testing features")
-///         (version: "1.3")
-///         (author: "Someone E. <someone_else@other.com>")
-///         (@arg verbose: -v --verbose "Print test information verbosely")
-///     )
-/// );
-/// # }
-/// ```
-/// # Shorthand Syntax for Args
-///
-/// * A single hyphen followed by a character (such as `-c`) sets the [`Arg::short`]
-/// * A double hyphen followed by a character or word (such as `--config`) sets [`Arg::long`]
-///   * If one wishes to use a [`Arg::long`] with a hyphen inside (i.e. `--config-file`), you
-///     must use `--("config-file")` due to limitations of the Rust macro system.
-/// * Three dots (`...`) sets [`Arg::multiple(true)`]
-/// * Angled brackets after either a short or long will set [`Arg::value_name`] and
-/// `Arg::required(true)` such as `--config <FILE>` = `Arg::value_name("FILE")` and
-/// `Arg::required(true)
-/// * Square brackets after either a short or long will set [`Arg::value_name`] and
-/// `Arg::required(false)` such as `--config [FILE]` = `Arg::value_name("FILE")` and
-/// `Arg::required(false)
-/// * There are short hand syntaxes for Arg methods that accept booleans
-///   * A plus sign will set that method to `true` such as `+required` = `Arg::required(true)`
-///   * An exclamation will set that method to `false` such as `!required` = `Arg::required(false)`
-/// * A `#{min, max}` will set [`Arg::min_values(min)`] and [`Arg::max_values(max)`]
-/// * An asterisk (`*`) will set `Arg::required(true)`
-/// * Curly brackets around a `fn` will set [`Arg::validator`] as in `{fn}` = `Arg::validator(fn)`
-/// * An Arg method that accepts a string followed by square brackets will set that method such as
-/// `conflicts_with[FOO]` will set `Arg::conflicts_with("FOO")` (note the lack of quotes around
-/// `FOO` in the macro)
-/// * An Arg method that takes a string and can be set multiple times (such as
-/// [`Arg::conflicts_with`]) followed by square brackets and a list of values separated by spaces
-/// will set that method such as `conflicts_with[FOO BAR BAZ]` will set
-/// `Arg::conflicts_with("FOO")`, `Arg::conflicts_with("BAR")`, and `Arg::conflicts_with("BAZ")`
-/// (note the lack of quotes around the values in the macro)
-///
-/// [`Arg::short`]: ./struct.Arg.html#method.short
-/// [`Arg::long`]: ./struct.Arg.html#method.long
-/// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-/// [`Arg::value_name`]: ./struct.Arg.html#method.value_name
-/// [`Arg::min_values(min)`]: ./struct.Arg.html#method.min_values
-/// [`Arg::max_values(max)`]: ./struct.Arg.html#method.max_values
-/// [`Arg::validator`]: ./struct.Arg.html#method.validator
-/// [`Arg::conflicts_with`]: ./struct.Arg.html#method.conflicts_with
-#[macro_export]
-macro_rules! clap_app {
-    (@app ($builder:expr)) => { $builder };
-    (@app ($builder:expr) (@arg ($name:expr): $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.arg(
-                clap_app!{ @arg ($crate::Arg::with_name($name)) (-) $($tail)* }))
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@arg $name:ident: $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.arg(
-                clap_app!{ @arg ($crate::Arg::with_name(stringify!($name))) (-) $($tail)* }))
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@setting $setting:ident) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.setting($crate::AppSettings::$setting))
-            $($tt)*
-        }
-    };
-// Treat the application builder as an argument to set it's attributes
-    (@app ($builder:expr) (@attributes $($attr:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app (clap_app!{ @arg ($builder) $($attr)* }) $($tt)* }
-    };
-    (@app ($builder:expr) (@group $name:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            (clap_app!{ @group ($builder, $crate::ArgGroup::with_name(stringify!($name))) $($tail)* })
-            $($tt)*
-        }
-    };
-// Handle subcommand creation
-    (@app ($builder:expr) (@subcommand $name:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.subcommand(
-                clap_app!{ @app ($crate::SubCommand::with_name(stringify!($name))) $($tail)* }
-            ))
-            $($tt)*
-        }
-    };
-// Yaml like function calls - used for setting various meta directly against the app
-    (@app ($builder:expr) ($ident:ident: $($v:expr),*) $($tt:tt)*) => {
-// clap_app!{ @app ($builder.$ident($($v),*)) $($tt)* }
-        clap_app!{ @app
-            ($builder.$ident($($v),*))
-            $($tt)*
-        }
-    };
-
-// Add members to group and continue argument handling with the parent builder
-    (@group ($builder:expr, $group:expr)) => { $builder.group($group) };
-    (@group ($builder:expr, $group:expr) (@attributes $($attr:tt)*) $($tt:tt)*) => {
-        clap_app!{ @group ($builder, clap_app!{ @arg ($group) (-) $($attr)* }) $($tt)* }
-    };
-    (@group ($builder:expr, $group:expr) (@arg $name:ident: $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @group
-            (clap_app!{ @app ($builder) (@arg $name: $($tail)*) },
-             $group.arg(stringify!($name)))
-            $($tt)*
-        }
-    };
-
-// No more tokens to munch
-    (@arg ($arg:expr) $modes:tt) => { $arg };
-// Shorthand tokens influenced by the usage_string
-    (@arg ($arg:expr) $modes:tt --($long:expr) $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.long($long)) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt --$long:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.long(stringify!($long))) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt -$short:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.short(stringify!($short))) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) (-) <$var:ident> $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) +takes_value +required $($tail)* }
-    };
-    (@arg ($arg:expr) (+) <$var:ident> $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) $($tail)* }
-    };
-    (@arg ($arg:expr) (-) [$var:ident] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) +takes_value $($tail)* }
-    };
-    (@arg ($arg:expr) (+) [$var:ident] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt ... $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes +multiple $($tail)* }
-    };
-// Shorthand magic
-    (@arg ($arg:expr) $modes:tt #{$n:expr, $m:expr} $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes min_values($n) max_values($m) $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt * $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes +required $($tail)* }
-    };
-// !foo -> .foo(false)
-    (@arg ($arg:expr) $modes:tt !$ident:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident(false)) $modes $($tail)* }
-    };
-// +foo -> .foo(true)
-    (@arg ($arg:expr) $modes:tt +$ident:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident(true)) $modes $($tail)* }
-    };
-// Validator
-    (@arg ($arg:expr) $modes:tt {$fn_:expr} $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.validator($fn_)) $modes $($tail)* }
-    };
-    (@as_expr $expr:expr) => { $expr };
-// Help
-    (@arg ($arg:expr) $modes:tt $desc:tt) => { $arg.help(clap_app!{ @as_expr $desc }) };
-// Handle functions that need to be called multiple times for each argument
-    (@arg ($arg:expr) $modes:tt $ident:ident[$($target:ident)*] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg $( .$ident(stringify!($target)) )*) $modes $($tail)* }
-    };
-// Inherit builder's functions
-    (@arg ($arg:expr) $modes:tt $ident:ident($($expr:expr)*) $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident($($expr)*)) $modes $($tail)* }
-    };
-
-// Build a subcommand outside of an app.
-    (@subcommand $name:ident => $($tail:tt)*) => {
-        clap_app!{ @app ($crate::SubCommand::with_name(stringify!($name))) $($tail)* }
-    };
-// Start the magic
-    (($name:expr) => $($tail:tt)*) => {{
-        clap_app!{ @app ($crate::App::new($name)) $($tail)*}
-    }};
-
-    ($name:ident => $($tail:tt)*) => {{
-        clap_app!{ @app ($crate::App::new(stringify!($name))) $($tail)*}
-    }};
-}
-
-macro_rules! impl_settings {
-    ($n:ident, $($v:ident => $c:ident),+) => {
-        pub fn set(&mut self, s: $n) {
-            match s {
-                $($n::$v => self.0.insert($c)),+
-            }
-        }
-
-        pub fn unset(&mut self, s: $n) {
-            match s {
-                $($n::$v => self.0.remove($c)),+
-            }
-        }
-
-        pub fn is_set(&self, s: $n) -> bool {
-            match s {
-                $($n::$v => self.0.contains($c)),+
-            }
-        }
-    };
-}
-
-// Convenience for writing to stderr thanks to https://github.com/BurntSushi
-macro_rules! wlnerr(
-    ($($arg:tt)*) => ({
-        use std::io::{Write, stderr};
-        writeln!(&mut stderr(), $($arg)*).ok();
-    })
-);
-
-#[cfg(feature = "debug")]
-#[cfg_attr(feature = "debug", macro_use)]
-mod debug_macros {
-    macro_rules! debugln {
-        ($fmt:expr) => (println!(concat!("DEBUG:clap:", $fmt)));
-        ($fmt:expr, $($arg:tt)*) => (println!(concat!("DEBUG:clap:",$fmt), $($arg)*));
-    }
-    macro_rules! sdebugln {
-        ($fmt:expr) => (println!($fmt));
-        ($fmt:expr, $($arg:tt)*) => (println!($fmt, $($arg)*));
-    }
-    macro_rules! debug {
-        ($fmt:expr) => (print!(concat!("DEBUG:clap:", $fmt)));
-        ($fmt:expr, $($arg:tt)*) => (print!(concat!("DEBUG:clap:",$fmt), $($arg)*));
-    }
-    macro_rules! sdebug {
-        ($fmt:expr) => (print!($fmt));
-        ($fmt:expr, $($arg:tt)*) => (print!($fmt, $($arg)*));
-    }
-}
-
-#[cfg(not(feature = "debug"))]
-#[cfg_attr(not(feature = "debug"), macro_use)]
-mod debug_macros {
-    macro_rules! debugln {
-        ($fmt:expr) => ();
-        ($fmt:expr, $($arg:tt)*) => ();
-    }
-    macro_rules! sdebugln {
-        ($fmt:expr) => ();
-        ($fmt:expr, $($arg:tt)*) => ();
-    }
-    macro_rules! debug {
-        ($fmt:expr) => ();
-        ($fmt:expr, $($arg:tt)*) => ();
-    }
-}
-
-// Helper/deduplication macro for printing the correct number of spaces in help messages
-// used in:
-//    src/args/arg_builder/*.rs
-//    src/app/mod.rs
-macro_rules! write_nspaces {
-    ($dst:expr, $num:expr) => ({
-        debugln!("write_spaces!: num={}", $num);
-        for _ in 0..$num {
-            try!($dst.write_all(b" "));
-        }
-    })
-}
-
-// convenience macro for remove an item from a vec
-macro_rules! vec_remove_all {
-    ($vec:expr, $to_rem:expr) => {
-        debugln!("vec_remove_all! to_rem={:?}", $to_rem);
-        for i in (0 .. $vec.len()).rev() {
-            let should_remove = $to_rem.any(|name| name == &$vec[i]);
-            if should_remove { $vec.swap_remove(i); }
-        }
-    };
-}
-macro_rules! find_from {
-    ($_self:expr, $arg_name:expr, $from:ident, $matcher:expr) => {{
-        let mut ret = None;
-        for k in $matcher.arg_names() {
-            if let Some(f) = find_by_name!($_self, k, flags, iter) {
-                if let Some(ref v) = f.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(f.to_string());
-                    }
-                }
-            }
-            if let Some(o) = find_by_name!($_self, k, opts, iter) {
-                if let Some(ref v) = o.$from() {
-                    if v.contains(&$arg_name) {
-                        ret = Some(o.to_string());
-                    }
-                }
-            }
-            if let Some(pos) = find_by_name!($_self, k, positionals, values) {
-                if let Some(ref v) = pos.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(pos.b.name.to_owned());
-                    }
-                }
-            }
-        }
-        ret
-    }};
-}
-
-macro_rules! find_name_from {
-    ($_self:expr, $arg_name:expr, $from:ident, $matcher:expr) => {{
-        let mut ret = None;
-        for k in $matcher.arg_names() {
-            if let Some(f) = find_by_name!($_self, k, flags, iter) {
-                if let Some(ref v) = f.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(f.b.name);
-                    }
-                }
-            }
-            if let Some(o) = find_by_name!($_self, k, opts, iter) {
-                if let Some(ref v) = o.$from() {
-                    if v.contains(&$arg_name) {
-                        ret = Some(o.b.name);
-                    }
-                }
-            }
-            if let Some(pos) = find_by_name!($_self, k, positionals, values) {
-                if let Some(ref v) = pos.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(pos.b.name);
-                    }
-                }
-            }
-        }
-        ret
-    }};
-}
-
-// Finds an arg by name
-macro_rules! find_by_name {
-    ($p:expr, $name:expr, $what:ident, $how:ident) => {
-        $p.$what.$how().find(|o| o.b.name == $name)
-    }
-}
-
-// Finds an option including if it's aliasesed
-macro_rules! find_opt_by_long {
-    (@os $_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, opts)
-    }};
-    ($_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, opts)
-    }};
-}
-
-macro_rules! find_flag_by_long {
-    (@os $_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, flags)
-    }};
-    ($_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, flags)
-    }};
-}
-
-macro_rules! _find_by_long {
-    ($_self:ident, $long:expr, $what:ident) => {{
-        $_self.$what
-            .iter()
-            .filter(|a| a.s.long.is_some())
-            .find(|a| {
-                a.s.long.unwrap() == $long ||
-                (a.s.aliases.is_some() &&
-                 a.s
-                    .aliases
-                    .as_ref()
-                    .unwrap()
-                    .iter()
-                    .any(|&(alias, _)| alias == $long))
-            })
-    }}
-}
-
-// Finds an option
-macro_rules! find_opt_by_short {
-    ($_self:ident, $short:expr) => {{
-        _find_by_short!($_self, $short, opts)
-    }}
-}
-
-macro_rules! find_flag_by_short {
-    ($_self:ident, $short:expr) => {{
-        _find_by_short!($_self, $short, flags)
-    }}
-}
-
-macro_rules! _find_by_short {
-    ($_self:ident, $short:expr, $what:ident) => {{
-        $_self.$what
-            .iter()
-            .filter(|a| a.s.short.is_some())
-            .find(|a| a.s.short.unwrap() == $short)
-    }}
-}
-
-macro_rules! find_subcmd {
-    ($_self:expr, $sc:expr) => {{
-        $_self.subcommands
-            .iter()
-            .find(|s| {
-                &*s.p.meta.name == $sc ||
-                (s.p.meta.aliases.is_some() &&
-                 s.p
-                    .meta
-                    .aliases
-                    .as_ref()
-                    .unwrap()
-                    .iter()
-                    .any(|&(n, _)| n == $sc))
-            })
-    }};
-}
-
-macro_rules! shorts {
-    ($_self:ident) => {{
-        _shorts_longs!($_self, short)
-    }};
-}
-
-
-macro_rules! longs {
-    ($_self:ident) => {{
-        _shorts_longs!($_self, long)
-    }};
-}
-
-macro_rules! _shorts_longs {
-    ($_self:ident, $what:ident) => {{
-        $_self.flags
-                .iter()
-                .filter(|f| f.s.$what.is_some())
-                .map(|f| f.s.$what.as_ref().unwrap())
-                .chain($_self.opts.iter()
-                                  .filter(|o| o.s.$what.is_some())
-                                  .map(|o| o.s.$what.as_ref().unwrap()))
-    }};
-}
-
-macro_rules! arg_names {
-    ($_self:ident) => {{
-        _names!(@args $_self)
-    }};
-}
-
-macro_rules! sc_names {
-    ($_self:ident) => {{
-        _names!(@sc $_self)
-    }};
-}
-
-macro_rules! _names {
-    (@args $_self:ident) => {{
-        $_self.flags
-                .iter()
-                .map(|f| &*f.b.name)
-                .chain($_self.opts.iter()
-                                  .map(|o| &*o.b.name)
-                                  .chain($_self.positionals.values()
-                                                           .map(|p| &*p.b.name)))
-    }};
-    (@sc $_self:ident) => {{
-        $_self.subcommands
-            .iter()
-            .map(|s| &*s.p.meta.name)
-            .chain($_self.subcommands
-                         .iter()
-                         .filter(|s| s.p.meta.aliases.is_some())
-                         .flat_map(|s| s.p.meta.aliases.as_ref().unwrap().iter().map(|&(n, _)| n)))
-
-    }}
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/osstringext.rs
+++ /dev/null
@@ -1,135 +0,0 @@
-#[cfg(target_os = "windows")]
-use INVALID_UTF8;
-use std::ffi::OsStr;
-#[cfg(not(target_os = "windows"))]
-use std::os::unix::ffi::OsStrExt;
-
-#[cfg(target_os = "windows")]
-pub trait OsStrExt3 {
-    fn from_bytes(b: &[u8]) -> &Self;
-    fn as_bytes(&self) -> &[u8];
-}
-
-#[doc(hidden)]
-pub trait OsStrExt2 {
-    fn starts_with(&self, s: &[u8]) -> bool;
-    fn split_at_byte(&self, b: u8) -> (&OsStr, &OsStr);
-    fn split_at(&self, i: usize) -> (&OsStr, &OsStr);
-    fn trim_left_matches(&self, b: u8) -> &OsStr;
-    fn len_(&self) -> usize;
-    fn contains_byte(&self, b: u8) -> bool;
-    fn is_empty_(&self) -> bool;
-    fn split(&self, b: u8) -> OsSplit;
-}
-
-#[cfg(target_os = "windows")]
-impl OsStrExt3 for OsStr {
-    fn from_bytes(b: &[u8]) -> &Self {
-        use std::mem;
-        unsafe { mem::transmute(b) }
-    }
-    fn as_bytes(&self) -> &[u8] { self.to_str().map(|s| s.as_bytes()).expect(INVALID_UTF8) }
-}
-
-impl OsStrExt2 for OsStr {
-    fn starts_with(&self, s: &[u8]) -> bool { self.as_bytes().starts_with(s) }
-
-    fn is_empty_(&self) -> bool { self.as_bytes().is_empty() }
-
-    fn contains_byte(&self, byte: u8) -> bool {
-        for b in self.as_bytes() {
-            if b == &byte {
-                return true;
-            }
-        }
-        false
-    }
-
-    fn split_at_byte(&self, byte: u8) -> (&OsStr, &OsStr) {
-        for (i, b) in self.as_bytes().iter().enumerate() {
-            if b == &byte {
-                return (OsStr::from_bytes(&self.as_bytes()[..i]),
-                        OsStr::from_bytes(&self.as_bytes()[i + 1..]));
-            }
-        }
-        (&*self, OsStr::from_bytes(&self.as_bytes()[self.len_()..self.len_()]))
-    }
-
-    fn trim_left_matches(&self, byte: u8) -> &OsStr {
-        for (i, b) in self.as_bytes().iter().enumerate() {
-            if b != &byte {
-                return OsStr::from_bytes(&self.as_bytes()[i..]);
-            }
-        }
-        &*self
-    }
-
-    fn split_at(&self, i: usize) -> (&OsStr, &OsStr) {
-        (OsStr::from_bytes(&self.as_bytes()[..i]), OsStr::from_bytes(&self.as_bytes()[i..]))
-    }
-
-    fn len_(&self) -> usize { self.as_bytes().len() }
-
-    fn split(&self, b: u8) -> OsSplit {
-        OsSplit {
-            sep: b,
-            val: self.as_bytes(),
-            pos: 0,
-        }
-    }
-}
-
-#[doc(hidden)]
-#[derive(Clone, Debug)]
-pub struct OsSplit<'a> {
-    sep: u8,
-    val: &'a [u8],
-    pos: usize,
-}
-
-impl<'a> Iterator for OsSplit<'a> {
-    type Item = &'a OsStr;
-
-    fn next(&mut self) -> Option<&'a OsStr> {
-        debugln!("OsSplit::next: self={:?}", self);
-        if self.pos == self.val.len() {
-            return None;
-        }
-        let start = self.pos;
-        for b in &self.val[start..] {
-            self.pos += 1;
-            if *b == self.sep {
-                return Some(OsStr::from_bytes(&self.val[start..self.pos - 1]));
-            }
-        }
-        Some(OsStr::from_bytes(&self.val[start..]))
-    }
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        let mut count = 0;
-        for b in &self.val[self.pos..] {
-            if *b == self.sep {
-                count += 1;
-            }
-        }
-        if count > 0 {
-            return (count, Some(count));
-        }
-        (0, None)
-    }
-}
-
-impl<'a> DoubleEndedIterator for OsSplit<'a> {
-    fn next_back(&mut self) -> Option<&'a OsStr> {
-        if self.pos == 0 {
-            return None;
-        }
-        let start = self.pos;
-        for b in self.val[..self.pos].iter().rev() {
-            self.pos -= 1;
-            if *b == self.sep {
-                return Some(OsStr::from_bytes(&self.val[self.pos + 1..start]));
-            }
-        }
-        Some(OsStr::from_bytes(&self.val[..start]))
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/strext.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-pub trait _StrExt {
-    fn _is_char_boundary(&self, index: usize) -> bool;
-}
-
-impl _StrExt for str {
-    #[inline]
-    fn _is_char_boundary(&self, index: usize) -> bool {
-        if index == self.len() {
-            return true;
-        }
-        match self.as_bytes().get(index) {
-            None => false,
-            Some(&b) => b < 128 || b >= 192,
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/suggestions.rs
+++ /dev/null
@@ -1,115 +0,0 @@
-use app::App;
-// Third Party
-#[cfg(feature = "suggestions")]
-use strsim;
-
-// Internal
-use fmt::Format;
-
-/// Produces a string from a given list of possible values which is similar to
-/// the passed in value `v` with a certain confidence.
-/// Thus in a list of possible values like ["foo", "bar"], the value "fop" will yield
-/// `Some("foo")`, whereas "blark" would yield `None`.
-#[cfg(feature = "suggestions")]
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean<'a, T: ?Sized, I>(v: &str, possible_values: I) -> Option<&'a str>
-    where T: AsRef<str> + 'a,
-          I: IntoIterator<Item = &'a T>
-{
-
-    let mut candidate: Option<(f64, &str)> = None;
-    for pv in possible_values {
-        let confidence = strsim::jaro_winkler(v, pv.as_ref());
-        if confidence > 0.8 &&
-           (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence)) {
-            candidate = Some((confidence, pv.as_ref()));
-        }
-    }
-    match candidate {
-        None => None,
-        Some((_, candidate)) => Some(candidate),
-    }
-}
-
-#[cfg(not(feature = "suggestions"))]
-pub fn did_you_mean<'a, T: ?Sized, I>(_: &str, _: I) -> Option<&'a str>
-    where T: AsRef<str> + 'a,
-          I: IntoIterator<Item = &'a T>
-{
-    None
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean_flag_suffix<'z, T, I>(arg: &str, longs: I, subcommands: &'z [App])
-                                     -> (String, Option<&'z str>)
-    where T: AsRef<str> + 'z,
-          I: IntoIterator<Item = &'z T>
-{
-    match did_you_mean(arg, longs) {
-        Some(candidate) => {
-            let suffix = format!("\n\tDid you mean {}{}?", Format::Good("--"), Format::Good(candidate));
-            return (suffix, Some(candidate))
-        }
-        None => {
-            for subcommand in subcommands {
-                let opts = subcommand.p.flags.iter().filter_map(|f| f.s.long).chain(
-                    subcommand.p.opts.iter().filter_map(|o| o.s.long));
-
-                if let Some(candidate) = did_you_mean(arg, opts) {
-                    let suffix = format!(
-                        "\n\tDid you mean to put '--{}' after the subcommand '{}'?",
-                        Format::Good(arg),
-                        Format::Good(candidate));
-                    return (suffix, Some(candidate));
-                }
-            }
-        }
-    }
-    return (String::new(), None)
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-pub fn did_you_mean_value_suffix<'z, T, I>(arg: &str, values: I) -> (String, Option<&'z str>)
-    where T: AsRef<str> + 'z,
-          I: IntoIterator<Item = &'z T>
-{
-    match did_you_mean(arg, values) {
-        Some(candidate) => {
-            let suffix = format!("\n\tDid you mean '{}'?", Format::Good(candidate));
-            (suffix, Some(candidate))
-        }
-        None => (String::new(), None),
-    }
-}
-
-#[cfg(all(test, features = "suggestions"))]
-mod test {
-    use super::*;
-
-    #[test]
-    fn possible_values_match() {
-        let p_vals = ["test", "possible", "values"];
-        assert_eq!(did_you_mean("tst", p_vals.iter()), Some("test"));
-    }
-
-    #[test]
-    fn possible_values_nomatch() {
-        let p_vals = ["test", "possible", "values"];
-        assert!(did_you_mean("hahaahahah", p_vals.iter()).is_none());
-    }
-
-    #[test]
-    fn suffix_long() {
-        let p_vals = ["test", "possible", "values"];
-        let suffix = "\n\tDid you mean \'--test\'?";
-        assert_eq!(did_you_mean_flag_suffix("tst", p_vals.iter(), []), (suffix, Some("test")));
-    }
-
-    #[test]
-    fn suffix_enum() {
-        let p_vals = ["test", "possible", "values"];
-        let suffix = "\n\tDid you mean \'test\'?";
-        assert_eq!(did_you_mean_value_suffix("tst", p_vals.iter()), (suffix, Some("test")));
-    }
-}
deleted file mode 100644
--- a/third_party/rust/clap-2.25.0/src/usage_parser.rs
+++ /dev/null
@@ -1,1199 +0,0 @@
-// Third Party
-use vec_map::VecMap;
-
-// Internal
-use INTERNAL_ERROR_MSG;
-use args::Arg;
-use args::settings::ArgSettings;
-
-#[derive(PartialEq, Debug)]
-enum UsageToken {
-    Name,
-    ValName,
-    Short,
-    Long,
-    Help,
-    Multiple,
-    Unknown,
-}
-
-#[doc(hidden)]
-#[derive(Debug)]
-pub struct UsageParser<'a> {
-    usage: &'a str,
-    pos: usize,
-    start: usize,
-    prev: UsageToken,
-    explicit_name_set: bool,
-}
-
-impl<'a> UsageParser<'a> {
-    fn new(usage: &'a str) -> Self {
-        debugln!("UsageParser::new: usage={:?}", usage);
-        UsageParser {
-            usage: usage,
-            pos: 0,
-            start: 0,
-            prev: UsageToken::Unknown,
-            explicit_name_set: false,
-        }
-    }
-
-    pub fn from_usage(usage: &'a str) -> Self {
-        debugln!("UsageParser::from_usage;");
-        UsageParser::new(usage)
-    }
-
-    pub fn parse(mut self) -> Arg<'a, 'a> {
-        debugln!("UsageParser::parse;");
-        let mut arg = Arg::default();
-        loop {
-            debugln!("UsageParser::parse:iter: pos={};", self.pos);
-            self.stop_at(token);
-            if let Some(&c) = self.usage.as_bytes().get(self.pos) {
-                match c {
-                    b'-' => self.short_or_long(&mut arg),
-                    b'.' => self.multiple(&mut arg),
-                    b'\'' => self.help(&mut arg),
-                    _ => self.name(&mut arg),
-                }
-            } else {
-                break;
-            }
-        }
-        debug_assert!(!arg.b.name.is_empty(),
-                      format!("No name found for Arg when parsing usage string: {}",
-                              self.usage));
-        arg.v.num_vals = match arg.v.val_names {
-            Some(ref v) if v.len() >= 2 => Some(v.len() as u64),
-            _ => None,
-        };
-        debugln!("UsageParser::parse: vals...{:?}", arg.v.val_names);
-        arg
-    }
-
-    fn name(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::name;");
-        if *self.usage.as_bytes().get(self.pos).expect(INTERNAL_ERROR_MSG) == b'<' &&
-           !self.explicit_name_set {
-            arg.setb(ArgSettings::Required);
-        }
-        self.pos += 1;
-        self.stop_at(name_end);
-        let name = &self.usage[self.start..self.pos];
-        if self.prev == UsageToken::Unknown {
-            debugln!("UsageParser::name: setting name...{}", name);
-            arg.b.name = name;
-            if arg.s.long.is_none() && arg.s.short.is_none() {
-                debugln!("UsageParser::name: explicit name set...");
-                self.explicit_name_set = true;
-                self.prev = UsageToken::Name;
-            }
-        } else {
-            debugln!("UsageParser::name: setting val name...{}", name);
-            if let Some(ref mut v) = arg.v.val_names {
-                let len = v.len();
-                v.insert(len, name);
-            } else {
-                let mut v = VecMap::new();
-                v.insert(0, name);
-                arg.v.val_names = Some(v);
-                arg.setb(ArgSettings::TakesValue);
-            }
-            self.prev = UsageToken::ValName;
-        }
-    }
-
-    fn stop_at<F>(&mut self, f: F)
-        where F: Fn(u8) -> bool
-    {
-        debugln!("UsageParser::stop_at;");
-        self.start = self.pos;
-        self.pos += self.usage[self.start..].bytes().take_while(|&b| f(b)).count();
-    }
-
-    fn short_or_long(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::short_or_long;");
-        self.pos += 1;
-        if *self.usage.as_bytes().get(self.pos).expect(INTERNAL_ERROR_MSG) == b'-' {
-            self.pos += 1;
-            self.long(arg);
-            return;
-        }
-        self.short(arg)
-    }
-
-    fn long(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::long;");
-        self.stop_at(long_end);
-        let name = &self.usage[self.start..self.pos];
-        if !self.explicit_name_set {
-            debugln!("UsageParser::long: setting name...{}", name);
-            arg.b.name = name;
-        }
-        debugln!("UsageParser::long: setting long...{}", name);
-        arg.s.long = Some(name);
-        self.prev = UsageToken::Long;
-    }
-
-    fn short(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::short;");
-        let start = &self.usage[self.pos..];
-        let short = start.chars().nth(0).expect(INTERNAL_ERROR_MSG);
-        debugln!("UsageParser::short: setting short...{}", short);
-        arg.s.short = Some(short);
-        if arg.b.name.is_empty() {
-            // --long takes precedence but doesn't set self.explicit_name_set
-            let name = &start[..short.len_utf8()];
-            debugln!("UsageParser::short: setting name...{}", name);
-            arg.b.name = name;
-        }
-        self.prev = UsageToken::Short;
-    }
-
-    // "something..."
-    fn multiple(&mut self, arg: &mut Arg) {
-        debugln!("UsageParser::multiple;");
-        let mut dot_counter = 1;
-        let start = self.pos;
-        let mut bytes = self.usage[start..].bytes();
-        while bytes.next() == Some(b'.') {
-            dot_counter += 1;
-            self.pos += 1;
-            if dot_counter == 3 {
-                debugln!("UsageParser::multiple: setting multiple");
-                arg.setb(ArgSettings::Multiple);
-                if arg.is_set(ArgSettings::TakesValue) {
-                    arg.setb(ArgSettings::UseValueDelimiter);
-                    arg.unsetb(ArgSettings::ValueDelimiterNotSet);
-                    if arg.v.val_delim.is_none() {
-                        arg.v.val_delim = Some(',');
-                    }
-                }
-                self.prev = UsageToken::Multiple;
-                self.pos += 1;
-                break;
-            }
-        }
-    }
-
-    fn help(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::help;");
-        self.stop_at(help_start);
-        self.start = self.pos + 1;
-        self.pos = self.usage.len() - 1;
-        debugln!("UsageParser::help: setting help...{}", &self.usage[self.start..self.pos]);
-        arg.b.help = Some(&self.usage[self.start..self.pos]);
-        self.pos += 1;   // Move to next byte to keep from thinking ending ' is a start
-        self.prev = UsageToken::Help;
-    }
-}
-
-#[inline]
-fn name_end(b: u8) -> bool { b != b']' && b != b'>' }
-
-#[inline]
-fn token(b: u8) -> bool { b != b'\'' && b != b'.' && b != b'<' && b != b'[' && b != b'-' }
-
-#[inline]
-fn long_end(b: u8) -> bool {
-    b != b'\'' && b != b'.' && b != b'<' && b != b'[' && b != b'=' && b != b' '
-}
-
-#[inline]
-fn help_start(b: u8) -> bool { b != b'\'' }
-
-#[cfg(test)]
-mod test {
-    use args::Arg;
-    use args::ArgSettings;
-
-    #[test]
-    fn create_flag_usage() {
-        let a = Arg::from_usage("[flag] -f 'some help info'");
-        assert_eq!(a.b.name, "flag");
-        assert_eq!(a.s.short.unwrap(), 'f');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let b = Arg::from_usage("[flag] --flag 'some help info'");
-        assert_eq!(b.b.name, "flag");
-        assert_eq!(b.s.long.unwrap(), "flag");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let b = Arg::from_usage("--flag 'some help info'");
-        assert_eq!(b.b.name, "flag");
-        assert_eq!(b.s.long.unwrap(), "flag");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-
-        let c = Arg::from_usage("[flag] -f --flag 'some help info'");
-        assert_eq!(c.b.name, "flag");
-        assert_eq!(c.s.short.unwrap(), 'f');
-        assert_eq!(c.s.long.unwrap(), "flag");
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-
-        let d = Arg::from_usage("[flag] -f... 'some help info'");
-        assert_eq!(d.b.name, "flag");
-        assert_eq!(d.s.short.unwrap(), 'f');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.v.val_names.is_none());
-        assert!(d.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flag] -f --flag... 'some help info'");
-        assert_eq!(e.b.name, "flag");
-        assert_eq!(e.s.long.unwrap(), "flag");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert_eq!(e.b.help.unwrap(), "some help info");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f --flag... 'some help info'");
-        assert_eq!(e.b.name, "flag");
-        assert_eq!(e.s.long.unwrap(), "flag");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert_eq!(e.b.help.unwrap(), "some help info");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("--flags");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.long.unwrap(), "flags");
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("--flags...");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.long.unwrap(), "flags");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flags] -f");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flags] -f...");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let a = Arg::from_usage("-f 'some help info'");
-        assert_eq!(a.b.name, "f");
-        assert_eq!(a.s.short.unwrap(), 'f');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f");
-        assert_eq!(e.b.name, "f");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f...");
-        assert_eq!(e.b.name, "f");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage0() {
-        // Short only
-        let a = Arg::from_usage("[option] -o [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage1() {
-        let b = Arg::from_usage("-o [opt] 'some help info'");
-        assert_eq!(b.b.name, "o");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert!(b.s.long.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage2() {
-        let c = Arg::from_usage("<option> -o <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage3() {
-        let d = Arg::from_usage("-o <opt> 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage4() {
-        let a = Arg::from_usage("[option] -o [opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage5() {
-        let a = Arg::from_usage("[option]... -o [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage6() {
-        let b = Arg::from_usage("-o [opt]... 'some help info'");
-        assert_eq!(b.b.name, "o");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert!(b.s.long.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage7() {
-        let c = Arg::from_usage("<option> -o <opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage8() {
-        let c = Arg::from_usage("<option>... -o <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage9() {
-        let d = Arg::from_usage("-o <opt>... 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long1() {
-        let a = Arg::from_usage("[option] --opt [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long2() {
-        let b = Arg::from_usage("--opt [option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long3() {
-        let c = Arg::from_usage("<option> --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long4() {
-        let d = Arg::from_usage("--opt <option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long5() {
-        let a = Arg::from_usage("[option] --opt [opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long6() {
-        let a = Arg::from_usage("[option]... --opt [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long7() {
-        let b = Arg::from_usage("--opt [option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long8() {
-        let c = Arg::from_usage("<option> --opt <opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long9() {
-        let c = Arg::from_usage("<option>... --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long10() {
-        let d = Arg::from_usage("--opt <option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals1() {
-        let a = Arg::from_usage("[option] --opt=[opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals2() {
-        let b = Arg::from_usage("--opt=[option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals3() {
-        let c = Arg::from_usage("<option> --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals4() {
-        let d = Arg::from_usage("--opt=<option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals5() {
-        let a = Arg::from_usage("[option] --opt=[opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals6() {
-        let a = Arg::from_usage("[option]... --opt=[opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals7() {
-        let b = Arg::from_usage("--opt=[option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals8() {
-        let c = Arg::from_usage("<option> --opt=<opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals9() {
-        let c = Arg::from_usage("<option>... --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals10() {
-        let d = Arg::from_usage("--opt=<option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both1() {
-        let a = Arg::from_usage("[option] -o --opt [option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both2() {
-        let b = Arg::from_usage("-o --opt [option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both3() {
-        let c = Arg::from_usage("<option> -o --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both4() {
-        let d = Arg::from_usage("-o --opt <option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both5() {
-        let a = Arg::from_usage("[option]... -o --opt [option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both6() {
-        let b = Arg::from_usage("-o --opt [option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both7() {
-        let c = Arg::from_usage("<option>... -o --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both8() {
-        let d = Arg::from_usage("-o --opt <option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals1() {
-        let a = Arg::from_usage("[option] -o --opt=[option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals2() {
-        let b = Arg::from_usage("-o --opt=[option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals3() {
-        let c = Arg::from_usage("<option> -o --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals4() {
-        let d = Arg::from_usage("-o --opt=<option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals5() {
-        let a = Arg::from_usage("[option]... -o --opt=[option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals6() {
-        let b = Arg::from_usage("-o --opt=[option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals7() {
-        let c = Arg::from_usage("<option>... -o --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals8() {
-        let d = Arg::from_usage("-o --opt=<option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_with_vals1() {
-        let d = Arg::from_usage("-o <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert!(d.s.long.is_none());
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals2() {
-        let d = Arg::from_usage("-o <file> <mode>... 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert!(d.s.long.is_none());
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals3() {
-        let d = Arg::from_usage("--opt <file> <mode>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals4() {
-        let d = Arg::from_usage("[myopt] --opt <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "myopt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(!d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals5() {
-        let d = Arg::from_usage("--opt <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_positional_usage() {
-        let a = Arg::from_usage("[pos] 'some help info'");
-        assert_eq!(a.b.name, "pos");
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_positional_usage0() {
-        let b = Arg::from_usage("<pos> 'some help info'");
-        assert_eq!(b.b.name, "pos");
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::Required));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_mult_help() {
-        let c = Arg::from_usage("[pos]... 'some help info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_lit_single_quote() {
-        let c = Arg::from_usage("[pos]... 'some help\' info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help' info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_double_lit_single_quote() {
-        let c = Arg::from_usage("[pos]... 'some \'help\' info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some 'help' info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_newline() {
-        let c = Arg::from_usage("[pos]... 'some help{n}\
-                                           info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help{n}info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_newline_lit_sq() {
-        let c = Arg::from_usage("[pos]... 'some help\' stuff{n}\
-                                           info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help' stuff{n}info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_req_mult_help() {
-        let d = Arg::from_usage("<pos>... 'some help info'");
-        assert_eq!(d.b.name, "pos");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::Required));
-        assert!(d.v.val_names.is_none());
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_req() {
-        let b = Arg::from_usage("<pos>");
-        assert_eq!(b.b.name, "pos");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::Required));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_mult() {
-        let c = Arg::from_usage("[pos]...");
-        assert_eq!(c.b.name, "pos");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn nonascii() {
-        let a = Arg::from_usage("<ASCII> 'üñíčöĐ€'");
-        assert_eq!(a.b.name, "ASCII");
-        assert_eq!(a.b.help, Some("üñíčöĐ€"));
-        let a = Arg::from_usage("<üñíčöĐ€> 'ASCII'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.b.help, Some("ASCII"));
-        let a = Arg::from_usage("<üñíčöĐ€> 'üñíčöĐ€'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.b.help, Some("üñíčöĐ€"));
-        let a = Arg::from_usage("-ø 'ø'");
-        assert_eq!(a.b.name, "ø");
-        assert_eq!(a.s.short, Some('ø'));
-        assert_eq!(a.b.help, Some("ø"));
-        let a = Arg::from_usage("--üñíčöĐ€ 'Nōṫ ASCII'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.s.long, Some("üñíčöĐ€"));
-        assert_eq!(a.b.help, Some("Nōṫ ASCII"));
-        let a = Arg::from_usage("[ñämê] --ôpt=[üñíčöĐ€] 'hælp'");
-        assert_eq!(a.b.name, "ñämê");
-        assert_eq!(a.s.long, Some("ôpt"));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"üñíčöĐ€"]);
-        assert_eq!(a.b.help, Some("hælp"));
-    }
-}
--- a/third_party/rust/clap/.cargo-checksum.json
+++ b/third_party/rust/clap/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".appveyor.yml":"38fb7e583271029caad727c9123a2b2679b7c59971de418f16dc5136dbebaeb5",".clog.toml":"f691701bd51b5f311931d0d8f05fa3d78c00dda8d60f3313e21011309c736ff1",".github/CONTRIBUTING.md":"f7eff737f3aa25294802fefb233e3758a64b248781dbbf3262532d693f340a87",".github/ISSUE_TEMPLATE.md":"181a07050efec74e52bb3890585eb02dc77259ac6396ff33fe0869208fa86cee",".mention-bot":"51790ab49f43ed86a4a7c3d2e468aa5fa526ca5e2ac6af20432a2cb5b2fdbe84",".travis.yml":"939aa491f28ece97d9a98e781ae8e76c484592742317390bb1de92224bf0678a","CHANGELOG.md":"9487316c1d190fa572f2779979c99395c687dd0495f4657ffb460e1a2a6c5019","CONTRIBUTORS.md":"6890277f02e66ec77120d3335240ac677abd126db5f7a9d9168f47f5cb4df977","Cargo.toml":"25cb059a452c73a7177ab54d9edf7c0dfcb1489e8013a3efd522e9b2fdfef05e","LICENSE-MIT":"6725d1437fc6c77301f2ff0e7d52914cf4f9509213e1078dc77d9356dbe6eac5","README.md":"57e3b95a81faf3503cc8ba14f8b30f725172551507846b6a6e0f9eb1f1ba2b2a","SPONSORS.md":"097c6b7a80feba1e1b9170fa641a2d7d1868e6115fce73a90ab26448ba36f843","clap-test.rs":"995a9d41ef372a814616113f4a58c1e580043678e54527afc2ebee7e8e1d3ef5","index.html":"36f9ce4465266f3af9a259444b01c4239200473cabfc848f789f75b322a3ea8f","justfile":"811b2dec57aec46e570aeeb9945018cf87fe65f6d5b27cdb9ffca79d906910f6","rustfmt.toml":"8fd2d63119df515fd5f44e530c709b19d66b09fbc2e22a640bf4b64c57e7d6b3","src/app/help.rs":"6bf52a4b213ae6b1e53d206bd63816961608284c1c0cbb6cebe9cc1dcf0dc463","src/app/macros.rs":"77764555c2831180f4e976d5bcd95f3da4fdb609d77ae84c94f4ce602afd0c9b","src/app/meta.rs":"a56d28bb466a8ba68155b3f2883e85228b4b74cf25658f62fc050e07cff2dc85","src/app/mod.rs":"672b7472eb674dd0e875dddb6916f7f63c49873ad6d5afcb46f054b9161fc3a4","src/app/parser.rs":"dd87e6e5b22ec761d0228de66f6d929b68a06a692099cb86feabba1924506e4d","src/app/settings.rs":"e6e73720774d7040efa0c155267e996ad9a1d1d4626bb568f3b902edc8913344","src/app/usage.rs":"703cec975c53e7f01b14b4593de41c518910ab347bc4c54efe79367a704ffc4c","src/app/validator.rs":"0e8d58ce7f22482897a48c8b34d52540274ece40f974226fcca6078cc896ae02","src/args/any_arg.rs":"2960506a31a884a9b3142fea532afa0a01f7de8d14ba2a6347eb5cd5b2fdd98b","src/args/arg.rs":"e10c790b12aea012a52edec6c5e8afe27925ae4b936f83352830a40ef1f4c93d","src/args/arg_builder/base.rs":"8b99a9ab811df3e0bdcfba8c0994042b0bcd06d8ddf794ab559baaf9a490ba59","src/args/arg_builder/flag.rs":"fd6eef19c4de7ded217e86224de472147d4f4c5813607bc0fa67462c5d347b7a","src/args/arg_builder/mod.rs":"7a32c8fd85b48f7b60e5f2c13dc70fa9100aa65cd933ba419300d28d682bf722","src/args/arg_builder/option.rs":"e73031991e561ea7e61574f719207034df0fa3acdd28735502d8511f00d7adbf","src/args/arg_builder/positional.rs":"897df6cda52b67728103c7b2c0750f91326880b751204f4ab15852b18be0d929","src/args/arg_builder/switched.rs":"61f5121b0ec746461215a47e1b7a4d699a37a3f181172820e0615f68d5f6f0ef","src/args/arg_builder/valued.rs":"20998bf790a58206b27cf8b09f6740812d507336042a2026f203f99af4500ed5","src/args/arg_matcher.rs":"ff2b23b43fb5d61727410ab156844b90f898279e08b4aa56f244ad7ced12d03f","src/args/arg_matches.rs":"2342be87d96e3b7437d711a3550e8bf83a524a52b3cd1a34e91de02f16e01fa6","src/args/group.rs":"7fe5e2f0dd24faf1765410a9336d85976875e964d7f246e1fa216c4808d88dde","src/args/macros.rs":"57f248e2694f9413cbbaf9087813ed4f27064f5f8e29eaf4ec41ec2b274ae806","src/args/matched_arg.rs":"1ed8d338869ecc3b5fa426ef4cf42f4c9c3b1dd538cdea1fe0489169345536f7","src/args/mod.rs":"c155cd989fa4ca1f8de6a79115afbf5086f092adcb854ff9698b9100f45fc323","src/args/settings.rs":"2753ff50046def9ccb7f601b3d9f565348da1ef0253af24ccee94616a2e5c470","src/args/subcommand.rs":"e1ad9638c33785f1301675de1795b0a4f4b079452aa11f7526d263c2a1179432","src/completions/bash.rs":"116c6830ee2b6310f299a69924f5b1e39b05ebec2b5f7b0ffe3b6938b7fa5514","src/completions/fish.rs":"65782afc62724e068efcb1c85b193f7963891def2ff5cd6e5200ebdb67003bb5","src/completions/macros.rs":"ebad5037e6e63401b1a54498e09d3bd93d1a3a06f045c2990902d47eb9a73774","src/completions/mod.rs":"5d4a734df6a21e6c1e0831a2f7be50a45d2e7bdaf7475589ea78b978643229cd","src/completions/powershell.rs":"866409e5d0a9b2551d739f86c0e4faf86911e9e7c656fb74b38e6960844233b5","src/completions/shell.rs":"c7995ca229fd0d8671761da0aca0513c4f740165f02d06cd97aa0ae881c22cd4","src/completions/zsh.rs":"e98cc3676c0bfa67f0816947b932c92a14cbcf13b45656cf2f8683f9ab05fbca","src/errors.rs":"3c46a4d79d9304ffb152a190528ec9db0cb6c05799bb5211e6df9f7d7abab814","src/fmt.rs":"f205f784268572544ff7e84a89f416c898255404275d4ab1f8fea7e89695daa9","src/lib.rs":"804d8a9c384122e54cc230327810bde108660e61238c2b889d5bbbbcc2f19c75","src/macros.rs":"a65e1349b12ff164578b5c106c73eb646c86b8be04ec4964fa6da511b3135d76","src/map.rs":"67ac4802ed485359c78a1747c832666095b5ee05d68c686d110bd2e4aa9f06e2","src/osstringext.rs":"a87a5a0685dd8310f6329d5f8e8f54c0fac68eb75595a835aeb1c36208efd5f9","src/strext.rs":"d4418d396069e9c05804f92c042ba7192a4244e46059e2edc98670b45cd2daee","src/suggestions.rs":"1f348d393c0c85e622ca97253fd3f25fed9c2c660996d6ca5ac7e3abfd99783b","src/usage_parser.rs":"cc23ff4156d5bebc8a1bebc45edcf337947d8d217461b052271777e0bf31fa51"},"package":"1b8c532887f1a292d17de05ae858a8fe50a301e196f9ef0ddb7ccd0d1d00f180"}
\ No newline at end of file
+{"files":{".appveyor.yml":"38fb7e583271029caad727c9123a2b2679b7c59971de418f16dc5136dbebaeb5",".clog.toml":"f691701bd51b5f311931d0d8f05fa3d78c00dda8d60f3313e21011309c736ff1",".github/CONTRIBUTING.md":"ae52844fd9544b18f4f4689826620a68acfe15ea9729fff2987a065d482339eb",".github/ISSUE_TEMPLATE.md":"181a07050efec74e52bb3890585eb02dc77259ac6396ff33fe0869208fa86cee",".mention-bot":"51790ab49f43ed86a4a7c3d2e468aa5fa526ca5e2ac6af20432a2cb5b2fdbe84",".travis.yml":"e1a3ffda7330c7123e2abde736ec9ce5e80cb8e8caf07608320e2f55418ab8c5","CHANGELOG.md":"59838b10450321e0928463f9bba9fcf27c036716abcce741ea560debd61526eb","CONTRIBUTORS.md":"73ff2f39d730fb481c48bef5dd172ed44aa42c6724c2d8ade88c5d661a29cb08","Cargo.toml":"41dbae832e00da4478f456620c582616346c353e2c796310a1be0e570746dd9b","LICENSE-MIT":"6725d1437fc6c77301f2ff0e7d52914cf4f9509213e1078dc77d9356dbe6eac5","README.md":"094f06b05cf519473296e1cc2606bfc13b81d1ea57583277c329fe87cdde9f51","SPONSORS.md":"097c6b7a80feba1e1b9170fa641a2d7d1868e6115fce73a90ab26448ba36f843","clap-test.rs":"995a9d41ef372a814616113f4a58c1e580043678e54527afc2ebee7e8e1d3ef5","index.html":"36f9ce4465266f3af9a259444b01c4239200473cabfc848f789f75b322a3ea8f","justfile":"811b2dec57aec46e570aeeb9945018cf87fe65f6d5b27cdb9ffca79d906910f6","rustfmt.toml":"8fd2d63119df515fd5f44e530c709b19d66b09fbc2e22a640bf4b64c57e7d6b3","src/app/help.rs":"6d712557a40475c41a162f66641c2a49e4f351c67084bda7b5d5f47b68521702","src/app/macros.rs":"dea724f1ec30e4e4a60cd4af4a11a6ca38d8723ba8167925a2efa83f1dbec64a","src/app/meta.rs":"86f2f871e3d867fd190a8103429b640b77e0caeabb03ad78e7a92f929eeb5582","src/app/mod.rs":"e293e9fed44b57f355cc9926c30d59e1980337306b76288afc401b2d140f0495","src/app/parser.rs":"a9c2465c2bc80e527e699e51a538192bdbf0b08dda1d7156d92f156e86db4016","src/app/settings.rs":"3c7f64be5ee8b8e8bb9f8eef2ed2568fda3a9e34b297ef193ee9da246860ae08","src/app/usage.rs":"b96e80083ea7e6b761b2c018e595400568289d89da59be54adbfaedd6eae5ab7","src/app/validator.rs":"e0a389815aca17ca384d26994d88af417c97b7137fa19086f58b2f949c82ca27","src/args/any_arg.rs":"2960506a31a884a9b3142fea532afa0a01f7de8d14ba2a6347eb5cd5b2fdd98b","src/args/arg.rs":"128d9007a8993ce32164b0673729ee05951b17082acfbe24321921292c2a54da","src/args/arg_builder/base.rs":"49591af68854d3120a20f9f76522f375b3e0ca353abbf7dbe1c142b844e7c29e","src/args/arg_builder/flag.rs":"fd6eef19c4de7ded217e86224de472147d4f4c5813607bc0fa67462c5d347b7a","src/args/arg_builder/mod.rs":"7a32c8fd85b48f7b60e5f2c13dc70fa9100aa65cd933ba419300d28d682bf722","src/args/arg_builder/option.rs":"e73031991e561ea7e61574f719207034df0fa3acdd28735502d8511f00d7adbf","src/args/arg_builder/positional.rs":"897df6cda52b67728103c7b2c0750f91326880b751204f4ab15852b18be0d929","src/args/arg_builder/switched.rs":"832ef0284a0ceb2da6d03a98f864526a255bf7debfceec47a0018cf78f209dc3","src/args/arg_builder/valued.rs":"20998bf790a58206b27cf8b09f6740812d507336042a2026f203f99af4500ed5","src/args/arg_matcher.rs":"52e749e3ffbd2abd62f848c9b5f09bc80a4e9150bb5baec48183d47ca0160989","src/args/arg_matches.rs":"0defd001300d55cbecea0ee88fbff6aa067bb80ffb3aac5f77fe44d7a4101539","src/args/group.rs":"27ce8153a0f9ec44636936ec9a2f7d01d5cbc53b1bf3a395d3cdfcd4ad5b7ce2","src/args/macros.rs":"57f248e2694f9413cbbaf9087813ed4f27064f5f8e29eaf4ec41ec2b274ae806","src/args/matched_arg.rs":"f4867244d0eff6b5d06a7a024d923e452e66c8da8240b452a9c07e23eceedbbc","src/args/mod.rs":"21d7ddc2ef26f4c6e3b9434a63450235e99cf7143f9d59c447d5ed0fa26cb5d1","src/args/settings.rs":"da4c29263ab99d5a9966f31643783bd7b7d2df18d8c4f07c37781aabc5c9a414","src/args/subcommand.rs":"40d3178fb6f0e9d3dc99959bd45ebe4655f64e7e18145ff7a5e9632ac36b8006","src/completions/bash.rs":"353699a488f76cec20c0274cad67f78e75e07f227944ffc41a9032a202886e1c","src/completions/fish.rs":"7c37ac0e6f822a7f349f3a3bc6cfdf48f1f0dc8218991832f85811dda9fc3feb","src/completions/macros.rs":"6fed51ae20ed545f2306fab82d4fb7656ef285ccc439284a74cbabd0a6cb88ec","src/completions/mod.rs":"89dcd675fc57b74c61e22fe378d2fd44dfaf1f6878fb7206bb94320434f764d2","src/completions/powershell.rs":"db6115e5477629d6df15afe0e98f53a96dd3bb77961652b52ce8a844dd570aba","src/completions/shell.rs":"f147b7348fe04aab218a5b84a476c8d791c9c74ebb4184e9259b071fb8d6ed81","src/completions/zsh.rs":"bd2778fad58de76104549b910b62609971a953e33f6aa0d58d803e588fb4319e","src/errors.rs":"79f099c4c607c05ed46844a86569db2b7dce96aaf4f2ef576e3a455cfe16a47e","src/fmt.rs":"7afbd78efba9936a1c776e86c65207b8bdff7bdb2d62b5d042b39f477b843bd1","src/lib.rs":"753bf20124032e3e9b40350e51b19ca957e8fc6056ff59253048b5b52664544d","src/macros.rs":"b3cfd0e12fd41d32519c9b86f3e17c5062b681d2bc3bb3fb4779a3c958252756","src/map.rs":"10c57678b453673aa2d78f72de2d44510271eb2f9771a8d203952353581318a8","src/osstringext.rs":"edfbd9b64574492be65db1d95319ae3a1335cfa17764fa30d9726af7a4873e73","src/strext.rs":"d4418d396069e9c05804f92c042ba7192a4244e46059e2edc98670b45cd2daee","src/suggestions.rs":"aaf08a30ab8594f415ee0a376596f668c5e2ba4ee6ab3c312239f4cbad6d5930","src/usage_parser.rs":"5dda6ef41b4c3773ab461ac7150fbdcc58ecbda7751723a0848fcb95a4312cb2"},"package":"110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"}
\ No newline at end of file
--- a/third_party/rust/clap/.github/CONTRIBUTING.md
+++ b/third_party/rust/clap/.github/CONTRIBUTING.md
@@ -1,26 +1,72 @@
 # How to Contribute
 
-Contributions are always welcome! Please use the following guidelines when contributing to `clap`
+Contributions are always welcome! And there is a multitude of ways in which you can help depending on what you like to do, or are good at. Anything from documentation, code cleanup, issue completion, new features, you name it, even filing issues is contributing and greatly appreciated!
+
+Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
+
+### Testing Code
+
+To test with all features both enabled and disabled, you can run these commands:
+
+```sh
+$ cargo test --no-default-features
+$ cargo test --features "yaml unstable"
+```
+
+Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the prebuilt recipes. *Not* using `just` is perfectly fine as well, it simply bundles commands automatically.
 
-## Goals
+For example, to test the code, as above simply run:
+
+```sh
+$ just run-tests
+```
 
-There are a few goals of `clap` that I'd like to maintain throughout contributions.
+From here on, I will list the appropriate `cargo` command as well as the `just` command.
+
+Sometimes it's helpful to only run a subset of the tests, which can be done via:
+
+```sh
+$ cargo test --test <test_name>
+
+# Or
 
-* Remain backwards compatible when possible
-  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
-  - This does not apply for security concerns
-  - `clap` officially supports the current stable version of Rust, minus two releases (i.e. if 1.13.0 is current, `clap` must support 1.11.0 and beyond)
-* Parse arguments quickly
-  - Parsing of arguments shouldn't slow down usage of the main program
-  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
-* Try to be cognizant of memory usage
-  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
-* `panic!` on *developer* error, exit gracefully on *end-user* error
+$ just run-test <test_name>
+```
+
+### Linting Code
+
+During the CI process `clap` runs against many different lints using [`clippy`](https://github.com/Manishearth/rust-clippy). In order to check if these lints pass on your own computer prior to submitting a PR you'll need a nightly compiler.
+
+In order to check the code for lints run either:
+
+```sh
+$ rustup override add nightly
+$ cargo build --features lints
+$ rustup override remove
+
+# Or
+
+$ just lint
+```
+
+### Debugging Code
+
+Another helpful technique is to see the `clap` debug output while developing features. In order to see the debug output while running the full test suite or individual tests, run:
+
+```sh
+$ cargo test --features debug
+
+# Or for individual tests
+$ cargo test --test <test_name> --features debug
+
+# The corresponding just command for individual debugging tests is:
+$ just debug <test_name>
+```
 
 ### Commit Messages
 
 I use a [conventional](https://github.com/ajoslin/conventional-changelog/blob/a5505865ff3dd710cf757f50530e73ef0ca641da/conventions/angular.md) changelog format so I can update my changelog automatically using [clog](https://github.com/clog-tool/clog-cli)
 
  * Please format your commit subject line using the following format: `TYPE(COMPONENT): MESSAGE` where `TYPE` is one of the following:
     - `api`  - An addition to the API
     - `setting` - A new `AppSettings` variant
@@ -49,8 +95,21 @@ 4. Ensure your changes contain documenta
 1. `git rebase` into concise commits and remove `--fixup`s or `wip` commits (`git rebase -i HEAD~NUM` where `NUM` is number of commits back to start the rebase)
 2. Push your changes back to your fork (`git push origin $your-branch`)
 3. Create a pull request against `master`! (You can also create the pull request first, and we'll merge when ready. This a good way to discuss proposed changes.)
 
 ### Other ways to contribute
 
 Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](../examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
 
+### Goals
+
+There are a few goals of `clap` that I'd like to maintain throughout contributions. If your proposed changes break, or go against any of these goals we'll discuss the changes further before merging (but will *not* be ignored, all contributes are welcome!). These are by no means hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by mistake or ignorance :P).
+
+* Remain backwards compatible when possible
+  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
+  - This does not apply for security concerns
+* Parse arguments quickly
+  - Parsing of arguments shouldn't slow down usage of the main program
+  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
+* Try to be cognizant of memory usage
+  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
+* `panic!` on *developer* error, exit gracefully on *end-user* error
--- a/third_party/rust/clap/.travis.yml
+++ b/third_party/rust/clap/.travis.yml
@@ -1,17 +1,17 @@
 sudo: true
 language: rust
 cache: cargo
 rust:
   - nightly
-  - nightly-2017-06-07
+  - nightly-2017-10-11
   - beta
   - stable
-  - 1.18.0
+  - 1.20.0
 matrix:
     allow_failures:
         - rust: nightly
 before_script:
   - |
     pip install git+git://github.com/kbknapp/travis-cargo.git --user &&
     export PATH=$HOME/.local/bin:$PATH
   - |
--- a/third_party/rust/clap/CHANGELOG.md
+++ b/third_party/rust/clap/CHANGELOG.md
@@ -1,8 +1,51 @@
+<a name="2.29.0"></a>
+## 2.29.0 (2017-12-02)
+
+
+#### API Additions
+
+* **Arg:**  adds Arg::hide_env_values(bool) which allows one to hide any current env values and display only the key in help messages ([fb41d062](https://github.com/kbknapp/clap-rs/commit/fb41d062eedf37cb4f805c90adca29909bd197d7))
+
+
+
+<a name="2.28.0"></a>
+## 2.28.0 (2017-11-28)
+
+The minimum required Rust is now 1.20. This was done to start using bitflags 1.0 and having >1.0 deps is a *very good* thing!
+
+#### Documentation
+
+*   changes the demo version to 2.28 to stay in sync ([ce6ca492](https://github.com/kbknapp/clap-rs/commit/ce6ca492c7510ab6474075806360b96081b021a9))
+*   Fix URL path to github hosted files ([ce72aada](https://github.com/kbknapp/clap-rs/commit/ce72aada56a9581d4a6cb4bf9bdb861c3906f8df), closes [#1106](https://github.com/kbknapp/clap-rs/issues/1106))
+*   fix typo ([002b07fc](https://github.com/kbknapp/clap-rs/commit/002b07fc98a1c85acb66296b1eec0b2aba906125))
+* **README.md:**  updates the readme and pulls out some redundant sections ([db6caf86](https://github.com/kbknapp/clap-rs/commit/db6caf8663747e679d2f4ed3bd127f33476754aa))
+
+#### Improvements
+
+*   adds '[SUBCOMMAND]' to usage strings with only AppSettings::AllowExternalSubcommands is used with no other subcommands ([e78bb757](https://github.com/kbknapp/clap-rs/commit/e78bb757a3df16e82d539e450c06767a6bfcf859), closes [#1093](https://github.com/kbknapp/clap-rs/issues/1093))
+
+#### API Additions
+
+*   Adds Arg::case_insensitive(bool) which allows matching Arg::possible_values without worrying about ASCII case ([1fec268e](https://github.com/kbknapp/clap-rs/commit/1fec268e51736602e38e67c76266f439e2e0ef12), closes [#1118](https://github.com/kbknapp/clap-rs/issues/1118))
+*   Adds the traits to be used with the clap-derive crate to be able to use Custom Derive ([6f4c3412](https://github.com/kbknapp/clap-rs/commit/6f4c3412415e882f5ca2cc3fbd6d4dce79440828))
+
+#### Bug Fixes
+
+*   Fixes a regression where --help couldn't be overridden ([a283d69f](https://github.com/kbknapp/clap-rs/commit/a283d69fc08aa016ae1bf9ba010012abecc7ba69), closes [#1112](https://github.com/kbknapp/clap-rs/issues/1112))
+*   fixes a bug that allowed options to pass parsing when no value was provided ([2fb75821](https://github.com/kbknapp/clap-rs/commit/2fb758219c7a60d639da67692e100b855a8165ac), closes [#1105](https://github.com/kbknapp/clap-rs/issues/1105))
+*   ignore PropagateGlobalValuesDown deprecation warning ([f61ce3f5](https://github.com/kbknapp/clap-rs/commit/f61ce3f55fe65e16b3db0bd4facdc4575de22767), closes [#1086](https://github.com/kbknapp/clap-rs/issues/1086))
+
+#### Deps
+
+*  Updates `bitflags` to 1.0
+
+
+
 <a name="v2.27.1"></a>
 ## v2.27.1 (2017-10-24)
 
 
 #### Bug Fixes
 
 * Adds `term_size` as an optional dependency (with feature `wrap_help`) to fix compile bug
 
--- a/third_party/rust/clap/CONTRIBUTORS.md
+++ b/third_party/rust/clap/CONTRIBUTORS.md
@@ -1,79 +1,87 @@
 the following is a list of contributors:
 
 
 [<img alt="kbknapp" src="https://avatars1.githubusercontent.com/u/6942134?v=4&s=117" width="117">](https://github.com/kbknapp) |[<img alt="homu" src="https://avatars1.githubusercontent.com/u/10212162?v=4&s=117" width="117">](https://github.com/homu) |[<img alt="Vinatorul" src="https://avatars1.githubusercontent.com/u/6770624?v=4&s=117" width="117">](https://github.com/Vinatorul) |[<img alt="tormol" src="https://avatars3.githubusercontent.com/u/10460821?v=4&s=117" width="117">](https://github.com/tormol) |[<img alt="little-dude" src="https://avatars2.githubusercontent.com/u/6646324?v=4&s=117" width="117">](https://github.com/little-dude) |[<img alt="sru" src="https://avatars3.githubusercontent.com/u/2485892?v=4&s=117" width="117">](https://github.com/sru) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [kbknapp](https://github.com/kbknapp) |[homu](https://github.com/homu) |[Vinatorul](https://github.com/Vinatorul) |[tormol](https://github.com/tormol) |[little-dude](https://github.com/little-dude) |[sru](https://github.com/sru) |
 
-[<img alt="nabijaczleweli" src="https://avatars3.githubusercontent.com/u/6709544?v=4&s=117" width="117">](https://github.com/nabijaczleweli) |[<img alt="mgeisler" src="https://avatars0.githubusercontent.com/u/89623?v=4&s=117" width="117">](https://github.com/mgeisler) |[<img alt="Byron" src="https://avatars2.githubusercontent.com/u/63622?v=4&s=117" width="117">](https://github.com/Byron) |[<img alt="hgrecco" src="https://avatars0.githubusercontent.com/u/278566?v=4&s=117" width="117">](https://github.com/hgrecco) |[<img alt="nateozem" src="https://avatars2.githubusercontent.com/u/22719441?v=4&s=117" width="117">](https://github.com/nateozem) |[<img alt="james-darkfox" src="https://avatars3.githubusercontent.com/u/637155?v=4&s=117" width="117">](https://github.com/james-darkfox) |
+[<img alt="willmurphyscode" src="https://avatars3.githubusercontent.com/u/12529630?v=4&s=117" width="117">](https://github.com/willmurphyscode) |[<img alt="mgeisler" src="https://avatars0.githubusercontent.com/u/89623?v=4&s=117" width="117">](https://github.com/mgeisler) |[<img alt="nabijaczleweli" src="https://avatars3.githubusercontent.com/u/6709544?v=4&s=117" width="117">](https://github.com/nabijaczleweli) |[<img alt="Byron" src="https://avatars2.githubusercontent.com/u/63622?v=4&s=117" width="117">](https://github.com/Byron) |[<img alt="hgrecco" src="https://avatars0.githubusercontent.com/u/278566?v=4&s=117" width="117">](https://github.com/hgrecco) |[<img alt="bluejekyll" src="https://avatars3.githubusercontent.com/u/986845?v=4&s=117" width="117">](https://github.com/bluejekyll) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[nabijaczleweli](https://github.com/nabijaczleweli) |[mgeisler](https://github.com/mgeisler) |[Byron](https://github.com/Byron) |[hgrecco](https://github.com/hgrecco) |[nateozem](https://github.com/nateozem) |[james-darkfox](https://github.com/james-darkfox) |
+[willmurphyscode](https://github.com/willmurphyscode) |[mgeisler](https://github.com/mgeisler) |[nabijaczleweli](https://github.com/nabijaczleweli) |[Byron](https://github.com/Byron) |[hgrecco](https://github.com/hgrecco) |[bluejekyll](https://github.com/bluejekyll) |
 
-[<img alt="Arnavion" src="https://avatars2.githubusercontent.com/u/1096010?v=4&s=117" width="117">](https://github.com/Arnavion) |[<img alt="rtaycher" src="https://avatars0.githubusercontent.com/u/324733?v=4&s=117" width="117">](https://github.com/rtaycher) |[<img alt="glowing-chemist" src="https://avatars0.githubusercontent.com/u/17074682?v=4&s=117" width="117">](https://github.com/glowing-chemist) |[<img alt="untitaker" src="https://avatars0.githubusercontent.com/u/837573?v=4&s=117" width="117">](https://github.com/untitaker) |[<img alt="afiune" src="https://avatars0.githubusercontent.com/u/5712253?v=4&s=117" width="117">](https://github.com/afiune) |[<img alt="crazymerlyn" src="https://avatars1.githubusercontent.com/u/6919679?v=4&s=117" width="117">](https://github.com/crazymerlyn) |
+[<img alt="ignatenkobrain" src="https://avatars1.githubusercontent.com/u/2866862?v=4&s=117" width="117">](https://github.com/ignatenkobrain) |[<img alt="james-darkfox" src="https://avatars3.githubusercontent.com/u/637155?v=4&s=117" width="117">](https://github.com/james-darkfox) |[<img alt="H2CO3" src="https://avatars2.githubusercontent.com/u/742370?v=4&s=117" width="117">](https://github.com/H2CO3) |[<img alt="nateozem" src="https://avatars2.githubusercontent.com/u/22719441?v=4&s=117" width="117">](https://github.com/nateozem) |[<img alt="glowing-chemist" src="https://avatars0.githubusercontent.com/u/17074682?v=4&s=117" width="117">](https://github.com/glowing-chemist) |[<img alt="rtaycher" src="https://avatars0.githubusercontent.com/u/324733?v=4&s=117" width="117">](https://github.com/rtaycher) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[Arnavion](https://github.com/Arnavion) |[rtaycher](https://github.com/rtaycher) |[glowing-chemist](https://github.com/glowing-chemist) |[untitaker](https://github.com/untitaker) |[afiune](https://github.com/afiune) |[crazymerlyn](https://github.com/crazymerlyn) |
+[ignatenkobrain](https://github.com/ignatenkobrain) |[james-darkfox](https://github.com/james-darkfox) |[H2CO3](https://github.com/H2CO3) |[nateozem](https://github.com/nateozem) |[glowing-chemist](https://github.com/glowing-chemist) |[rtaycher](https://github.com/rtaycher) |
 
-[<img alt="SuperFluffy" src="https://avatars0.githubusercontent.com/u/701177?v=4&s=117" width="117">](https://github.com/SuperFluffy) |[<img alt="japaric" src="https://avatars3.githubusercontent.com/u/5018213?v=4&s=117" width="117">](https://github.com/japaric) |[<img alt="matthiasbeyer" src="https://avatars0.githubusercontent.com/u/427866?v=4&s=117" width="117">](https://github.com/matthiasbeyer) |[<img alt="SShrike" src="https://avatars1.githubusercontent.com/u/4061736?v=4&s=117" width="117">](https://github.com/SShrike) |[<img alt="tshepang" src="https://avatars0.githubusercontent.com/u/588486?v=4&s=117" width="117">](https://github.com/tshepang) |[<img alt="gohyda" src="https://avatars3.githubusercontent.com/u/10263838?v=4&s=117" width="117">](https://github.com/gohyda) |
+[<img alt="Arnavion" src="https://avatars2.githubusercontent.com/u/1096010?v=4&s=117" width="117">](https://github.com/Arnavion) |[<img alt="japaric" src="https://avatars3.githubusercontent.com/u/5018213?v=4&s=117" width="117">](https://github.com/japaric) |[<img alt="untitaker" src="https://avatars0.githubusercontent.com/u/837573?v=4&s=117" width="117">](https://github.com/untitaker) |[<img alt="afiune" src="https://avatars0.githubusercontent.com/u/5712253?v=4&s=117" width="117">](https://github.com/afiune) |[<img alt="crazymerlyn" src="https://avatars1.githubusercontent.com/u/6919679?v=4&s=117" width="117">](https://github.com/crazymerlyn) |[<img alt="SuperFluffy" src="https://avatars0.githubusercontent.com/u/701177?v=4&s=117" width="117">](https://github.com/SuperFluffy) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[SuperFluffy](https://github.com/SuperFluffy) |[japaric](https://github.com/japaric) |[matthiasbeyer](https://github.com/matthiasbeyer) |[SShrike](https://github.com/SShrike) |[tshepang](https://github.com/tshepang) |[gohyda](https://github.com/gohyda) |
+[Arnavion](https://github.com/Arnavion) |[japaric](https://github.com/japaric) |[untitaker](https://github.com/untitaker) |[afiune](https://github.com/afiune) |[crazymerlyn](https://github.com/crazymerlyn) |[SuperFluffy](https://github.com/SuperFluffy) |
 
-[<img alt="jimmycuadra" src="https://avatars2.githubusercontent.com/u/122457?v=4&s=117" width="117">](https://github.com/jimmycuadra) |[<img alt="Nemo157" src="https://avatars1.githubusercontent.com/u/81079?v=4&s=117" width="117">](https://github.com/Nemo157) |[<img alt="golem131" src="https://avatars3.githubusercontent.com/u/2429587?v=4&s=117" width="117">](https://github.com/golem131) |[<img alt="porglezomp" src="https://avatars1.githubusercontent.com/u/1690225?v=4&s=117" width="117">](https://github.com/porglezomp) |[<img alt="wdv4758h" src="https://avatars1.githubusercontent.com/u/2716047?v=4&s=117" width="117">](https://github.com/wdv4758h) |[<img alt="frewsxcv" src="https://avatars2.githubusercontent.com/u/416575?v=4&s=117" width="117">](https://github.com/frewsxcv) |
+[<img alt="malbarbo" src="https://avatars3.githubusercontent.com/u/1678126?v=4&s=117" width="117">](https://github.com/malbarbo) |[<img alt="matthiasbeyer" src="https://avatars0.githubusercontent.com/u/427866?v=4&s=117" width="117">](https://github.com/matthiasbeyer) |[<img alt="gohyda" src="https://avatars3.githubusercontent.com/u/10263838?v=4&s=117" width="117">](https://github.com/gohyda) |[<img alt="tshepang" src="https://avatars0.githubusercontent.com/u/588486?v=4&s=117" width="117">](https://github.com/tshepang) |[<img alt="golem131" src="https://avatars3.githubusercontent.com/u/2429587?v=4&s=117" width="117">](https://github.com/golem131) |[<img alt="jimmycuadra" src="https://avatars2.githubusercontent.com/u/122457?v=4&s=117" width="117">](https://github.com/jimmycuadra) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[jimmycuadra](https://github.com/jimmycuadra) |[Nemo157](https://github.com/Nemo157) |[golem131](https://github.com/golem131) |[porglezomp](https://github.com/porglezomp) |[wdv4758h](https://github.com/wdv4758h) |[frewsxcv](https://github.com/frewsxcv) |
+[malbarbo](https://github.com/malbarbo) |[matthiasbeyer](https://github.com/matthiasbeyer) |[gohyda](https://github.com/gohyda) |[tshepang](https://github.com/tshepang) |[golem131](https://github.com/golem131) |[jimmycuadra](https://github.com/jimmycuadra) |
 
-[<img alt="hoodie" src="https://avatars1.githubusercontent.com/u/260370?v=4&s=117" width="117">](https://github.com/hoodie) |[<img alt="huonw" src="https://avatars1.githubusercontent.com/u/1203825?v=4&s=117" width="117">](https://github.com/huonw) |[<img alt="GrappigPanda" src="https://avatars0.githubusercontent.com/u/2055372?v=4&s=117" width="117">](https://github.com/GrappigPanda) |[<img alt="ignatenkobrain" src="https://avatars1.githubusercontent.com/u/2866862?v=4&s=117" width="117">](https://github.com/ignatenkobrain) |[<img alt="shepmaster" src="https://avatars0.githubusercontent.com/u/174509?v=4&s=117" width="117">](https://github.com/shepmaster) |[<img alt="cstorey" src="https://avatars3.githubusercontent.com/u/743059?v=4&s=117" width="117">](https://github.com/cstorey) |
+[<img alt="Nemo157" src="https://avatars1.githubusercontent.com/u/81079?v=4&s=117" width="117">](https://github.com/Nemo157) |[<img alt="SShrike" src="https://avatars1.githubusercontent.com/u/4061736?v=4&s=117" width="117">](https://github.com/SShrike) |[<img alt="Eijebong" src="https://avatars2.githubusercontent.com/u/3650385?v=4&s=117" width="117">](https://github.com/Eijebong) |[<img alt="cstorey" src="https://avatars3.githubusercontent.com/u/743059?v=4&s=117" width="117">](https://github.com/cstorey) |[<img alt="wdv4758h" src="https://avatars1.githubusercontent.com/u/2716047?v=4&s=117" width="117">](https://github.com/wdv4758h) |[<img alt="frewsxcv" src="https://avatars2.githubusercontent.com/u/416575?v=4&s=117" width="117">](https://github.com/frewsxcv) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[hoodie](https://github.com/hoodie) |[huonw](https://github.com/huonw) |[GrappigPanda](https://github.com/GrappigPanda) |[ignatenkobrain](https://github.com/ignatenkobrain) |[shepmaster](https://github.com/shepmaster) |[cstorey](https://github.com/cstorey) |
+[Nemo157](https://github.com/Nemo157) |[SShrike](https://github.com/SShrike) |[Eijebong](https://github.com/Eijebong) |[cstorey](https://github.com/cstorey) |[wdv4758h](https://github.com/wdv4758h) |[frewsxcv](https://github.com/frewsxcv) |
 
-[<img alt="kieraneglin" src="https://avatars0.githubusercontent.com/u/569917?v=4&s=117" width="117">](https://github.com/kieraneglin) |[<img alt="musoke" src="https://avatars0.githubusercontent.com/u/16665084?v=4&s=117" width="117">](https://github.com/musoke) |[<img alt="nelsonjchen" src="https://avatars1.githubusercontent.com/u/5363?v=4&s=117" width="117">](https://github.com/nelsonjchen) |[<img alt="pkgw" src="https://avatars0.githubusercontent.com/u/59598?v=4&s=117" width="117">](https://github.com/pkgw) |[<img alt="Deedasmi" src="https://avatars0.githubusercontent.com/u/5093293?v=4&s=117" width="117">](https://github.com/Deedasmi) |[<img alt="vmchale" src="https://avatars1.githubusercontent.com/u/13259982?v=4&s=117" width="117">](https://github.com/vmchale) |
+[<img alt="hoodie" src="https://avatars1.githubusercontent.com/u/260370?v=4&s=117" width="117">](https://github.com/hoodie) |[<img alt="huonw" src="https://avatars1.githubusercontent.com/u/1203825?v=4&s=117" width="117">](https://github.com/huonw) |[<img alt="GrappigPanda" src="https://avatars0.githubusercontent.com/u/2055372?v=4&s=117" width="117">](https://github.com/GrappigPanda) |[<img alt="shepmaster" src="https://avatars0.githubusercontent.com/u/174509?v=4&s=117" width="117">](https://github.com/shepmaster) |[<img alt="porglezomp" src="https://avatars1.githubusercontent.com/u/1690225?v=4&s=117" width="117">](https://github.com/porglezomp) |[<img alt="kieraneglin" src="https://avatars0.githubusercontent.com/u/569917?v=4&s=117" width="117">](https://github.com/kieraneglin) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[kieraneglin](https://github.com/kieraneglin) |[musoke](https://github.com/musoke) |[nelsonjchen](https://github.com/nelsonjchen) |[pkgw](https://github.com/pkgw) |[Deedasmi](https://github.com/Deedasmi) |[vmchale](https://github.com/vmchale) |
+[hoodie](https://github.com/hoodie) |[huonw](https://github.com/huonw) |[GrappigPanda](https://github.com/GrappigPanda) |[shepmaster](https://github.com/shepmaster) |[porglezomp](https://github.com/porglezomp) |[kieraneglin](https://github.com/kieraneglin) |
 
-[<img alt="messense" src="https://avatars0.githubusercontent.com/u/1556054?v=4&s=117" width="117">](https://github.com/messense) |[<img alt="Keats" src="https://avatars2.githubusercontent.com/u/680355?v=4&s=117" width="117">](https://github.com/Keats) |[<img alt="starkat99" src="https://avatars1.githubusercontent.com/u/8295111?v=4&s=117" width="117">](https://github.com/starkat99) |[<img alt="alex-gulyas" src="https://avatars0.githubusercontent.com/u/8698329?v=4&s=117" width="117">](https://github.com/alex-gulyas) |[<img alt="cite-reader" src="https://avatars1.githubusercontent.com/u/4196987?v=4&s=117" width="117">](https://github.com/cite-reader) |[<img alt="alexbool" src="https://avatars3.githubusercontent.com/u/1283792?v=4&s=117" width="117">](https://github.com/alexbool) |
+[<img alt="musoke" src="https://avatars0.githubusercontent.com/u/16665084?v=4&s=117" width="117">](https://github.com/musoke) |[<img alt="nelsonjchen" src="https://avatars1.githubusercontent.com/u/5363?v=4&s=117" width="117">](https://github.com/nelsonjchen) |[<img alt="pkgw" src="https://avatars0.githubusercontent.com/u/59598?v=4&s=117" width="117">](https://github.com/pkgw) |[<img alt="Deedasmi" src="https://avatars0.githubusercontent.com/u/5093293?v=4&s=117" width="117">](https://github.com/Deedasmi) |[<img alt="vmchale" src="https://avatars1.githubusercontent.com/u/13259982?v=4&s=117" width="117">](https://github.com/vmchale) |[<img alt="messense" src="https://avatars0.githubusercontent.com/u/1556054?v=4&s=117" width="117">](https://github.com/messense) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[messense](https://github.com/messense) |[Keats](https://github.com/Keats) |[starkat99](https://github.com/starkat99) |[alex-gulyas](https://github.com/alex-gulyas) |[cite-reader](https://github.com/cite-reader) |[alexbool](https://github.com/alexbool) |
+[musoke](https://github.com/musoke) |[nelsonjchen](https://github.com/nelsonjchen) |[pkgw](https://github.com/pkgw) |[Deedasmi](https://github.com/Deedasmi) |[vmchale](https://github.com/vmchale) |[messense](https://github.com/messense) |
 
-[<img alt="AluisioASG" src="https://avatars2.githubusercontent.com/u/1904165?v=4&s=117" width="117">](https://github.com/AluisioASG) |[<img alt="BurntSushi" src="https://avatars3.githubusercontent.com/u/456674?v=4&s=117" width="117">](https://github.com/BurntSushi) |[<img alt="nox" src="https://avatars0.githubusercontent.com/u/123095?v=4&s=117" width="117">](https://github.com/nox) |[<img alt="mitsuhiko" src="https://avatars1.githubusercontent.com/u/7396?v=4&s=117" width="117">](https://github.com/mitsuhiko) |[<img alt="brennie" src="https://avatars3.githubusercontent.com/u/156585?v=4&s=117" width="117">](https://github.com/brennie) |[<img alt="pixelistik" src="https://avatars1.githubusercontent.com/u/170929?v=4&s=117" width="117">](https://github.com/pixelistik) |
+[<img alt="Keats" src="https://avatars2.githubusercontent.com/u/680355?v=4&s=117" width="117">](https://github.com/Keats) |[<img alt="starkat99" src="https://avatars1.githubusercontent.com/u/8295111?v=4&s=117" width="117">](https://github.com/starkat99) |[<img alt="durka" src="https://avatars3.githubusercontent.com/u/47007?v=4&s=117" width="117">](https://github.com/durka) |[<img alt="alex-gulyas" src="https://avatars0.githubusercontent.com/u/8698329?v=4&s=117" width="117">](https://github.com/alex-gulyas) |[<img alt="cite-reader" src="https://avatars1.githubusercontent.com/u/4196987?v=4&s=117" width="117">](https://github.com/cite-reader) |[<img alt="alexbool" src="https://avatars3.githubusercontent.com/u/1283792?v=4&s=117" width="117">](https://github.com/alexbool) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[AluisioASG](https://github.com/AluisioASG) |[BurntSushi](https://github.com/BurntSushi) |[nox](https://github.com/nox) |[mitsuhiko](https://github.com/mitsuhiko) |[brennie](https://github.com/brennie) |[pixelistik](https://github.com/pixelistik) |
+[Keats](https://github.com/Keats) |[starkat99](https://github.com/starkat99) |[durka](https://github.com/durka) |[alex-gulyas](https://github.com/alex-gulyas) |[cite-reader](https://github.com/cite-reader) |[alexbool](https://github.com/alexbool) |
+
+[<img alt="AluisioASG" src="https://avatars2.githubusercontent.com/u/1904165?v=4&s=117" width="117">](https://github.com/AluisioASG) |[<img alt="BurntSushi" src="https://avatars3.githubusercontent.com/u/456674?v=4&s=117" width="117">](https://github.com/BurntSushi) |[<img alt="nox" src="https://avatars0.githubusercontent.com/u/123095?v=4&s=117" width="117">](https://github.com/nox) |[<img alt="pixelistik" src="https://avatars1.githubusercontent.com/u/170929?v=4&s=117" width="117">](https://github.com/pixelistik) |[<img alt="brennie" src="https://avatars3.githubusercontent.com/u/156585?v=4&s=117" width="117">](https://github.com/brennie) |[<img alt="ogham" src="https://avatars3.githubusercontent.com/u/503760?v=4&s=117" width="117">](https://github.com/ogham) |
+:---: |:---: |:---: |:---: |:---: |:---: |
+[AluisioASG](https://github.com/AluisioASG) |[BurntSushi](https://github.com/BurntSushi) |[nox](https://github.com/nox) |[pixelistik](https://github.com/pixelistik) |[brennie](https://github.com/brennie) |[ogham](https://github.com/ogham) |
 
 [<img alt="Bilalh" src="https://avatars0.githubusercontent.com/u/171602?v=4&s=117" width="117">](https://github.com/Bilalh) |[<img alt="dotdash" src="https://avatars1.githubusercontent.com/u/230962?v=4&s=117" width="117">](https://github.com/dotdash) |[<img alt="bradurani" src="https://avatars0.githubusercontent.com/u/4195952?v=4&s=117" width="117">](https://github.com/bradurani) |[<img alt="Seeker14491" src="https://avatars2.githubusercontent.com/u/6490497?v=4&s=117" width="117">](https://github.com/Seeker14491) |[<img alt="brianp" src="https://avatars1.githubusercontent.com/u/179134?v=4&s=117" width="117">](https://github.com/brianp) |[<img alt="casey" src="https://avatars2.githubusercontent.com/u/1945?v=4&s=117" width="117">](https://github.com/casey) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [Bilalh](https://github.com/Bilalh) |[dotdash](https://github.com/dotdash) |[bradurani](https://github.com/bradurani) |[Seeker14491](https://github.com/Seeker14491) |[brianp](https://github.com/brianp) |[casey](https://github.com/casey) |
 
 [<img alt="volks73" src="https://avatars1.githubusercontent.com/u/1915469?v=4&s=117" width="117">](https://github.com/volks73) |[<img alt="daboross" src="https://avatars1.githubusercontent.com/u/1152146?v=4&s=117" width="117">](https://github.com/daboross) |[<img alt="mernen" src="https://avatars0.githubusercontent.com/u/6412?v=4&s=117" width="117">](https://github.com/mernen) |[<img alt="dguo" src="https://avatars0.githubusercontent.com/u/2763135?v=4&s=117" width="117">](https://github.com/dguo) |[<img alt="davidszotten" src="https://avatars3.githubusercontent.com/u/412005?v=4&s=117" width="117">](https://github.com/davidszotten) |[<img alt="drusellers" src="https://avatars1.githubusercontent.com/u/63355?v=4&s=117" width="117">](https://github.com/drusellers) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [volks73](https://github.com/volks73) |[daboross](https://github.com/daboross) |[mernen](https://github.com/mernen) |[dguo](https://github.com/dguo) |[davidszotten](https://github.com/davidszotten) |[drusellers](https://github.com/drusellers) |
 
-[<img alt="eddyb" src="https://avatars2.githubusercontent.com/u/77424?v=4&s=117" width="117">](https://github.com/eddyb) |[<img alt="birkenfeld" src="https://avatars0.githubusercontent.com/u/144359?v=4&s=117" width="117">](https://github.com/birkenfeld) |[<img alt="guanqun" src="https://avatars0.githubusercontent.com/u/53862?v=4&s=117" width="117">](https://github.com/guanqun) |[<img alt="tanakh" src="https://avatars2.githubusercontent.com/u/109069?v=4&s=117" width="117">](https://github.com/tanakh) |[<img alt="SirVer" src="https://avatars0.githubusercontent.com/u/140115?v=4&s=117" width="117">](https://github.com/SirVer) |[<img alt="idmit" src="https://avatars1.githubusercontent.com/u/2546728?v=4&s=117" width="117">](https://github.com/idmit) |
+[<img alt="eddyb" src="https://avatars2.githubusercontent.com/u/77424?v=4&s=117" width="117">](https://github.com/eddyb) |[<img alt="Fraser999" src="https://avatars3.githubusercontent.com/u/190532?v=4&s=117" width="117">](https://github.com/Fraser999) |[<img alt="birkenfeld" src="https://avatars0.githubusercontent.com/u/144359?v=4&s=117" width="117">](https://github.com/birkenfeld) |[<img alt="guanqun" src="https://avatars0.githubusercontent.com/u/53862?v=4&s=117" width="117">](https://github.com/guanqun) |[<img alt="tanakh" src="https://avatars2.githubusercontent.com/u/109069?v=4&s=117" width="117">](https://github.com/tanakh) |[<img alt="SirVer" src="https://avatars0.githubusercontent.com/u/140115?v=4&s=117" width="117">](https://github.com/SirVer) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[eddyb](https://github.com/eddyb) |[birkenfeld](https://github.com/birkenfeld) |[guanqun](https://github.com/guanqun) |[tanakh](https://github.com/tanakh) |[SirVer](https://github.com/SirVer) |[idmit](https://github.com/idmit) |
+[eddyb](https://github.com/eddyb) |[Fraser999](https://github.com/Fraser999) |[birkenfeld](https://github.com/birkenfeld) |[guanqun](https://github.com/guanqun) |[tanakh](https://github.com/tanakh) |[SirVer](https://github.com/SirVer) |
 
-[<img alt="archer884" src="https://avatars1.githubusercontent.com/u/679494?v=4&s=117" width="117">](https://github.com/archer884) |[<img alt="jacobmischka" src="https://avatars1.githubusercontent.com/u/3939997?v=4&s=117" width="117">](https://github.com/jacobmischka) |[<img alt="jespino" src="https://avatars0.githubusercontent.com/u/290303?v=4&s=117" width="117">](https://github.com/jespino) |[<img alt="jtdowney" src="https://avatars1.githubusercontent.com/u/44654?v=4&s=117" width="117">](https://github.com/jtdowney) |[<img alt="andete" src="https://avatars2.githubusercontent.com/u/689017?v=4&s=117" width="117">](https://github.com/andete) |[<img alt="jdanford" src="https://avatars2.githubusercontent.com/u/5767112?v=4&s=117" width="117">](https://github.com/jdanford) |
+[<img alt="idmit" src="https://avatars1.githubusercontent.com/u/2546728?v=4&s=117" width="117">](https://github.com/idmit) |[<img alt="archer884" src="https://avatars1.githubusercontent.com/u/679494?v=4&s=117" width="117">](https://github.com/archer884) |[<img alt="jacobmischka" src="https://avatars1.githubusercontent.com/u/3939997?v=4&s=117" width="117">](https://github.com/jacobmischka) |[<img alt="jespino" src="https://avatars0.githubusercontent.com/u/290303?v=4&s=117" width="117">](https://github.com/jespino) |[<img alt="jfrankenau" src="https://avatars3.githubusercontent.com/u/2736480?v=4&s=117" width="117">](https://github.com/jfrankenau) |[<img alt="jtdowney" src="https://avatars1.githubusercontent.com/u/44654?v=4&s=117" width="117">](https://github.com/jtdowney) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[archer884](https://github.com/archer884) |[jacobmischka](https://github.com/jacobmischka) |[jespino](https://github.com/jespino) |[jtdowney](https://github.com/jtdowney) |[andete](https://github.com/andete) |[jdanford](https://github.com/jdanford) |
+[idmit](https://github.com/idmit) |[archer884](https://github.com/archer884) |[jacobmischka](https://github.com/jacobmischka) |[jespino](https://github.com/jespino) |[jfrankenau](https://github.com/jfrankenau) |[jtdowney](https://github.com/jtdowney) |
 
-[<img alt="joshtriplett" src="https://avatars2.githubusercontent.com/u/162737?v=4&s=117" width="117">](https://github.com/joshtriplett) |[<img alt="Kalwyn" src="https://avatars3.githubusercontent.com/u/22778640?v=4&s=117" width="117">](https://github.com/Kalwyn) |[<img alt="manuel-rhdt" src="https://avatars1.githubusercontent.com/u/3199013?v=4&s=117" width="117">](https://github.com/manuel-rhdt) |[<img alt="malbarbo" src="https://avatars3.githubusercontent.com/u/1678126?v=4&s=117" width="117">](https://github.com/malbarbo) |[<img alt="Marwes" src="https://avatars3.githubusercontent.com/u/957312?v=4&s=117" width="117">](https://github.com/Marwes) |[<img alt="mdaffin" src="https://avatars1.githubusercontent.com/u/171232?v=4&s=117" width="117">](https://github.com/mdaffin) |
+[<img alt="andete" src="https://avatars2.githubusercontent.com/u/689017?v=4&s=117" width="117">](https://github.com/andete) |[<img alt="joshtriplett" src="https://avatars2.githubusercontent.com/u/162737?v=4&s=117" width="117">](https://github.com/joshtriplett) |[<img alt="Kalwyn" src="https://avatars3.githubusercontent.com/u/22778640?v=4&s=117" width="117">](https://github.com/Kalwyn) |[<img alt="manuel-rhdt" src="https://avatars1.githubusercontent.com/u/3199013?v=4&s=117" width="117">](https://github.com/manuel-rhdt) |[<img alt="Marwes" src="https://avatars3.githubusercontent.com/u/957312?v=4&s=117" width="117">](https://github.com/Marwes) |[<img alt="mdaffin" src="https://avatars1.githubusercontent.com/u/171232?v=4&s=117" width="117">](https://github.com/mdaffin) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[joshtriplett](https://github.com/joshtriplett) |[Kalwyn](https://github.com/Kalwyn) |[manuel-rhdt](https://github.com/manuel-rhdt) |[malbarbo](https://github.com/malbarbo) |[Marwes](https://github.com/Marwes) |[mdaffin](https://github.com/mdaffin) |
+[andete](https://github.com/andete) |[joshtriplett](https://github.com/joshtriplett) |[Kalwyn](https://github.com/Kalwyn) |[manuel-rhdt](https://github.com/manuel-rhdt) |[Marwes](https://github.com/Marwes) |[mdaffin](https://github.com/mdaffin) |
 
 [<img alt="iliekturtles" src="https://avatars3.githubusercontent.com/u/5081378?v=4&s=117" width="117">](https://github.com/iliekturtles) |[<img alt="nicompte" src="https://avatars2.githubusercontent.com/u/439369?v=4&s=117" width="117">](https://github.com/nicompte) |[<img alt="NickeZ" src="https://avatars2.githubusercontent.com/u/492753?v=4&s=117" width="117">](https://github.com/NickeZ) |[<img alt="nvzqz" src="https://avatars0.githubusercontent.com/u/10367662?v=4&s=117" width="117">](https://github.com/nvzqz) |[<img alt="nuew" src="https://avatars2.githubusercontent.com/u/26099511?v=4&s=117" width="117">](https://github.com/nuew) |[<img alt="Geogi" src="https://avatars1.githubusercontent.com/u/1818316?v=4&s=117" width="117">](https://github.com/Geogi) |
 :---: |:---: |:---: |:---: |:---: |:---: |
 [iliekturtles](https://github.com/iliekturtles) |[nicompte](https://github.com/nicompte) |[NickeZ](https://github.com/NickeZ) |[nvzqz](https://github.com/nvzqz) |[nuew](https://github.com/nuew) |[Geogi](https://github.com/Geogi) |
 
-[<img alt="flying-sheep" src="https://avatars0.githubusercontent.com/u/291575?v=4&s=117" width="117">](https://github.com/flying-sheep) |[<img alt="Phlosioneer" src="https://avatars2.githubusercontent.com/u/4657718?v=4&s=117" width="117">](https://github.com/Phlosioneer) |[<img alt="peppsac" src="https://avatars3.githubusercontent.com/u/2198295?v=4&s=117" width="117">](https://github.com/peppsac) |[<img alt="golddranks" src="https://avatars1.githubusercontent.com/u/2675542?v=4&s=117" width="117">](https://github.com/golddranks) |[<img alt="hexjelly" src="https://avatars0.githubusercontent.com/u/435283?v=4&s=117" width="117">](https://github.com/hexjelly) |[<img alt="rnelson" src="https://avatars3.githubusercontent.com/u/118361?v=4&s=117" width="117">](https://github.com/rnelson) |
+[<img alt="focusaurus" src="https://avatars1.githubusercontent.com/u/482377?v=4&s=117" width="117">](https://github.com/focusaurus) |[<img alt="flying-sheep" src="https://avatars0.githubusercontent.com/u/291575?v=4&s=117" width="117">](https://github.com/flying-sheep) |[<img alt="Phlosioneer" src="https://avatars2.githubusercontent.com/u/4657718?v=4&s=117" width="117">](https://github.com/Phlosioneer) |[<img alt="peppsac" src="https://avatars3.githubusercontent.com/u/2198295?v=4&s=117" width="117">](https://github.com/peppsac) |[<img alt="golddranks" src="https://avatars1.githubusercontent.com/u/2675542?v=4&s=117" width="117">](https://github.com/golddranks) |[<img alt="hexjelly" src="https://avatars0.githubusercontent.com/u/435283?v=4&s=117" width="117">](https://github.com/hexjelly) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[flying-sheep](https://github.com/flying-sheep) |[Phlosioneer](https://github.com/Phlosioneer) |[peppsac](https://github.com/peppsac) |[golddranks](https://github.com/golddranks) |[hexjelly](https://github.com/hexjelly) |[rnelson](https://github.com/rnelson) |
+[focusaurus](https://github.com/focusaurus) |[flying-sheep](https://github.com/flying-sheep) |[Phlosioneer](https://github.com/Phlosioneer) |[peppsac](https://github.com/peppsac) |[golddranks](https://github.com/golddranks) |[hexjelly](https://github.com/hexjelly) |
 
-[<img alt="swatteau" src="https://avatars3.githubusercontent.com/u/5521255?v=4&s=117" width="117">](https://github.com/swatteau) |[<img alt="tspiteri" src="https://avatars0.githubusercontent.com/u/18604588?v=4&s=117" width="117">](https://github.com/tspiteri) |[<img alt="vks" src="https://avatars2.githubusercontent.com/u/33460?v=4&s=117" width="117">](https://github.com/vks) |[<img alt="th4t" src="https://avatars2.githubusercontent.com/u/2801030?v=4&s=117" width="117">](https://github.com/th4t) |[<img alt="mineo" src="https://avatars1.githubusercontent.com/u/78236?v=4&s=117" width="117">](https://github.com/mineo) |[<img alt="wabain" src="https://avatars3.githubusercontent.com/u/7651435?v=4&s=117" width="117">](https://github.com/wabain) |
+[<img alt="rnelson" src="https://avatars3.githubusercontent.com/u/118361?v=4&s=117" width="117">](https://github.com/rnelson) |[<img alt="swatteau" src="https://avatars3.githubusercontent.com/u/5521255?v=4&s=117" width="117">](https://github.com/swatteau) |[<img alt="tspiteri" src="https://avatars0.githubusercontent.com/u/18604588?v=4&s=117" width="117">](https://github.com/tspiteri) |[<img alt="siiptuo" src="https://avatars0.githubusercontent.com/u/10729330?v=4&s=117" width="117">](https://github.com/siiptuo) |[<img alt="vks" src="https://avatars2.githubusercontent.com/u/33460?v=4&s=117" width="117">](https://github.com/vks) |[<img alt="vsupalov" src="https://avatars2.githubusercontent.com/u/2801030?v=4&s=117" width="117">](https://github.com/vsupalov) |
 :---: |:---: |:---: |:---: |:---: |:---: |
-[swatteau](https://github.com/swatteau) |[tspiteri](https://github.com/tspiteri) |[vks](https://github.com/vks) |[th4t](https://github.com/th4t) |[mineo](https://github.com/mineo) |[wabain](https://github.com/wabain) |
+[rnelson](https://github.com/rnelson) |[swatteau](https://github.com/swatteau) |[tspiteri](https://github.com/tspiteri) |[siiptuo](https://github.com/siiptuo) |[vks](https://github.com/vks) |[vsupalov](https://github.com/vsupalov) |
 
-[<img alt="grossws" src="https://avatars2.githubusercontent.com/u/171284?v=4&s=117" width="117">](https://github.com/grossws) |[<img alt="kennytm" src="https://avatars1.githubusercontent.com/u/103023?v=4&s=117" width="117">](https://github.com/kennytm) |[<img alt="mvaude" src="https://avatars1.githubusercontent.com/u/9532611?v=4&s=117" width="117">](https://github.com/mvaude) |[<img alt="panicbit" src="https://avatars2.githubusercontent.com/u/628445?v=4&s=117" width="117">](https://github.com/panicbit) |[<img alt="ogham" src="https://avatars3.githubusercontent.com/u/503760?v=4&s=117" width="117">](https://github.com/ogham) |
-:---: |:---: |:---: |:---: |:---: |
-[grossws](https://github.com/grossws) |[kennytm](https://github.com/kennytm) |[mvaude](https://github.com/mvaude) |[panicbit](https://github.com/panicbit) |[ogham](https://github.com/ogham) |
+[<img alt="mineo" src="https://avatars1.githubusercontent.com/u/78236?v=4&s=117" width="117">](https://github.com/mineo) |[<img alt="wabain" src="https://avatars3.githubusercontent.com/u/7651435?v=4&s=117" width="117">](https://github.com/wabain) |[<img alt="grossws" src="https://avatars2.githubusercontent.com/u/171284?v=4&s=117" width="117">](https://github.com/grossws) |[<img alt="kennytm" src="https://avatars1.githubusercontent.com/u/103023?v=4&s=117" width="117">](https://github.com/kennytm) |[<img alt="mvaude" src="https://avatars1.githubusercontent.com/u/9532611?v=4&s=117" width="117">](https://github.com/mvaude) |[<img alt="panicbit" src="https://avatars2.githubusercontent.com/u/628445?v=4&s=117" width="117">](https://github.com/panicbit) |
+:---: |:---: |:---: |:---: |:---: |:---: |
+[mineo](https://github.com/mineo) |[wabain](https://github.com/wabain) |[grossws](https://github.com/grossws) |[kennytm](https://github.com/kennytm) |[mvaude](https://github.com/mvaude) |[panicbit](https://github.com/panicbit) |
+
+[<img alt="mitsuhiko" src="https://avatars1.githubusercontent.com/u/7396?v=4&s=117" width="117">](https://github.com/mitsuhiko) |
+:---: |
+[mitsuhiko](https://github.com/mitsuhiko) |
 
 
 
 
 This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)
--- a/third_party/rust/clap/Cargo.toml
+++ b/third_party/rust/clap/Cargo.toml
@@ -7,27 +7,27 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "clap"
-version = "2.27.1"
+version = "2.29.0"
 authors = ["Kevin K. <kbknapp@gmail.com>"]
 exclude = ["examples/*", "clap-test/*", "tests/*", "benches/*", "*.png", "clap-perf/*", "*.dot"]
 description = "A simple to use, efficient, and full featured  Command Line Argument Parser\n"
 homepage = "https://clap.rs/"
 documentation = "https://docs.rs/clap/"
 readme = "README.md"
 keywords = ["argument", "command", "arg", "parser", "parse"]
 categories = ["command-line-interface"]
 license = "MIT"
-repository = "https://github.com/kbknapp/clap-rs.git"
+repository = "https://github.com/kbknapp/clap-rs"
 [package.metadata.docs.rs]
 features = ["doc"]
 [profile.test]
 opt-level = 1
 lto = false
 codegen-units = 4
 debug = true
 debug-assertions = true
@@ -57,70 +57,70 @@ debug-assertions = true
 rpath = false
 
 [profile.release]
 opt-level = 3
 lto = true
 debug = false
 debug-assertions = false
 rpath = false
-[dependencies.bitflags]
-version = "0.9"
-
-[dependencies.clippy]
-version = "~0.0.166"
-optional = true
-
 [dependencies.ansi_term]
-version = "0.9.0"
-optional = true
-
-[dependencies.vec_map]
-version = "0.8"
-optional = true
-
-[dependencies.strsim]
-version = "0.6.0"
+version = "0.10.0"
 optional = true
 
 [dependencies.atty]
 version = "0.2.2"
 optional = true
 
-[dependencies.unicode-width]
-version = "0.1.4"
+[dependencies.bitflags]
+version = "1.0"
+
+[dependencies.clippy]
+version = "~0.0.166"
+optional = true
+
+[dependencies.strsim]
+version = "0.6.0"
+optional = true
+
+[dependencies.term_size]
+version = "0.3.0"
+optional = true
 
 [dependencies.textwrap]
 version = "0.9.0"
 
-[dependencies.term_size]
-version = "0.3.0"
+[dependencies.unicode-width]
+version = "0.1.4"
+
+[dependencies.vec_map]
+version = "0.8"
 optional = true
 
 [dependencies.yaml-rust]
 version = "0.3.5"
 optional = true
+[dev-dependencies.lazy_static]
+version = "1"
+
 [dev-dependencies.regex]
 version = "0.2"
 
-[dev-dependencies.lazy_static]
-version = "0.2"
-
 [dev-dependencies.version-sync]
-version = "0.3"
+version = "0.5"
 
 [features]
+color = ["ansi_term", "atty"]
 debug = []
+default = ["suggestions", "color", "vec_map"]
+doc = ["yaml"]
+lints = ["clippy"]
+nightly = []
 no_cargo = []
-yaml = ["yaml-rust"]
-nightly = []
-color = ["ansi_term", "atty"]
 suggestions = ["strsim"]
-default = ["suggestions", "color", "vec_map"]
+unstable = []
 wrap_help = ["term_size", "textwrap/term_size"]
-lints = ["clippy"]
-unstable = []
-doc = ["yaml"]
+yaml = ["yaml-rust"]
 [badges.appveyor]
 repository = "kbknapp/clap-rs"
 
 [badges.travis-ci]
 repository = "kbknapp/clap-rs"
--- a/third_party/rust/clap/README.md
+++ b/third_party/rust/clap/README.md
@@ -5,19 +5,19 @@ clap
 
 Linux: [![Build Status](https://travis-ci.org/kbknapp/clap-rs.svg?branch=master)](https://travis-ci.org/kbknapp/clap-rs)
 Windows: [![Build status](https://ci.appveyor.com/api/projects/status/ejg8c33dn31nhv36/branch/master?svg=true)](https://ci.appveyor.com/project/kbknapp/clap-rs/branch/master)
 
 Command Line Argument Parser for Rust
 
 It is a simple-to-use, efficient, and full-featured library for parsing command line arguments and subcommands when writing console/terminal applications.
 
-## [documentation](https://docs.rs/clap/)
-## [website](https://clap.rs/)
-## [blog](https://blog.clap.rs/)
+* [documentation](https://docs.rs/clap/)
+* [website](https://clap.rs/)
+* [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U)
 
 Table of Contents
 =================
 
 * [What's New](#whats-new)
 * [About](#about)
 * [FAQ](#faq)
 * [Features](#features)
@@ -26,138 +26,56 @@ Table of Contents
   * [Pre-Built Test](#pre-built-test)
   * [BYOB (Build Your Own Binary)](#byob-build-your-own-binary)
 * [Usage](#usage)
   * [Optional Dependencies / Features](#optional-dependencies--features)
   * [Dependencies Tree](#dependencies-tree)
   * [More Information](#more-information)
     * [Video Tutorials](#video-tutorials)
 * [How to Contribute](#how-to-contribute)
-  * [Testing Code](#testing-code)
-  * [Linting Code](#linting-code)
-  * [Debugging Code](#debugging-code)
-  * [Goals](#goals)
   * [Compatibility Policy](#compatibility-policy)
     * [Minimum Version of Rust](#minimum-version-of-rust)
+* [Related Crates](#related-crates)
 * [License](#license)
 * [Recent Breaking Changes](#recent-breaking-changes)
   * [Deprecations](#deprecations)
 
 Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)
 
 ## What's New
 
-Here's whats new in 2.27.1:
-
-** This release also contains a very minor breaking change to fix a bug **
+Here's whats new in 2.29.0:
 
-The only CLIs affected will be those using unrestrained multiple values and subcommands where the
-subcommand name can coincide with one of the multiple values.
-
-See the commit [0c223f54](https://github.com/kbknapp/clap-rs/commit/0c223f54ed46da406bc8b43a5806e0b227863b31) for full details.
+* **Arg:**  adds Arg::hide_env_values(bool) which allows one to hide any current env values and display only the key in help messages
 
-*    Adds `term_size` as an optional dependency (with feature `wrap_help`) to fix compile bug
-*   **The minimum required version of Rust is now 1.18.0 (Stable)**
-*   Values from global args are now propagated UP and DOWN!
-*   fixes a bug where using AppSettings::AllowHyphenValues would allow invalid arguments even when there is no way for them to be valid
-*   when an argument requires a value and that value happens to match a subcommand name, its parsed as a value
-*   fixes a bug that prevented number_of_values and default_values to be used together
-*   fixes a bug that didn't allow args with default values to have conflicts
-*   fixes a panic when using global args and calling App::get_matches_from_safe_borrow multiple times
-*   fixes issues and potential regressions with global args values not being propagated properly or at all
-*   fixes a bug where default values are not applied if the option supports zero values
-*   adds addtional blurbs about using multiples with subcommands
-*   updates the docs to reflect changes to global args and that global args values can now be propagated back up the stack
-*   add html_root_url attribute
-*   sync README version numbers with crate version
-*   args that have require_delimiter(true) is now reflected in help and usage strings
-*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed
-*   fixes when an argument requires a value and that value happens to match a subcommand name, its parsed as a value
-* **AppSettings::PropagateGlobalValuesDown:**  this setting deprecated and is no longer required to propagate values down or up
+Here's whats new in 2.28.0:
 
-Here's the highlights for v2.21.0 to v2.26.2
+The minimum required Rust is now 1.20. This was done to start using bitflags 1.0 and having >1.0 deps is a *very good* thing!
 
-*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed
-*   fixes a bug where default values are not applied if the option supports zero values
-*   fixes using require_equals(true) and min_values(0) together
-*   escape special characters in zsh and fish completions
-*   avoid panic generating default help msg if term width set to 0 due to bug in textwrap 0.7.0
-*   Change `who's` -> `whose` in documentation
-* **Help Message:**  fixes `App::long_about` not being displayed
-* **Suggestions:**  output for flag after subcommand
-*   **The minimum required version of Rust is now 1.13.0 (Stable)**
-*   bumps unicode-segmentation to v1.2
-*   update textwrap to version 0.7.0 which increases the performance of writing help strings
-* impl Default for Values + OsValues for any lifetime.
-* use textwrap crate for wrapping help texts
-* suggests to use flag after subcommand when applicable
-* Bumps bitflags crate to v0.9
-* fixes a bug where args that allow values to start with a hyphen couldnt contain a double hyphen -- as a value
-* fixes a bug where positional argument help text is misaligned
-* **App::template docs:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template
-* **Arg::allow_hyphen_values docs:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together
-* **clap_app! docs:**  adds using the @group specifier to the macro docs
-* adds a debug assertion to ensure all args added to groups actually exist
-* fixes a bug where args with last(true) and required(true) set were not being printed in the usage string
-* fixes a bug that was printing the arg name, instead of value name when Arg::last(true) was used
-* fixes a bug where flags were parsed as flags AND positional values when specific combinations of settings were used
-* **README.md:**  fix some typos
-* **Arg:**  add `default_value_os`
-* **arg_matches.rs:**  Added a Default implementation for Values and OsValues iterators.
-* **PowerShell Completions:**
-  * fixes a bug where powershells completions cant be used if no subcommands are defined
-  * massively dedups subcommand names in the generate script to make smaller scripts that are still functionally equiv
-* allows specifying a short help vs a long help (i.e. varying levels of detail depending on if -h or --help was used)
-* **clap_app!:**  adds support for arg names with hyphens similar to longs with hyphens
-* fixes a bug that wasn't allowing help and version to be properly overridden
-  * This may break code that was relying on this bug! If you add a flag with a long of `help` manually *and* rely on the help message to be printed automatically your code could break. Please see the commit link in the full CHANGELOG.md
-* `App::long_about`
-* `App::long_version`
-* `App::print_long_help`
-* `App::write_long_help`
-* `App::print_long_version`
-* `App::write_long_version`
-* `Arg::long_help`
-* **clap_app!:**  documents the `--("some-arg")` method for using args with hyphens inside them
-* fixes the usage string regression when using help templates
-* fixes a big regression with custom usage strings
-* adds the ability to change the name of the App instance after creation
-* adds ability to hide the default value of an argument from the help string
-* fixes support for loading author info from yaml
-* adds fish subcommand help support
-* options that use `require_equals(true)` now display the equals sign in help messages, usage strings, and errors
-* setting the max term width now correctly propagates down through child subcommands
-* fixes the precedence of this error to prioritize over other error messages
-* fixes some regression bugs resulting from old asserts in debug mode.
-* adds the ability to mark a positional argument as 'last' which means it should be used with `--` syntax and can be accessed early to effectivly skip other positional args
-* Some performance improvements by reducing the ammount of duplicate work, cloning, and allocations in all cases.
-* Some massive performance gains when using many args (i.e. things like shell glob expansions)
-* adds a setting to allow one to infer shortened subcommands or aliases (i.e. for subcommmand "test", "t", "te", or "tes" would be allowed assuming no other ambiguities)
-* when `AppSettings::SubcommandsNegateReqs` and `ArgsNegateSubcommands` are used, a new more accurate double line usage string is shown
-* provides `default_value_os` and `default_value_if[s]_os`
-* provides `App::help_message` and `App::version_message` which allows one to override the auto-generated help/version flag associated help
-* adds the ability to require the equals syntax with options `--opt=val`
-* doesn't print the argument sections in the help message if all args in that section are hidden
-* doesn't include the various `[ARGS]` `[FLAGS]` or `[OPTIONS]` if the only ones available are hidden
-* now correctly shows subcommand as required in the usage string when AppSettings::SubcommandRequiredElseHelp is used
-* fixes some "memory leaks" when an error is detected and clap exits
-* fixes a trait that's marked private accidentlly, but should be crate internal public
-* fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts
-* Fixes a critical bug in the `clap_app!` macro of a missing fragment specifier when using `!property` style tags.
-* Fix examples link in CONTRIBUTING.md
+* Updates `bitflags` to 1.0
+* Adds the traits to be used with the `clap-derive` crate to be able to use Custom Derive (for now must be accessed with `unstable` feature flag)
+* Adds Arg::case_insensitive(bool) which allows matching Arg::possible_values without worrying about ASCII case
+* Fixes a regression where --help couldn't be overridden
+* adds '[SUBCOMMAND]' to usage strings with only AppSettings::AllowExternalSubcommands is used with no other subcommands
+* uses `.bash` for Bash completion scripts now instead of `.bash-completion` due to convention and `.bash-completion` not being supported by completion projects
+* Fix URL path to github hosted files
+* fix typos in docs
+* **README.md:**  updates the readme and pulls out some redundant sections
+* fixes a bug that allowed options to pass parsing when no value was provided
+* ignore PropagateGlobalValuesDown deprecation warning
 
 For full details, see [CHANGELOG.md](https://github.com/kbknapp/clap-rs/blob/master/CHANGELOG.md)
 
 ## About
 
-`clap` is used to parse *and validate* the string of command line arguments provided by the user at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means you focus on your *applications* functionality, and less on the parsing and validating of arguments.
+`clap` is used to parse *and validate* the string of command line arguments provided by a user at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means you focus on your *applications* functionality, and less on the parsing and validating of arguments.
 
-`clap` also provides the traditional version and help switches (or flags) 'for free' meaning automatically with no configuration. It does this by checking list of valid possibilities you supplied and adding only the ones you haven't already defined. If you are using subcommands, `clap` will also auto-generate a `help` subcommand for you in addition to the traditional flags.
+`clap` provides many things 'for free' (with no configuration) including the traditional version and help switches (or flags) along with associated messages. If you are using subcommands, `clap` will also auto-generate a `help` subcommand and separate associated help messages.
 
-Once `clap` parses the user provided string of arguments, it returns the matches along with any applicable values. If the user made an error or typo, `clap` informs them of the mistake and exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to exit). Because of this, you can make reasonable assumptions in your code about the validity of the arguments.
+Once `clap` parses the user provided string of arguments, it returns the matches along with any applicable values. If the user made an error or typo, `clap` informs them with a friendly message and exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to exit). Because of this, you can make reasonable assumptions in your code about the validity of the arguments prior to your applications main execution.
 
 ## FAQ
 
 For a full FAQ and more in depth details, see [the wiki page](https://github.com/kbknapp/clap-rs/wiki/FAQ)
 
 ### Comparisons
 
 First, let me say that these comparisons are highly subjective, and not meant in a critical or harsh manner. All the argument parsing libraries out there (to include `clap`) have their own strengths and weaknesses. Sometimes it just comes down to personal taste when all other factors are equal. When in doubt, try them all and pick one that you enjoy :) There's plenty of room in the Rust community for multiple implementations!
@@ -173,27 +91,31 @@ Personally, I find many, many uses of `g
 #### How does `clap` compare to [docopt.rs](https://github.com/docopt/docopt.rs)?
 
 I first want to say I'm a big a fan of BurntSushi's work, the creator of `Docopt.rs`. I aspire to produce the quality of libraries that this man does! When it comes to comparing these two libraries they are very different. `docopt` tasks you with writing a help message, and then it parsers that message for you to determine all valid arguments and their use. Some people LOVE this approach, others do not. If you're willing to write a detailed help message, it's nice that you can stick that in your program and have `docopt` do the rest. On the downside, it's far less flexible.
 
 `docopt` is also excellent at translating arguments into Rust types automatically. There is even a syntax extension which will do all this for you, if you're willing to use a nightly compiler (use of a stable compiler requires you to somewhat manually translate from arguments to Rust types). To use BurntSushi's words, `docopt` is also a sort of black box. You get what you get, and it's hard to tweak implementation or customize the experience for your use case.
 
 Because `docopt` is doing a ton of work to parse your help messages and determine what you were trying to communicate as valid arguments, it's also one of the more heavy weight parsers performance-wise. For most applications this isn't a concern and this isn't to say `docopt` is slow, in fact far from it. This is just something to keep in mind while comparing.
 
-#### All else being equal, what are some reasons to use `clap`?
+#### All else being equal, what are some reasons to use `clap`? (The Pitch)
 
 `clap` is as fast, and as lightweight as possible while still giving all the features you'd expect from a modern argument parser. In fact, for the amount and type of features `clap` offers it remains about as fast as `getopts`. If you use `clap` when just need some simple arguments parsed, you'll find it's a walk in the park. `clap` also makes it possible to represent extremely complex, and advanced requirements, without too much thought. `clap` aims to be intuitive, easy to use, and fully capable for wide variety use cases and needs.
 
+#### All else being equal, what are some reasons *not* to use `clap`? (The Anti Pitch)
+
+Depending on the style in which you choose to define the valid arguments, `clap` can be very verbose. `clap` also offers so many finetuning knobs and dials, that learning everything can seem overwhelming. I strive to keep the simple cases simple, but when turning all those custom dials it can get complex. `clap` is also opinionated about parsing. Even though so much can be tweaked and tuned with `clap` (and I'm adding more all the time), there are still certain features which `clap` implements in specific ways which may be contrary to some users use-cases. Finally, `clap` is "stringly typed" when referring to arguments which can cause typos in code. This particular paper-cut is being actively worked on, and should be gone in v3.x.
+
 ## Features
 
 Below are a few of the features which `clap` supports, full descriptions and usage can be found in the [documentation](https://docs.rs/clap/) and [examples/](examples) directory
 
 * **Auto-generated Help, Version, and Usage information**
-  - Can optionally be fully, or partially overridden if you want a custom help, version, or usage
-* **Auto-generated bash completion scripts at compile time**
+  - Can optionally be fully, or partially overridden if you want a custom help, version, or usage statements
+* **Auto-generated completion scripts at compile time (Bash, Zsh, Fish, and PowerShell)**
   - Even works through many multiple levels of subcommands
   - Works with options which only accept certain values
   - Works with subcommand aliases
 * **Flags / Switches** (i.e. bool fields)
   - Both short and long versions supported (i.e. `-f` and `--flag` respectively)
   - Supports combining short versions (i.e. `-fBgoZ` is the same as `-f -B -g -o -Z`)
   - Supports multiple occurrences (i.e. `-vvv` or `-v -v -v`)
 * **Positional Arguments** (i.e. those which are based off an index from the program name)
@@ -212,39 +134,41 @@ Below are a few of the features which `c
 * **Sub-Commands** (i.e. `git add <file>` where `add` is a sub-command of `git`)
   - Support their own sub-arguments, and sub-sub-commands independent of the parent
   - Get their own auto-generated Help, Version, and Usage independent of parent
 * **Support for building CLIs from YAML** - This keeps your Rust source nice and tidy and makes supporting localized translation very simple!
 * **Requirement Rules**: Arguments can define the following types of requirement rules
   - Can be required by default
   - Can be required only if certain arguments are present
   - Can require other arguments to be present
+  - Can be required only if certain values of other arguments are used
 * **Confliction Rules**: Arguments can optionally define the following types of exclusion rules
   - Can be disallowed when certain arguments are present
   - Can disallow use of other arguments when present
 * **Groups**: Arguments can be made part of a group
   - Fully compatible with other relational rules (requirements, conflicts, and overrides) which allows things like requiring the use of any arg in a group, or denying the use of an entire group conditionally
 * **Specific Value Sets**: Positional or Option Arguments can define a specific set of allowed values (i.e. imagine a `--mode` option which may *only* have one of two values `fast` or `slow` such as `--mode fast` or `--mode slow`)
 * **Default Values**
+  - Also supports conditional default values (i.e. a default which only applies if specific arguments are used, or specific values of those arguments)
 * **Automatic Version from Cargo.toml**: `clap` is fully compatible with Rust's `env!()` macro for automatically setting the version of your application to the version in your Cargo.toml. See [09_auto_version example](examples/09_auto_version.rs) for how to do this (Thanks to [jhelwig](https://github.com/jhelwig) for pointing this out)
 * **Typed Values**: You can use several convenience macros provided by `clap` to get typed values (i.e. `i32`, `u8`, etc.) from positional or option arguments so long as the type you request implements `std::str::FromStr` See the [12_typed_values example](examples/12_typed_values.rs). You can also use `clap`s `arg_enum!` macro to create an enum with variants that automatically implement `std::str::FromStr`. See [13a_enum_values_automatic example](examples/13a_enum_values_automatic.rs) for details
 * **Suggestions**: Suggests corrections when the user enters a typo. For example, if you defined a `--myoption` argument, and the user mistakenly typed `--moyption` (notice `y` and `o` transposed), they would receive a `Did you mean '--myoption'?` error and exit gracefully. This also works for subcommands and flags. (Thanks to [Byron](https://github.com/Byron) for the implementation) (This feature can optionally be disabled, see 'Optional Dependencies / Features')
 * **Colorized Errors (Non Windows OS only)**: Error message are printed in in colored text (this feature can optionally be disabled, see 'Optional Dependencies / Features').
-* **Global Arguments**: Arguments can optionally be defined once, and be available to all child subcommands.
+* **Global Arguments**: Arguments can optionally be defined once, and be available to all child subcommands. There values will also be propagated up/down throughout all subcommands.
 * **Custom Validations**: You can define a function to use as a validator of argument values. Imagine defining a function to validate IP addresses, or fail parsing upon error. This means your application logic can be solely focused on *using* values.
 * **POSIX Compatible Conflicts/Overrides** - In POSIX args can be conflicting, but not fail parsing because whichever arg comes *last* "wins" so to speak. This allows things such as aliases (i.e. `alias ls='ls -l'` but then using `ls -C` in your terminal which ends up passing `ls -l -C` as the final arguments. Since `-l` and `-C` aren't compatible, this effectively runs `ls -C` in `clap` if you choose...`clap` also supports hard conflicts that fail parsing). (Thanks to [Vinatorul](https://github.com/Vinatorul)!)
 * Supports the Unix `--` meaning, only positional arguments follow
 
 ## Quick Example
 
 The following examples show a quick example of some of the very basic functionality of `clap`. For more advanced usage, such as requirements, conflicts, groups, multiple values and occurrences see the [documentation](https://docs.rs/clap/), [examples/](examples) directory of this repository or the [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
 
- **NOTE:** All of these examples are functionally the same, but show different styles in which to use `clap`
+ **NOTE:** All of these examples are functionally the same, but show different styles in which to use `clap`. These different styles are purely a matter of personal preference.
 
-The first example shows a method that allows more advanced configuration options (not shown in this small example), or even dynamically generating arguments when desired. The downside is it's more verbose.
+The first example shows a method using the 'Builder Pattern' which allows more advanced configuration options (not shown in this small example), or even dynamically generating arguments when desired. The downside is it's more verbose.
 
 ```rust
 // (Full example with detailed comments in examples/01b_quick_example.rs)
 //
 // This example demonstrates clap's full 'builder pattern' style of creating arguments which is
 // more verbose, but allows easier editing, and at times more advanced options, or the possibility
 // to generate arguments dynamically.
 extern crate clap;
@@ -372,19 +296,19 @@ subcommands:
         args:
             - debug:
                 short: d
                 help: print debug information
 ```
 
 Since this feature requires additional dependencies that not everyone may want, it is *not* compiled in by default and we need to enable a feature flag in Cargo.toml:
 
-Simply change your `clap = "2.27"` to `clap = {version = "2.27", features = ["yaml"]}`.
+Simply change your `clap = "2.29"` to `clap = {version = "2.87", features = ["yaml"]}`.
 
-At last we create our `main.rs` file just like we would have with the previous two examples:
+Finally we create our `main.rs` file just like we would have with the previous two examples:
 
 ```rust
 // (Full example with detailed comments in examples/17_yaml.rs)
 //
 // This example demonstrates clap's building from YAML style of creating arguments which is far
 // more clean, but takes a very small performance hit compared to the other two methods.
 #[macro_use]
 extern crate clap;
@@ -394,17 +318,17 @@ fn main() {
     // The YAML file is found relative to the current file, similar to how modules are found
     let yaml = load_yaml!("cli.yml");
     let matches = App::from_yaml(yaml).get_matches();
 
     // Same as previous examples...
 }
 ```
 
-Finally there is a macro version, which is like a hybrid approach offering the speed of the builder pattern (the first example), but without all the verbosity.
+Last but not least there is a macro version, which is like a hybrid approach offering the runtime speed of the builder pattern (the first example), but without all the verbosity.
 
 ```rust
 #[macro_use]
 extern crate clap;
 
 fn main() {
     let matches = clap_app!(myapp =>
         (version: "1.0")
@@ -432,43 +356,44 @@ If you were to compile any of the above 
 My Super Program 1.0
 Kevin K. <kbknapp@gmail.com>
 Does awesome things
 
 USAGE:
     MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
 
 FLAGS:
-    -h, --help       Prints this message
+    -h, --help       Prints help information
     -v               Sets the level of verbosity
     -V, --version    Prints version information
 
 OPTIONS:
     -c, --config <FILE>    Sets a custom config file
 
 ARGS:
     INPUT    The input file to use
 
 SUBCOMMANDS:
-    help    Prints this message
+    help    Prints this message or the help of the given subcommand(s)
     test    Controls testing features
 ```
 
-**NOTE:** You could also run `myapp test --help` to see similar output and options for the `test` subcommand.
+**NOTE:** You could also run `myapp test --help` or `myapp help test` to see the help message for the `test` subcommand.
 
 ## Try it!
 
 ### Pre-Built Test
 
-To try out the pre-built example, use the following steps:
+To try out the pre-built examples, use the following steps:
 
-* Clone the repository `$ git clone https://github.com/kbknapp/clap-rs && cd clap-rs/tests`
-* Compile the example `$ cargo build --release`
-* Run the help info `$ ./target/release/claptests --help`
+* Clone the repository `$ git clone https://github.com/kbknapp/clap-rs && cd clap-rs/`
+* Compile the example `$ cargo build --example <EXAMPLE>`
+* Run the help info `$ ./target/debug/examples/<EXAMPLE> --help`
 * Play with the arguments!
+* You can also do a onetime run via `$ cargo run --example <EXAMPLE> -- [args to example]
 
 ### BYOB (Build Your Own Binary)
 
 To test out `clap`'s default auto-generated help/version follow these steps:
 * Create a new cargo project `$ cargo new fake --bin && cd fake`
 * Add `clap` to your `Cargo.toml`
 *
 ```toml
@@ -491,49 +416,48 @@ fn main() {
 * Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake --version`
 
 ## Usage
 
 For full usage, add `clap` as a dependency in your `Cargo.toml` () to use from crates.io:
 
 ```toml
 [dependencies]
-clap = "~2.27"
+clap = "~2.29"
 ```
 
 (**note**: If you are concerned with supporting a minimum version of Rust that is *older* than the current stable Rust minus 2 stable releases, it's recommended to use the `~major.minor.patch` style versions in your `Cargo.toml` which will only update the patch version automatically. For more information see the [Compatibility Policy](#compatibility-policy))
 
 Then add `extern crate clap;` to your crate root.
 
 Define a list of valid arguments for your program (see the [documentation](https://docs.rs/clap/) or [examples/](examples) directory of this repo)
 
 Then run `cargo build` or `cargo update && cargo build` for your project.
 
 ### Optional Dependencies / Features
 
 #### Features enabled by default
 
 * **"suggestions"**: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
 * **"color"**: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term`)
-* **"wrap_help"**: Wraps the help at the actual terminal width when available, instead of 120 characters. (builds dependency `term_size`)
 * **"vec_map"**: Use [`VecMap`](https://crates.io/crates/vec_map) internally instead of a [`BTreeMap`](https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html). This feature provides a _slight_ performance improvement. (builds dependency `vec_map`)
 
 To disable these, add this to your `Cargo.toml`:
 
 ```toml
 [dependencies.clap]
-version = "2.27"
+version = "2.29"
 default-features = false
 ```
 
 You can also selectively enable only the features you'd like to include, by adding:
 
 ```toml
 [dependencies.clap]
-version = "2.27"
+version = "2.29"
 default-features = false
 
 # Cherry-pick the features you'd like to use
 features = [ "suggestions", "color" ]
 ```
 
 #### Opt-in features
 
@@ -559,129 +483,50 @@ You can also find usage examples in the 
 #### Video Tutorials
 
 There's also the video tutorial series [Argument Parsing with Rust v2](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
 
 These videos slowly trickle out as I finish them and currently a work in progress.
 
 ## How to Contribute
 
-Contributions are always welcome! And there is a multitude of ways in which you can help depending on what you like to do, or are good at. Anything from documentation, code cleanup, issue completion, new features, you name it, even filing issues is contributing and greatly appreciated!
-
-Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
-
-Please read [CONTRIBUTING.md](.github/CONTRIBUTING.md) before you start contributing.
-
-
-### Testing Code
-
-To test with all features both enabled and disabled, you can run these commands:
-
-```sh
-$ cargo test --no-default-features
-$ cargo test --features "yaml unstable"
-```
-
-Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the prebuilt recipes. *Not* using `just` is perfectly fine as well, it simply bundles commands automatically.
-
-For example, to test the code, as above simply run:
-
-```sh
-$ just run-tests
-```
-
-From here on, I will list the appropriate `cargo` command as well as the `just` command.
-
-Sometimes it's helpful to only run a subset of the tests, which can be done via:
-
-```sh
-$ cargo test --test <test_name>
-
-# Or
-
-$ just run-test <test_name>
-```
-
-### Linting Code
-
-During the CI process `clap` runs against many different lints using [`clippy`](https://github.com/Manishearth/rust-clippy). In order to check if these lints pass on your own computer prior to submitting a PR you'll need a nightly compiler.
-
-In order to check the code for lints run either:
-
-```sh
-$ rustup override add nightly
-$ cargo build --features lints
-$ rustup override remove
-
-# Or
-
-$ just lint
-```
-
-### Debugging Code
-
-Another helpful technique is to see the `clap` debug output while developing features. In order to see the debug output while running the full test suite or individual tests, run:
-
-```sh
-$ cargo test --features debug
-
-# Or for individual tests
-$ cargo test --test <test_name> --features debug
-
-# The corresponding just command for individual debugging tests is:
-$ just debug <test_name>
-```
-
-### Goals
-
-There are a few goals of `clap` that I'd like to maintain throughout contributions. If your proposed changes break, or go against any of these goals we'll discuss the changes further before merging (but will *not* be ignored, all contributes are welcome!). These are by no means hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by mistake or ignorance :P).
-
-* Remain backwards compatible when possible
-  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
-  - This does not apply for security concerns
-* Parse arguments quickly
-  - Parsing of arguments shouldn't slow down usage of the main program
-  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
-* Try to be cognizant of memory usage
-  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
-* `panic!` on *developer* error, exit gracefully on *end-user* error
+Details on how to contribute can be found in the [CONTRIBUTING.md](.github/CONTRIBUTING.md) file.
 
 ### Compatibility Policy
 
 Because `clap` takes SemVer and compatibility seriously, this is the official policy regarding breaking changes and minimum required versions of Rust.
 
 `clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version of `clap` will be bumped.
 
 In order to keep from being surprised of breaking changes, it is **highly** recommended to use the `~major.minor.patch` style in your `Cargo.toml` only if you wish to target a version of Rust that is *older* than current stable minus two releases:
 
 ```toml
 [dependencies]
-clap = "~2.27"
+clap = "~2.29"
 ```
 
 This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore cannot break due to new features, or bumped minimum versions of Rust.
 
 #### Warning about '~' Dependencies
 
 Using `~` can cause issues in certain circumstances.
 
 From @alexcrichton:
 
 Right now Cargo's version resolution is pretty naive, it's just a brute-force search of the solution space, returning the first resolvable graph. This also means that it currently won't terminate until it proves there is not possible resolvable graph. This leads to situations where workspaces with multiple binaries, for example, have two different dependencies such as:
 
 ```toml,no_sync
 
 # In one Cargo.toml
 [dependencies]
-clap = "~2.27.0"
+clap = "~2.29.0"
 
 # In another Cargo.toml
 [dependencies]
-clap = "2.27"
-
+clap = "2.29"
 ```
 
 This is inherently an unresolvable crate graph in Cargo right now. Cargo requires there's only one major version of a crate, and being in the same workspace these two crates must share a version. This is impossible in this location, though, as these version constraints cannot be met.
 
 #### Minimum Version of Rust
 
 `clap` will officially support current stable Rust, minus two releases, but may work with prior releases as well. For example, current stable Rust at the time of this writing is 1.21.0, meaning `clap` is guaranteed to compile with 1.19.0 and beyond.
 
@@ -696,20 +541,31 @@ Upon bumping the minimum version of Rust
  * The breaking change is to fix a security concern
  * The breaking change is to be fixing a bug (i.e. relying on a bug as a feature)
  * The breaking change is a feature isn't used in the wild, or all users of said feature have given approval *prior* to the change
 
 ## License
 
 `clap` is licensed under the MIT license. Please read the [LICENSE-MIT](LICENSE-MIT) file in this repository for more information.
 
+## Related Crates
+
+There are several excellent crates which can be used with `clap`, I recommend checking them all out! If you've got a crate that would be a good fit to be used with `clap` open an issue and let me know, I'd love to add it!
+
+* [`structopt`](https://github.com/TeXitoi/structopt) - This crate allows you to define a struct, and build a CLI from it! No more "stringly typed" and it uses `clap` behind the scenes! (*Note*: There is work underway to pull this crate into mainline `clap`).
+* [`assert_cli`](https://github.com/killercup/assert_cli) - This crate allows you test your CLIs in a very intuitive and functional way!
+
 ## Recent Breaking Changes
 
 `clap` follows semantic versioning, so breaking changes should only happen upon major version bumps. The only exception to this rule is breaking changes that happen due to implementation that was deemed to be a bug, security concerns, or it can be reasonably proved to affect no code. For the full details, see [CHANGELOG.md](./CHANGELOG.md).
 
+As of 2.27.0:
+
+* Argument values now take precedence over subcommand names. This only arises by using unrestrained multiple values and subcommands together where the subcommand name can coincide with one of the multiple values. Such as `$ prog <files>... <subcommand>`. The fix is to place restraints on number of values, or disallow the use of `$ prog <prog-args> <subcommand>` structure.
+
 As of 2.0.0 (From 1.x)
 
 * **Fewer lifetimes! Yay!**
  * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`
  * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`
  * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`
 * **Simply Renamed**
  * `App::arg_group` => `App::group`
--- a/third_party/rust/clap/src/app/help.rs
+++ b/third_party/rust/clap/src/app/help.rs
@@ -500,21 +500,27 @@ impl<'a> Help<'a> {
         debugln!("Help::spec_vals: a={}", a);
         let mut spec_vals = vec![];
         if let Some(ref env) = a.env() {
             debugln!(
                 "Help::spec_vals: Found environment variable...[{:?}:{:?}]",
                 env.0,
                 env.1
             );
-            spec_vals.push(format!(
-                " [env:{}: {}]",
+            let env_val = if !a.is_set(ArgSettings::HideEnvValues) {
+                format!("={}", env.1.map_or(Cow::Borrowed(""), |val| val.to_string_lossy()))
+            } else {
+                String::new()
+            };
+            let env_info = format!(
+                " [env: {}{}]",
                 env.0.to_string_lossy(),
-                env.1.map_or(Cow::Borrowed(""), |val| val.to_string_lossy())
-            ));
+                env_val
+            );
+            spec_vals.push(env_info);
         }
         if !a.is_set(ArgSettings::HideDefaultValue) {
             if let Some(pv) = a.default_val() {
                 debugln!("Help::spec_vals: Found default value...[{:?}]", pv);
                 spec_vals.push(format!(
                     " [default: {}]",
                     if self.color {
                         self.cizer.good(pv.to_string_lossy())
--- a/third_party/rust/clap/src/app/macros.rs
+++ b/third_party/rust/clap/src/app/macros.rs
@@ -80,17 +80,17 @@ macro_rules! arg_post_processing {
         // Add all required args which aren't already found in matcher to the master
         // list
         debug!("arg_post_processing!: Does '{}' have requirements...", $arg.to_string());
         if let Some(reqs) = $arg.requires() {
             for n in reqs.iter()
                 .filter(|&&(val, _)| val.is_none())
                 .filter(|&&(_, req)| !$matcher.contains(&req))
                 .map(|&(_, name)| name) {
-                    
+
                 $me.required.push(n);
             }
         } else { sdebugln!("No"); }
 
         _handle_group_reqs!($me, $arg);
     };
 }
 
--- a/third_party/rust/clap/src/app/meta.rs
+++ b/third_party/rust/clap/src/app/meta.rs
@@ -18,10 +18,16 @@ pub struct AppMeta<'b> {
     pub disp_ord: usize,
     pub term_w: Option<usize>,
     pub max_w: Option<usize>,
     pub template: Option<&'b str>,
 }
 
 impl<'b> AppMeta<'b> {
     pub fn new() -> Self { Default::default() }
-    pub fn with_name(s: String) -> Self { AppMeta { name: s, disp_ord: 999, ..Default::default() } }
-}
\ No newline at end of file
+    pub fn with_name(s: String) -> Self {
+        AppMeta {
+            name: s,
+            disp_ord: 999,
+            ..Default::default()
+        }
+    }
+}
--- a/third_party/rust/clap/src/app/mod.rs
+++ b/third_party/rust/clap/src/app/mod.rs
@@ -55,36 +55,40 @@ use map::{self, VecMap};
 ///                  displaying the help information from --help or -h")
 ///     .get_matches();
 ///
 /// // Your program logic starts here...
 /// ```
 /// [`App::get_matches`]: ./struct.App.html#method.get_matches
 #[allow(missing_debug_implementations)]
 pub struct App<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
-    #[doc(hidden)]
-    pub p: Parser<'a, 'b>,
+    #[doc(hidden)] pub p: Parser<'a, 'b>,
 }
 
 
 impl<'a, 'b> App<'a, 'b> {
     /// Creates a new instance of an application requiring a name. The name may be, but doesn't
     /// have to be same as the binary. The name will be displayed to the user when they request to
     /// print version or help and usage information.
     ///
     /// # Examples
     ///
     /// ```no_run
     /// # use clap::{App, Arg};
     /// let prog = App::new("My Program")
     /// # ;
     /// ```
-    pub fn new<S: Into<String>>(n: S) -> Self { App { p: Parser::with_name(n.into()) } }
+    pub fn new<S: Into<String>>(n: S) -> Self {
+        App {
+            p: Parser::with_name(n.into()),
+        }
+    }
 
     /// Get the name of the app
     pub fn get_name(&self) -> &str { &self.p.meta.name }
 
     /// Get the name of the binary
     pub fn get_bin_name(&self) -> Option<&str> { self.p.meta.bin_name.as_ref().map(|s| s.as_str()) }
 
     /// Creates a new instance of an application requiring a name, but uses the [`crate_authors!`]
@@ -98,17 +102,19 @@ impl<'a, 'b> App<'a, 'b> {
     /// # ;
     /// ```
     /// [`crate_authors!`]: ./macro.crate_authors!.html
     /// [`crate_version!`]: ./macro.crate_version!.html
     /// [`App::author`]: ./struct.App.html#method.author
     /// [`App::version`]: ./struct.App.html#method.author
     #[deprecated(since="2.14.1", note="Can never work; use explicit App::author() and App::version() calls instead")]
     pub fn with_defaults<S: Into<String>>(n: S) -> Self {
-        let mut a = App { p: Parser::with_name(n.into()) };
+        let mut a = App {
+            p: Parser::with_name(n.into()),
+        };
         a.p.meta.author = Some("Kevin K. <kbknapp@gmail.com>");
         a.p.meta.version = Some("2.19.2");
         a
     }
 
     /// Creates a new instance of [`App`] from a .yml (YAML) file. A full example of supported YAML
     /// objects can be found in [`examples/17_yaml.rs`] and [`examples/17_yaml.yml`]. One great use
     /// for using YAML is when supporting multiple languages and dialects, as each language could
@@ -1068,17 +1074,18 @@ impl<'a, 'b> App<'a, 'b> {
     ///        SubCommand::with_name("config").about("Controls configuration functionality")
     ///                                 .arg(Arg::with_name("config_file").index(1)),
     ///        SubCommand::with_name("debug").about("Controls debug functionality")])
     /// # ;
     /// ```
     /// [`SubCommand`]: ./struct.SubCommand.html
     /// [`IntoIterator`]: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
     pub fn subcommands<I>(mut self, subcmds: I) -> Self
-        where I: IntoIterator<Item = App<'a, 'b>>
+    where
+        I: IntoIterator<Item = App<'a, 'b>>,
     {
         for subcmd in subcmds {
             self.p.add_subcommand(subcmd);
         }
         self
     }
 
     /// Allows custom ordering of [`SubCommand`]s within the help message. Subcommands with a lower
@@ -1370,25 +1377,27 @@ impl<'a, 'b> App<'a, 'b> {
     ///         Some(outdir) => outdir,
     ///     };
     ///     let mut app = build_cli();
     ///     app.gen_completions("myapp",      // We need to specify the bin name manually
     ///                         Shell::Bash,  // Then say which shell to build completions for
     ///                         outdir);      // Then say where write the completions to
     /// }
     /// ```
-    /// Now, once we combile there will be a `{bin_name}.bash-completion` file in the directory.
+    /// Now, once we compile there will be a `{bin_name}.bash` file in the directory.
     /// Assuming we compiled with debug mode, it would be somewhere similar to
-    /// `<project>/target/debug/build/myapp-<hash>/out/myapp.bash-completion`.
+    /// `<project>/target/debug/build/myapp-<hash>/out/myapp.bash`.
     ///
     /// Fish shell completions will use the file format `{bin_name}.fish`
-    pub fn gen_completions<T: Into<OsString>, S: Into<String>>(&mut self,
-                                                               bin_name: S,
-                                                               for_shell: Shell,
-                                                               out_dir: T) {
+    pub fn gen_completions<T: Into<OsString>, S: Into<String>>(
+        &mut self,
+        bin_name: S,
+        for_shell: Shell,
+        out_dir: T,
+    ) {
         self.p.meta.bin_name = Some(bin_name.into());
         self.p.gen_completions(for_shell, out_dir.into());
     }
 
 
     /// Generate a completions file for a specified shell at runtime.  Until `cargo install` can
     /// install extra files like a completion script, this may be used e.g. in a command that
     /// outputs the contents of the completion script, to be redirected into a file by the user.
@@ -1414,22 +1423,24 @@ impl<'a, 'b> App<'a, 'b> {
     ///     // normal logic continues...
     /// }
     ///
     /// ```
     ///
     /// Usage:
     ///
     /// ```shell
-    /// $ myapp generate-bash-completions > /etc/bash_completion.d/myapp
+    /// $ myapp generate-bash-completions > /usr/share/bash-completion/completions/myapp.bash
     /// ```
-    pub fn gen_completions_to<W: Write, S: Into<String>>(&mut self,
-                                                         bin_name: S,
-                                                         for_shell: Shell,
-                                                         buf: &mut W) {
+    pub fn gen_completions_to<W: Write, S: Into<String>>(
+        &mut self,
+        bin_name: S,
+        for_shell: Shell,
+        buf: &mut W,
+    ) {
         self.p.meta.bin_name = Some(bin_name.into());
         self.p.gen_completions_to(for_shell, buf);
     }
 
     /// Starts the parsing process, upon a failed parse an error will be displayed to the user and
     /// the process will exit with the appropriate error code. By default this method gets all user
     /// provided arguments from [`env::args_os`] in order to allow for invalid UTF-8 code points,
     /// which are legal on many platforms.
@@ -1492,18 +1503,19 @@ impl<'a, 'b> App<'a, 'b> {
     ///     // Args and options go here...
     ///     .get_matches_from(arg_vec);
     /// ```
     /// [`App::get_matches`]: ./struct.App.html#method.get_matches
     /// [`clap::Result`]: ./type.Result.html
     /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
     /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
     pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches<'a>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<OsString> + Clone,
     {
         self.get_matches_from_safe_borrow(itr).unwrap_or_else(|e| {
             // Otherwise, write to stderr and exit
             if e.use_stderr() {
                 wlnerr!("{}", e.message);
                 if self.p.is_set(AppSettings::WaitOnError) {
                     wlnerr!("\nPress [ENTER] / [RETURN] to continue...");
                     let mut s = String::new();
@@ -1548,18 +1560,19 @@ impl<'a, 'b> App<'a, 'b> {
     /// [`ErrorKind::VersionDisplayed`]: ./enum.ErrorKind.html#variant.VersionDisplayed
     /// [`Error::exit`]: ./struct.Error.html#method.exit
     /// [`std::process::exit`]: https://doc.rust-lang.org/std/process/fn.exit.html
     /// [`clap::Error`]: ./struct.Error.html
     /// [`Error::exit`]: ./struct.Error.html#method.exit
     /// [`kind`]: ./struct.Error.html
     /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
     pub fn get_matches_from_safe<I, T>(mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<OsString> + Clone,
     {
         self.get_matches_from_safe_borrow(itr)
     }
 
     /// Starts the parsing process without consuming the [`App`] struct `self`. This is normally not
     /// the desired functionality, instead prefer [`App::get_matches_from_safe`] which *does*
     /// consume `self`.
     ///
@@ -1576,18 +1589,19 @@ impl<'a, 'b> App<'a, 'b> {
     ///     // Args and options go here...
     /// let matches = app.get_matches_from_safe_borrow(arg_vec)
     ///     .unwrap_or_else( |e| { panic!("An error occurs: {}", e) });
     /// ```
     /// [`App`]: ./struct.App.html
     /// [`App::get_matches_from_safe`]: ./struct.App.html#method.get_matches_from_safe
     /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
     pub fn get_matches_from_safe_borrow<I, T>(&mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-        where I: IntoIterator<Item = T>,
-              T: Into<OsString> + Clone
+    where
+        I: IntoIterator<Item = T>,
+        T: Into<OsString> + Clone,
     {
         // If there are global arguments, or settings we need to propgate them down to subcommands
         // before parsing incase we run into a subcommand
         if !self.p.is_set(AppSettings::Propagated) {
             self.p.propagate_globals();
             self.p.propagate_settings();
             self.p.derive_display_order();
             self.p.set(AppSettings::Propagated);
@@ -1617,17 +1631,17 @@ impl<'a, 'b> App<'a, 'b> {
             }
         }
 
         // do the real parsing
         if let Err(e) = self.p.get_matches_with(&mut matcher, &mut it.peekable()) {
             return Err(e);
         }
 
-        let global_arg_vec : Vec<&str> = (&self).p.global_args.iter().map(|ga| ga.b.name).collect();
+        let global_arg_vec: Vec<&str> = (&self).p.global_args.iter().map(|ga| ga.b.name).collect();
         matcher.propagate_globals(&global_arg_vec);
 
         Ok(matcher.into())
     }
 }
 
 #[cfg(feature = "yaml")]
 impl<'a> From<&'a Yaml> for App<'a, 'a> {
@@ -1669,55 +1683,64 @@ impl<'a> From<&'a Yaml> for App<'a, 'a> 
         yaml_str!(a, yaml, help_message);
         yaml_str!(a, yaml, version_message);
         yaml_str!(a, yaml, alias);
         yaml_str!(a, yaml, visible_alias);
 
         if let Some(v) = yaml["display_order"].as_i64() {
             a = a.display_order(v as usize);
         } else if yaml["display_order"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a u64",
-                   yaml["display_order"]);
+            panic!(
+                "Failed to convert YAML value {:?} to a u64",
+                yaml["display_order"]
+            );
         }
         if let Some(v) = yaml["setting"].as_str() {
             a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
         } else if yaml["setting"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to an AppSetting",
-                   yaml["setting"]);
+            panic!(
+                "Failed to convert YAML value {:?} to an AppSetting",
+                yaml["setting"]
+            );
         }
         if let Some(v) = yaml["settings"].as_vec() {
             for ys in v {
                 if let Some(s) = ys.as_str() {
                     a = a.setting(s.parse().expect("unknown AppSetting found in YAML file"));
                 }
             }
         } else if let Some(v) = yaml["settings"].as_str() {
             a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
         } else if yaml["settings"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a string",
-                   yaml["settings"]);
+            panic!(
+                "Failed to convert YAML value {:?} to a string",
+                yaml["settings"]
+            );
         }
         if let Some(v) = yaml["global_setting"].as_str() {
             a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
         } else if yaml["global_setting"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to an AppSetting",
-                   yaml["setting"]);
+            panic!(
+                "Failed to convert YAML value {:?} to an AppSetting",
+                yaml["setting"]
+            );
         }
         if let Some(v) = yaml["global_settings"].as_vec() {
             for ys in v {
                 if let Some(s) = ys.as_str() {
-                    a = a.global_setting(s.parse()
-                        .expect("unknown AppSetting found in YAML file"));
+                    a = a.global_setting(s.parse().expect("unknown AppSetting found in YAML file"));
                 }
             }
         } else if let Some(v) = yaml["global_settings"].as_str() {
             a = a.global_setting(v.parse().expect("unknown AppSetting found in YAML file"));
         } else if yaml["global_settings"] != Yaml::BadValue {
-            panic!("Failed to convert YAML value {:?} to a string",
-                   yaml["global_settings"]);
+            panic!(
+                "Failed to convert YAML value {:?} to a string",
+                yaml["global_settings"]
+            );
         }
 
         macro_rules! vec_or_str {
             ($a:ident, $y:ident, $as_vec:ident, $as_single:ident) => {{
                     let maybe_vec = $y[stringify!($as_vec)].as_vec();
                     if let Some(vec) = maybe_vec {
                         for ys in vec {
                             if let Some(s) = ys.as_str() {
@@ -1795,18 +1818,20 @@ impl<'n, 'e> AnyArg<'n, 'e> for App<'n, 
     fn default_val(&self) -> Option<&'e OsStr> { None }
     fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
         None
     }
     fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> { None }
     fn longest_filter(&self) -> bool { true }
     fn aliases(&self) -> Option<Vec<&'e str>> {
         if let Some(ref aliases) = self.p.meta.aliases {
-            let vis_aliases: Vec<_> =
-                aliases.iter().filter_map(|&(n, v)| if v { Some(n) } else { None }).collect();
+            let vis_aliases: Vec<_> = aliases
+                .iter()
+                .filter_map(|&(n, v)| if v { Some(n) } else { None })
+                .collect();
             if vis_aliases.is_empty() {
                 None
             } else {
                 Some(vis_aliases)
             }
         } else {
             None
         }
--- a/third_party/rust/clap/src/app/parser.rs
+++ b/third_party/rust/clap/src/app/parser.rs
@@ -12,17 +12,17 @@ use std::iter::Peekable;
 // Internal
 use INTERNAL_ERROR_MSG;
 use INVALID_UTF8;
 use SubCommand;
 use app::App;
 use app::help::Help;
 use app::meta::AppMeta;
 use app::settings::AppFlags;
-use args::{AnyArg, ArgMatcher, Base, Switched, Arg, ArgGroup, FlagBuilder, OptBuilder, PosBuilder};
+use args::{AnyArg, Arg, ArgGroup, ArgMatcher, Base, FlagBuilder, OptBuilder, PosBuilder, Switched};
 use args::settings::ArgSettings;
 use completions::ComplGen;
 use errors::{Error, ErrorKind};
 use errors::Result as ClapResult;
 use fmt::ColorWhen;
 use osstringext::OsStrExt2;
 use completions::Shell;
 use suggestions;
@@ -42,17 +42,18 @@ pub enum ParseResult<'a> {
     NotFound,
     ValuesDone,
 }
 
 #[allow(missing_debug_implementations)]
 #[doc(hidden)]
 #[derive(Clone, Default)]
 pub struct Parser<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     pub meta: AppMeta<'b>,
     settings: AppFlags,
     pub g_settings: AppFlags,
     pub flags: Vec<FlagBuilder<'a, 'b>>,
     pub opts: Vec<OptBuilder<'a, 'b>>,
     pub positionals: VecMap<PosBuilder<'a, 'b>>,
     pub subcommands: Vec<App<'a, 'b>>,
@@ -65,21 +66,23 @@ pub struct Parser<'a, 'b>
     help_short: Option<char>,
     version_short: Option<char>,
     cache: Option<&'a str>,
     pub help_message: Option<&'a str>,
     pub version_message: Option<&'a str>,
 }
 
 impl<'a, 'b> Parser<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     pub fn with_name(n: String) -> Self {
         Parser {
             meta: AppMeta::with_name(n),
+            g_settings: AppFlags::zeroed(),
             ..Default::default()
         }
     }
 
     pub fn help_short(&mut self, s: &str) {
         let c = s.trim_left_matches(|c| c == '-')
             .chars()
             .nth(0)
@@ -108,105 +111,111 @@ impl<'a, 'b> Parser<'a, 'b>
     }
 
     pub fn gen_completions(&mut self, for_shell: Shell, od: OsString) {
         use std::error::Error;
 
         let out_dir = PathBuf::from(od);
         let name = &*self.meta.bin_name.as_ref().unwrap().clone();
         let file_name = match for_shell {
-            Shell::Bash => format!("{}.bash-completion", name),
+            Shell::Bash => format!("{}.bash", name),
             Shell::Fish => format!("{}.fish", name),
             Shell::Zsh => format!("_{}", name),
             Shell::PowerShell => format!("_{}.ps1", name),
         };
 
         let mut file = match File::create(out_dir.join(file_name)) {
             Err(why) => panic!("couldn't create completion file: {}", why.description()),
             Ok(file) => file,
         };
         self.gen_completions_to(for_shell, &mut file)
     }
 
     #[inline]
     fn app_debug_asserts(&mut self) -> bool {
         assert!(self.verify_positionals());
-        let should_err = self.groups
-            .iter()
-            .all(|g| {
-                g.args
-                    .iter()
-                    .all(|arg| {
-                             (self.flags.iter().any(|f| &f.b.name == arg) ||
-                              self.opts.iter().any(|o| &o.b.name == arg) ||
-                              self.positionals.values().any(|p| &p.b.name == arg) ||
-                              self.groups.iter().any(|g| &g.name == arg))
-                         })
-            });
-        let g = self.groups
-            .iter()
-            .find(|g| {
-                g.args
-                    .iter()
-                    .any(|arg| {
-                             !(self.flags.iter().any(|f| &f.b.name == arg) ||
-                               self.opts.iter().any(|o| &o.b.name == arg) ||
-                               self.positionals.values().any(|p| &p.b.name == arg) ||
-                               self.groups.iter().any(|g| &g.name == arg))
-                         })
-            });
-        assert!(should_err,
-                "The group '{}' contains the arg '{}' that doesn't actually exist.",
-                g.unwrap().name,
-                g.unwrap()
-                    .args
-                    .iter()
-                    .find(|arg| {
-                              !(self.flags.iter().any(|f| &&f.b.name == arg) ||
-                                self.opts.iter().any(|o| &&o.b.name == arg) ||
-                                self.positionals.values().any(|p| &&p.b.name == arg) ||
-                                self.groups.iter().any(|g| &&g.name == arg))
-                          })
-                    .unwrap());
+        let should_err = self.groups.iter().all(|g| {
+            g.args.iter().all(|arg| {
+                (self.flags.iter().any(|f| &f.b.name == arg)
+                    || self.opts.iter().any(|o| &o.b.name == arg)
+                    || self.positionals.values().any(|p| &p.b.name == arg)
+                    || self.groups.iter().any(|g| &g.name == arg))
+            })
+        });
+        let g = self.groups.iter().find(|g| {
+            g.args.iter().any(|arg| {
+                !(self.flags.iter().any(|f| &f.b.name == arg)
+                    || self.opts.iter().any(|o| &o.b.name == arg)
+                    || self.positionals.values().any(|p| &p.b.name == arg)
+                    || self.groups.iter().any(|g| &g.name == arg))
+            })
+        });
+        assert!(
+            should_err,
+            "The group '{}' contains the arg '{}' that doesn't actually exist.",
+            g.unwrap().name,
+            g.unwrap()
+                .args
+                .iter()
+                .find(|arg| {
+                    !(self.flags.iter().any(|f| &&f.b.name == arg)
+                        || self.opts.iter().any(|o| &&o.b.name == arg)
+                        || self.positionals.values().any(|p| &&p.b.name == arg)
+                        || self.groups.iter().any(|g| &&g.name == arg))
+                })
+                .unwrap()
+        );
         true
     }
 
     #[inline]
     fn debug_asserts(&self, a: &Arg) -> bool {
-        assert!(!arg_names!(self).any(|name| name == a.b.name),
-                format!("Non-unique argument name: {} is already in use", a.b.name));
+        assert!(
+            !arg_names!(self).any(|name| name == a.b.name),
+            format!("Non-unique argument name: {} is already in use", a.b.name)
+        );
         if let Some(l) = a.s.long {
-            assert!(!self.contains_long(l),
-                    "Argument long must be unique\n\n\t--{} is already in use",
-                    l);
+            assert!(
+                !self.contains_long(l),
+                "Argument long must be unique\n\n\t--{} is already in use",
+                l
+            );
         }
         if let Some(s) = a.s.short {
-            assert!(!self.contains_short(s),
-                    "Argument short must be unique\n\n\t-{} is already in use",
-                    s);
+            assert!(
+                !self.contains_short(s),
+                "Argument short must be unique\n\n\t-{} is already in use",
+                s
+            );
         }
         let i = if a.index.is_none() {
             (self.positionals.len() + 1)
         } else {
             a.index.unwrap() as usize
         };
-        assert!(!self.positionals.contains_key(i),
-                "Argument \"{}\" has the same index as another positional \
-                    argument\n\n\tPerhaps try .multiple(true) to allow one positional argument \
-                    to take multiple values",
-                a.b.name);
-        assert!(!(a.is_set(ArgSettings::Required) && a.is_set(ArgSettings::Global)),
-                "Global arguments cannot be required.\n\n\t'{}' is marked as \
-                          global and required",
-                a.b.name);
+        assert!(
+            !self.positionals.contains_key(i),
+            "Argument \"{}\" has the same index as another positional \
+             argument\n\n\tPerhaps try .multiple(true) to allow one positional argument \
+             to take multiple values",
+            a.b.name
+        );
+        assert!(
+            !(a.is_set(ArgSettings::Required) && a.is_set(ArgSettings::Global)),
+            "Global arguments cannot be required.\n\n\t'{}' is marked as \
+             global and required",
+            a.b.name
+        );
         if a.b.is_set(ArgSettings::Last) {
-            assert!(!self.positionals
-                         .values()
-                         .any(|p| p.b.is_set(ArgSettings::Last)),
-                    "Only one positional argument may have last(true) set. Found two.");
+            assert!(
+                !self.positionals
+                    .values()
+                    .any(|p| p.b.is_set(ArgSettings::Last)),
+                "Only one positional argument may have last(true) set. Found two."
+            );
             assert!(a.s.long.is_none(),
                     "Flags or Options may not have last(true) set. {} has both a long and last(true) set.",
                     a.b.name);
             assert!(a.s.short.is_none(),
                     "Flags or Options may not have last(true) set. {} has both a short and last(true) set.",
                     a.b.name);
         }
         true
@@ -240,19 +249,20 @@ impl<'a, 'b> Parser<'a, 'b>
     }
 
     #[inline]
     fn add_reqs(&mut self, a: &Arg<'a, 'b>) {
         if a.is_set(ArgSettings::Required) {
             // If the arg is required, add all it's requirements to master required list
             if let Some(ref areqs) = a.b.requires {
                 for name in areqs
-                        .iter()
-                        .filter(|&&(val, _)| val.is_none())
-                        .map(|&(_, name)| name) {
+                    .iter()
+                    .filter(|&&(val, _)| val.is_none())
+                    .map(|&(_, name)| name)
+                {
                     self.required.push(name);
                 }
             }
             self.required.push(a.b.name);
         }
     }
 
     #[inline]
@@ -350,36 +360,42 @@ impl<'a, 'b> Parser<'a, 'b>
             grp.conflicts = group.conflicts.clone();
             grp.required = group.required;
         } else {
             self.groups.push(group);
         }
     }
 
     pub fn add_subcommand(&mut self, mut subcmd: App<'a, 'b>) {
-        debugln!("Parser::add_subcommand: term_w={:?}, name={}",
-                 self.meta.term_w,
-                 subcmd.p.meta.name);
+        debugln!(
+            "Parser::add_subcommand: term_w={:?}, name={}",
+            self.meta.term_w,
+            subcmd.p.meta.name
+        );
         subcmd.p.meta.term_w = self.meta.term_w;
         if subcmd.p.meta.name == "help" {
             self.unset(AS::NeedsSubcommandHelp);
         }
 
         self.subcommands.push(subcmd);
     }
 
     pub fn propagate_settings(&mut self) {
-        debugln!("Parser::propagate_settings: self={}, g_settings={:#?}",
-                 self.meta.name,
-                 self.g_settings);
+        debugln!(
+            "Parser::propagate_settings: self={}, g_settings={:#?}",
+            self.meta.name,
+            self.g_settings
+        );
         for sc in &mut self.subcommands {
-            debugln!("Parser::propagate_settings: sc={}, settings={:#?}, g_settings={:#?}",
-                     sc.p.meta.name,
-                     sc.p.settings,
-                     sc.p.g_settings);
+            debugln!(
+                "Parser::propagate_settings: sc={}, settings={:#?}, g_settings={:#?}",
+                sc.p.meta.name,
+                sc.p.settings,
+                sc.p.g_settings
+            );
             // We have to create a new scope in order to tell rustc the borrow of `sc` is
             // done and to recursively call this method
             {
                 let vsc = self.settings.is_set(AS::VersionlessSubcommands);
                 let gv = self.settings.is_set(AS::GlobalVersion);
 
                 if vsc {
                     sc.p.set(AS::DisableVersion);
@@ -397,31 +413,34 @@ impl<'a, 'b> Parser<'a, 'b>
         }
     }
 
     #[cfg_attr(feature = "lints", allow(needless_borrow))]
     pub fn derive_display_order(&mut self) {
         if self.is_set(AS::DeriveDisplayOrder) {
             let unified = self.is_set(AS::UnifiedHelpMessage);
             for (i, o) in self.opts
-                    .iter_mut()
-                    .enumerate()
-                    .filter(|&(_, ref o)| o.s.disp_ord == 999) {
+                .iter_mut()
+                .enumerate()
+                .filter(|&(_, ref o)| o.s.disp_ord == 999)
+            {
                 o.s.disp_ord = if unified { o.s.unified_ord } else { i };
             }
             for (i, f) in self.flags
-                    .iter_mut()
-                    .enumerate()
-                    .filter(|&(_, ref f)| f.s.disp_ord == 999) {
+                .iter_mut()
+                .enumerate()
+                .filter(|&(_, ref f)| f.s.disp_ord == 999)
+            {
                 f.s.disp_ord = if unified { f.s.unified_ord } else { i };
             }
             for (i, sc) in &mut self.subcommands
-                                    .iter_mut()
-                                    .enumerate()
-                                    .filter(|&(_, ref sc)| sc.p.meta.disp_ord == 999) {
+                .iter_mut()
+                .enumerate()
+                .filter(|&(_, ref sc)| sc.p.meta.disp_ord == 999)
+            {
                 sc.p.meta.disp_ord = i;
             }
         }
         for sc in &mut self.subcommands {
             sc.p.derive_display_order();
         }
     }
 
@@ -468,17 +487,21 @@ impl<'a, 'b> Parser<'a, 'b>
         }
         self.positionals
             .values()
             .any(|p| !p.is_set(ArgSettings::Hidden))
     }
 
     #[inline]
     pub fn has_visible_subcommands(&self) -> bool {
-        self.has_subcommands() && self.subcommands.iter().filter(|sc| sc.p.meta.name != "help").any(|sc| !sc.p.is_set(AS::Hidden))
+        self.has_subcommands()
+            && self.subcommands
+                .iter()
+                .filter(|sc| sc.p.meta.name != "help")
+                .any(|sc| !sc.p.is_set(AS::Hidden))
     }
 
     #[inline]
     pub fn is_set(&self, s: AS) -> bool { self.settings.is_set(s) }
 
     #[inline]
     pub fn set(&mut self, s: AS) { self.settings.set(s) }
 
@@ -489,76 +512,85 @@ impl<'a, 'b> Parser<'a, 'b>
     pub fn verify_positionals(&mut self) -> bool {
         // Because you must wait until all arguments have been supplied, this is the first chance
         // to make assertions on positional argument indexes
         //
         // Firt we verify that the index highest supplied index, is equal to the number of
         // positional arguments to verify there are no gaps (i.e. supplying an index of 1 and 3
         // but no 2)
         if let Some((idx, p)) = self.positionals.iter().rev().next() {
-            assert!(!(idx != self.positionals.len()),
-                    "Found positional argument \"{}\" whose index is {} but there \
-                          are only {} positional arguments defined",
-                    p.b.name,
-                    idx,
-                    self.positionals.len());
+            assert!(
+                !(idx != self.positionals.len()),
+                "Found positional argument \"{}\" whose index is {} but there \
+                 are only {} positional arguments defined",
+                p.b.name,
+                idx,
+                self.positionals.len()
+            );
         }
 
         // Next we verify that only the highest index has a .multiple(true) (if any)
-        if self.positionals
-               .values()
-               .any(|a| {
-                        a.b.is_set(ArgSettings::Multiple) &&
-                        (a.index as usize != self.positionals.len())
-                    }) {
+        if self.positionals.values().any(|a| {
+            a.b.is_set(ArgSettings::Multiple) && (a.index as usize != self.positionals.len())
+        }) {
             let mut it = self.positionals.values().rev();
             let last = it.next().unwrap();
             let second_to_last = it.next().unwrap();
             // Either the final positional is required
             // Or the second to last has a terminator or .last(true) set
-            let ok = last.is_set(ArgSettings::Required) ||
-                     (second_to_last.v.terminator.is_some() ||
-                      second_to_last.b.is_set(ArgSettings::Last)) ||
-                     last.is_set(ArgSettings::Last);
-            assert!(ok,
-                    "When using a positional argument with .multiple(true) that is *not the \
-                          last* positional argument, the last positional argument (i.e the one \
-                          with the highest index) *must* have .required(true) or .last(true) set.");
+            let ok = last.is_set(ArgSettings::Required)
+                || (second_to_last.v.terminator.is_some()
+                    || second_to_last.b.is_set(ArgSettings::Last))
+                || last.is_set(ArgSettings::Last);
+            assert!(
+                ok,
+                "When using a positional argument with .multiple(true) that is *not the \
+                 last* positional argument, the last positional argument (i.e the one \
+                 with the highest index) *must* have .required(true) or .last(true) set."
+            );
             let ok = second_to_last.is_set(ArgSettings::Multiple) || last.is_set(ArgSettings::Last);
-            assert!(ok,
-                    "Only the last positional argument, or second to last positional \
-                          argument may be set to .multiple(true)");
+            assert!(
+                ok,
+                "Only the last positional argument, or second to last positional \
+                 argument may be set to .multiple(true)"
+            );
 
             let count = self.positionals
                 .values()
-                .filter(|p| p.b.settings.is_set(ArgSettings::Multiple) && p.v.num_vals.is_none())
+                .filter(|p| {
+                    p.b.settings.is_set(ArgSettings::Multiple) && p.v.num_vals.is_none()
+                })
                 .count();
-            let ok = count <= 1 ||
-                     (last.is_set(ArgSettings::Last) && last.is_set(ArgSettings::Multiple) &&
-                      second_to_last.is_set(ArgSettings::Multiple) &&
-                      count == 2);
-            assert!(ok,
-                    "Only one positional argument with .multiple(true) set is allowed per \
-                        command, unless the second one also has .last(true) set");
+            let ok = count <= 1
+                || (last.is_set(ArgSettings::Last) && last.is_set(ArgSettings::Multiple)
+                    && second_to_last.is_set(ArgSettings::Multiple)
+                    && count == 2);
+            assert!(
+                ok,
+                "Only one positional argument with .multiple(true) set is allowed per \
+                 command, unless the second one also has .last(true) set"
+            );
         }
 
 
         if self.is_set(AS::AllowMissingPositional) {
             // Check that if a required positional argument is found, all positions with a lower
             // index are also required.
             let mut found = false;
             let mut foundx2 = false;
             for p in self.positionals.values().rev() {
                 if foundx2 && !p.b.settings.is_set(ArgSettings::Required) {
-                    assert!(p.b.is_set(ArgSettings::Required),
-                            "Found positional argument which is not required with a lower \
-                                  index than a required positional argument by two or more: {:?} \
-                                  index {}",
-                            p.b.name,
-                            p.index);
+                    assert!(
+                        p.b.is_set(ArgSettings::Required),
+                        "Found positional argument which is not required with a lower \
+                         index than a required positional argument by two or more: {:?} \
+                         index {}",
+                        p.b.name,
+                        p.index
+                    );
                 } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
                     // Args that .last(true) don't count since they can be required and have
                     // positionals with a lower index that aren't required
                     // Imagine: prog <req1> [opt1] -- <req2>
                     // Both of these are valid invocations:
                     //      $ prog r1 -- r2
                     //      $ prog r1 o1 -- r2
                     if found {
@@ -572,41 +604,43 @@ impl<'a, 'b> Parser<'a, 'b>
                 }
             }
         } else {
             // Check that if a required positional argument is found, all positions with a lower
             // index are also required
             let mut found = false;
             for p in self.positionals.values().rev() {
                 if found {
-                    assert!(p.b.is_set(ArgSettings::Required),
-                            "Found positional argument which is not required with a lower \
-                                  index than a required positional argument: {:?} index {}",
-                            p.b.name,
-                            p.index);
+                    assert!(
+                        p.b.is_set(ArgSettings::Required),
+                        "Found positional argument which is not required with a lower \
+                         index than a required positional argument: {:?} index {}",
+                        p.b.name,
+                        p.index
+                    );
                 } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
                     // Args that .last(true) don't count since they can be required and have
                     // positionals with a lower index that aren't required
                     // Imagine: prog <req1> [opt1] -- <req2>
                     // Both of these are valid invocations:
                     //      $ prog r1 -- r2
                     //      $ prog r1 o1 -- r2
                     found = true;
                     continue;
                 }
             }
         }
-        if self.positionals
-               .values()
-               .any(|p| {
-                        p.b.is_set(ArgSettings::Last) && p.b.is_set(ArgSettings::Required)
-                    }) && self.has_subcommands() &&
-           !self.is_set(AS::SubcommandsNegateReqs) {
-            panic!("Having a required positional argument with .last(true) set *and* child \
-            subcommands without setting SubcommandsNegateReqs isn't compatible.");
+        if self.positionals.values().any(|p| {
+            p.b.is_set(ArgSettings::Last) && p.b.is_set(ArgSettings::Required)
+        }) && self.has_subcommands() && !self.is_set(AS::SubcommandsNegateReqs)
+        {
+            panic!(
+                "Having a required positional argument with .last(true) set *and* child \
+                 subcommands without setting SubcommandsNegateReqs isn't compatible."
+            );
         }
 
         true
     }
 
     pub fn propagate_globals(&mut self) {
         for sc in &mut self.subcommands {
             // We have to create a new scope in order to tell rustc the borrow of `sc` is
@@ -641,40 +675,41 @@ impl<'a, 'b> Parser<'a, 'b>
         if !self.is_set(AS::InferSubcommands) {
             if let Some(sc) = find_subcmd!(self, arg_os) {
                 return (true, Some(&sc.p.meta.name));
             }
         } else {
             let v = self.subcommands
                 .iter()
                 .filter(|s| {
-                    starts(&s.p.meta.name[..], &*arg_os) ||
-                    (s.p.meta.aliases.is_some() &&
-                     s.p
-                         .meta
-                         .aliases
-                         .as_ref()
-                         .unwrap()
-                         .iter()
-                         .filter(|&&(a, _)| starts(a, &*arg_os))
-                         .count() == 1)
+                    starts(&s.p.meta.name[..], &*arg_os)
+                        || (s.p.meta.aliases.is_some()
+                            && s.p
+                                .meta
+                                .aliases
+                                .as_ref()
+                                .unwrap()
+                                .iter()
+                                .filter(|&&(a, _)| starts(a, &*arg_os))
+                                .count() == 1)
                 })
                 .map(|sc| &sc.p.meta.name)
                 .collect::<Vec<_>>();
 
             if v.len() == 1 {
                 return (true, Some(v[0]));
             }
         }
         (false, None)
     }
 
     fn parse_help_subcommand<I, T>(&self, it: &mut I) -> ClapResult<ParseResult<'a>>
-        where I: Iterator<Item = T>,
-              T: Into<OsString>
+    where
+        I: Iterator<Item = T>,
+        T: Into<OsString>,
     {
         debugln!("Parser::parse_help_subcommand;");
         let cmds: Vec<OsString> = it.map(|c| c.into()).collect();
         let mut help_help = false;
         let mut bin_name = self.meta
             .bin_name
             .as_ref()
             .unwrap_or(&self.meta.name)
@@ -682,42 +717,45 @@ impl<'a, 'b> Parser<'a, 'b>
         let mut sc = {
             let mut sc: &Parser = self;
             for (i, cmd) in cmds.iter().enumerate() {
                 if &*cmd.to_string_lossy() == "help" {
                     // cmd help help
                     help_help = true;
                 }
                 if let Some(c) = sc.subcommands
-                       .iter()
-                       .find(|s| &*s.p.meta.name == cmd)
-                       .map(|sc| &sc.p) {
+                    .iter()
+                    .find(|s| &*s.p.meta.name == cmd)
+                    .map(|sc| &sc.p)
+                {
                     sc = c;
                     if i == cmds.len() - 1 {
                         break;
                     }
                 } else if let Some(c) = sc.subcommands
-                              .iter()
-                              .find(|s| if let Some(ref als) = s.p.meta.aliases {
-                                        als.iter().any(|&(a, _)| a == &*cmd.to_string_lossy())
-                                    } else {
-                                        false
-                                    })
-                              .map(|sc| &sc.p) {
+                    .iter()
+                    .find(|s| {
+                        if let Some(ref als) = s.p.meta.aliases {
+                            als.iter().any(|&(a, _)| a == &*cmd.to_string_lossy())
+                        } else {
+                            false
+                        }
+                    })
+                    .map(|sc| &sc.p)
+                {
                     sc = c;
                     if i == cmds.len() - 1 {
                         break;
                     }
                 } else {
-                    return Err(Error::unrecognized_subcommand(cmd.to_string_lossy().into_owned(),
-                                                              self.meta
-                                                                  .bin_name
-                                                                  .as_ref()
-                                                                  .unwrap_or(&self.meta.name),
-                                                              self.color()));
+                    return Err(Error::unrecognized_subcommand(
+                        cmd.to_string_lossy().into_owned(),
+                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
+                        self.color(),
+                    ));
                 }
                 bin_name = format!("{} {}", bin_name, &*sc.meta.name);
             }
             sc.clone()
         };
         if help_help {
             let mut pb = PosBuilder::new("subcommand", 1);
             pb.b.help = Some("The subcommand whose help message to display");
@@ -731,19 +769,21 @@ impl<'a, 'b> Parser<'a, 'b>
             sc.meta.bin_name = Some(format!("{} {}", bin_name, sc.meta.name));
         }
         Err(sc._help(false))
     }
 
     // allow wrong self convention due to self.valid_neg_num = true and it's a private method
     #[cfg_attr(feature = "lints", allow(wrong_self_convention))]
     fn is_new_arg(&mut self, arg_os: &OsStr, needs_val_of: ParseResult<'a>) -> bool {
-        debugln!("Parser::is_new_arg: arg={:?}, Needs Val of={:?}",
-                 arg_os,
-                 needs_val_of);
+        debugln!(
+            "Parser::is_new_arg: arg={:?}, Needs Val of={:?}",
+            arg_os,
+            needs_val_of
+        );
         let app_wide_settings = if self.is_set(AS::AllowLeadingHyphen) {
             true
         } else if self.is_set(AS::AllowNegativeNumbers) {
             let a = arg_os.to_string_lossy();
             if a.parse::<i64>().is_ok() || a.parse::<f64>().is_ok() {
                 self.set(AS::ValidNegNumFound);
                 true
             } else {
@@ -764,18 +804,20 @@ impl<'a, 'b> Parser<'a, 'b>
                 let p = self.positionals
                     .values()
                     .find(|p| p.b.name == name)
                     .expect(INTERNAL_ERROR_MSG);
                 (p.is_set(ArgSettings::AllowLeadingHyphen) || app_wide_settings)
             }
             _ => false,
         };
-        debugln!("Parser::is_new_arg: Arg::allow_leading_hyphen({:?})",
-                 arg_allows_tac);
+        debugln!(
+            "Parser::is_new_arg: Arg::allow_leading_hyphen({:?})",
+            arg_allows_tac
+        );
 
         // Is this a new argument, or values from a previous option?
         let mut ret = if arg_os.starts_with(b"--") {
             debugln!("Parser::is_new_arg: -- found");
             if arg_os.len_() == 2 && !arg_allows_tac {
                 return true; // We have to return true so override everything else
             } else if arg_allows_tac {
                 return false;
@@ -793,299 +835,310 @@ impl<'a, 'b> Parser<'a, 'b>
         ret = ret && !arg_allows_tac;
 
         debugln!("Parser::is_new_arg: starts_new_arg={:?}", ret);
         ret
     }
 
     // The actual parsing function
     #[cfg_attr(feature = "lints", allow(while_let_on_iterator, collapsible_if))]
-    pub fn get_matches_with<I, T>(&mut self,
-                                  matcher: &mut ArgMatcher<'a>,
-                                  it: &mut Peekable<I>)
-                                  -> ClapResult<()>
-        where I: Iterator<Item = T>,
-              T: Into<OsString> + Clone
+    pub fn get_matches_with<I, T>(
+        &mut self,
+        matcher: &mut ArgMatcher<'a>,
+        it: &mut Peekable<I>,
+    ) -> ClapResult<()>
+    where
+        I: Iterator<Item = T>,
+        T: Into<OsString> + Clone,
     {
         debugln!("Parser::get_matches_with;");
         // Verify all positional assertions pass
         debug_assert!(self.app_debug_asserts());
-        if self.positionals
-               .values()
-               .any(|a| {
-                        a.b.is_set(ArgSettings::Multiple) &&
-                        (a.index as usize != self.positionals.len())
-                    }) &&
-           self.positionals
-               .values()
-               .last()
-               .map_or(false, |p| !p.is_set(ArgSettings::Last)) {
+        if self.positionals.values().any(|a| {
+            a.b.is_set(ArgSettings::Multiple) && (a.index as usize != self.positionals.len())
+        })
+            && self.positionals
+                .values()
+                .last()
+                .map_or(false, |p| !p.is_set(ArgSettings::Last))
+        {
             self.settings.set(AS::LowIndexMultiplePositional);
         }
         let has_args = self.has_args();
 
         // Next we create the `--help` and `--version` arguments and add them if
         // necessary
         self.create_help_and_version();
 
         let mut subcmd_name: Option<String> = None;
         let mut needs_val_of: ParseResult<'a> = ParseResult::NotFound;
         let mut pos_counter = 1;
         while let Some(arg) = it.next() {
             let arg_os = arg.into();
-            debugln!("Parser::get_matches_with: Begin parsing '{:?}' ({:?})",
-                     arg_os,
-                     &*arg_os.as_bytes());
+            debugln!(
+                "Parser::get_matches_with: Begin parsing '{:?}' ({:?})",
+                arg_os,
+                &*arg_os.as_bytes()
+            );
 
             self.unset(AS::ValidNegNumFound);
             // Is this a new argument, or values from a previous option?
             let starts_new_arg = self.is_new_arg(&arg_os, needs_val_of);
             if arg_os.starts_with(b"--") && arg_os.len_() == 2 && starts_new_arg {
                 debugln!("Parser::get_matches_with: setting TrailingVals=true");
                 self.set(AS::TrailingValues);
                 continue;
             }
 
             // Has the user already passed '--'? Meaning only positional args follow
             if !self.is_set(AS::TrailingValues) {
                 // Does the arg match a subcommand name, or any of it's aliases (if defined)
                 {
                     match needs_val_of {
-                        ParseResult::Opt(_) | ParseResult::Pos(_) =>(),
+                        ParseResult::Opt(_) | ParseResult::Pos(_) => (),
                         _ => {
                             let (is_match, sc_name) = self.possible_subcommand(&arg_os);
-                            debugln!("Parser::get_matches_with: possible_sc={:?}, sc={:?}",
-                                    is_match,
-                                    sc_name);
+                            debugln!(
+                                "Parser::get_matches_with: possible_sc={:?}, sc={:?}",
+                                is_match,
+                                sc_name
+                            );
                             if is_match {
                                 let sc_name = sc_name.expect(INTERNAL_ERROR_MSG);
                                 if sc_name == "help" && self.is_set(AS::NeedsSubcommandHelp) {
                                     self.parse_help_subcommand(it)?;
                                 }
                                 subcmd_name = Some(sc_name.to_owned());
                                 break;
                             }
                         }
                     }
                 }
 
                 if !starts_new_arg {
                     if let ParseResult::Opt(name) = needs_val_of {
-                            // Check to see if parsing a value from a previous arg
-                            let arg = self.opts
-                                .iter()
-                                .find(|o| o.b.name == name)
-                                .expect(INTERNAL_ERROR_MSG);
-                            // get the OptBuilder so we can check the settings
-                            needs_val_of = self.add_val_to_arg(arg, &arg_os, matcher)?;
-                            // get the next value from the iterator
-                            continue;
+                        // Check to see if parsing a value from a previous arg
+                        let arg = self.opts
+                            .iter()
+                            .find(|o| o.b.name == name)
+                            .expect(INTERNAL_ERROR_MSG);
+                        // get the OptBuilder so we can check the settings
+                        needs_val_of = self.add_val_to_arg(arg, &arg_os, matcher)?;
+                        // get the next value from the iterator
+                        continue;
                     }
                 } else if arg_os.starts_with(b"--") {
                     needs_val_of = self.parse_long_arg(matcher, &arg_os)?;
-                    debugln!("Parser:get_matches_with: After parse_long_arg {:?}",
-                             needs_val_of);
+                    debugln!(
+                        "Parser:get_matches_with: After parse_long_arg {:?}",
+                        needs_val_of
+                    );
                     match needs_val_of {
-                        ParseResult::Flag |
-                            ParseResult::Opt(..) |
-                            ParseResult::ValuesDone => continue,
+                        ParseResult::Flag | ParseResult::Opt(..) | ParseResult::ValuesDone => {
+                            continue
+                        }
                         _ => (),
                     }
                 } else if arg_os.starts_with(b"-") && arg_os.len_() != 1 {
                     // Try to parse short args like normal, if AllowLeadingHyphen or
                     // AllowNegativeNumbers is set, parse_short_arg will *not* throw
                     // an error, and instead return Ok(None)
                     needs_val_of = self.parse_short_arg(matcher, &arg_os)?;
                     // If it's None, we then check if one of those two AppSettings was set
-                    debugln!("Parser:get_matches_with: After parse_short_arg {:?}",
-                             needs_val_of);
+                    debugln!(
+                        "Parser:get_matches_with: After parse_short_arg {:?}",
+                        needs_val_of
+                    );
                     match needs_val_of {
                         ParseResult::MaybeNegNum => {
-                            if !(arg_os.to_string_lossy().parse::<i64>().is_ok() ||
-                                 arg_os.to_string_lossy().parse::<f64>().is_ok()) {
-                                return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                "",
-                                &*usage::create_error_usage(self, matcher, None),
-                                self.color()));
+                            if !(arg_os.to_string_lossy().parse::<i64>().is_ok()
+                                || arg_os.to_string_lossy().parse::<f64>().is_ok())
+                            {
+                                return Err(Error::unknown_argument(
+                                    &*arg_os.to_string_lossy(),
+                                    "",
+                                    &*usage::create_error_usage(self, matcher, None),
+                                    self.color(),
+                                ));
                             }
                         }
-                        ParseResult::Opt(..) |
-                            ParseResult::Flag |
-                            ParseResult::ValuesDone => continue,
+                        ParseResult::Opt(..) | ParseResult::Flag | ParseResult::ValuesDone => {
+                            continue
+                        }
                         _ => (),
                     }
                 }
 
-                if !(self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound)) &&
-                   !self.is_set(AS::InferSubcommands) {
-                    if let Some(cdate) = suggestions::did_you_mean(&*arg_os.to_string_lossy(),
-                                                                   sc_names!(self)) {
-                        return Err(Error::invalid_subcommand(arg_os
-                                                                 .to_string_lossy()
-                                                                 .into_owned(),
-                                                             cdate,
-                                                             self.meta
-                                                                 .bin_name
-                                                                 .as_ref()
-                                                                 .unwrap_or(&self.meta.name),
-                                                             &*usage::create_error_usage(self,
-                                                                                         matcher,
-                                                                                         None),
-                                                             self.color()));
+                if !(self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound))
+                    && !self.is_set(AS::InferSubcommands)
+                {
+                    if let Some(cdate) =
+                        suggestions::did_you_mean(&*arg_os.to_string_lossy(), sc_names!(self))
+                    {
+                        return Err(Error::invalid_subcommand(
+                            arg_os.to_string_lossy().into_owned(),
+                            cdate,
+                            self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
+                            &*usage::create_error_usage(self, matcher, None),
+                            self.color(),
+                        ));
                     }
                 }
             }
 
-            let low_index_mults = self.is_set(AS::LowIndexMultiplePositional) &&
-                                  pos_counter == (self.positionals.len() - 1);
-            let missing_pos = self.is_set(AS::AllowMissingPositional) &&
-                              pos_counter == (self.positionals.len() - 1);
-            debugln!("Parser::get_matches_with: Positional counter...{}",
-                     pos_counter);
-            debugln!("Parser::get_matches_with: Low index multiples...{:?}",
-                     low_index_mults);
+            let low_index_mults = self.is_set(AS::LowIndexMultiplePositional)
+                && pos_counter == (self.positionals.len() - 1);
+            let missing_pos = self.is_set(AS::AllowMissingPositional)
+                && pos_counter == (self.positionals.len() - 1);
+            debugln!(
+                "Parser::get_matches_with: Positional counter...{}",
+                pos_counter
+            );
+            debugln!(
+                "Parser::get_matches_with: Low index multiples...{:?}",
+                low_index_mults
+            );
             if low_index_mults || missing_pos {
                 if let Some(na) = it.peek() {
                     let n = (*na).clone().into();
                     needs_val_of = if needs_val_of != ParseResult::ValuesDone {
                         if let Some(p) = self.positionals.get(pos_counter) {
                             ParseResult::Pos(p.b.name)
                         } else {
                             ParseResult::ValuesDone
                         }
                     } else {
                         ParseResult::ValuesDone
                     };
-                    let sc_match = {
-                        self.possible_subcommand(&n).0
-                    };
-                    if self.is_new_arg(&n, needs_val_of) || sc_match ||
-                       suggestions::did_you_mean(&n.to_string_lossy(), sc_names!(self)).is_some() {
+                    let sc_match = { self.possible_subcommand(&n).0 };
+                    if self.is_new_arg(&n, needs_val_of) || sc_match
+                        || suggestions::did_you_mean(&n.to_string_lossy(), sc_names!(self))
+                            .is_some()
+                    {
                         debugln!("Parser::get_matches_with: Bumping the positional counter...");
                         pos_counter += 1;
                     }
                 } else {
                     debugln!("Parser::get_matches_with: Bumping the positional counter...");
                     pos_counter += 1;
                 }
             } else if self.is_set(AS::ContainsLast) && self.is_set(AS::TrailingValues) {
                 // Came to -- and one postional has .last(true) set, so we go immediately
                 // to the last (highest index) positional
                 debugln!("Parser::get_matches_with: .last(true) and --, setting last pos");
                 pos_counter = self.positionals.len();
             }
             if let Some(p) = self.positionals.get(pos_counter) {
                 if p.is_set(ArgSettings::Last) && !self.is_set(AS::TrailingValues) {
-                    return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                                       "",
-                                                       &*usage::create_error_usage(self,
-                                                                                   matcher,
-                                                                                   None),
-                                                       self.color()));
+                    return Err(Error::unknown_argument(
+                        &*arg_os.to_string_lossy(),
+                        "",
+                        &*usage::create_error_usage(self, matcher, None),
+                        self.color(),
+                    ));
                 }
                 parse_positional!(self, p, arg_os, pos_counter, matcher);
                 self.settings.set(AS::ValidArgFound);
             } else if self.is_set(AS::AllowExternalSubcommands) {
                 // Get external subcommand name
                 let sc_name = match arg_os.to_str() {
                     Some(s) => s.to_string(),
                     None => {
                         if !self.is_set(AS::StrictUtf8) {
-                            return Err(Error::invalid_utf8(&*usage::create_error_usage(self,
-                                                                                       matcher,
-                                                                                       None),
-                                                           self.color()));
+                            return Err(Error::invalid_utf8(
+                                &*usage::create_error_usage(self, matcher, None),
+                                self.color(),
+                            ));
                         }
                         arg_os.to_string_lossy().into_owned()
                     }
                 };
 
                 // Collect the external subcommand args
                 let mut sc_m = ArgMatcher::new();
                 while let Some(v) = it.next() {
                     let a = v.into();
                     if a.to_str().is_none() && !self.is_set(AS::StrictUtf8) {
-                        return Err(Error::invalid_utf8(&*usage::create_error_usage(self,
-                                                                                   matcher,
-                                                                                   None),
-                                                       self.color()));
+                        return Err(Error::invalid_utf8(
+                            &*usage::create_error_usage(self, matcher, None),
+                            self.color(),
+                        ));
                     }
                     sc_m.add_val_to("", &a);
                 }
 
                 matcher.subcommand(SubCommand {
-                                       name: sc_name,
-                                       matches: sc_m.into(),
-                                   });
-            } else if !((self.is_set(AS::AllowLeadingHyphen) ||
-                        self.is_set(AS::AllowNegativeNumbers)) && arg_os.starts_with(b"-")) &&
-                      !self.is_set(AS::InferSubcommands) {
-                return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                                   "",
-                                                   &*usage::create_error_usage(self,
-                                                                               matcher,
-                                                                               None),
-                                                   self.color()));
+                    name: sc_name,
+                    matches: sc_m.into(),
+                });
+            } else if !((self.is_set(AS::AllowLeadingHyphen)
+                || self.is_set(AS::AllowNegativeNumbers))
+                && arg_os.starts_with(b"-"))
+                && !self.is_set(AS::InferSubcommands)
+            {
+                return Err(Error::unknown_argument(
+                    &*arg_os.to_string_lossy(),
+                    "",
+                    &*usage::create_error_usage(self, matcher, None),
+                    self.color(),
+                ));
             } else if !has_args || self.is_set(AS::InferSubcommands) && self.has_subcommands() {
-                if let Some(cdate) = suggestions::did_you_mean(&*arg_os.to_string_lossy(),
-                                                               sc_names!(self)) {
-                    return Err(Error::invalid_subcommand(arg_os.to_string_lossy().into_owned(),
-                                                         cdate,
-                                                         self.meta
-                                                             .bin_name
-                                                             .as_ref()
-                                                             .unwrap_or(&self.meta.name),
-                                                         &*usage::create_error_usage(self,
-                                                                                     matcher,
-                                                                                     None),
-                                                         self.color()));
+                if let Some(cdate) =
+                    suggestions::did_you_mean(&*arg_os.to_string_lossy(), sc_names!(self))
+                {
+                    return Err(Error::invalid_subcommand(
+                        arg_os.to_string_lossy().into_owned(),
+                        cdate,
+                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
+                        &*usage::create_error_usage(self, matcher, None),
+                        self.color(),
+                    ));
                 } else {
-                    return Err(Error::unrecognized_subcommand(arg_os
-                                                                  .to_string_lossy()
-                                                                  .into_owned(),
-                                                              self.meta
-                                                                  .bin_name
-                                                                  .as_ref()
-                                                                  .unwrap_or(&self.meta.name),
-                                                              self.color()));
+                    return Err(Error::unrecognized_subcommand(
+                        arg_os.to_string_lossy().into_owned(),
+                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
+                        self.color(),
+                    ));
                 }
             } else {
-                return Err(Error::unknown_argument(&*arg_os.to_string_lossy(),
-                                                   "",
-                                                   &*usage::create_error_usage(self,
-                                                                               matcher,
-                                                                               None),
-                                                   self.color()));
+                return Err(Error::unknown_argument(
+                    &*arg_os.to_string_lossy(),
+                    "",
+                    &*usage::create_error_usage(self, matcher, None),
+                    self.color(),
+                ));
             }
         }
 
         if let Some(ref pos_sc_name) = subcmd_name {
             let sc_name = {
                 find_subcmd!(self, pos_sc_name)
                     .expect(INTERNAL_ERROR_MSG)
                     .p
                     .meta
                     .name
                     .clone()
             };
             self.parse_subcommand(&*sc_name, matcher, it)?;
         } else if self.is_set(AS::SubcommandRequired) {
             let bn = self.meta.bin_name.as_ref().unwrap_or(&self.meta.name);
-            return Err(Error::missing_subcommand(bn,
-                                                 &usage::create_error_usage(self, matcher, None),
-                                                 self.color()));
+            return Err(Error::missing_subcommand(
+                bn,
+                &usage::create_error_usage(self, matcher, None),
+                self.color(),
+            ));
         } else if self.is_set(AS::SubcommandRequiredElseHelp) {
             debugln!("Parser::get_matches_with: SubcommandRequiredElseHelp=true");
             let mut out = vec![];
             self.write_help_err(&mut out)?;
             return Err(Error {
-                           message: String::from_utf8_lossy(&*out).into_owned(),
-                           kind: ErrorKind::MissingArgumentOrSubcommand,
-                           info: None,
-                       });
+                message: String::from_utf8_lossy(&*out).into_owned(),
+                kind: ErrorKind::MissingArgumentOrSubcommand,
+                info: None,
+            });
         }
 
         Validator::new(self).validate(needs_val_of, subcmd_name, matcher)
     }
 
 
     fn propagate_help_version(&mut self) {
         debugln!("Parser::propagate_help_version;");
@@ -1096,47 +1149,55 @@ impl<'a, 'b> Parser<'a, 'b>
     }
 
     fn build_bin_names(&mut self) {
         debugln!("Parser::build_bin_names;");
         for sc in &mut self.subcommands {
             debug!("Parser::build_bin_names:iter: bin_name set...");
             if sc.p.meta.bin_name.is_none() {
                 sdebugln!("No");
-                let bin_name = format!("{}{}{}",
-                                       self.meta
-                                           .bin_name
-                                           .as_ref()
-                                           .unwrap_or(&self.meta.name.clone()),
-                                       if self.meta.bin_name.is_some() {
-                                           " "
-                                       } else {
-                                           ""
-                                       },
-                                       &*sc.p.meta.name);
-                debugln!("Parser::build_bin_names:iter: Setting bin_name of {} to {}",
-                         self.meta.name,
-                         bin_name);
+                let bin_name = format!(
+                    "{}{}{}",
+                    self.meta
+                        .bin_name
+                        .as_ref()
+                        .unwrap_or(&self.meta.name.clone()),
+                    if self.meta.bin_name.is_some() {
+                        " "
+                    } else {
+                        ""
+                    },
+                    &*sc.p.meta.name
+                );
+                debugln!(
+                    "Parser::build_bin_names:iter: Setting bin_name of {} to {}",
+                    self.meta.name,
+                    bin_name
+                );
                 sc.p.meta.bin_name = Some(bin_name);
             } else {
                 sdebugln!("yes ({:?})", sc.p.meta.bin_name);
             }
-            debugln!("Parser::build_bin_names:iter: Calling build_bin_names from...{}",
-                     sc.p.meta.name);
+            debugln!(
+                "Parser::build_bin_names:iter: Calling build_bin_names from...{}",
+                sc.p.meta.name
+            );
             sc.p.build_bin_names();
         }
     }
 
-    fn parse_subcommand<I, T>(&mut self,
-                              sc_name: &str,
-                              matcher: &mut ArgMatcher<'a>,
-                              it: &mut Peekable<I>)
-                              -> ClapResult<()>
-        where I: Iterator<Item = T>,
-              T: Into<OsString> + Clone
+    fn parse_subcommand<I, T>(
+        &mut self,
+        sc_name: &str,
+        matcher: &mut ArgMatcher<'a>,
+        it: &mut Peekable<I>,
+    ) -> ClapResult<()>
+    where
+        I: Iterator<Item = T>,
+        T: Into<OsString> + Clone,
     {
         use std::fmt::Write;
         debugln!("Parser::parse_subcommand;");
         let mut mid_string = String::new();
         if !self.is_set(AS::SubcommandsNegateReqs) {
             let mut hs: Vec<&str> = self.required.iter().map(|n| &**n).collect();
             for k in matcher.arg_names() {
                 hs.push(k);
@@ -1144,46 +1205,52 @@ impl<'a, 'b> Parser<'a, 'b>
             let reqs = usage::get_required_usage_from(self, &hs, Some(matcher), None, false);
 
             for s in &reqs {
                 write!(&mut mid_string, " {}", s).expect(INTERNAL_ERROR_MSG);
             }
         }
         mid_string.push_str(" ");
         if let Some(ref mut sc) = self.subcommands
-               .iter_mut()
-               .find(|s| s.p.meta.name == sc_name) {
+            .iter_mut()
+            .find(|s| s.p.meta.name == sc_name)
+        {
             let mut sc_matcher = ArgMatcher::new();
             // bin_name should be parent's bin_name + [<reqs>] + the sc's name separated by
             // a space
-            sc.p.meta.usage = Some(format!("{}{}{}",
-                                           self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                                           if self.meta.bin_name.is_some() {
-                                               &*mid_string
-                                           } else {
-                                               ""
-                                           },
-                                           &*sc.p.meta.name));
-            sc.p.meta.bin_name =
-                Some(format!("{}{}{}",
-                             self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                             if self.meta.bin_name.is_some() {
-                                 " "
-                             } else {
-                                 ""
-                             },
-                             &*sc.p.meta.name));
-            debugln!("Parser::parse_subcommand: About to parse sc={}",
-                     sc.p.meta.name);
+            sc.p.meta.usage = Some(format!(
+                "{}{}{}",
+                self.meta.bin_name.as_ref().unwrap_or(&String::new()),
+                if self.meta.bin_name.is_some() {
+                    &*mid_string
+                } else {
+                    ""
+                },
+                &*sc.p.meta.name
+            ));
+            sc.p.meta.bin_name = Some(format!(
+                "{}{}{}",
+                self.meta.bin_name.as_ref().unwrap_or(&String::new()),
+                if self.meta.bin_name.is_some() {
+                    " "
+                } else {
+                    ""
+                },
+                &*sc.p.meta.name
+            ));
+            debugln!(
+                "Parser::parse_subcommand: About to parse sc={}",
+                sc.p.meta.name
+            );
             debugln!("Parser::parse_subcommand: sc settings={:#?}", sc.p.settings);
             sc.p.get_matches_with(&mut sc_matcher, it)?;
             matcher.subcommand(SubCommand {
-                                   name: sc.p.meta.name.clone(),
-                                   matches: sc_matcher.into(),
-                               });
+                name: sc.p.meta.name.clone(),
+                matches: sc_matcher.into(),
+            });
         }
         Ok(())
     }
 
     pub fn groups_for_arg(&self, name: &str) -> Option<Vec<&'a str>> {
         debugln!("Parser::groups_for_arg: name={}", name);
 
         if self.groups.is_empty() {
@@ -1207,20 +1274,21 @@ impl<'a, 'b> Parser<'a, 'b>
         Some(res)
     }
 
     pub fn args_in_group(&self, group: &str) -> Vec<String> {
         let mut g_vec = vec![];
         let mut args = vec![];
 
         for n in &self.groups
-                      .iter()
-                      .find(|g| g.name == group)
-                      .expect(INTERNAL_ERROR_MSG)
-                      .args {
+            .iter()
+            .find(|g| g.name == group)
+            .expect(INTERNAL_ERROR_MSG)
+            .args
+        {
             if let Some(f) = self.flags.iter().find(|f| &f.b.name == n) {
                 args.push(f.to_string());
             } else if let Some(f) = self.opts.iter().find(|o| &o.b.name == n) {
                 args.push(f.to_string());
             } else if let Some(p) = self.positionals.values().find(|p| &p.b.name == n) {
                 args.push(p.b.name.to_owned());
             } else {
                 g_vec.push(*n);
@@ -1234,20 +1302,21 @@ impl<'a, 'b> Parser<'a, 'b>
         args.iter().map(ToOwned::to_owned).collect()
     }
 
     pub fn arg_names_in_group(&self, group: &str) -> Vec<&'a str> {
         let mut g_vec = vec![];
         let mut args = vec![];
 
         for n in &self.groups
-                      .iter()
-                      .find(|g| g.name == group)
-                      .expect(INTERNAL_ERROR_MSG)
-                      .args {
+            .iter()
+            .find(|g| g.name == group)
+            .expect(INTERNAL_ERROR_MSG)
+            .args
+        {
             if self.groups.iter().any(|g| g.name == *n) {
                 args.extend(self.arg_names_in_group(n));
                 g_vec.push(*n);
             } else if !args.contains(n) {
                 args.push(*n);
             }
         }
 
@@ -1291,48 +1360,54 @@ impl<'a, 'b> Parser<'a, 'b>
                 s: Switched {
                     short: self.version_short,
                     long: Some("version"),
                     ..Default::default()
                 },
             };
             self.flags.push(arg);
         }
-        if !self.subcommands.is_empty() && !self.is_set(AS::DisableHelpSubcommand) &&
-           self.is_set(AS::NeedsSubcommandHelp) {
+        if !self.subcommands.is_empty() && !self.is_set(AS::DisableHelpSubcommand)
+            && self.is_set(AS::NeedsSubcommandHelp)
+        {
             debugln!("Parser::create_help_and_version: Building help");
-            self.subcommands
-                .push(App::new("help")
-                          .about("Prints this message or the help of the given subcommand(s)"));
+            self.subcommands.push(
+                App::new("help")
+                    .about("Prints this message or the help of the given subcommand(s)"),
+            );
         }
     }
 
     // Retrieves the names of all args the user has supplied thus far, except required ones
     // because those will be listed in self.required
     fn check_for_help_and_version_str(&self, arg: &OsStr) -> ClapResult<()> {
         debugln!("Parser::check_for_help_and_version_str;");
-        debug!("Parser::check_for_help_and_version_str: Checking if --{} is help or version...",
-               arg.to_str().unwrap());
+        debug!(
+            "Parser::check_for_help_and_version_str: Checking if --{} is help or version...",
+            arg.to_str().unwrap()
+        );
         if arg == "help" && self.is_set(AS::NeedsLongHelp) {
             sdebugln!("Help");
             return Err(self._help(true));
         }
         if arg == "version" && self.is_set(AS::NeedsLongVersion) {
             sdebugln!("Version");
             return Err(self._version(true));
         }
         sdebugln!("Neither");
 
         Ok(())
     }
 
     fn check_for_help_and_version_char(&self, arg: char) -> ClapResult<()> {
         debugln!("Parser::check_for_help_and_version_char;");
-        debug!("Parser::check_for_help_and_version_char: Checking if -{} is help or version...",
-               arg);
+        debug!(
+            "Parser::check_for_help_and_version_char: Checking if -{} is help or version...",
+            arg
+        );
         if let Some(h) = self.help_short {
             if arg == h && self.is_set(AS::NeedsLongHelp) {
                 sdebugln!("Help");
                 return Err(self._help(false));
             }
         }
         if let Some(v) = self.version_short {
             if arg == v && self.is_set(AS::NeedsLongVersion) {
@@ -1340,85 +1415,89 @@ impl<'a, 'b> Parser<'a, 'b>
                 return Err(self._version(false));
             }
         }
         sdebugln!("Neither");
         Ok(())
     }
 
     fn use_long_help(&self) -> bool {
-        self.meta.long_about.is_some() ||
-                 self.flags.iter().any(|f| f.b.long_help.is_some()) ||
-                 self.opts.iter().any(|o| o.b.long_help.is_some()) ||
-                 self.positionals.values().any(|p| p.b.long_help.is_some()) ||
-                 self.subcommands
-                     .iter()
-                     .any(|s| s.p.meta.long_about.is_some())
+        self.meta.long_about.is_some() || self.flags.iter().any(|f| f.b.long_help.is_some())
+            || self.opts.iter().any(|o| o.b.long_help.is_some())
+            || self.positionals.values().any(|p| p.b.long_help.is_some())
+            || self.subcommands
+                .iter()
+                .any(|s| s.p.meta.long_about.is_some())
     }
 
     fn _help(&self, mut use_long: bool) -> Error {
         debugln!("Parser::_help: use_long={:?}", use_long);
         use_long = use_long && self.use_long_help();
         let mut buf = vec![];
         match Help::write_parser_help(&mut buf, self, use_long) {
             Err(e) => e,
             _ => Error {
                 message: String::from_utf8(buf).unwrap_or_default(),
                 kind: ErrorKind::HelpDisplayed,
                 info: None,
-            }
+            },
         }
     }
 
     fn _version(&self, use_long: bool) -> Error {
         debugln!("Parser::_version: ");
         let out = io::stdout();
         let mut buf_w = BufWriter::new(out.lock());
         match self.print_version(&mut buf_w, use_long) {
             Err(e) => e,
             _ => Error {
                 message: String::new(),
                 kind: ErrorKind::VersionDisplayed,
                 info: None,
-            }
+            },
         }
     }
 
-    fn parse_long_arg(&mut self,
-                      matcher: &mut ArgMatcher<'a>,
-                      full_arg: &OsStr)
-                      -> ClapResult<ParseResult<'a>> {
+    fn parse_long_arg(
+        &mut self,
+        matcher: &mut ArgMatcher<'a>,
+        full_arg: &OsStr,
+    ) -> ClapResult<ParseResult<'a>> {
         // maybe here lifetime should be 'a
         debugln!("Parser::parse_long_arg;");
         let mut val = None;
         debug!("Parser::parse_long_arg: Does it contain '='...");
         let arg = if full_arg.contains_byte(b'=') {
             let (p0, p1) = full_arg.trim_left_matches(b'-').split_at_byte(b'=');
             sdebugln!("Yes '{:?}'", p1);
             val = Some(p1);
             p0
         } else {
             sdebugln!("No");
             full_arg.trim_left_matches(b'-')
         };
 
         if let Some(opt) = find_opt_by_long!(@os self, arg) {
-            debugln!("Parser::parse_long_arg: Found valid opt '{}'",
-                     opt.to_string());
+            debugln!(
+                "Parser::parse_long_arg: Found valid opt '{}'",
+                opt.to_string()
+            );
             self.settings.set(AS::ValidArgFound);
             let ret = self.parse_opt(val, opt, val.is_some(), matcher)?;
             if self.cache.map_or(true, |name| name != opt.b.name) {
                 arg_post_processing!(self, opt, matcher);
                 self.cache = Some(opt.b.name);
             }
 
             return Ok(ret);
         } else if let Some(flag) = find_flag_by_long!(@os self, arg) {
-            debugln!("Parser::parse_long_arg: Found valid flag '{}'",
-                     flag.to_string());
+            debugln!(
+                "Parser::parse_long_arg: Found valid flag '{}'",
+                flag.to_string()
+            );
             self.settings.set(AS::ValidArgFound);
             // Only flags could be help or version, and we need to check the raw long
             // so this is the first point to check
             self.check_for_help_and_version_str(arg)?;
 
             self.parse_flag(flag, matcher)?;
 
             // Handle conflicts, requirements, etc.
@@ -1435,30 +1514,33 @@ impl<'a, 'b> Parser<'a, 'b>
         }
 
         debugln!("Parser::parse_long_arg: Didn't match anything");
         self.did_you_mean_error(arg.to_str().expect(INVALID_UTF8), matcher)
             .map(|_| ParseResult::NotFound)
     }
 
     #[cfg_attr(feature = "lints", allow(len_zero))]
-    fn parse_short_arg(&mut self,
-                       matcher: &mut ArgMatcher<'a>,
-                       full_arg: &OsStr)
-                       -> ClapResult<ParseResult<'a>> {
+    fn parse_short_arg(
+        &mut self,
+        matcher: &mut ArgMatcher<'a>,
+        full_arg: &OsStr,
+    ) -> ClapResult<ParseResult<'a>> {
         debugln!("Parser::parse_short_arg: full_arg={:?}", full_arg);
         let arg_os = full_arg.trim_left_matches(b'-');
         let arg = arg_os.to_string_lossy();
 
         // If AllowLeadingHyphen is set, we want to ensure `-val` gets parsed as `-val` and not
         // `-v` `-a` `-l` assuming `v` `a` and `l` are all, or mostly, valid shorts.
         if self.is_set(AS::AllowLeadingHyphen) {
             if arg.chars().any(|c| !self.contains_short(c)) {
-                debugln!("Parser::parse_short_arg: LeadingHyphenAllowed yet -{} isn't valid",
-                         arg);
+                debugln!(
+                    "Parser::parse_short_arg: LeadingHyphenAllowed yet -{} isn't valid",
+                    arg
+                );
                 return Ok(ParseResult::MaybeHyphenValue);
             }
         } else if self.is_set(AS::ValidNegNumFound) {
             // TODO: Add docs about having AllowNegativeNumbers and `-2` as a valid short
             // May be better to move this to *after* not finding a valid flag/opt?
             debugln!("Parser::parse_short_arg: Valid negative num...");
             return Ok(ParseResult::MaybeNegNum);
         }
@@ -1470,26 +1552,30 @@ impl<'a, 'b> Parser<'a, 'b>
             // concatenated value: -oval
             // Option: -o
             // Value: val
             if let Some(opt) = find_opt_by_short!(self, c) {
                 debugln!("Parser::parse_short_arg:iter:{}: Found valid opt", c);
                 self.settings.set(AS::ValidArgFound);
                 // Check for trailing concatenated value
                 let p: Vec<_> = arg.splitn(2, c).collect();
-                debugln!("Parser::parse_short_arg:iter:{}: p[0]={:?}, p[1]={:?}",
-                         c,
-                         p[0].as_bytes(),
-                         p[1].as_bytes());
+                debugln!(
+                    "Parser::parse_short_arg:iter:{}: p[0]={:?}, p[1]={:?}",
+                    c,
+                    p[0].as_bytes(),
+                    p[1].as_bytes()
+                );
                 let i = p[0].as_bytes().len() + 1;
                 let val = if p[1].as_bytes().len() > 0 {
-                    debugln!("Parser::parse_short_arg:iter:{}: val={:?} (bytes), val={:?} (ascii)",
-                             c,
-                             arg_os.split_at(i).1.as_bytes(),
-                             arg_os.split_at(i).1);
+                    debugln!(
+                        "Parser::parse_short_arg:iter:{}: val={:?} (bytes), val={:?} (ascii)",
+                        c,
+                        arg_os.split_at(i).1.as_bytes(),
+                        arg_os.split_at(i).1
+                    );
                     Some(arg_os.split_at(i).1)
                 } else {
                     None
                 };
 
                 // Default to "we're expecting a value later"
                 let ret = self.parse_opt(val, opt, false, matcher)?;
 
@@ -1509,63 +1595,68 @@ impl<'a, 'b> Parser<'a, 'b>
                 // Handle conflicts, requirements, overrides, etc.
                 // Must be called here due to mutablilty
                 if self.cache.map_or(true, |name| name != flag.b.name) {
                     arg_post_processing!(self, flag, matcher);
                     self.cache = Some(flag.b.name);
                 }
             } else {
                 let arg = format!("-{}", c);
-                return Err(Error::unknown_argument(&*arg,
-                                                   "",
-                                                   &*usage::create_error_usage(self,
-                                                                               matcher,
-                                                                               None),
-                                                   self.color()));
+                return Err(Error::unknown_argument(
+                    &*arg,
+                    "",
+                    &*usage::create_error_usage(self, matcher, None),
+                    self.color(),
+                ));
             }
         }
         Ok(ret)
     }
 
-    fn parse_opt(&self,
-                 val: Option<&OsStr>,
-                 opt: &OptBuilder<'a, 'b>,
-                 had_eq: bool,
-                 matcher: &mut ArgMatcher<'a>)
-                 -> ClapResult<ParseResult<'a>> {
+    fn parse_opt(
+        &self,
+        val: Option<&OsStr>,
+        opt: &OptBuilder<'a, 'b>,
+        had_eq: bool,
+        matcher: &mut ArgMatcher<'a>,
+    ) -> ClapResult<ParseResult<'a>> {
         debugln!("Parser::parse_opt; opt={}, val={:?}", opt.b.name, val);
         debugln!("Parser::parse_opt; opt.settings={:?}", opt.b.settings);
         let mut has_eq = false;
         let no_val = val.is_none();
         let empty_vals = opt.is_set(ArgSettings::EmptyValues);
         let min_vals_zero = opt.v.min_vals.unwrap_or(1) == 0;
         let needs_eq = opt.is_set(ArgSettings::RequireEquals);
 
         debug!("Parser::parse_opt; Checking for val...");
         if let Some(fv) = val {
             has_eq = fv.starts_with(&[b'=']) || had_eq;
             let v = fv.trim_left_matches(b'=');
-            if !empty_vals &&
-               (v.len_() == 0 || (needs_eq && !has_eq)) {
+            if !empty_vals && (v.len_() == 0 || (needs_eq && !has_eq)) {
                 sdebugln!("Found Empty - Error");
-                return Err(Error::empty_value(opt,
-                                              &*usage::create_error_usage(self, matcher, None),
-                                              self.color()));
+                return Err(Error::empty_value(
+                    opt,
+                    &*usage::create_error_usage(self, matcher, None),
+                    self.color(),
+                ));
             }
             sdebugln!("Found - {:?}, len: {}", v, v.len_());
-            debugln!("Parser::parse_opt: {:?} contains '='...{:?}",
-                     fv,
-                     fv.starts_with(&[b'=']));
+            debugln!(
+                "Parser::parse_opt: {:?} contains '='...{:?}",
+                fv,
+                fv.starts_with(&[b'='])
+            );
             self.add_val_to_arg(opt, v, matcher)?;
         } else if needs_eq && !(empty_vals || min_vals_zero) {
             sdebugln!("None, but requires equals...Error");
-            return Err(Error::empty_value(opt,
-                                          &*usage::create_error_usage(self, matcher, None),
-                                          self.color()));
-
+            return Err(Error::empty_value(
+                opt,
+                &*usage::create_error_usage(self, matcher, None),
+                self.color(),
+            ));
         } else {
             sdebugln!("None");
         }
 
         matcher.inc_occurrence_of(opt.b.name);
         // Increment or create the group "args"
         self.groups_for_arg(opt.b.name)
             .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
@@ -1578,57 +1669,64 @@ impl<'a, 'b> Parser<'a, 'b>
         } else if no_val || (mult && !needs_delim) && !has_eq && matcher.needs_more_vals(opt) {
             debugln!("Parser::parse_opt: More arg vals required...");
             return Ok(ParseResult::Opt(opt.b.name));
         }
         debugln!("Parser::parse_opt: More arg vals not required...");
         Ok(ParseResult::ValuesDone)
     }
 
-    fn add_val_to_arg<A>(&self,
-                         arg: &A,
-                         val: &OsStr,
-                         matcher: &mut ArgMatcher<'a>)
-                         -> ClapResult<ParseResult<'a>>
-        where A: AnyArg<'a, 'b> + Display
+    fn add_val_to_arg<A>(
+        &self,
+        arg: &A,
+        val: &OsStr,
+        matcher: &mut ArgMatcher<'a>,
+    ) -> ClapResult<ParseResult<'a>>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Parser::add_val_to_arg; arg={}, val={:?}", arg.name(), val);
-        debugln!("Parser::add_val_to_arg; trailing_vals={:?}, DontDelimTrailingVals={:?}",
-                 self.is_set(AS::TrailingValues),
-                 self.is_set(AS::DontDelimitTrailingValues));
+        debugln!(
+            "Parser::add_val_to_arg; trailing_vals={:?}, DontDelimTrailingVals={:?}",
+            self.is_set(AS::TrailingValues),
+            self.is_set(AS::DontDelimitTrailingValues)
+        );
         if !(self.is_set(AS::TrailingValues) && self.is_set(AS::DontDelimitTrailingValues)) {
             if let Some(delim) = arg.val_delim() {
                 if val.is_empty_() {
                     Ok(self.add_single_val_to_arg(arg, val, matcher)?)
                 } else {
                     let mut iret = ParseResult::ValuesDone;
                     for v in val.split(delim as u32 as u8) {
                         iret = self.add_single_val_to_arg(arg, v, matcher)?;
                     }
                     // If there was a delimiter used, we're not looking for more values
-                    if val.contains_byte(delim as u32 as u8) ||
-                        arg.is_set(ArgSettings::RequireDelimiter) {
-                            iret = ParseResult::ValuesDone;
-                        }
+                    if val.contains_byte(delim as u32 as u8)
+                        || arg.is_set(ArgSettings::RequireDelimiter)
+                    {
+                        iret = ParseResult::ValuesDone;
+                    }
                     Ok(iret)
                 }
             } else {
                 self.add_single_val_to_arg(arg, val, matcher)
             }
         } else {
             self.add_single_val_to_arg(arg, val, matcher)
         }
     }
 
-    fn add_single_val_to_arg<A>(&self,
-                                arg: &A,
-                                v: &OsStr,
-                                matcher: &mut ArgMatcher<'a>)
-                                -> ClapResult<ParseResult<'a>>
-        where A: AnyArg<'a, 'b> + Display
+    fn add_single_val_to_arg<A>(
+        &self,
+        arg: &A,
+        v: &OsStr,
+        matcher: &mut ArgMatcher<'a>,
+    ) -> ClapResult<ParseResult<'a>>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Parser::add_single_val_to_arg;");
         debugln!("Parser::add_single_val_to_arg: adding val...{:?}", v);
         if let Some(t) = arg.val_terminator() {
             if t == v {
                 return Ok(ParseResult::ValuesDone);
             }
         }
@@ -1643,54 +1741,55 @@ impl<'a, 'b> Parser<'a, 'b>
 
         if matcher.needs_more_vals(arg) {
             return Ok(ParseResult::Opt(arg.name()));
         }
         Ok(ParseResult::ValuesDone)
     }
 
 
-    fn parse_flag(&self,
-                  flag: &FlagBuilder<'a, 'b>,
-                  matcher: &mut ArgMatcher<'a>)
-                  -> ClapResult<ParseResult<'a>> {
+    fn parse_flag(
+        &self,
+        flag: &FlagBuilder<'a, 'b>,
+        matcher: &mut ArgMatcher<'a>,
+    ) -> ClapResult<ParseResult<'a>> {
         debugln!("Parser::parse_flag;");
 
         matcher.inc_occurrence_of(flag.b.name);
         // Increment or create the group "args"
         self.groups_for_arg(flag.b.name)
             .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
 
         Ok(ParseResult::Flag)
     }
 
     fn did_you_mean_error(&self, arg: &str, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-
         // Didn't match a flag or option
-        let suffix =
-            suggestions::did_you_mean_flag_suffix(arg, longs!(self), &self.subcommands);
+        let suffix = suggestions::did_you_mean_flag_suffix(arg, longs!(self), &self.subcommands);
 
         // Add the arg to the matches to build a proper usage string
         if let Some(name) = suffix.1 {
             if let Some(opt) = find_opt_by_long!(self, name) {
                 self.groups_for_arg(&*opt.b.name)
                     .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
                 matcher.insert(&*opt.b.name);
             } else if let Some(flg) = find_flag_by_long!(self, name) {
                 self.groups_for_arg(&*flg.b.name)
                     .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
                 matcher.insert(&*flg.b.name);
             }
         }
 
         let used_arg = format!("--{}", arg);
-        Err(Error::unknown_argument(&*used_arg,
-                                    &*suffix.0,
-                                    &*usage::create_error_usage(self, matcher, None),
-                                    self.color()))
+        Err(Error::unknown_argument(
+            &*used_arg,
+            &*suffix.0,
+            &*usage::create_error_usage(self, matcher, None),
+            self.color(),
+        ))
     }
 
     // Prints the version to the user and exits if quit=true
     fn print_version<W: Write>(&self, w: &mut W, use_long: bool) -> ClapResult<()> {
         self.write_version(w, use_long)?;
         w.flush().map_err(Error::from)
     }
 
@@ -1806,17 +1905,17 @@ impl<'a, 'b> Parser<'a, 'b>
             add_val!(self, o, matcher);
         }
         for p in self.positionals.values() {
             debug!("Parser::add_defaults:iter:{}:", p.b.name);
             add_val!(self, p, matcher);
         }
         Ok(())
     }
-    
+
     pub fn add_env(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
         macro_rules! add_val {
             ($_self:ident, $a:ident, $m:ident) => {
                 if let Some(ref val) = $a.v.env {
                     if $m.get($a.b.name).map(|ma| ma.vals.len()).map(|len| len == 0).unwrap_or(false) {
                         if let Some(ref val) = val.1 {
                             $_self.add_val_to_arg($a, OsStr::new(val), $m)?;
 
@@ -1883,43 +1982,47 @@ impl<'a, 'b> Parser<'a, 'b>
         if let Some(p) = find_by_name!(self, name, positionals, values) {
             return Some(p);
         }
         None
     }
 
     /// Check is a given string matches the binary name for this parser
     fn is_bin_name(&self, value: &str) -> bool {
-        self.meta.bin_name
+        self.meta
+            .bin_name
             .as_ref()
             .and_then(|name| Some(value == name))
             .unwrap_or(false)
     }
 
     /// Check is a given string is an alias for this parser
     fn is_alias(&self, value: &str) -> bool {
-        self.meta.aliases
+        self.meta
+            .aliases
             .as_ref()
             .and_then(|aliases| {
                 for alias in aliases {
                     if alias.0 == value {
                         return Some(true);
                     }
                 }
                 Some(false)
             })
             .unwrap_or(false)
     }
 
     // Only used for completion scripts due to bin_name messiness
     #[cfg_attr(feature = "lints", allow(block_in_if_condition_stmt))]
     pub fn find_subcommand(&'b self, sc: &str) -> Option<&'b App<'a, 'b>> {
         debugln!("Parser::find_subcommand: sc={}", sc);
-        debugln!("Parser::find_subcommand: Currently in Parser...{}",
-                 self.meta.bin_name.as_ref().unwrap());
+        debugln!(
+            "Parser::find_subcommand: Currently in Parser...{}",
+            self.meta.bin_name.as_ref().unwrap()
+        );
         for s in &self.subcommands {
             if s.p.is_bin_name(sc) {
                 return Some(s);
             }
             // XXX: why do we split here?
             // isn't `sc` supposed to be single word already?
             let last = sc.split(' ').rev().next().expect(INTERNAL_ERROR_MSG);
             if s.p.is_alias(last) {
--- a/third_party/rust/clap/src/app/settings.rs
+++ b/third_party/rust/clap/src/app/settings.rs
@@ -1,9 +1,10 @@
 // Std
+#[allow(unused_imports)]
 use std::ascii::AsciiExt;
 use std::str::FromStr;
 use std::ops::BitOr;
 
 bitflags! {
     struct Flags: u64 {
         const SC_NEGATE_REQS       = 1;
         const SC_REQUIRED          = 1 << 1;
@@ -54,64 +55,69 @@ pub struct AppFlags(Flags);
 
 impl BitOr for AppFlags {
     type Output = Self;
     fn bitor(self, rhs: Self) -> Self { AppFlags(self.0 | rhs.0) }
 }
 
 impl Default for AppFlags {
     fn default() -> Self {
-        AppFlags(NEEDS_LONG_VERSION | NEEDS_LONG_HELP | NEEDS_SC_HELP | UTF8_NONE | COLOR_AUTO)
+        AppFlags(
+            Flags::NEEDS_LONG_VERSION | Flags::NEEDS_LONG_HELP | Flags::NEEDS_SC_HELP
+                | Flags::UTF8_NONE | Flags::COLOR_AUTO,
+        )
     }
 }
 
+#[allow(deprecated)]
 impl AppFlags {
     pub fn new() -> Self { AppFlags::default() }
+    pub fn zeroed() -> Self { AppFlags(Flags::empty()) }
 
     impl_settings! { AppSettings,
-        ArgRequiredElseHelp => A_REQUIRED_ELSE_HELP,
-        ArgsNegateSubcommands => ARGS_NEGATE_SCS,
-        AllowExternalSubcommands => ALLOW_UNK_SC,
-        AllowInvalidUtf8 => UTF8_NONE,
-        AllowLeadingHyphen => LEADING_HYPHEN,
-        AllowNegativeNumbers => ALLOW_NEG_NUMS,
-        AllowMissingPositional => ALLOW_MISSING_POS,
-        ColoredHelp => COLORED_HELP,
-        ColorAlways => COLOR_ALWAYS,
-        ColorAuto => COLOR_AUTO,
-        ColorNever => COLOR_NEVER,
-        DontDelimitTrailingValues => DONT_DELIM_TRAIL,
-        DontCollapseArgsInUsage => DONT_COLLAPSE_ARGS,
-        DeriveDisplayOrder => DERIVE_DISP_ORDER,
-        DisableHelpSubcommand => DISABLE_HELP_SC,
-        DisableVersion => DISABLE_VERSION,
-        GlobalVersion => GLOBAL_VERSION,
-        HidePossibleValuesInHelp => NO_POS_VALUES,
-        Hidden => HIDDEN,
-        LowIndexMultiplePositional => LOW_INDEX_MUL_POS,
-        NeedsLongHelp => NEEDS_LONG_HELP,
-        NeedsLongVersion => NEEDS_LONG_VERSION,
-        NeedsSubcommandHelp => NEEDS_SC_HELP,
-        NoBinaryName => NO_BIN_NAME,
-        PropagateGlobalValuesDown=> PROPAGATE_VALS_DOWN,
-        StrictUtf8 => UTF8_STRICT,
-        SubcommandsNegateReqs => SC_NEGATE_REQS,
-        SubcommandRequired => SC_REQUIRED,
-        SubcommandRequiredElseHelp => SC_REQUIRED_ELSE_HELP,
-        TrailingVarArg => TRAILING_VARARG,
-        UnifiedHelpMessage => UNIFIED_HELP,
-        NextLineHelp => NEXT_LINE_HELP,
-        VersionlessSubcommands => VERSIONLESS_SC,
-        WaitOnError => WAIT_ON_ERROR,
-        TrailingValues => TRAILING_VALUES,
-        ValidNegNumFound => VALID_NEG_NUM_FOUND,
-        Propagated => PROPAGATED,
-        ValidArgFound => VALID_ARG_FOUND,
-        InferSubcommands => INFER_SUBCOMMANDS,
-        ContainsLast => CONTAINS_LAST
+        ArgRequiredElseHelp => Flags::A_REQUIRED_ELSE_HELP,
+        ArgsNegateSubcommands => Flags::ARGS_NEGATE_SCS,
+        AllowExternalSubcommands => Flags::ALLOW_UNK_SC,
+        AllowInvalidUtf8 => Flags::UTF8_NONE,
+        AllowLeadingHyphen => Flags::LEADING_HYPHEN,
+        AllowNegativeNumbers => Flags::ALLOW_NEG_NUMS,
+        AllowMissingPositional => Flags::ALLOW_MISSING_POS,
+        ColoredHelp => Flags::COLORED_HELP,
+        ColorAlways => Flags::COLOR_ALWAYS,
+        ColorAuto => Flags::COLOR_AUTO,
+        ColorNever => Flags::COLOR_NEVER,
+        DontDelimitTrailingValues => Flags::DONT_DELIM_TRAIL,
+        DontCollapseArgsInUsage => Flags::DONT_COLLAPSE_ARGS,
+        DeriveDisplayOrder => Flags::DERIVE_DISP_ORDER,
+        DisableHelpSubcommand => Flags::DISABLE_HELP_SC,
+        DisableVersion => Flags::DISABLE_VERSION,
+        GlobalVersion => Flags::GLOBAL_VERSION,
+        HidePossibleValuesInHelp => Flags::NO_POS_VALUES,
+        Hidden => Flags::HIDDEN,
+        LowIndexMultiplePositional => Flags::LOW_INDEX_MUL_POS,
+        NeedsLongHelp => Flags::NEEDS_LONG_HELP,
+        NeedsLongVersion => Flags::NEEDS_LONG_VERSION,
+        NeedsSubcommandHelp => Flags::NEEDS_SC_HELP,
+        NoBinaryName => Flags::NO_BIN_NAME,
+        PropagateGlobalValuesDown=> Flags::PROPAGATE_VALS_DOWN,
+        StrictUtf8 => Flags::UTF8_STRICT,
+        SubcommandsNegateReqs => Flags::SC_NEGATE_REQS,
+        SubcommandRequired => Flags::SC_REQUIRED,
+        SubcommandRequiredElseHelp => Flags::SC_REQUIRED_ELSE_HELP,
+        TrailingVarArg => Flags::TRAILING_VARARG,
+        UnifiedHelpMessage => Flags::UNIFIED_HELP,
+        NextLineHelp => Flags::NEXT_LINE_HELP,
+        VersionlessSubcommands => Flags::VERSIONLESS_SC,
+        WaitOnError => Flags::WAIT_ON_ERROR,
+        TrailingValues => Flags::TRAILING_VALUES,
+        ValidNegNumFound => Flags::VALID_NEG_NUM_FOUND,
+        Propagated => Flags::PROPAGATED,
+        ValidArgFound => Flags::VALID_ARG_FOUND,
+        InferSubcommands => Flags::INFER_SUBCOMMANDS,
+        ContainsLast => Flags::CONTAINS_LAST
     }
 }
 
 /// Application level settings, which affect how [`App`] operates
 ///
 /// **NOTE:** When these settings are used, they apply only to current command, and are *not*
 /// propagated down or up through child or parent subcommands
 ///
@@ -130,18 +136,18 @@ pub enum AppSettings {
     /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
     ///
     /// # Platform Specific
     ///
     /// Non Windows systems only
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, AppSettings};
     /// use std::ffi::OsString;
     /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
     ///
     /// let r = App::new("myprog")
     ///   //.setting(AppSettings::AllowInvalidUtf8)
     ///     .arg_from_usage("<arg> 'some positional arg'")
     ///     .get_matches_from_safe(
@@ -584,19 +590,19 @@ pub enum AppSettings {
     /// # use clap::{App, Arg, SubCommand, AppSettings};
     /// App::new("myprog")
     ///     .setting(AppSettings::NextLineHelp)
     ///     .get_matches();
     /// ```
     NextLineHelp,
 
     /// **DEPRECATED**: This setting is no longer required in order to propagate values up or down
-    /// 
+    ///
     /// Specifies that the parser should propagate global arg's values down or up through any *used*
-    /// child subcommands. Meaning, if a subcommand wasn't used, the values won't be propagated to 
+    /// child subcommands. Meaning, if a subcommand wasn't used, the values won't be propagated to
     /// said subcommand.
     ///
     /// # Examples
     ///
     /// ```rust
     /// # use clap::{App, Arg, AppSettings, SubCommand};
     /// let m = App::new("myprog")
     ///     .arg(Arg::from_usage("[cmd] 'command to run'")
@@ -702,18 +708,18 @@ pub enum AppSettings {
     /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
     ///
     /// # Platform Specific
     ///
     /// Non Windows systems only
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, AppSettings, ErrorKind};
     /// use std::ffi::OsString;
     /// use std::os::unix::ffi::OsStringExt;
     ///
     /// let m = App::new("myprog")
     ///     .setting(AppSettings::StrictUtf8)
     ///     .arg_from_usage("<arg> 'some positional arg'")
     ///     .get_matches_from_safe(
@@ -831,42 +837,33 @@ pub enum AppSettings {
     /// # use clap::{App, Arg, AppSettings};
     /// App::new("myprog")
     ///     .setting(AppSettings::WaitOnError)
     /// # ;
     /// ```
     /// [`SubCommand`]: ./struct.SubCommand.html
     WaitOnError,
 
-    #[doc(hidden)]
-    NeedsLongVersion,
+    #[doc(hidden)] NeedsLongVersion,
 
-    #[doc(hidden)]
-    NeedsLongHelp,
+    #[doc(hidden)] NeedsLongHelp,
 
-    #[doc(hidden)]
-    NeedsSubcommandHelp,
+    #[doc(hidden)] NeedsSubcommandHelp,
 
-    #[doc(hidden)]
-    LowIndexMultiplePositional,
+    #[doc(hidden)] LowIndexMultiplePositional,
 
-    #[doc(hidden)]
-    TrailingValues,
+    #[doc(hidden)] TrailingValues,
 
-    #[doc(hidden)]
-    ValidNegNumFound,
+    #[doc(hidden)] ValidNegNumFound,
 
-    #[doc(hidden)]
-    Propagated,
+    #[doc(hidden)] Propagated,
 
-    #[doc(hidden)]
-    ValidArgFound,
+    #[doc(hidden)] ValidArgFound,
 
-    #[doc(hidden)]
-    ContainsLast,
+    #[doc(hidden)] ContainsLast,
 }
 
 impl FromStr for AppSettings {
     type Err = String;
     fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
         match &*s.to_ascii_lowercase() {
             "argrequiredelsehelp" => Ok(AppSettings::ArgRequiredElseHelp),
             "argsnegatesubcommands" => Ok(AppSettings::ArgsNegateSubcommands),
@@ -908,79 +905,147 @@ impl FromStr for AppSettings {
 }
 
 #[cfg(test)]
 mod test {
     use super::AppSettings;
 
     #[test]
     fn app_settings_fromstr() {
-        assert_eq!("argsnegatesubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::ArgsNegateSubcommands);
-        assert_eq!("argrequiredelsehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::ArgRequiredElseHelp);
-        assert_eq!("allowexternalsubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowExternalSubcommands);
-        assert_eq!("allowinvalidutf8".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowInvalidUtf8);
-        assert_eq!("allowleadinghyphen".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowLeadingHyphen);
-        assert_eq!("allownegativenumbers".parse::<AppSettings>().unwrap(),
-                   AppSettings::AllowNegativeNumbers);
-        assert_eq!("coloredhelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColoredHelp);
-        assert_eq!("colorauto".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorAuto);
-        assert_eq!("coloralways".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorAlways);
-        assert_eq!("colornever".parse::<AppSettings>().unwrap(),
-                   AppSettings::ColorNever);
-        assert_eq!("disablehelpsubcommand".parse::<AppSettings>().unwrap(),
-                   AppSettings::DisableHelpSubcommand);
-        assert_eq!("disableversion".parse::<AppSettings>().unwrap(),
-                   AppSettings::DisableVersion);
-        assert_eq!("dontcollapseargsinusage".parse::<AppSettings>().unwrap(),
-                   AppSettings::DontCollapseArgsInUsage);
-        assert_eq!("dontdelimittrailingvalues".parse::<AppSettings>().unwrap(),
-                   AppSettings::DontDelimitTrailingValues);
-        assert_eq!("derivedisplayorder".parse::<AppSettings>().unwrap(),
-                   AppSettings::DeriveDisplayOrder);
-        assert_eq!("globalversion".parse::<AppSettings>().unwrap(),
-                   AppSettings::GlobalVersion);
-        assert_eq!("hidden".parse::<AppSettings>().unwrap(),
-                   AppSettings::Hidden);
-        assert_eq!("hidepossiblevaluesinhelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::HidePossibleValuesInHelp);
-        assert_eq!("lowindexmultiplePositional".parse::<AppSettings>().unwrap(),
-                   AppSettings::LowIndexMultiplePositional);
-        assert_eq!("nobinaryname".parse::<AppSettings>().unwrap(),
-                   AppSettings::NoBinaryName);
-        assert_eq!("nextlinehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::NextLineHelp);
-        assert_eq!("subcommandsnegatereqs".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandsNegateReqs);
-        assert_eq!("subcommandrequired".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandRequired);
-        assert_eq!("subcommandrequiredelsehelp".parse::<AppSettings>().unwrap(),
-                   AppSettings::SubcommandRequiredElseHelp);
-        assert_eq!("strictutf8".parse::<AppSettings>().unwrap(),
-                   AppSettings::StrictUtf8);
-        assert_eq!("trailingvararg".parse::<AppSettings>().unwrap(),
-                   AppSettings::TrailingVarArg);
-        assert_eq!("unifiedhelpmessage".parse::<AppSettings>().unwrap(),
-                   AppSettings::UnifiedHelpMessage);
-        assert_eq!("versionlesssubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::VersionlessSubcommands);
-        assert_eq!("waitonerror".parse::<AppSettings>().unwrap(),
-                   AppSettings::WaitOnError);
-        assert_eq!("validnegnumfound".parse::<AppSettings>().unwrap(),
-                   AppSettings::ValidNegNumFound);
-        assert_eq!("validargfound".parse::<AppSettings>().unwrap(),
-                   AppSettings::ValidArgFound);
-        assert_eq!("propagated".parse::<AppSettings>().unwrap(),
-                   AppSettings::Propagated);
-        assert_eq!("trailingvalues".parse::<AppSettings>().unwrap(),
-                   AppSettings::TrailingValues);
-        assert_eq!("infersubcommands".parse::<AppSettings>().unwrap(),
-                   AppSettings::InferSubcommands);
+        assert_eq!(
+            "argsnegatesubcommands".parse::<AppSettings>().unwrap(),
+            AppSettings::ArgsNegateSubcommands
+        );
+        assert_eq!(
+            "argrequiredelsehelp".parse::<AppSettings>().unwrap(),
+            AppSettings::ArgRequiredElseHelp
+        );
+        assert_eq!(
+            "allowexternalsubcommands".parse::<AppSettings>().unwrap(),
+            AppSettings::AllowExternalSubcommands
+        );
+        assert_eq!(
+            "allowinvalidutf8".parse::<AppSettings>().unwrap(),
+            AppSettings::AllowInvalidUtf8
+        );
+        assert_eq!(
+            "allowleadinghyphen".parse::<AppSettings>().unwrap(),
+            AppSettings::AllowLeadingHyphen
+        );
+        assert_eq!(
+            "allownegativenumbers".parse::<AppSettings>().unwrap(),
+            AppSettings::AllowNegativeNumbers
+        );
+        assert_eq!(
+            "coloredhelp".parse::<AppSettings>().unwrap(),
+            AppSettings::ColoredHelp
+        );
+        assert_eq!(
+            "colorauto".parse::<AppSettings>().unwrap(),
+            AppSettings::ColorAuto
+        );
+        assert_eq!(
+            "coloralways".parse::<AppSettings>().unwrap(),
+            AppSettings::ColorAlways
+        );
+        assert_eq!(
+            "colornever".parse::<AppSettings>().unwrap(),
+            AppSettings::ColorNever
+        );
+        assert_eq!(
+            "disablehelpsubcommand".parse::<AppSettings>().unwrap(),
+            AppSettings::DisableHelpSubcommand
+        );
+        assert_eq!(
+            "disableversion".parse::<AppSettings>().unwrap(),
+            AppSettings::DisableVersion
+        );
+        assert_eq!(
+            "dontcollapseargsinusage".parse::<AppSettings>().unwrap(),
+            AppSettings::DontCollapseArgsInUsage
+        );
+        assert_eq!(
+            "dontdelimittrailingvalues".parse::<AppSettings>().unwrap(),
+            AppSettings::DontDelimitTrailingValues
+        );
+        assert_eq!(
+            "derivedisplayorder".parse::<AppSettings>().unwrap(),
+            AppSettings::DeriveDisplayOrder
+        );
+        assert_eq!(
+            "globalversion".parse::<AppSettings>().unwrap(),
+            AppSettings::GlobalVersion
+        );
+        assert_eq!(
+            "hidden".parse::<AppSettings>().unwrap(),
+            AppSettings::Hidden
+        );
+        assert_eq!(
+            "hidepossiblevaluesinhelp".parse::<AppSettings>().unwrap(),
+            AppSettings::HidePossibleValuesInHelp
+        );
+        assert_eq!(
+            "lowindexmultiplePositional".parse::<AppSettings>().unwrap(),
+            AppSettings::LowIndexMultiplePositional
+        );
+        assert_eq!(
+            "nobinaryname".parse::<AppSettings>().unwrap(),
+            AppSettings::NoBinaryName
+        );
+        assert_eq!(
+            "nextlinehelp".parse::<AppSettings>().unwrap(),
+            AppSettings::NextLineHelp
+        );
+        assert_eq!(
+            "subcommandsnegatereqs".parse::<AppSettings>().unwrap(),
+            AppSettings::SubcommandsNegateReqs
+        );
+        assert_eq!(
+            "subcommandrequired".parse::<AppSettings>().unwrap(),
+            AppSettings::SubcommandRequired
+        );
+        assert_eq!(
+            "subcommandrequiredelsehelp".parse::<AppSettings>().unwrap(),
+            AppSettings::SubcommandRequiredElseHelp
+        );
+        assert_eq!(
+            "strictutf8".parse::<AppSettings>().unwrap(),
+            AppSettings::StrictUtf8
+        );
+        assert_eq!(
+            "trailingvararg".parse::<AppSettings>().unwrap(),
+            AppSettings::TrailingVarArg
+        );
+        assert_eq!(
+            "unifiedhelpmessage".parse::<AppSettings>().unwrap(),
+            AppSettings::UnifiedHelpMessage
+        );
+        assert_eq!(
+            "versionlesssubcommands".parse::<AppSettings>().unwrap(),
+            AppSettings::VersionlessSubcommands
+        );
+        assert_eq!(
+            "waitonerror".parse::<AppSettings>().unwrap(),
+            AppSettings::WaitOnError
+        );
+        assert_eq!(
+            "validnegnumfound".parse::<AppSettings>().unwrap(),
+            AppSettings::ValidNegNumFound
+        );
+        assert_eq!(
+            "validargfound".parse::<AppSettings>().unwrap(),
+            AppSettings::ValidArgFound
+        );
+        assert_eq!(
+            "propagated".parse::<AppSettings>().unwrap(),
+            AppSettings::Propagated
+        );
+        assert_eq!(
+            "trailingvalues".parse::<AppSettings>().unwrap(),
+            AppSettings::TrailingValues
+        );
+        assert_eq!(
+            "infersubcommands".parse::<AppSettings>().unwrap(),
+            AppSettings::InferSubcommands
+        );
         assert!("hahahaha".parse::<AppSettings>().is_err());
     }
 }
--- a/third_party/rust/clap/src/app/usage.rs
+++ b/third_party/rust/clap/src/app/usage.rs
@@ -14,21 +14,23 @@ pub fn create_usage_with_title(p: &Parse
     debugln!("usage::create_usage_with_title;");
     let mut usage = String::with_capacity(75);
     usage.push_str("USAGE:\n    ");
     usage.push_str(&*create_usage_no_title(p, used));
     usage
 }
 
 // Creates a usage string to be used in error message (i.e. one with currently used args)
-pub fn create_error_usage<'a, 'b>(p: &Parser<'a, 'b>,
-                                  matcher: &'b ArgMatcher<'a>,
-                                  extra: Option<&str>)
-                                  -> String {
-    let mut args: Vec<_> = matcher.arg_names()
+pub fn create_error_usage<'a, 'b>(
+    p: &Parser<'a, 'b>,
+    matcher: &'b ArgMatcher<'a>,
+    extra: Option<&str>,
+) -> String {
+    let mut args: Vec<_> = matcher
+        .arg_names()
         .iter()
         .filter(|n| {
             if let Some(o) = find_by_name!(p, **n, opts, iter) {
                 !o.b.is_set(ArgSettings::Required) && !o.b.is_set(ArgSettings::Hidden)
             } else if let Some(p) = find_by_name!(p, **n, positionals, values) {
                 !p.b.is_set(ArgSettings::Required) && p.b.is_set(ArgSettings::Hidden)
             } else {
                 true // flags can't be required, so they're always true
@@ -55,88 +57,94 @@ pub fn create_usage_no_title(p: &Parser,
 }
 
 // Creates a usage string for display in help messages (i.e. not for errors)
 pub fn create_help_usage(p: &Parser, incl_reqs: bool) -> String {
     let mut usage = String::with_capacity(75);
     let name = p.meta
         .usage
         .as_ref()
-        .unwrap_or_else(|| {
-                            p.meta
-                                .bin_name
-                                .as_ref()
-                                .unwrap_or(&p.meta.name)
-                        });
+        .unwrap_or_else(|| p.meta.bin_name.as_ref().unwrap_or(&p.meta.name));
     usage.push_str(&*name);
     let req_string = if incl_reqs {
         let mut reqs: Vec<&str> = p.required().map(|r| &**r).collect();
         reqs.sort();
         reqs.dedup();
-        get_required_usage_from(p, &reqs, None, None, false).iter().fold(String::new(), |a, s| {
-            a + &format!(" {}", s)[..]
-        })
+        get_required_usage_from(p, &reqs, None, None, false)
+            .iter()
+            .fold(String::new(), |a, s| a + &format!(" {}", s)[..])
     } else {
         String::new()
     };
 
     let flags = needs_flags_tag(p);
     if flags && !p.is_set(AS::UnifiedHelpMessage) {
         usage.push_str(" [FLAGS]");
     } else if flags {
         usage.push_str(" [OPTIONS]");
     }
-    if !p.is_set(AS::UnifiedHelpMessage) &&
-       p.opts.iter().any(|o| !o.is_set(ArgSettings::Required) && !o.is_set(ArgSettings::Hidden)) {
+    if !p.is_set(AS::UnifiedHelpMessage) && p.opts.iter().any(|o| {
+        !o.is_set(ArgSettings::Required) && !o.is_set(ArgSettings::Hidden)
+    }) {
         usage.push_str(" [OPTIONS]");
     }
 
     usage.push_str(&req_string[..]);
 
     let has_last = p.positionals.values().any(|p| p.is_set(ArgSettings::Last));
     // places a '--' in the usage string if there are args and options
     // supporting multiple values
-    if p.opts.iter().any(|o| o.is_set(ArgSettings::Multiple)) &&
-       p.positionals.values().any(|p| !p.is_set(ArgSettings::Required)) &&
-       !p.has_visible_subcommands() && !has_last {
+    if p.opts.iter().any(|o| o.is_set(ArgSettings::Multiple))
+        && p.positionals
+            .values()
+            .any(|p| !p.is_set(ArgSettings::Required))
+        && !(p.has_visible_subcommands() || p.is_set(AS::AllowExternalSubcommands))
+        && !has_last
+    {
         usage.push_str(" [--]");
     }
-    let not_req_or_hidden =
-        |p: &PosBuilder| (!p.is_set(ArgSettings::Required) || p.is_set(ArgSettings::Last)) && !p.is_set(ArgSettings::Hidden);
+    let not_req_or_hidden = |p: &PosBuilder| {
+        (!p.is_set(ArgSettings::Required) || p.is_set(ArgSettings::Last))
+            && !p.is_set(ArgSettings::Hidden)
+    };
     if p.has_positionals() && p.positionals.values().any(not_req_or_hidden) {
         if let Some(args_tag) = get_args_tag(p, incl_reqs) {
             usage.push_str(&*args_tag);
         } else {
             usage.push_str(" [ARGS]");
         }
         if has_last && incl_reqs {
             let pos = p.positionals
                 .values()
                 .find(|p| p.b.is_set(ArgSettings::Last))
                 .expect(INTERNAL_ERROR_MSG);
             debugln!("usage::create_help_usage: '{}' has .last(true)", pos.name());
             let req = pos.is_set(ArgSettings::Required);
-            if req && p.positionals.values().any(|p| !p.is_set(ArgSettings::Required)) {
+            if req
+                && p.positionals
+                    .values()
+                    .any(|p| !p.is_set(ArgSettings::Required))
+            {
                 usage.push_str(" -- <");
             } else if req {
                 usage.push_str(" [--] <");
             } else {
                 usage.push_str(" [-- <");
             }
             usage.push_str(&*pos.name_no_brackets());
             usage.push_str(">");
             usage.push_str(pos.multiple_str());
             if !req {
                 usage.push_str("]");
             }
         }
     }
 
     // incl_reqs is only false when this function is called recursively
-    if p.has_visible_subcommands() && incl_reqs {
+    if p.has_visible_subcommands() && incl_reqs || p.is_set(AS::AllowExternalSubcommands) {
         if p.is_set(AS::SubcommandsNegateReqs) || p.is_set(AS::ArgsNegateSubcommands) {
             if !p.is_set(AS::ArgsNegateSubcommands) {
                 usage.push_str("\n    ");
                 usage.push_str(&*create_help_usage(p, false));
                 usage.push_str(" <SUBCOMMAND>");
             } else {
                 usage.push_str("\n    ");
                 usage.push_str(&*name);
@@ -156,115 +164,126 @@ pub fn create_help_usage(p: &Parser, inc
 // Creates a context aware usage string, or "smart usage" from currently used
 // args, and requirements
 fn create_smart_usage(p: &Parser, used: &[&str]) -> String {
     debugln!("usage::smart_usage;");
     let mut usage = String::with_capacity(75);
     let mut hs: Vec<&str> = p.required().map(|s| &**s).collect();
     hs.extend_from_slice(used);
 
-    let r_string =
-        get_required_usage_from(p, &hs, None, None, false).iter().fold(String::new(), |acc, s| {
-            acc + &format!(" {}", s)[..]
-        });
+    let r_string = get_required_usage_from(p, &hs, None, None, false)
+        .iter()
+        .fold(String::new(), |acc, s| acc + &format!(" {}", s)[..]);
 
-    usage.push_str(&p.meta
-                        .usage
-                        .as_ref()
-                        .unwrap_or_else(|| {
-                                            p.meta
-                                                .bin_name
-                                                .as_ref()
-                                                .unwrap_or(&p.meta.name)
-                                        })
-                        [..]);
+    usage.push_str(
+        &p.meta
+            .usage
+            .as_ref()
+            .unwrap_or_else(|| p.meta.bin_name.as_ref().unwrap_or(&p.meta.name))[..],
+    );
     usage.push_str(&*r_string);
     if p.is_set(AS::SubcommandRequired) {
         usage.push_str(" <SUBCOMMAND>");
     }
     usage.shrink_to_fit();
     usage
 }
 
 // Gets the `[ARGS]` tag for the usage string
 fn get_args_tag(p: &Parser, incl_reqs: bool) -> Option<String> {
     debugln!("usage::get_args_tag;");
     let mut count = 0;
     'outer: for pos in p.positionals
-                    .values()
-                    .filter(|pos| !pos.is_set(ArgSettings::Required))
-                    .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                    .filter(|pos| !pos.is_set(ArgSettings::Last)) {
+        .values()
+        .filter(|pos| !pos.is_set(ArgSettings::Required))
+        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
+        .filter(|pos| !pos.is_set(ArgSettings::Last))
+    {
         debugln!("usage::get_args_tag:iter:{}:", pos.b.name);
         if let Some(g_vec) = p.groups_for_arg(pos.b.name) {
             for grp_s in &g_vec {
                 debugln!("usage::get_args_tag:iter:{}:iter:{};", pos.b.name, grp_s);
                 // if it's part of a required group we don't want to count it
                 if p.groups.iter().any(|g| g.required && (&g.name == grp_s)) {
                     continue 'outer;
                 }
             }
         }
         count += 1;
-        debugln!("usage::get_args_tag:iter: {} Args not required or hidden",
-                 count);
+        debugln!(
+            "usage::get_args_tag:iter: {} Args not required or hidden",
+            count
+        );
     }
     if !p.is_set(AS::DontCollapseArgsInUsage) && count > 1 {
         debugln!("usage::get_args_tag:iter: More than one, returning [ARGS]");
         return None; // [ARGS]
     } else if count == 1 && incl_reqs {
         let pos = p.positionals
             .values()
             .find(|pos| {
-                      !pos.is_set(ArgSettings::Required) && !pos.is_set(ArgSettings::Hidden) &&
-                      !pos.is_set(ArgSettings::Last)
-                  })
+                !pos.is_set(ArgSettings::Required) && !pos.is_set(ArgSettings::Hidden)
+                    && !pos.is_set(ArgSettings::Last)
+            })
             .expect(INTERNAL_ERROR_MSG);
-        debugln!("usage::get_args_tag:iter: Exactly one, returning '{}'",
-                 pos.name());
-        return Some(format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()));
+        debugln!(
+            "usage::get_args_tag:iter: Exactly one, returning '{}'",
+            pos.name()
+        );
+        return Some(format!(
+            " [{}]{}",
+            pos.name_no_brackets(),
+            pos.multiple_str()
+        ));
     } else if p.is_set(AS::DontCollapseArgsInUsage) && !p.positionals.is_empty() && incl_reqs {
         debugln!("usage::get_args_tag:iter: Don't collapse returning all");
-        return Some(p.positionals
-                        .values()
-                        .filter(|pos| !pos.is_set(ArgSettings::Required))
-                        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                        .filter(|pos| !pos.is_set(ArgSettings::Last))
-                        .map(|pos| {
-                                 format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
-                             })
-                        .collect::<Vec<_>>()
-                        .join(""));
+        return Some(
+            p.positionals
+                .values()
+                .filter(|pos| !pos.is_set(ArgSettings::Required))
+                .filter(|pos| !pos.is_set(ArgSettings::Hidden))
+                .filter(|pos| !pos.is_set(ArgSettings::Last))
+                .map(|pos| {
+                    format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
+                })
+                .collect::<Vec<_>>()
+                .join(""),
+        );
     } else if !incl_reqs {
         debugln!("usage::get_args_tag:iter: incl_reqs=false, building secondary usage string");
         let highest_req_pos = p.positionals
             .iter()
-            .filter_map(|(idx, pos)| if pos.b.is_set(ArgSettings::Required) &&
-                                        !pos.b.is_set(ArgSettings::Last) {
-                            Some(idx)
-                        } else {
-                            None
-                        })
+            .filter_map(|(idx, pos)| {
+                if pos.b.is_set(ArgSettings::Required) && !pos.b.is_set(ArgSettings::Last) {
+                    Some(idx)
+                } else {
+                    None
+                }
+            })
             .max()
             .unwrap_or_else(|| p.positionals.len());
-        return Some(p.positionals
-                        .iter()
-                        .filter_map(|(idx, pos)| if idx <= highest_req_pos {
-                                        Some(pos)
-                                    } else {
-                                        None
-                                    })
-                        .filter(|pos| !pos.is_set(ArgSettings::Required))
-                        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                        .filter(|pos| !pos.is_set(ArgSettings::Last))
-                        .map(|pos| {
-                                 format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
-                             })
-                        .collect::<Vec<_>>()
-                        .join(""));
+        return Some(
+            p.positionals
+                .iter()
+                .filter_map(|(idx, pos)| {
+                    if idx <= highest_req_pos {
+                        Some(pos)
+                    } else {
+                        None
+                    }
+                })
+                .filter(|pos| !pos.is_set(ArgSettings::Required))
+                .filter(|pos| !pos.is_set(ArgSettings::Hidden))
+                .filter(|pos| !pos.is_set(ArgSettings::Last))
+                .map(|pos| {
+                    format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str())
+                })
+                .collect::<Vec<_>>()
+                .join(""),
+        );
     }
     Some("".into())
 }
 
 // Determines if we need the `[FLAGS]` tag in the usage string
 fn needs_flags_tag(p: &Parser) -> bool {
     debugln!("usage::needs_flags_tag;");
     'outer: for f in &p.flags {
@@ -291,25 +310,28 @@ fn needs_flags_tag(p: &Parser) -> bool {
         return true;
     }
 
     debugln!("usage::needs_flags_tag: [FLAGS] not required");
     false
 }
 
 // Returns the required args in usage string form by fully unrolling all groups
-pub fn get_required_usage_from<'a, 'b>(p: &Parser<'a, 'b>,
-                                       reqs: &[&'a str],
-                                       matcher: Option<&ArgMatcher<'a>>,
-                                       extra: Option<&str>,
-                                       incl_last: bool)
-                                       -> VecDeque<String> {
-    debugln!("usage::get_required_usage_from: reqs={:?}, extra={:?}",
-             reqs,
-             extra);
+pub fn get_required_usage_from<'a, 'b>(
+    p: &Parser<'a, 'b>,
+    reqs: &[&'a str],
+    matcher: Option<&ArgMatcher<'a>>,
+    extra: Option<&str>,
+    incl_last: bool,
+) -> VecDeque<String> {
+    debugln!(
+        "usage::get_required_usage_from: reqs={:?}, extra={:?}",
+        reqs,
+        extra
+    );
     let mut desc_reqs: Vec<&str> = vec![];
     desc_reqs.extend(extra);
     let mut new_reqs: Vec<&str> = vec![];
     macro_rules! get_requires {
         (@group $a: ident, $v:ident, $p:ident) => {{
             if let Some(rl) = p.groups.iter()
                                             .filter(|g| g.requires.is_some())
                                             .find(|g| &g.name == $a)
@@ -341,95 +363,113 @@ pub fn get_required_usage_from<'a, 'b>(p
     // initialize new_reqs
     for a in reqs {
         get_requires!(a, flags, iter, new_reqs, reqs);
         get_requires!(a, opts, iter, new_reqs, reqs);
         get_requires!(a, positionals, values, new_reqs, reqs);
         get_requires!(@group a, new_reqs, reqs);
     }
     desc_reqs.extend_from_slice(&*new_reqs);
-    debugln!("usage::get_required_usage_from: after init desc_reqs={:?}",
-             desc_reqs);
+    debugln!(
+        "usage::get_required_usage_from: after init desc_reqs={:?}",
+        desc_reqs
+    );
     loop {
         let mut tmp = vec![];
         for a in &new_reqs {
             get_requires!(a, flags, iter, tmp, desc_reqs);
             get_requires!(a, opts, iter, tmp, desc_reqs);
             get_requires!(a, positionals, values, tmp, desc_reqs);
             get_requires!(@group a, tmp, desc_reqs);
         }
         if tmp.is_empty() {
             debugln!("usage::get_required_usage_from: no more children");
             break;
         } else {
             debugln!("usage::get_required_usage_from: after iter tmp={:?}", tmp);
-            debugln!("usage::get_required_usage_from: after iter new_reqs={:?}",
-                     new_reqs);
+            debugln!(
+                "usage::get_required_usage_from: after iter new_reqs={:?}",
+                new_reqs
+            );
             desc_reqs.extend_from_slice(&*new_reqs);
             new_reqs.clear();
             new_reqs.extend_from_slice(&*tmp);
-            debugln!("usage::get_required_usage_from: after iter desc_reqs={:?}",
-                     desc_reqs);
+            debugln!(
+                "usage::get_required_usage_from: after iter desc_reqs={:?}",
+                desc_reqs
+            );
         }
     }
     desc_reqs.extend_from_slice(reqs);
     desc_reqs.sort();
     desc_reqs.dedup();
-    debugln!("usage::get_required_usage_from: final desc_reqs={:?}",
-             desc_reqs);
+    debugln!(
+        "usage::get_required_usage_from: final desc_reqs={:?}",
+        desc_reqs
+    );
     let mut ret_val = VecDeque::new();
     let args_in_groups = p.groups
         .iter()
         .filter(|gn| desc_reqs.contains(&gn.name))
         .flat_map(|g| p.arg_names_in_group(g.name))
         .collect::<Vec<_>>();
 
     let pmap = if let Some(m) = matcher {
-        desc_reqs.iter()
+        desc_reqs
+            .iter()
             .filter(|a| p.positionals.values().any(|p| &&p.b.name == a))
             .filter(|&pos| !m.contains(pos))
             .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
             .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
             .filter(|pos| !args_in_groups.contains(&pos.b.name))
             .map(|pos| (pos.index, pos))
             .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
     } else {
-        desc_reqs.iter()
+        desc_reqs
+            .iter()
             .filter(|a| p.positionals.values().any(|pos| &&pos.b.name == a))
             .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
             .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
             .filter(|pos| !args_in_groups.contains(&pos.b.name))
             .map(|pos| (pos.index, pos))
             .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
     };
-    debugln!("usage::get_required_usage_from: args_in_groups={:?}",
-             args_in_groups);
+    debugln!(
+        "usage::get_required_usage_from: args_in_groups={:?}",
+        args_in_groups
+    );
     for &p in pmap.values() {
         let s = p.to_string();
         if args_in_groups.is_empty() || !args_in_groups.contains(&&*s) {
             ret_val.push_back(s);
         }
     }
-    for a in desc_reqs.iter()
-            .filter(|name| !p.positionals.values().any(|p| &&p.b.name == name))
-            .filter(|name| !p.groups.iter().any(|g| &&g.name == name))
-            .filter(|name| !args_in_groups.contains(name))
-            .filter(|name| !(matcher.is_some() && matcher.as_ref().unwrap().contains(name))) {
+    for a in desc_reqs
+        .iter()
+        .filter(|name| !p.positionals.values().any(|p| &&p.b.name == name))
+        .filter(|name| !p.groups.iter().any(|g| &&g.name == name))
+        .filter(|name| !args_in_groups.contains(name))
+        .filter(|name| {
+            !(matcher.is_some() && matcher.as_ref().unwrap().contains(name))
+        }) {
         debugln!("usage::get_required_usage_from:iter:{}:", a);
         let arg = find_by_name!(p, *a, flags, iter)
             .map(|f| f.to_string())
             .unwrap_or_else(|| {
-                                find_by_name!(p, *a, opts, iter)
-                                    .map(|o| o.to_string())
-                                    .expect(INTERNAL_ERROR_MSG)
-                            });
+                find_by_name!(p, *a, opts, iter)
+                    .map(|o| o.to_string())
+                    .expect(INTERNAL_ERROR_MSG)
+            });
         ret_val.push_back(arg);
     }
     let mut g_vec: Vec<String> = vec![];
-    for g in desc_reqs.iter().filter(|n| p.groups.iter().any(|g| &&g.name == n)) {
+    for g in desc_reqs
+        .iter()
+        .filter(|n| p.groups.iter().any(|g| &&g.name == n))
+    {
         let g_string = p.args_in_group(g).join("|");
         let elem = format!("<{}>", &g_string[..g_string.len()]);
         if !g_vec.contains(&elem) {
             g_vec.push(elem);
         }
     }
     for g in g_vec {
         ret_val.push_back(g);
--- a/third_party/rust/clap/src/app/validator.rs
+++ b/third_party/rust/clap/src/app/validator.rs
@@ -1,36 +1,40 @@
 // std
 use std::fmt::Display;
+#[allow(unused_imports)]
+use std::ascii::AsciiExt;
 
 // Internal
 use INTERNAL_ERROR_MSG;
 use INVALID_UTF8;
 use args::{AnyArg, ArgMatcher, MatchedArg};
 use args::settings::ArgSettings;
 use errors::{Error, ErrorKind};
 use errors::Result as ClapResult;
 use osstringext::OsStrExt2;
 use app::settings::AppSettings as AS;
-use app::parser::{Parser, ParseResult};
+use app::parser::{ParseResult, Parser};
 use fmt::{Colorizer, ColorizerOption};
 use app::usage;
 
 pub struct Validator<'a, 'b, 'z>(&'z mut Parser<'a, 'b>)
-    where 'a: 'b,
-          'b: 'z;
+where
+    'a: 'b,
+    'b: 'z;
 
 impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
     pub fn new(p: &'z mut Parser<'a, 'b>) -> Self { Validator(p) }
 
-    pub fn validate(&mut self,
-                    needs_val_of: ParseResult<'a>,
-                    subcmd_name: Option<String>,
-                    matcher: &mut ArgMatcher<'a>)
-                    -> ClapResult<()> {
+    pub fn validate(
+        &mut self,
+        needs_val_of: ParseResult<'a>,
+        subcmd_name: Option<String>,
+        matcher: &mut ArgMatcher<'a>,
+    ) -> ClapResult<()> {
         debugln!("Validator::validate;");
         let mut reqs_validated = false;
         self.0.add_env(matcher)?;
         self.0.add_defaults(matcher)?;
         if let ParseResult::Opt(a) = needs_val_of {
             debugln!("Validator::validate: needs_val_of={:?}", a);
             let o = self.0
                 .opts
@@ -40,111 +44,132 @@ impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
             self.validate_required(matcher)?;
             reqs_validated = true;
             let should_err = if let Some(v) = matcher.0.args.get(&*o.b.name) {
                 v.vals.is_empty() && !(o.v.min_vals.is_some() && o.v.min_vals.unwrap() == 0)
             } else {
                 true
             };
             if should_err {
-                return Err(Error::empty_value(o,
-                                              &*usage::create_error_usage(self.0, matcher, None),
-                                              self.0.color()));
+                return Err(Error::empty_value(
+                    o,
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
         }
 
-        if matcher.is_empty() && matcher.subcommand_name().is_none() &&
-           self.0.is_set(AS::ArgRequiredElseHelp) {
+        if matcher.is_empty() && matcher.subcommand_name().is_none()
+            && self.0.is_set(AS::ArgRequiredElseHelp)
+        {
             let mut out = vec![];
             self.0.write_help_err(&mut out)?;
             return Err(Error {
-                           message: String::from_utf8_lossy(&*out).into_owned(),
-                           kind: ErrorKind::MissingArgumentOrSubcommand,
-                           info: None,
-                       });
+                message: String::from_utf8_lossy(&*out).into_owned(),
+                kind: ErrorKind::MissingArgumentOrSubcommand,
+                info: None,
+            });
         }
         self.validate_blacklist(matcher)?;
         if !(self.0.is_set(AS::SubcommandsNegateReqs) && subcmd_name.is_some()) && !reqs_validated {
             self.validate_required(matcher)?;
         }
         self.validate_matched_args(matcher)?;
         matcher.usage(usage::create_usage_with_title(self.0, &[]));
 
         Ok(())
     }
 
-    fn validate_values<A>(&self,
-                          arg: &A,
-                          ma: &MatchedArg,
-                          matcher: &ArgMatcher<'a>)
-                          -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
+    fn validate_values<A>(
+        &self,
+        arg: &A,
+        ma: &MatchedArg,
+        matcher: &ArgMatcher<'a>,
+    ) -> ClapResult<()>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Validator::validate_values: arg={:?}", arg.name());
         for val in &ma.vals {
             if self.0.is_set(AS::StrictUtf8) && val.to_str().is_none() {
-                debugln!("Validator::validate_values: invalid UTF-8 found in val {:?}",
-                         val);
-                return Err(Error::invalid_utf8(&*usage::create_error_usage(self.0, matcher, None),
-                                               self.0.color()));
+                debugln!(
+                    "Validator::validate_values: invalid UTF-8 found in val {:?}",
+                    val
+                );
+                return Err(Error::invalid_utf8(
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
             if let Some(p_vals) = arg.possible_vals() {
                 debugln!("Validator::validate_values: possible_vals={:?}", p_vals);
                 let val_str = val.to_string_lossy();
-                if !p_vals.contains(&&*val_str) {
-                    return Err(Error::invalid_value(val_str,
-                                                    p_vals,
-                                                    arg,
-                                                    &*usage::create_error_usage(self.0,
-                                                                                matcher,
-                                                                                None),
-                                                    self.0.color()));
+                let ok = if arg.is_set(ArgSettings::CaseInsensitive) {
+                    p_vals.iter().any(|pv| pv.eq_ignore_ascii_case(&*val_str))
+                } else {
+                    p_vals.contains(&&*val_str)
+                };
+                if !ok {
+                    return Err(Error::invalid_value(
+                        val_str,
+                        p_vals,
+                        arg,
+                        &*usage::create_error_usage(self.0, matcher, None),
+                        self.0.color(),
+                    ));
                 }
             }
-            if !arg.is_set(ArgSettings::EmptyValues) && val.is_empty_() &&
-               matcher.contains(&*arg.name()) {
+            if !arg.is_set(ArgSettings::EmptyValues) && val.is_empty_()
+                && matcher.contains(&*arg.name())
+            {
                 debugln!("Validator::validate_values: illegal empty val found");
-                return Err(Error::empty_value(arg,
-                                              &*usage::create_error_usage(self.0, matcher, None),
-                                              self.0.color()));
+                return Err(Error::empty_value(
+                    arg,
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
             if let Some(vtor) = arg.validator() {
                 debug!("Validator::validate_values: checking validator...");
                 if let Err(e) = vtor(val.to_string_lossy().into_owned()) {
                     sdebugln!("error");
                     return Err(Error::value_validation(Some(arg), e, self.0.color()));
                 } else {
                     sdebugln!("good");
                 }
             }
             if let Some(vtor) = arg.validator_os() {
                 debug!("Validator::validate_values: checking validator_os...");
                 if let Err(e) = vtor(val) {
                     sdebugln!("error");
-                    return Err(Error::value_validation(Some(arg),
-                                                       (*e).to_string_lossy().to_string(),
-                                                       self.0.color()));
+                    return Err(Error::value_validation(
+                        Some(arg),
+                        (*e).to_string_lossy().to_string(),
+                        self.0.color(),
+                    ));
                 } else {
                     sdebugln!("good");
                 }
             }
         }
         Ok(())
     }
 
     fn validate_blacklist(&self, matcher: &mut ArgMatcher) -> ClapResult<()> {
-        debugln!("Validator::validate_blacklist: blacklist={:?}",
-                 self.0.blacklist);
+        debugln!(
+            "Validator::validate_blacklist: blacklist={:?}",
+            self.0.blacklist
+        );
         macro_rules! build_err {
             ($p:expr, $name:expr, $matcher:ident) => ({
                 debugln!("build_err!: name={}", $name);
                 let mut c_with = find_from!($p, &$name, blacklist, &$matcher);
                 c_with = c_with.or(
                     $p.find_any_arg(&$name).map_or(None, |aa| aa.blacklist())
-                                           .map_or(None, 
+                                           .map_or(None,
                                                 |bl| bl.iter().find(|arg| $matcher.contains(arg)))
                                            .map_or(None, |an| $p.find_any_arg(an))
                                            .map_or(None, |aa| Some(format!("{}", aa)))
                 );
                 debugln!("build_err!: '{:?}' conflicts with '{}'", c_with, &$name);
                 $matcher.remove(&$name);
                 let usg = usage::create_error_usage($p, $matcher, None);
                 if let Some(f) = find_by_name!($p, $name, flags, iter) {
@@ -161,44 +186,63 @@ impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
                         },
                         None    => panic!(INTERNAL_ERROR_MSG)
                     }
                 }
             });
         }
 
         for name in &self.0.blacklist {
-            debugln!("Validator::validate_blacklist:iter:{}: Checking blacklisted arg", name);
+            debugln!(
+                "Validator::validate_blacklist:iter:{}: Checking blacklisted arg",
+                name
+            );
             let mut should_err = false;
             if self.0.groups.iter().any(|g| &g.name == name) {
-                debugln!("Validator::validate_blacklist:iter:{}: groups contains it...", name);
+                debugln!(
+                    "Validator::validate_blacklist:iter:{}: groups contains it...",
+                    name
+                );
                 for n in self.0.arg_names_in_group(name) {
-                    debugln!("Validator::validate_blacklist:iter:{}:iter:{}: looking in group...", name, n);
+                    debugln!(
+                        "Validator::validate_blacklist:iter:{}:iter:{}: looking in group...",
+                        name,
+                        n
+                    );
                     if matcher.contains(n) {
-                        debugln!("Validator::validate_blacklist:iter:{}:iter:{}: matcher contains it...", name, n);
+                        debugln!(
+                            "Validator::validate_blacklist:iter:{}:iter:{}: matcher contains it...",
+                            name,
+                            n
+                        );
                         return Err(build_err!(self.0, n, matcher));
                     }
                 }
             } else if let Some(ma) = matcher.get(name) {
-                debugln!("Validator::validate_blacklist:iter:{}: matcher contains it...", name);
+                debugln!(
+                    "Validator::validate_blacklist:iter:{}: matcher contains it...",
+                    name
+                );
                 should_err = ma.occurs > 0;
             }
             if should_err {
                 return Err(build_err!(self.0, *name, matcher));
             }
         }
         Ok(())
     }
 
     fn validate_matched_args(&self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
         debugln!("Validator::validate_matched_args;");
         for (name, ma) in matcher.iter() {
-            debugln!("Validator::validate_matched_args:iter:{}: vals={:#?}",
-                     name,
-                     ma.vals);
+            debugln!(
+                "Validator::validate_matched_args:iter:{}: vals={:#?}",
+                name,
+                ma.vals
+            );
             if let Some(opt) = find_by_name!(self.0, *name, opts, iter) {
                 self.validate_arg_num_vals(opt, ma, matcher)?;
                 self.validate_values(opt, ma, matcher)?;
                 self.validate_arg_requires(opt, ma, matcher)?;
                 self.validate_arg_num_occurs(opt, ma, matcher)?;
             } else if let Some(flag) = find_by_name!(self.0, *name, flags, iter) {
                 self.validate_arg_requires(flag, ma, matcher)?;
                 self.validate_arg_num_occurs(flag, ma, matcher)?;
@@ -218,136 +262,148 @@ impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
                         return self.missing_required_error(matcher, None);
                     }
                 }
             }
         }
         Ok(())
     }
 
-    fn validate_arg_num_occurs<A>(&self,
-                                  a: &A,
-                                  ma: &MatchedArg,
-                                  matcher: &ArgMatcher)
-                                  -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
+    fn validate_arg_num_occurs<A>(
+        &self,
+        a: &A,
+        ma: &MatchedArg,
+        matcher: &ArgMatcher,
+    ) -> ClapResult<()>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Validator::validate_arg_num_occurs: a={};", a.name());
         if ma.occurs > 1 && !a.is_set(ArgSettings::Multiple) {
             // Not the first time, and we don't allow multiples
-            return Err(Error::unexpected_multiple_usage(a,
-                                                        &*usage::create_error_usage(self.0,
-                                                                                    matcher,
-                                                                                    None),
-                                                        self.0.color()));
+            return Err(Error::unexpected_multiple_usage(
+                a,
+                &*usage::create_error_usage(self.0, matcher, None),
+                self.0.color(),
+            ));
         }
         Ok(())
     }
 
-    fn validate_arg_num_vals<A>(&self,
-                                a: &A,
-                                ma: &MatchedArg,
-                                matcher: &ArgMatcher)
-                                -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
+    fn validate_arg_num_vals<A>(
+        &self,
+        a: &A,
+        ma: &MatchedArg,
+        matcher: &ArgMatcher,
+    ) -> ClapResult<()>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Validator::validate_arg_num_vals;");
         if let Some(num) = a.num_vals() {
             debugln!("Validator::validate_arg_num_vals: num_vals set...{}", num);
             let should_err = if a.is_set(ArgSettings::Multiple) {
                 ((ma.vals.len() as u64) % num) != 0
             } else {
                 num != (ma.vals.len() as u64)
             };
             if should_err {
                 debugln!("Validator::validate_arg_num_vals: Sending error WrongNumberOfValues");
-                return Err(Error::wrong_number_of_values(a,
-                                                         num,
-                                                         if a.is_set(ArgSettings::Multiple) {
-                                                             (ma.vals.len() % num as usize)
-                                                         } else {
-                                                             ma.vals.len()
-                                                         },
-                                                         if ma.vals.len() == 1 ||
-                                                            (a.is_set(ArgSettings::Multiple) &&
-                                                             (ma.vals.len() % num as usize) ==
-                                                             1) {
-                                                             "as"
-                                                         } else {
-                                                             "ere"
-                                                         },
-                                                         &*usage::create_error_usage(self.0,
-                                                                                     matcher,
-                                                                                     None),
-                                                         self.0.color()));
+                return Err(Error::wrong_number_of_values(
+                    a,
+                    num,
+                    if a.is_set(ArgSettings::Multiple) {
+                        (ma.vals.len() % num as usize)
+                    } else {
+                        ma.vals.len()
+                    },
+                    if ma.vals.len() == 1
+                        || (a.is_set(ArgSettings::Multiple) && (ma.vals.len() % num as usize) == 1)
+                    {
+                        "as"
+                    } else {
+                        "ere"
+                    },
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
         }
         if let Some(num) = a.max_vals() {
             debugln!("Validator::validate_arg_num_vals: max_vals set...{}", num);
             if (ma.vals.len() as u64) > num {
                 debugln!("Validator::validate_arg_num_vals: Sending error TooManyValues");
-                return Err(Error::too_many_values(ma.vals
-                                                      .iter()
-                                                      .last()
-                                                      .expect(INTERNAL_ERROR_MSG)
-                                                      .to_str()
-                                                      .expect(INVALID_UTF8),
-                                                  a,
-                                                  &*usage::create_error_usage(self.0,
-                                                                              matcher,
-                                                                              None),
-                                                  self.0.color()));
+                return Err(Error::too_many_values(
+                    ma.vals
+                        .iter()
+                        .last()
+                        .expect(INTERNAL_ERROR_MSG)
+                        .to_str()
+                        .expect(INVALID_UTF8),
+                    a,
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
         }
         let min_vals_zero = if let Some(num) = a.min_vals() {
             debugln!("Validator::validate_arg_num_vals: min_vals set: {}", num);
             if (ma.vals.len() as u64) < num && num != 0 {
                 debugln!("Validator::validate_arg_num_vals: Sending error TooFewValues");
-                return Err(Error::too_few_values(a,
-                                                 num,
-                                                 ma.vals.len(),
-                                                 &*usage::create_error_usage(self.0,
-                                                                             matcher,
-                                                                             None),
-                                                 self.0.color()));
+                return Err(Error::too_few_values(
+                    a,
+                    num,
+                    ma.vals.len(),
+                    &*usage::create_error_usage(self.0, matcher, None),
+                    self.0.color(),
+                ));
             }
             num == 0
-        } else { false };
+        } else {
+            false
+        };
         // Issue 665 (https://github.com/kbknapp/clap-rs/issues/665)
-        if a.takes_value() && !(a.is_set(ArgSettings::EmptyValues) || min_vals_zero)  && ma.vals.is_empty() {
-            return Err(Error::empty_value(a,
-                                          &*usage::create_error_usage(self.0, matcher, None),
-                                          self.0.color()));
+        // Issue 1105 (https://github.com/kbknapp/clap-rs/issues/1105)
+        if a.takes_value() && !min_vals_zero && ma.vals.is_empty() {
+            return Err(Error::empty_value(
+                a,
+                &*usage::create_error_usage(self.0, matcher, None),
+                self.0.color(),
+            ));
         }
         Ok(())
     }
 
-    fn validate_arg_requires<A>(&self,
-                                a: &A,
-                                ma: &MatchedArg,
-                                matcher: &ArgMatcher)
-                                -> ClapResult<()>
-        where A: AnyArg<'a, 'b> + Display
+    fn validate_arg_requires<A>(
+        &self,
+        a: &A,
+        ma: &MatchedArg,
+        matcher: &ArgMatcher,
+    ) -> ClapResult<()>
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         debugln!("Validator::validate_arg_requires;");
         if let Some(a_reqs) = a.requires() {
             for &(val, name) in a_reqs.iter().filter(|&&(val, _)| val.is_some()) {
                 let missing_req =
                     |v| v == val.expect(INTERNAL_ERROR_MSG) && !matcher.contains(name);
                 if ma.vals.iter().any(missing_req) {
                     return self.missing_required_error(matcher, None);
                 }
             }
         }
         Ok(())
     }
 
     fn validate_required(&self, matcher: &ArgMatcher) -> ClapResult<()> {
-        debugln!("Validator::validate_required: required={:?};",
-                 self.0.required);
+        debugln!(
+            "Validator::validate_required: required={:?};",
+            self.0.required
+        );
         'outer: for name in &self.0.required {
             debugln!("Validator::validate_required:iter:{}:", name);
             if matcher.contains(name) {
                 continue 'outer;
             }
             if let Some(a) = find_by_name!(self.0, *name, flags, iter) {
                 if self.is_missing_required_ok(a, matcher) {
                     continue 'outer;
@@ -371,90 +427,91 @@ impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
                     return self.missing_required_error(matcher, Some(r));
                 }
             }
         }
         Ok(())
     }
 
     fn validate_conflicts<A>(&self, a: &A, matcher: &ArgMatcher) -> Option<bool>
-        where A: AnyArg<'a, 'b>
+    where
+        A: AnyArg<'a, 'b>,
     {
         debugln!("Validator::validate_conflicts: a={:?};", a.name());
-        a.blacklist()
-            .map(|bl| {
-                bl.iter()
-                    .any(|conf| {
-                        matcher.contains(conf) ||
-                        self.0
-                            .groups
-                            .iter()
-                            .find(|g| &g.name == conf)
-                            .map_or(false, |g| g.args.iter().any(|arg| matcher.contains(arg)))
-                    })
+        a.blacklist().map(|bl| {
+            bl.iter().any(|conf| {
+                matcher.contains(conf)
+                    || self.0
+                        .groups
+                        .iter()
+                        .find(|g| &g.name == conf)
+                        .map_or(false, |g| g.args.iter().any(|arg| matcher.contains(arg)))
             })
+        })
     }
 
     fn validate_required_unless<A>(&self, a: &A, matcher: &ArgMatcher) -> Option<bool>
-        where A: AnyArg<'a, 'b>
+    where
+        A: AnyArg<'a, 'b>,
     {
         debugln!("Validator::validate_required_unless: a={:?};", a.name());
         macro_rules! check {
             ($how:ident, $_self:expr, $a:ident, $m:ident) => {{
                 $a.required_unless().map(|ru| {
                     ru.iter().$how(|n| {
                         $m.contains(n) || {
                             if let Some(grp) = $_self.groups.iter().find(|g| &g.name == n) {
                                      grp.args.iter().any(|arg| $m.contains(arg))
                             } else {
                                 false
                             }
                         }
                     })
                 })
-            }}; 
+            }};
         }
         if a.is_set(ArgSettings::RequiredUnlessAll) {
             check!(all, self.0, a, matcher)
         } else {
             check!(any, self.0, a, matcher)
         }
     }
 
     fn missing_required_error(&self, matcher: &ArgMatcher, extra: Option<&str>) -> ClapResult<()> {
         debugln!("Validator::missing_required_error: extra={:?}", extra);
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: self.0.color(),
         });
-        let mut reqs = self.0
-            .required
-            .iter()
-            .map(|&r| &*r)
-            .collect::<Vec<_>>();
+        let mut reqs = self.0.required.iter().map(|&r| &*r).collect::<Vec<_>>();
         if let Some(r) = extra {
             reqs.push(r);
         }
         reqs.retain(|n| !matcher.contains(n));
         reqs.dedup();
         debugln!("Validator::missing_required_error: reqs={:#?}", reqs);
         let req_args =
             usage::get_required_usage_from(self.0, &reqs[..], Some(matcher), extra, true)
                 .iter()
-                .fold(String::new(),
-                      |acc, s| acc + &format!("\n    {}", c.error(s))[..]);
-        debugln!("Validator::missing_required_error: req_args={:#?}",
-                 req_args);
-        Err(Error::missing_required_argument(&*req_args,
-                                             &*usage::create_error_usage(self.0, matcher, extra),
-                                             self.0.color()))
+                .fold(String::new(), |acc, s| {
+                    acc + &format!("\n    {}", c.error(s))[..]
+                });
+        debugln!(
+            "Validator::missing_required_error: req_args={:#?}",
+            req_args
+        );
+        Err(Error::missing_required_argument(
+            &*req_args,
+            &*usage::create_error_usage(self.0, matcher, extra),
+            self.0.color(),
+        ))
     }
 
     #[inline]
     fn is_missing_required_ok<A>(&self, a: &A, matcher: &ArgMatcher) -> bool
-        where A: AnyArg<'a, 'b>
+    where
+        A: AnyArg<'a, 'b>,
     {
         debugln!("Validator::is_missing_required_ok: a={}", a.name());
-        self.validate_conflicts(a, matcher).unwrap_or(false) ||
-        self.validate_required_unless(a, matcher)
-            .unwrap_or(false)
+        self.validate_conflicts(a, matcher).unwrap_or(false)
+            || self.validate_required_unless(a, matcher).unwrap_or(false)
     }
 }
--- a/third_party/rust/clap/src/args/arg.rs
+++ b/third_party/rust/clap/src/args/arg.rs
@@ -1,25 +1,25 @@
 #[cfg(feature = "yaml")]
 use std::collections::BTreeMap;
 use std::rc::Rc;
-use std::ffi::{OsString, OsStr};
-#[cfg(target_os="windows")]
+use std::ffi::{OsStr, OsString};
+#[cfg(target_os = "windows")]
 use osstringext::OsStrExt3;
-#[cfg(not(target_os="windows"))]
+#[cfg(not(target_os = "windows"))]
 use std::os::unix::ffi::OsStrExt;
 use std::env;
 
 #[cfg(feature = "yaml")]
 use yaml_rust::Yaml;
 use map::VecMap;
 
 use usage_parser::UsageParser;
 use args::settings::ArgSettings;
-use args::arg_builder::{Base, Valued, Switched};
+use args::arg_builder::{Base, Switched, Valued};
 
 /// The abstract representation of a command line argument. Used to set all the options and
 /// relationships that define a valid argument for the program.
 ///
 /// There are two methods for constructing [`Arg`]s, using the builder pattern and setting options
 /// manually, or using a usage string which is far less verbose but has fewer options. You can also
 /// use a combination of the two methods to achieve the best of both worlds.
 ///
@@ -36,28 +36,24 @@ use args::arg_builder::{Base, Valued, Sw
 ///       .help("Provides a config file to myprog");
 /// // Using a usage string (setting a similar argument to the one above)
 /// let input = Arg::from_usage("-i, --input=[FILE] 'Provides an input file to the program'");
 /// ```
 /// [`Arg`]: ./struct.Arg.html
 #[allow(missing_debug_implementations)]
 #[derive(Default, Clone)]
 pub struct Arg<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
-    #[doc(hidden)]
-    pub b: Base<'a, 'b>,
-    #[doc(hidden)]
-    pub s: Switched<'b>,
-    #[doc(hidden)]
-    pub v: Valued<'a, 'b>,
-    #[doc(hidden)]
-    pub index: Option<u64>,
-    #[doc(hidden)]
-    pub r_ifs: Option<Vec<(&'a str, &'b str)>>,
+    #[doc(hidden)] pub b: Base<'a, 'b>,
+    #[doc(hidden)] pub s: Switched<'b>,
+    #[doc(hidden)] pub v: Valued<'a, 'b>,
+    #[doc(hidden)] pub index: Option<u64>,
+    #[doc(hidden)] pub r_ifs: Option<Vec<(&'a str, &'b str)>>,
 }
 
 impl<'a, 'b> Arg<'a, 'b> {
     /// Creates a new instance of [`Arg`] using a unique string name. The name will be used to get
     /// information about whether or not the argument was used at runtime, get values, set
     /// relationships with other args, etc..
     ///
     /// **NOTE:** In the case of arguments that take values (i.e. [`Arg::takes_value(true)`])
@@ -68,17 +64,22 @@ impl<'a, 'b> Arg<'a, 'b> {
     ///
     /// ```rust
     /// # use clap::{App, Arg};
     /// Arg::with_name("config")
     /// # ;
     /// ```
     /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
     /// [`Arg`]: ./struct.Arg.html
-    pub fn with_name(n: &'a str) -> Self { Arg { b: Base::new(n), ..Default::default() } }
+    pub fn with_name(n: &'a str) -> Self {
+        Arg {
+            b: Base::new(n),
+            ..Default::default()
+        }
+    }
 
     /// Creates a new instance of [`Arg`] from a .yml (YAML) file.
     ///
     /// # Examples
     ///
     /// ```ignore
     /// # #[macro_use]
     /// # extern crate clap;
@@ -138,21 +139,21 @@ impl<'a, 'b> Arg<'a, 'b> {
                 "overrides_with" => yaml_vec_or_str!(v, a, overrides_with),
                 "possible_values" => yaml_vec_or_str!(v, a, possible_value),
                 "required_unless_one" => yaml_vec_or_str!(v, a, required_unless),
                 "required_unless_all" => {
                     a = yaml_vec_or_str!(v, a, required_unless);
                     a.setb(ArgSettings::RequiredUnlessAll);
                     a
                 }
-                s => {
-                    panic!("Unknown Arg setting '{}' in YAML file for arg '{}'",
-                           s,
-                           name_str)
-                }
+                s => panic!(
+                    "Unknown Arg setting '{}' in YAML file for arg '{}'",
+                    s,
+                    name_str
+                ),
             }
         }
 
         a
     }
 
     /// Creates a new instance of [`Arg`] from a usage string. Allows creation of basic settings
     /// for the [`Arg`]. The syntax is flexible, but there are some rules to follow.
@@ -600,42 +601,42 @@ impl<'a, 'b> Arg<'a, 'b> {
     ///
     /// FLAGS:
     ///    --config
     ///         The config file used by the myprog must be in JSON format
     ///         with only valid keys and may not contain other nonsense
     ///         that cannot be read by this program. Obviously I'm going on
     ///         and on, so I'll stop now.
     ///
-    /// -h, --help       
+    /// -h, --help
     ///         Prints help information
     ///
-    /// -V, --version    
+    /// -V, --version
     ///         Prints version information
     /// ```
     /// [`Arg::help`]: ./struct.Arg.html#method.help
     pub fn long_help(mut self, h: &'b str) -> Self {
         self.b.long_help = Some(h);
         self
     }
 
     /// Specifies that this arg is the last, or final, positional argument (i.e. has the highest
     /// index) and is *only* able to be accessed via the `--` syntax (i.e. `$ prog args --
     /// last_arg`). Even, if no other arguments are left to parse, if the user omits the `--` syntax
     /// they will receive an [`UnknownArgument`] error. Setting an argument to `.last(true)` also
     /// allows one to access this arg early using the `--` syntax. Accessing an arg early, even with
     /// the `--` syntax is otherwise not possible.
     ///
-    /// **NOTE:** This will change the usage string to look like `$ prog [FLAGS] [-- <ARG>]` if 
+    /// **NOTE:** This will change the usage string to look like `$ prog [FLAGS] [-- <ARG>]` if
     /// `ARG` is marked as `.last(true)`.
     ///
     /// **NOTE:** This setting will imply [`AppSettings::DontCollapseArgsInUsage`] because failing
     /// to set this can make the usage string very confusing.
     ///
-    /// **NOTE**: This setting only applies to positional arguments, and has no affect on FLAGS / 
+    /// **NOTE**: This setting only applies to positional arguments, and has no affect on FLAGS /
     /// OPTIONS
     ///
     /// **CAUTION:** Setting an argument to `.last(true)` *and* having child subcommands is not
     /// recommended with the exception of *also* using [`AppSettings::ArgsNegateSubcommands`]
     /// (or [`AppSettings::SubcommandsNegateReqs`] if the argument marked `.last(true)` is also
     /// marked [`.required(true)`])
     ///
     /// # Examples
@@ -1886,58 +1887,58 @@ impl<'a, 'b> Arg<'a, 'b> {
     /// occurrences vs multiple values.
     ///
     /// For example, `--opt val1 val2` is one occurrence, but two values. Whereas
     /// `--opt val1 --opt val2` is two occurrences.
     ///
     /// **WARNING:**
     ///
     /// Setting `multiple(true)` for an [option] with no other details, allows multiple values
-    /// **and** multiple occurrences because it isn't possible to have more occurrences than values 
-    /// for options. Because multiple values are allowed, `--option val1 val2 val3` is perfectly 
-    /// valid, be careful when designing a CLI where positional arguments are expected after a 
-    /// option which accepts multiple values, as `clap` will continue parsing *values* until it 
+    /// **and** multiple occurrences because it isn't possible to have more occurrences than values
+    /// for options. Because multiple values are allowed, `--option val1 val2 val3` is perfectly
+    /// valid, be careful when designing a CLI where positional arguments are expected after a
+    /// option which accepts multiple values, as `clap` will continue parsing *values* until it
     /// reaches the max or specific number of values defined, or another flag or option.
     ///
     /// **Pro Tip**:
     ///
     /// It's possible to define an option which allows multiple occurrences, but only one value per
     /// occurrence. To do this use [`Arg::number_of_values(1)`] in coordination with
     /// [`Arg::multiple(true)`].
     ///
     /// **WARNING:**
-    /// 
+    ///
     /// When using args with `multiple(true)` on [options] or [positionals] (i.e. those args that
     /// accept values) and [subcommands], one needs to consider the posibility of an argument value
     /// being the same as a valid subcommand. By default `clap` will parse the argument in question
     /// as a value *only if* a value is possible at that moment. Otherwise it will be parsed as a
     /// subcommand. In effect, this means using `multiple(true)` with no additional parameters and
-    /// a possible value that coincides with a subcommand name, the subcommand cannot be called 
+    /// a possible value that coincides with a subcommand name, the subcommand cannot be called
     /// unless another argument is passed first.
-    /// 
+    ///
     /// As an example, consider a CLI with an option `--ui-paths=<paths>...` and subcommand `signer`
-    /// 
+    ///
     /// The following would be parsed as values to `--ui-paths`.
-    /// 
+    ///
     /// ```notrust
     /// $ program --ui-paths path1 path2 signer
     /// ```
-    /// 
+    ///
     /// This is because `--ui-paths` accepts multiple values. `clap` will continue parsing values
     /// until another argument is reached and it knows `--ui-paths` is done.
-    /// 
+    ///
     /// By adding additional parameters to `--ui-paths` we can solve this issue. Consider adding
-    /// [`Arg::number_of_values(1)`] as discussed above. The following are all valid, and `signer` 
+    /// [`Arg::number_of_values(1)`] as discussed above. The following are all valid, and `signer`
     /// is parsed as both a subcommand and a value in the second case.
-    /// 
+    ///
     /// ```notrust
     /// $ program --ui-paths path1 signer
     /// $ program --ui-paths path1 --ui-paths signer signer
     /// ```
-    /// 
+    ///
     /// # Examples
     ///
     /// ```rust
     /// # use clap::{App, Arg};
     /// Arg::with_name("debug")
     ///     .short("d")
     ///     .multiple(true)
     /// # ;
@@ -2128,18 +2129,18 @@ impl<'a, 'b> Arg<'a, 'b> {
         self.setb(ArgSettings::TakesValue);
         self.v.terminator = Some(term);
         self
     }
 
     /// Specifies that an argument can be matched to all child [`SubCommand`]s.
     ///
     /// **NOTE:** Global arguments *only* propagate down, **not** up (to parent commands), however
-    /// their values once a user uses them will be propagated back up to parents. In effect, this 
-    /// means one should *define* all global arguments at the top level, however it doesn't matter 
+    /// their values once a user uses them will be propagated back up to parents. In effect, this
+    /// means one should *define* all global arguments at the top level, however it doesn't matter
     /// where the user *uses* the global argument.
     ///
     /// # Examples
     ///
     /// ```rust
     /// # use clap::{App, Arg};
     /// Arg::with_name("debug")
     ///     .short("d")
@@ -2385,16 +2386,69 @@ impl<'a, 'b> Arg<'a, 'b> {
         if let Some(ref mut vec) = self.v.possible_vals {
             vec.push(name);
         } else {
             self.v.possible_vals = Some(vec![name]);
         }
         self
     }
 
+    /// When used with [`Arg::possible_values`] it allows the argument value to pass validation even if
+    /// the case differs from that of the specified `possible_value`.
+    ///
+    /// **Pro Tip:** Use this setting with [`arg_enum!`]
+    ///
+    /// # Examples
+    ///
+    /// ```rust
+    /// # use clap::{App, Arg};
+    /// # use std::ascii::AsciiExt;
+    /// let m = App::new("pv")
+    ///     .arg(Arg::with_name("option")
+    ///         .long("--option")
+    ///         .takes_value(true)
+    ///         .possible_value("test123")
+    ///         .case_insensitive(true))
+    ///     .get_matches_from(vec![
+    ///         "pv", "--option", "TeSt123",
+    ///     ]);
+    ///
+    /// assert!(m.value_of("option").unwrap().eq_ignore_ascii_case("test123"));
+    /// ```
+    ///
+    /// This setting also works when multiple values can be defined:
+    ///
+    /// ```rust
+    /// # use clap::{App, Arg};
+    /// let m = App::new("pv")
+    ///     .arg(Arg::with_name("option")
+    ///         .short("-o")
+    ///         .long("--option")
+    ///         .takes_value(true)
+    ///         .possible_value("test123")
+    ///         .possible_value("test321")
+    ///         .multiple(true)
+    ///         .case_insensitive(true))
+    ///     .get_matches_from(vec![
+    ///         "pv", "--option", "TeSt123", "teST123", "tESt321"
+    ///     ]);
+    ///
+    /// let matched_vals = m.values_of("option").unwrap().collect::<Vec<_>>();
+    /// assert_eq!(&*matched_vals, &["TeSt123", "teST123", "tESt321"]);
+    /// ```
+    /// [`Arg::case_insensitive(true)`]: ./struct.Arg.html#method.possible_values
+    /// [`arg_enum!`]: ./macro.arg_enum.html
+    pub fn case_insensitive(self, ci: bool) -> Self {
+        if ci {
+            self.set(ArgSettings::CaseInsensitive)
+        } else {
+            self.unset(ArgSettings::CaseInsensitive)
+        }
+    }
+
     /// Specifies the name of the [`ArgGroup`] the argument belongs to.
     ///
     /// # Examples
     ///
     /// ```rust
     /// # use clap::{App, Arg};
     /// Arg::with_name("debug")
     ///     .long("debug")
@@ -2545,29 +2599,30 @@ impl<'a, 'b> Arg<'a, 'b> {
     /// assert!(res.is_ok());
     /// assert_eq!(res.unwrap().value_of("file"), Some("some@file"));
     /// ```
     /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
     /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
     /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
     /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
     pub fn validator<F>(mut self, f: F) -> Self
-        where F: Fn(String) -> Result<(), String> + 'static
+    where
+        F: Fn(String) -> Result<(), String> + 'static,
     {
         self.v.validator = Some(Rc::new(f));
         self
     }
 
-    /// Works identically to Validator but is intended to be used with values that could 
+    /// Works identically to Validator but is intended to be used with values that could
     /// contain non UTF-8 formatted strings.
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```rust")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```rust")]
     /// # use clap::{App, Arg};
     /// # use std::ffi::{OsStr, OsString};
     /// # use std::os::unix::ffi::OsStrExt;
     /// fn has_ampersand(v: &OsStr) -> Result<(), OsString> {
     ///     if v.as_bytes().iter().any(|b| *b == b'&') { return Ok(()); }
     ///     Err(OsString::from("The value did not contain the required & sigil"))
     /// }
     /// let res = App::new("prog")
@@ -2582,17 +2637,18 @@ impl<'a, 'b> Arg<'a, 'b> {
     /// ```
     /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
     /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
     /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
     /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
     /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
     /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
     pub fn validator_os<F>(mut self, f: F) -> Self
-        where F: Fn(&OsStr) -> Result<(), OsString> + 'static
+    where
+        F: Fn(&OsStr) -> Result<(), OsString> + 'static,
     {
         self.v.validator_os = Some(Rc::new(f));
         self
     }
 
     /// Specifies the *maximum* number of values are for this argument. For example, if you had a
     /// `-f <file>` argument where you wanted up to 3 'files' you would set `.max_values(3)`, and
     /// this argument would be satisfied if the user provided, 1, 2, or 3 values.
@@ -2885,19 +2941,21 @@ impl<'a, 'b> Arg<'a, 'b> {
     /// assert_eq!(m.values_of("config").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"])
     /// ```
     /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
     /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
     pub fn value_delimiter(mut self, d: &str) -> Self {
         self.unsetb(ArgSettings::ValueDelimiterNotSet);
         self.setb(ArgSettings::TakesValue);
         self.setb(ArgSettings::UseValueDelimiter);
-        self.v.val_delim = Some(d.chars()
-            .nth(0)
-            .expect("Failed to get value_delimiter from arg"));
+        self.v.val_delim = Some(
+            d.chars()
+                .nth(0)
+                .expect("Failed to get value_delimiter from arg"),
+        );
         self
     }
 
     /// Specify multiple names for values of option arguments. These names are cosmetic only, used
     /// for help and usage strings only. The names are **not** used to access arguments. The values
     /// of the arguments are accessed in numeric order (i.e. if you specify two names `one` and
     /// `two` `one` will be the first matched value, `two` will be the second).
     ///
@@ -3205,30 +3263,33 @@ impl<'a, 'b> Arg<'a, 'b> {
     ///         "prog", "--opt", "hahaha"
     ///     ]);
     ///
     /// assert_eq!(m.value_of("other"), None);
     /// ```
     /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
     /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
     pub fn default_value_if(self, arg: &'a str, val: Option<&'b str>, default: &'b str) -> Self {
-        self.default_value_if_os(arg,
-                                 val.map(str::as_bytes).map(OsStr::from_bytes),
-                                 OsStr::from_bytes(default.as_bytes()))
+        self.default_value_if_os(
+            arg,
+            val.map(str::as_bytes).map(OsStr::from_bytes),
+            OsStr::from_bytes(default.as_bytes()),
+        )
     }
 
     /// Provides a conditional default value in the exact same manner as [`Arg::default_value_if`]
     /// only using [`OsStr`]s instead.
     /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if
     /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    pub fn default_value_if_os(mut self,
-                               arg: &'a str,
-                               val: Option<&'b OsStr>,
-                               default: &'b OsStr)
-                               -> Self {
+    pub fn default_value_if_os(
+        mut self,
+        arg: &'a str,
+        val: Option<&'b OsStr>,
+        default: &'b OsStr,
+    ) -> Self {
         self.setb(ArgSettings::TakesValue);
         if let Some(ref mut vm) = self.v.default_vals_ifs {
             let l = vm.len();
             vm.insert(l, (arg, val, default));
         } else {
             let mut vm = VecMap::new();
             vm.insert(0, (arg, val, default));
             self.v.default_vals_ifs = Some(vm);
@@ -3317,19 +3378,21 @@ impl<'a, 'b> Arg<'a, 'b> {
     ///     ]);
     ///
     /// assert_eq!(m.value_of("other"), Some("default"));
     /// ```
     /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
     /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
     pub fn default_value_ifs(mut self, ifs: &[(&'a str, Option<&'b str>, &'b str)]) -> Self {
         for &(arg, val, default) in ifs {
-            self = self.default_value_if_os(arg,
-                                            val.map(str::as_bytes).map(OsStr::from_bytes),
-                                            OsStr::from_bytes(default.as_bytes()));
+            self = self.default_value_if_os(
+                arg,
+                val.map(str::as_bytes).map(OsStr::from_bytes),
+                OsStr::from_bytes(default.as_bytes()),
+            );
         }
         self
     }
 
     /// Provides multiple conditional default values in the exact same manner as
     /// [`Arg::default_value_ifs`] only using [`OsStr`]s instead.
     /// [`Arg::default_value_ifs`]: ./struct.Arg.html#method.default_value_ifs
     /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
@@ -3339,126 +3402,133 @@ impl<'a, 'b> Arg<'a, 'b> {
             self = self.default_value_if_os(arg, val, default);
         }
         self
     }
 
     /// Specifies that if the value is not passed in as an argument, that it should be retrieved
     /// from the environment, if available. If it is not present in the environment, then default
     /// rules will apply.
-    /// 
+    ///
     /// **NOTE:** If the user *does not* use this argument at runtime, [`ArgMatches::occurrences_of`]
     /// will return `0` even though the [`ArgMatches::value_of`] will return the default specified.
     ///
     /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::is_present`] will
     /// return `true` if the variable is present in the environemnt . If you wish to determine whether
     /// the argument was used at runtime or not, consider [`ArgMatches::occurrences_of`] which will
     /// return `0` if the argument was *not* used at runtime.
-    /// 
+    ///
     /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    /// 
+    ///
     /// **NOTE:** If [`Arg::multiple(true)`] is set then [`Arg::use_delimiter(true)`] should also be
     /// set. Otherwise, only a single argument will be returned from the environment variable. The
     /// default delimiter is `,` and follows all the other delimiter rules.
-    ///  
+    ///
     /// # Examples
-    /// 
+    ///
     /// In this example, we show the variable coming from the environment:
-    /// 
+    ///
     /// ```rust
     /// # use std::env;
     /// # use clap::{App, Arg};
     ///
     /// env::set_var("MY_FLAG", "env");
-    ///  
+    ///
     /// let m = App::new("prog")
     ///     .arg(Arg::with_name("flag")
     ///         .long("flag")
     ///         .env("MY_FLAG"))
     ///     .get_matches_from(vec![
     ///         "prog"
     ///     ]);
     ///
     /// assert_eq!(m.value_of("flag"), Some("env"));
     /// ```
-    /// 
+    ///
     /// In this example, we show the variable coming from an option on the CLI:
-    /// 
+    ///
     /// ```rust
     /// # use std::env;
     /// # use clap::{App, Arg};
     ///
     /// env::set_var("MY_FLAG", "env");
-    ///  
+    ///
     /// let m = App::new("prog")
     ///     .arg(Arg::with_name("flag")
     ///         .long("flag")
     ///         .env("MY_FLAG"))
     ///     .get_matches_from(vec![
     ///         "prog", "--flag", "opt"
     ///     ]);
     ///
     /// assert_eq!(m.value_of("flag"), Some("opt"));
     /// ```
-    /// 
+    ///
     /// In this example, we show the variable coming from the environment even with the
     /// presence of a default:
-    /// 
+    ///
     /// ```rust
     /// # use std::env;
     /// # use clap::{App, Arg};
     ///
     /// env::set_var("MY_FLAG", "env");
-    ///  
+    ///
     /// let m = App::new("prog")
     ///     .arg(Arg::with_name("flag")
     ///         .long("flag")
     ///         .env("MY_FLAG")
     ///         .default_value("default"))
     ///     .get_matches_from(vec![
     ///         "prog"
     ///     ]);
     ///
     /// assert_eq!(m.value_of("flag"), Some("env"));
     /// ```
-    /// 
+    ///
     /// In this example, we show the use of multiple values in a single environment variable:
-    /// 
+    ///
     /// ```rust
     /// # use std::env;
     /// # use clap::{App, Arg};
     ///
     /// env::set_var("MY_FLAG_MULTI", "env1,env2");
-    ///  
+    ///
     /// let m = App::new("prog")
     ///     .arg(Arg::with_name("flag")
     ///         .long("flag")
     ///         .env("MY_FLAG_MULTI")
     ///         .multiple(true)
     ///         .use_delimiter(true))
     ///     .get_matches_from(vec![
     ///         "prog"
     ///     ]);
     ///
     /// assert_eq!(m.values_of("flag").unwrap().collect::<Vec<_>>(), vec!["env1", "env2"]);
     /// ```
-    pub fn env(self, name: &'a str) -> Self {
-        self.env_os(OsStr::new(name))
-    }
+    pub fn env(self, name: &'a str) -> Self { self.env_os(OsStr::new(name)) }
 
     /// Specifies that if the value is not passed in as an argument, that it should be retrieved
     /// from the environment if available in the exact same manner as [`Arg::env`] only using
     /// [`OsStr`]s instead.
     pub fn env_os(mut self, name: &'a OsStr) -> Self {
         self.setb(ArgSettings::TakesValue);
 
         self.v.env = Some((name, env::var_os(name)));
         self
     }
 
+    /// @TODO @p2 @docs @release: write docs
+    pub fn hide_env_values(self, hide: bool) -> Self { 
+        if hide {
+            self.set(ArgSettings::HideEnvValues)
+        } else {
+            self.unset(ArgSettings::HideEnvValues)
+        }
+    }
+
     /// When set to `true` the help string will be displayed on the line after the argument and
     /// indented once. This can be helpful for arguments with very long or complex help messages.
     /// This can also be helpful for arguments with very long flag names, or many/long value names.
     ///
     /// **NOTE:** To apply this setting to all arguments consider using
     /// [`AppSettings::NextLineHelp`]
     ///
     /// # Examples
@@ -3601,12 +3671,10 @@ impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> f
             s: a.s.clone(),
             index: a.index,
             r_ifs: a.r_ifs.clone(),
         }
     }
 }
 
 impl<'n, 'e> PartialEq for Arg<'n, 'e> {
-    fn eq(&self, other: &Arg<'n, 'e>) -> bool {
-        self.b == other.b
-    }
+    fn eq(&self, other: &Arg<'n, 'e>) -> bool { self.b == other.b }
 }
--- a/third_party/rust/clap/src/args/arg_builder/base.rs
+++ b/third_party/rust/clap/src/args/arg_builder/base.rs
@@ -1,35 +1,38 @@
-
-use args::{ArgSettings, Arg, ArgFlags};
+use args::{Arg, ArgFlags, ArgSettings};
 
 #[derive(Debug, Clone, Default)]
 pub struct Base<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     pub name: &'a str,
     pub help: Option<&'b str>,
     pub long_help: Option<&'b str>,
     pub blacklist: Option<Vec<&'a str>>,
     pub settings: ArgFlags,
     pub r_unless: Option<Vec<&'a str>>,
     pub overrides: Option<Vec<&'a str>>,
     pub groups: Option<Vec<&'a str>>,
     pub requires: Option<Vec<(Option<&'b str>, &'a str)>>,
 }
 
 impl<'n, 'e> Base<'n, 'e> {
-    pub fn new(name: &'n str) -> Self { Base { name: name, ..Default::default() } }
+    pub fn new(name: &'n str) -> Self {
+        Base {
+            name: name,
+            ..Default::default()
+        }
+    }
 
     pub fn set(&mut self, s: ArgSettings) { self.settings.set(s); }
     pub fn unset(&mut self, s: ArgSettings) { self.settings.unset(s); }
     pub fn is_set(&self, s: ArgSettings) -> bool { self.settings.is_set(s) }
 }
 
 impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Base<'n, 'e> {
     fn from(a: &'z Arg<'n, 'e>) -> Self { a.b.clone() }
 }
 
 impl<'n, 'e> PartialEq for Base<'n, 'e> {
-    fn eq(&self, other: &Base<'n, 'e>) -> bool {
-        self.name == other.name
-    }
-}
\ No newline at end of file
+    fn eq(&self, other: &Base<'n, 'e>) -> bool { self.name == other.name }
+}
--- a/third_party/rust/clap/src/args/arg_builder/switched.rs
+++ b/third_party/rust/clap/src/args/arg_builder/switched.rs
@@ -1,9 +1,8 @@
-
 use Arg;
 
 #[derive(Debug)]
 pub struct Switched<'b> {
     pub short: Option<char>,
     pub long: Option<&'b str>,
     pub aliases: Option<Vec<(&'b str, bool)>>, // (name, visible)
     pub disp_ord: usize,
--- a/third_party/rust/clap/src/args/arg_matcher.rs
+++ b/third_party/rust/clap/src/args/arg_matcher.rs
@@ -16,26 +16,29 @@ pub struct ArgMatcher<'a>(pub ArgMatches
 
 impl<'a> Default for ArgMatcher<'a> {
     fn default() -> Self { ArgMatcher(ArgMatches::default()) }
 }
 
 impl<'a> ArgMatcher<'a> {
     pub fn new() -> Self { ArgMatcher::default() }
 
-    pub fn propagate_globals(&mut self, global_arg_vec : &[&'a str]) {
-        debugln!("ArgMatcher::get_global_values: global_arg_vec={:?}", global_arg_vec);
+    pub fn propagate_globals(&mut self, global_arg_vec: &[&'a str]) {
+        debugln!(
+            "ArgMatcher::get_global_values: global_arg_vec={:?}",
+            global_arg_vec
+        );
         let mut vals_map = HashMap::new();
         self.fill_in_global_values(global_arg_vec, &mut vals_map);
     }
 
     fn fill_in_global_values(
-        &mut self, 
-        global_arg_vec: &[&'a str], 
-        vals_map: &mut HashMap<&'a str, MatchedArg> 
+        &mut self,
+        global_arg_vec: &[&'a str],
+        vals_map: &mut HashMap<&'a str, MatchedArg>,
     ) {
         for global_arg in global_arg_vec {
             if let Some(ma) = self.get(global_arg) {
                 // We have to check if the parent's global arg wasn't used but still exists
                 // such as from a default value.
                 //
                 // For example, `myprog subcommand --global-arg=value` where --global-arg defines
                 // a default value of `other` myprog would have an existing MatchedArg for
@@ -115,17 +118,18 @@ impl<'a> ArgMatcher<'a> {
             occurs: 0,
             vals: Vec::with_capacity(1),
         });
         // let len = ma.vals.len() + 1;
         ma.vals.push(val.to_owned());
     }
 
     pub fn needs_more_vals<'b, A>(&self, o: &A) -> bool
-        where A: AnyArg<'a, 'b>
+    where
+        A: AnyArg<'a, 'b>,
     {
         debugln!("ArgMatcher::needs_more_vals: o={}", o.name());
         if let Some(ma) = self.get(o.name()) {
             if let Some(num) = o.num_vals() {
                 debugln!("ArgMatcher::needs_more_vals: num_vals...{}", num);
                 return if o.is_set(ArgSettings::Multiple) {
                     ((ma.vals.len() as u64) % num) != 0
                 } else {
--- a/third_party/rust/clap/src/args/arg_matches.rs
+++ b/third_party/rust/clap/src/args/arg_matches.rs
@@ -54,37 +54,38 @@ use args::SubCommand;
 ///     } else {
 ///         println!("Debug mode kind of on");
 ///     }
 /// }
 /// ```
 /// [`App::get_matches`]: ./struct.App.html#method.get_matches
 #[derive(Debug, Clone)]
 pub struct ArgMatches<'a> {
-    #[doc(hidden)]
-    pub args: HashMap<&'a str, MatchedArg>,
-    #[doc(hidden)]
-    pub subcommand: Option<Box<SubCommand<'a>>>,
-    #[doc(hidden)]
-    pub usage: Option<String>,
+    #[doc(hidden)] pub args: HashMap<&'a str, MatchedArg>,
+    #[doc(hidden)] pub subcommand: Option<Box<SubCommand<'a>>>,
+    #[doc(hidden)] pub usage: Option<String>,
 }
 
 impl<'a> Default for ArgMatches<'a> {
     fn default() -> Self {
         ArgMatches {
             args: HashMap::new(),
             subcommand: None,
             usage: None,
         }
     }
 }
 
 impl<'a> ArgMatches<'a> {
     #[doc(hidden)]
-    pub fn new() -> Self { ArgMatches { ..Default::default() } }
+    pub fn new() -> Self {
+        ArgMatches {
+            ..Default::default()
+        }
+    }
 
     /// Gets the value of a specific [option] or [positional] argument (i.e. an argument that takes
     /// an additional value at runtime). If the option wasn't present at runtime
     /// it returns `None`.
     ///
     /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
     /// prefer [`ArgMatches::values_of`] as `ArgMatches::value_of` will only return the *first*
     /// value.
@@ -121,18 +122,18 @@ impl<'a> ArgMatches<'a> {
     /// it returns `None`. A lossy value is one which contains invalid UTF-8 code points, those
     /// invalid points will be replaced with `\u{FFFD}`
     ///
     /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
     /// prefer [`Arg::values_of_lossy`] as `value_of_lossy()` will only return the *first* value.
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, Arg};
     /// use std::ffi::OsString;
     /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
     ///
     /// let m = App::new("utf8")
     ///     .arg(Arg::from_usage("<arg> 'some arg'"))
     ///     .get_matches_from(vec![OsString::from("myprog"),
     ///                             // "Hi {0xe9}!"
@@ -156,18 +157,18 @@ impl<'a> ArgMatches<'a> {
     /// value may contain invalid UTF-8 code points.
     ///
     /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
     /// prefer [`ArgMatches::values_of_os`] as `Arg::value_of_os` will only return the *first*
     /// value.
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, Arg};
     /// use std::ffi::OsString;
     /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
     ///
     /// let m = App::new("utf8")
     ///     .arg(Arg::from_usage("<arg> 'some arg'"))
     ///     .get_matches_from(vec![OsString::from("myprog"),
     ///                             // "Hi {0xe9}!"
@@ -206,29 +207,31 @@ impl<'a> ArgMatches<'a> {
     /// assert_eq!(vals, ["val1", "val2", "val3"]);
     /// ```
     /// [`Values`]: ./struct.Values.html
     /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
     pub fn values_of<S: AsRef<str>>(&'a self, name: S) -> Option<Values<'a>> {
         if let Some(arg) = self.args.get(name.as_ref()) {
             fn to_str_slice(o: &OsString) -> &str { o.to_str().expect(INVALID_UTF8) }
             let to_str_slice: fn(&OsString) -> &str = to_str_slice; // coerce to fn pointer
-            return Some(Values { iter: arg.vals.iter().map(to_str_slice) });
+            return Some(Values {
+                iter: arg.vals.iter().map(to_str_slice),
+            });
         }
         None
     }
 
     /// Gets the lossy values of a specific argument. If the option wasn't present at runtime
     /// it returns `None`. A lossy value is one where if it contains invalid UTF-8 code points,
     /// those invalid points will be replaced with `\u{FFFD}`
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, Arg};
     /// use std::ffi::OsString;
     /// use std::os::unix::ffi::OsStringExt;
     ///
     /// let m = App::new("utf8")
     ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
     ///     .get_matches_from(vec![OsString::from("myprog"),
     ///                             // "Hi"
@@ -237,34 +240,36 @@ impl<'a> ArgMatches<'a> {
     ///                             OsString::from_vec(vec![0xe9, b'!'])]);
     /// let mut itr = m.values_of_lossy("arg").unwrap().into_iter();
     /// assert_eq!(&itr.next().unwrap()[..], "Hi");
     /// assert_eq!(&itr.next().unwrap()[..], "\u{FFFD}!");
     /// assert_eq!(itr.next(), None);
     /// ```
     pub fn values_of_lossy<S: AsRef<str>>(&'a self, name: S) -> Option<Vec<String>> {
         if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(arg.vals
-                .iter()
-                .map(|v| v.to_string_lossy().into_owned())
-                .collect());
+            return Some(
+                arg.vals
+                    .iter()
+                    .map(|v| v.to_string_lossy().into_owned())
+                    .collect(),
+            );
         }
         None
     }
 
     /// Gets a [`OsValues`] struct which is implements [`Iterator`] for [`OsString`] values of a
     /// specific argument. If the option wasn't present at runtime it returns `None`. An OS value
     /// on Unix-like systems is any series of bytes, regardless of whether or not they contain
     /// valid UTF-8 code points. Since [`String`]s in Rust are guaranteed to be valid UTF-8, a valid
     /// filename as an argument value on Linux (for example) may contain invalid UTF-8 code points.
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, Arg};
     /// use std::ffi::{OsStr,OsString};
     /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
     ///
     /// let m = App::new("utf8")
     ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
     ///     .get_matches_from(vec![OsString::from("myprog"),
     ///                                 // "Hi"
@@ -280,17 +285,19 @@ impl<'a> ArgMatches<'a> {
     /// [`OsValues`]: ./struct.OsValues.html
     /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
     /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
     /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
     pub fn values_of_os<S: AsRef<str>>(&'a self, name: S) -> Option<OsValues<'a>> {
         fn to_str_slice(o: &OsString) -> &OsStr { &*o }
         let to_str_slice: fn(&'a OsString) -> &'a OsStr = to_str_slice; // coerce to fn pointer
         if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(OsValues { iter: arg.vals.iter().map(to_str_slice) });
+            return Some(OsValues {
+                iter: arg.vals.iter().map(to_str_slice),
+            });
         }
         None
     }
 
     /// Returns `true` if an argument was present at runtime, otherwise `false`.
     ///
     /// # Examples
     ///
@@ -502,17 +509,19 @@ impl<'a> ArgMatches<'a> {
     ///          assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
     ///     },
     ///     _ => {},
     /// }
     /// ```
     /// [`ArgMatches::subcommand_matches`]: ./struct.ArgMatches.html#method.subcommand_matches
     /// [`ArgMatches::subcommand_name`]: ./struct.ArgMatches.html#method.subcommand_name
     pub fn subcommand(&self) -> (&str, Option<&ArgMatches<'a>>) {
-        self.subcommand.as_ref().map_or(("", None), |sc| (&sc.name[..], Some(&sc.matches)))
+        self.subcommand
+            .as_ref()
+            .map_or(("", None), |sc| (&sc.name[..], Some(&sc.matches)))
     }
 
     /// Returns a string slice of the usage statement for the [`App`] or [`SubCommand`]
     ///
     /// # Examples
     ///
     /// ```no_run
     /// # use clap::{App, Arg, SubCommand};
@@ -568,17 +577,19 @@ impl<'a> DoubleEndedIterator for Values<
 impl<'a> ExactSizeIterator for Values<'a> {}
 
 /// Creates an empty iterator.
 impl<'a> Default for Values<'a> {
     fn default() -> Self {
         static EMPTY: [OsString; 0] = [];
         // This is never called because the iterator is empty:
         fn to_str_slice(_: &OsString) -> &str { unreachable!() };
-        Values { iter: EMPTY[..].iter().map(to_str_slice) }
+        Values {
+            iter: EMPTY[..].iter().map(to_str_slice),
+        }
     }
 }
 
 #[test]
 fn test_default_values() {
     let mut values: Values = Values::default();
     assert_eq!(values.next(), None);
 }
@@ -591,18 +602,18 @@ fn test_default_values_with_shorter_life
 }
 
 /// An iterator for getting multiple values out of an argument via the [`ArgMatches::values_of_os`]
 /// method. Usage of this iterator allows values which contain invalid UTF-8 code points unlike
 /// [`Values`].
 ///
 /// # Examples
 ///
-#[cfg_attr(not(unix), doc=" ```ignore")]
-#[cfg_attr(    unix , doc=" ```")]
+#[cfg_attr(not(unix), doc = " ```ignore")]
+#[cfg_attr(unix, doc = " ```")]
 /// # use clap::{App, Arg};
 /// use std::ffi::OsString;
 /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
 ///
 /// let m = App::new("utf8")
 ///     .arg(Arg::from_usage("<arg> 'some arg'"))
 ///     .get_matches_from(vec![OsString::from("myprog"),
 ///                             // "Hi {0xe9}!"
@@ -629,17 +640,19 @@ impl<'a> DoubleEndedIterator for OsValue
 }
 
 /// Creates an empty iterator.
 impl<'a> Default for OsValues<'a> {
     fn default() -> Self {
         static EMPTY: [OsString; 0] = [];
         // This is never called because the iterator is empty:
         fn to_str_slice(_: &OsString) -> &OsStr { unreachable!() };
-        OsValues { iter: EMPTY[..].iter().map(to_str_slice) }
+        OsValues {
+            iter: EMPTY[..].iter().map(to_str_slice),
+        }
     }
 }
 
 #[test]
 fn test_default_osvalues() {
     let mut values: OsValues = OsValues::default();
     assert_eq!(values.next(), None);
 }
--- a/third_party/rust/clap/src/args/group.rs
+++ b/third_party/rust/clap/src/args/group.rs
@@ -74,28 +74,22 @@ use yaml_rust::Yaml;
 /// // we could also alternatively check each arg individually (not shown here)
 /// ```
 /// [`ArgGroup::multiple(true)`]: ./struct.ArgGroup.html#method.multiple
 /// [arguments]: ./struct.Arg.html
 /// [conflict]: ./struct.Arg.html#method.conflicts_with
 /// [requirement]: ./struct.Arg.html#method.requires
 #[derive(Default)]
 pub struct ArgGroup<'a> {
-    #[doc(hidden)]
-    pub name: &'a str,
-    #[doc(hidden)]
-    pub args: Vec<&'a str>,
-    #[doc(hidden)]
-    pub required: bool,
-    #[doc(hidden)]
-    pub requires: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub conflicts: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub multiple: bool,
+    #[doc(hidden)] pub name: &'a str,
+    #[doc(hidden)] pub args: Vec<&'a str>,
+    #[doc(hidden)] pub required: bool,
+    #[doc(hidden)] pub requires: Option<Vec<&'a str>>,
+    #[doc(hidden)] pub conflicts: Option<Vec<&'a str>>,
+    #[doc(hidden)] pub multiple: bool,
 }
 
 impl<'a> ArgGroup<'a> {
     /// Creates a new instance of `ArgGroup` using a unique string name. The name will be used to
     /// get values from the group or refer to the group inside of conflict and requirement rules.
     ///
     /// # Examples
     ///
@@ -149,19 +143,21 @@ impl<'a> ArgGroup<'a> {
     /// // maybe we don't know which of the two flags was used...
     /// assert!(m.is_present("req_flags"));
     /// // but we can also check individually if needed
     /// assert!(m.is_present("flag"));
     /// ```
     /// [argument]: ./struct.Arg.html
     #[cfg_attr(feature = "lints", allow(should_assert_eq))]
     pub fn arg(mut self, n: &'a str) -> Self {
-        assert!(self.name != n,
-                "ArgGroup '{}' can not have same name as arg inside it",
-                &*self.name);
+        assert!(
+            self.name != n,
+            "ArgGroup '{}' can not have same name as arg inside it",
+            &*self.name
+        );
         self.args.push(n);
         self
     }
 
     /// Adds multiple [arguments] to this group by name
     ///
     /// # Examples
     ///
@@ -421,29 +417,31 @@ impl<'a> ArgGroup<'a> {
             self = self.conflicts_with(n);
         }
         self
     }
 }
 
 impl<'a> Debug for ArgGroup<'a> {
     fn fmt(&self, f: &mut Formatter) -> Result {
-        write!(f,
-               "{{\n\
-                   \tname: {:?},\n\
-                   \targs: {:?},\n\
-                   \trequired: {:?},\n\
-                   \trequires: {:?},\n\
-                   \tconflicts: {:?},\n\
-                }}",
-               self.name,
-               self.args,
-               self.required,
-               self.requires,
-               self.conflicts)
+        write!(
+            f,
+            "{{\n\
+             \tname: {:?},\n\
+             \targs: {:?},\n\
+             \trequired: {:?},\n\
+             \trequires: {:?},\n\
+             \tconflicts: {:?},\n\
+             }}",
+            self.name,
+            self.args,
+            self.required,
+            self.requires,
+            self.conflicts
+        )
     }
 }
 
 impl<'a, 'z> From<&'z ArgGroup<'a>> for ArgGroup<'a> {
     fn from(g: &'z ArgGroup<'a>) -> Self {
         ArgGroup {
             name: g.name,
             required: g.required,
@@ -457,17 +455,19 @@ impl<'a, 'z> From<&'z ArgGroup<'a>> for 
 
 #[cfg(feature = "yaml")]
 impl<'a> From<&'a BTreeMap<Yaml, Yaml>> for ArgGroup<'a> {
     fn from(b: &'a BTreeMap<Yaml, Yaml>) -> Self {
         // We WANT this to panic on error...so expect() is good.
         let mut a = ArgGroup::default();
         let group_settings = if b.len() == 1 {
             let name_yml = b.keys().nth(0).expect("failed to get name");
-            let name_str = name_yml.as_str().expect("failed to convert arg YAML name to str");
+            let name_str = name_yml
+                .as_str()
+                .expect("failed to convert arg YAML name to str");
             a.name = name_str;
             b.get(name_yml)
                 .expect("failed to get name_str")
                 .as_hash()
                 .expect("failed to convert to a hash")
         } else {
             b
         };
@@ -486,22 +486,22 @@ impl<'a> From<&'a BTreeMap<Yaml, Yaml>> 
                 "requires" => yaml_vec_or_str!(v, a, requires),
                 "conflicts_with" => yaml_vec_or_str!(v, a, conflicts_with),
                 "name" => {
                     if let Some(ys) = v.as_str() {
                         a.name = ys;
                     }
                     a
                 }
-                s => {
-                    panic!("Unknown ArgGroup setting '{}' in YAML file for \
-                             ArgGroup '{}'",
-                           s,
-                           a.name)
-                }
+                s => panic!(
+                    "Unknown ArgGroup setting '{}' in YAML file for \
+                     ArgGroup '{}'",
+                    s,
+                    a.name
+                ),
             }
         }
 
         a
     }
 }
 
 #[cfg(test)]
@@ -546,27 +546,29 @@ mod test {
             .requires("r1")
             .requires_all(&["r2", "r3"])
             .requires("r4");
 
         let args = vec!["a1", "a4", "a2", "a3"];
         let reqs = vec!["r1", "r2", "r3", "r4"];
         let confs = vec!["c1", "c2", "c3", "c4"];
 
-        let debug_str = format!("{{\n\
-                   \tname: \"test\",\n\
-                   \targs: {:?},\n\
-                   \trequired: {:?},\n\
-                   \trequires: {:?},\n\
-                   \tconflicts: {:?},\n\
-               }}",
-                                args,
-                                true,
-                                Some(reqs),
-                                Some(confs));
+        let debug_str = format!(
+            "{{\n\
+             \tname: \"test\",\n\
+             \targs: {:?},\n\
+             \trequired: {:?},\n\
+             \trequires: {:?},\n\
+             \tconflicts: {:?},\n\
+             }}",
+            args,
+            true,
+            Some(reqs),
+            Some(confs)
+        );
         assert_eq!(&*format!("{:?}", g), &*debug_str);
     }
 
     #[test]
     fn test_from() {
         let g = ArgGroup::with_name("test")
             .arg("a1")
             .arg("a4")
@@ -584,20 +586,19 @@ mod test {
         let confs = vec!["c1", "c2", "c3", "c4"];
 
         let g2 = ArgGroup::from(&g);
         assert_eq!(g2.args, args);
         assert_eq!(g2.requires, Some(reqs));
         assert_eq!(g2.conflicts, Some(confs));
     }
 
-    #[cfg(feature="yaml")]
+    #[cfg(feature = "yaml")]
     #[cfg_attr(feature = "yaml", test)]
     fn test_yaml() {
-
         let g_yaml = "name: test
 args:
 - a1
 - a4
 - a2
 - a3
 conflicts_with:
 - c1
--- a/third_party/rust/clap/src/args/matched_arg.rs
+++ b/third_party/rust/clap/src/args/matched_arg.rs
@@ -1,18 +1,16 @@
 // Std
 use std::ffi::OsString;
 
 #[doc(hidden)]
 #[derive(Debug, Clone)]
 pub struct MatchedArg {
-    #[doc(hidden)]
-    pub occurs: u64,
-    #[doc(hidden)]
-    pub vals: Vec<OsString>,
+    #[doc(hidden)] pub occurs: u64,
+    #[doc(hidden)] pub vals: Vec<OsString>,
 }
 
 impl Default for MatchedArg {
     fn default() -> Self {
         MatchedArg {
             occurs: 1,
             vals: Vec::with_capacity(1),
         }
--- a/third_party/rust/clap/src/args/mod.rs
+++ b/third_party/rust/clap/src/args/mod.rs
@@ -1,13 +1,13 @@
 pub use self::any_arg::{AnyArg, DispOrder};
 pub use self::arg::Arg;
-pub use self::arg_builder::{Base, Switched, Valued, FlagBuilder, OptBuilder, PosBuilder};
+pub use self::arg_builder::{Base, FlagBuilder, OptBuilder, PosBuilder, Switched, Valued};
 pub use self::arg_matcher::ArgMatcher;
-pub use self::arg_matches::{Values, OsValues, ArgMatches};
+pub use self::arg_matches::{ArgMatches, OsValues, Values};
 pub use self::group::ArgGroup;
 pub use self::matched_arg::MatchedArg;
 pub use self::settings::{ArgFlags, ArgSettings};
 pub use self::subcommand::SubCommand;
 
 #[macro_use]
 mod macros;
 mod arg;
--- a/third_party/rust/clap/src/args/settings.rs
+++ b/third_party/rust/clap/src/args/settings.rs
@@ -1,62 +1,67 @@
 // Std
+#[allow(unused_imports)]
 use std::ascii::AsciiExt;
 use std::str::FromStr;
 
 bitflags! {
-    struct Flags: u16 {
+    struct Flags: u32 {
         const REQUIRED         = 1;
         const MULTIPLE         = 1 << 1;
         const EMPTY_VALS       = 1 << 2;
         const GLOBAL           = 1 << 3;
         const HIDDEN           = 1 << 4;
         const TAKES_VAL        = 1 << 5;
         const USE_DELIM        = 1 << 6;
         const NEXT_LINE_HELP   = 1 << 7;
         const R_UNLESS_ALL     = 1 << 8;
         const REQ_DELIM        = 1 << 9;
         const DELIM_NOT_SET    = 1 << 10;
         const HIDE_POS_VALS    = 1 << 11;
         const ALLOW_TAC_VALS   = 1 << 12;
         const REQUIRE_EQUALS   = 1 << 13;
         const LAST             = 1 << 14;
         const HIDE_DEFAULT_VAL = 1 << 15;
+        const CASE_INSENSITIVE = 1 << 16;
+        const HIDE_ENV_VALS    = 1 << 17;
     }
 }
 
 #[doc(hidden)]
 #[derive(Debug, Clone, Copy)]
 pub struct ArgFlags(Flags);
 
 impl ArgFlags {
     pub fn new() -> Self { ArgFlags::default() }
 
     impl_settings!{ArgSettings,
-        Required => REQUIRED,
-        Multiple => MULTIPLE,
-        EmptyValues => EMPTY_VALS,
-        Global => GLOBAL,
-        Hidden => HIDDEN,
-        TakesValue => TAKES_VAL,
-        UseValueDelimiter => USE_DELIM,
-        NextLineHelp => NEXT_LINE_HELP,
-        RequiredUnlessAll => R_UNLESS_ALL,
-        RequireDelimiter => REQ_DELIM,
-        ValueDelimiterNotSet => DELIM_NOT_SET,
-        HidePossibleValues => HIDE_POS_VALS,
-        AllowLeadingHyphen => ALLOW_TAC_VALS,
-        RequireEquals => REQUIRE_EQUALS,
-        Last => LAST,
-        HideDefaultValue => HIDE_DEFAULT_VAL
+        Required => Flags::REQUIRED,
+        Multiple => Flags::MULTIPLE,
+        EmptyValues => Flags::EMPTY_VALS,
+        Global => Flags::GLOBAL,
+        Hidden => Flags::HIDDEN,
+        TakesValue => Flags::TAKES_VAL,
+        UseValueDelimiter => Flags::USE_DELIM,
+        NextLineHelp => Flags::NEXT_LINE_HELP,
+        RequiredUnlessAll => Flags::R_UNLESS_ALL,
+        RequireDelimiter => Flags::REQ_DELIM,
+        ValueDelimiterNotSet => Flags::DELIM_NOT_SET,
+        HidePossibleValues => Flags::HIDE_POS_VALS,
+        AllowLeadingHyphen => Flags::ALLOW_TAC_VALS,
+        RequireEquals => Flags::REQUIRE_EQUALS,
+        Last => Flags::LAST,
+        CaseInsensitive => Flags::CASE_INSENSITIVE,
+        HideEnvValues => Flags::HIDE_ENV_VALS,
+        HideDefaultValue => Flags::HIDE_DEFAULT_VAL
     }
 }
 
 impl Default for ArgFlags {
-    fn default() -> Self { ArgFlags(EMPTY_VALS | DELIM_NOT_SET) }
+    fn default() -> Self { ArgFlags(Flags::EMPTY_VALS | Flags::DELIM_NOT_SET) }
 }
 
 /// Various settings that apply to arguments and may be set, unset, and checked via getter/setter
 /// methods [`Arg::set`], [`Arg::unset`], and [`Arg::is_set`]
 /// [`Arg::set`]: ./struct.Arg.html#method.set
 /// [`Arg::unset`]: ./struct.Arg.html#method.unset
 /// [`Arg::is_set`]: ./struct.Arg.html#method.is_set
 #[derive(Debug, PartialEq, Copy, Clone)]
@@ -86,20 +91,22 @@ pub enum ArgSettings {
     AllowLeadingHyphen,
     /// Require options use `--option=val` syntax
     RequireEquals,
     /// Specifies that the arg is the last positional argument and may be accessed early via `--`
     /// syntax
     Last,
     /// Hides the default value from the help string
     HideDefaultValue,
-    #[doc(hidden)]
-    RequiredUnlessAll,
-    #[doc(hidden)]
-    ValueDelimiterNotSet,
+    /// Makes `Arg::possible_values` case insensitive
+    CaseInsensitive,
+    /// Hides ENV values in the help message
+    HideEnvValues,
+    #[doc(hidden)] RequiredUnlessAll,
+    #[doc(hidden)] ValueDelimiterNotSet,
 }
 
 impl FromStr for ArgSettings {
     type Err = String;
     fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
         match &*s.to_ascii_lowercase() {
             "required" => Ok(ArgSettings::Required),
             "multiple" => Ok(ArgSettings::Multiple),
@@ -112,54 +119,93 @@ impl FromStr for ArgSettings {
             "requiredunlessall" => Ok(ArgSettings::RequiredUnlessAll),
             "requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
             "valuedelimiternotset" => Ok(ArgSettings::ValueDelimiterNotSet),
             "hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
             "allowleadinghyphen" => Ok(ArgSettings::AllowLeadingHyphen),
             "requireequals" => Ok(ArgSettings::RequireEquals),
             "last" => Ok(ArgSettings::Last),
             "hidedefaultvalue" => Ok(ArgSettings::HideDefaultValue),
+            "caseinsensitive" => Ok(ArgSettings::CaseInsensitive),
+            "hideenvvalues" => Ok(ArgSettings::HideEnvValues),
             _ => Err("unknown ArgSetting, cannot convert from str".to_owned()),
         }
     }
 }
 
 #[cfg(test)]
 mod test {
     use super::ArgSettings;
 
     #[test]
     fn arg_settings_fromstr() {
-        assert_eq!("allowleadinghyphen".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::AllowLeadingHyphen);
-        assert_eq!("emptyvalues".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::EmptyValues);
-        assert_eq!("global".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Global);
-        assert_eq!("hidepossiblevalues".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::HidePossibleValues);
-        assert_eq!("hidden".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Hidden);
-        assert_eq!("multiple".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Multiple);
-        assert_eq!("nextlinehelp".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::NextLineHelp);
-        assert_eq!("requiredunlessall".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequiredUnlessAll);
-        assert_eq!("requiredelimiter".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequireDelimiter);
-        assert_eq!("required".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Required);
-        assert_eq!("takesvalue".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::TakesValue);
-        assert_eq!("usevaluedelimiter".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::UseValueDelimiter);
-        assert_eq!("valuedelimiternotset".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::ValueDelimiterNotSet);
-        assert_eq!("requireequals".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::RequireEquals);
-        assert_eq!("last".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::Last);
-        assert_eq!("hidedefaultvalue".parse::<ArgSettings>().unwrap(),
-                   ArgSettings::HideDefaultValue);
+        assert_eq!(
+            "allowleadinghyphen".parse::<ArgSettings>().unwrap(),
+            ArgSettings::AllowLeadingHyphen
+        );
+        assert_eq!(
+            "emptyvalues".parse::<ArgSettings>().unwrap(),
+            ArgSettings::EmptyValues
+        );
+        assert_eq!(
+            "global".parse::<ArgSettings>().unwrap(),
+            ArgSettings::Global
+        );
+        assert_eq!(
+            "hidepossiblevalues".parse::<ArgSettings>().unwrap(),
+            ArgSettings::HidePossibleValues
+        );
+        assert_eq!(
+            "hidden".parse::<ArgSettings>().unwrap(),
+            ArgSettings::Hidden
+        );
+        assert_eq!(
+            "multiple".parse::<ArgSettings>().unwrap(),
+            ArgSettings::Multiple
+        );
+        assert_eq!(
+            "nextlinehelp".parse::<ArgSettings>().unwrap(),
+            ArgSettings::NextLineHelp
+        );
+        assert_eq!(
+            "requiredunlessall".parse::<ArgSettings>().unwrap(),
+            ArgSettings::RequiredUnlessAll
+        );
+        assert_eq!(
+            "requiredelimiter".parse::<ArgSettings>().unwrap(),
+            ArgSettings::RequireDelimiter
+        );
+        assert_eq!(
+            "required".parse::<ArgSettings>().unwrap(),
+            ArgSettings::Required
+        );
+        assert_eq!(
+            "takesvalue".parse::<ArgSettings>().unwrap(),
+            ArgSettings::TakesValue
+        );
+        assert_eq!(
+            "usevaluedelimiter".parse::<ArgSettings>().unwrap(),
+            ArgSettings::UseValueDelimiter
+        );
+        assert_eq!(
+            "valuedelimiternotset".parse::<ArgSettings>().unwrap(),
+            ArgSettings::ValueDelimiterNotSet
+        );
+        assert_eq!(
+            "requireequals".parse::<ArgSettings>().unwrap(),
+            ArgSettings::RequireEquals
+        );
+        assert_eq!("last".parse::<ArgSettings>().unwrap(), ArgSettings::Last);
+        assert_eq!(
+            "hidedefaultvalue".parse::<ArgSettings>().unwrap(),
+            ArgSettings::HideDefaultValue
+        );
+        assert_eq!(
+            "caseinsensitive".parse::<ArgSettings>().unwrap(),
+            ArgSettings::CaseInsensitive
+        );
+        assert_eq!(
+            "hideenvvalues".parse::<ArgSettings>().unwrap(),
+            ArgSettings::HideEnvValues
+        );
         assert!("hahahaha".parse::<ArgSettings>().is_err());
     }
 }
--- a/third_party/rust/clap/src/args/subcommand.rs
+++ b/third_party/rust/clap/src/args/subcommand.rs
@@ -24,20 +24,18 @@ use ArgMatches;
 ///                 .help("The configuration file to use")
 ///                 .index(1)))
 /// # ;
 /// ```
 /// [`App`]: ./struct.App.html
 /// [arguments]: ./struct.Arg.html
 #[derive(Debug, Clone)]
 pub struct SubCommand<'a> {
-    #[doc(hidden)]
-    pub name: String,
-    #[doc(hidden)]
-    pub matches: ArgMatches<'a>,
+    #[doc(hidden)] pub name: String,
+    #[doc(hidden)] pub matches: ArgMatches<'a>,
 }
 
 impl<'a> SubCommand<'a> {
     /// Creates a new instance of a subcommand requiring a name. The name will be displayed
     /// to the user when they print version or help and usage information.
     ///
     /// # Examples
     ///
--- a/third_party/rust/clap/src/completions/bash.rs
+++ b/third_party/rust/clap/src/completions/bash.rs
@@ -2,28 +2,30 @@
 use std::io::Write;
 
 // Internal
 use app::parser::Parser;
 use args::{ArgSettings, OptBuilder};
 use completions;
 
 pub struct BashGen<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     p: &'b Parser<'a, 'b>,
 }
 
 impl<'a, 'b> BashGen<'a, 'b> {
     pub fn new(p: &'b Parser<'a, 'b>) -> Self { BashGen { p: p } }
 
     pub fn generate_to<W: Write>(&self, buf: &mut W) {
-
-        w!(buf,
-           format!("_{name}() {{
+        w!(
+            buf,
+            format!(
+                "_{name}() {{
     local i cur prev opts cmds
     COMPREPLY=()
     cur=\"${{COMP_WORDS[COMP_CWORD]}}\"
     prev=\"${{COMP_WORDS[COMP_CWORD-1]}}\"
     cmd=\"\"
     opts=\"\"
 
     for i in ${{COMP_WORDS[@]}}
@@ -55,136 +57,149 @@ impl<'a, 'b> BashGen<'a, 'b> {
             return 0
             ;;
         {subcmd_details}
     esac
 }}
 
 complete -F _{name} -o bashdefault -o default {name}
 ",
-                   name = self.p.meta.bin_name.as_ref().unwrap(),
-                   name_opts = self.all_options_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                   name_opts_details =
-                       self.option_details_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                   subcmds = self.all_subcommands(),
-                   subcmd_details = self.subcommand_details())
-               .as_bytes());
+                name = self.p.meta.bin_name.as_ref().unwrap(),
+                name_opts = self.all_options_for_path(self.p.meta.bin_name.as_ref().unwrap()),
+                name_opts_details =
+                    self.option_details_for_path(self.p.meta.bin_name.as_ref().unwrap()),
+                subcmds = self.all_subcommands(),
+                subcmd_details = self.subcommand_details()
+            ).as_bytes()
+        );
     }
 
     fn all_subcommands(&self) -> String {
         debugln!("BashGen::all_subcommands;");
         let mut subcmds = String::new();
         let scs = completions::all_subcommand_names(self.p);
 
         for sc in &scs {
-            subcmds = format!("{}
+            subcmds = format!(
+                "{}
             {name})
                 cmd+=\"__{name}\"
                 ;;",
-                              subcmds,
-                              name = sc.replace("-", "__"));
+                subcmds,
+                name = sc.replace("-", "__")
+            );
         }
 
         subcmds
     }
 
     fn subcommand_details(&self) -> String {
         debugln!("BashGen::subcommand_details;");
         let mut subcmd_dets = String::new();
         let mut scs = completions::get_all_subcommand_paths(self.p, true);
         scs.sort();
         scs.dedup();
 
         for sc in &scs {
-            subcmd_dets = format!("{}
+            subcmd_dets = format!(
+                "{}
         {subcmd})
             opts=\"{sc_opts}\"
             if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq {level} ]] ; then
                 COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
                 return 0
             fi
             case \"${{prev}}\" in
                 {opts_details}
                 *)
                     COMPREPLY=()
                     ;;
             esac
             COMPREPLY=( $(compgen -W \"${{opts}}\" -- ${{cur}}) )
             return 0
             ;;",
-                                  subcmd_dets,
-                                  subcmd = sc.replace("-", "__"),
-                                  sc_opts = self.all_options_for_path(&*sc),
-                                  level = sc.split("__").map(|_| 1).fold(0, |acc, n| acc + n),
-                                  opts_details = self.option_details_for_path(&*sc));
+                subcmd_dets,
+                subcmd = sc.replace("-", "__"),
+                sc_opts = self.all_options_for_path(&*sc),
+                level = sc.split("__").map(|_| 1).fold(0, |acc, n| acc + n),
+                opts_details = self.option_details_for_path(&*sc)
+            );
         }
 
         subcmd_dets
     }
 
     fn option_details_for_path(&self, path: &str) -> String {
         debugln!("BashGen::option_details_for_path: path={}", path);
         let mut p = self.p;
         for sc in path.split("__").skip(1) {
             debugln!("BashGen::option_details_for_path:iter: sc={}", sc);
             p = &find_subcmd!(p, sc).unwrap().p;
         }
         let mut opts = String::new();
         for o in p.opts() {
             if let Some(l) = o.s.long {
-                opts = format!("{}
+                opts = format!(
+                    "{}
                 --{})
                     COMPREPLY=({})
                     return 0
                     ;;",
-                               opts,
-                               l,
-                               self.vals_for(o));
+                    opts,
+                    l,
+                    self.vals_for(o)
+                );
             }
             if let Some(s) = o.s.short {
-                opts = format!("{}
+                opts = format!(
+                    "{}
                     -{})
                     COMPREPLY=({})
                     return 0
                     ;;",
-                               opts,
-                               s,
-                               self.vals_for(o));
+                    opts,
+                    s,
+                    self.vals_for(o)
+                );
             }
         }
         opts
     }
 
     fn vals_for(&self, o: &OptBuilder) -> String {
         debugln!("BashGen::vals_for: o={}", o.b.name);
         use args::AnyArg;
         let mut ret = String::new();
         let mut needs_quotes = true;
         if let Some(vals) = o.possible_vals() {
             needs_quotes = false;
             ret = format!("$(compgen -W \"{}\" -- ${{cur}})", vals.join(" "));
         } else if let Some(vec) = o.val_names() {
             let mut it = vec.iter().peekable();
             while let Some((_, val)) = it.next() {
-                ret = format!("{}<{}>{}",
-                              ret,
-                              val,
-                              if it.peek().is_some() { " " } else { "" });
+                ret = format!(
+                    "{}<{}>{}",
+                    ret,
+                    val,
+                    if it.peek().is_some() { " " } else { "" }
+                );
             }
             let num = vec.len();
             if o.is_set(ArgSettings::Multiple) && num == 1 {
                 ret = format!("{}...", ret);
             }
         } else if let Some(num) = o.num_vals() {
             let mut it = (0..num).peekable();
             while let Some(_) = it.next() {
-                ret = format!("{}<{}>{}",
-                              ret,
-                              o.name(),
-                              if it.peek().is_some() { " " } else { "" });
+                ret = format!(
+                    "{}<{}>{}",
+                    ret,
+                    o.name(),
+                    if it.peek().is_some() { " " } else { "" }
+                );
             }
             if o.is_set(ArgSettings::Multiple) && num == 1 {
                 ret = format!("{}...", ret);
             }
         } else {
             ret = format!("<{}>", o.name());
             if o.is_set(ArgSettings::Multiple) {
                 ret = format!("{}...", ret);
@@ -198,33 +213,42 @@ complete -F _{name} -o bashdefault -o de
     fn all_options_for_path(&self, path: &str) -> String {
         debugln!("BashGen::all_options_for_path: path={}", path);
         let mut p = self.p;
         for sc in path.split("__").skip(1) {
             debugln!("BashGen::all_options_for_path:iter: sc={}", sc);
             p = &find_subcmd!(p, sc).unwrap().p;
         }
         let mut opts = shorts!(p).fold(String::new(), |acc, s| format!("{} -{}", acc, s));
-        opts = format!("{} {}",
-                       opts,
-                       longs!(p).fold(String::new(), |acc, l| format!("{} --{}", acc, l)));
-        opts = format!("{} {}",
-                       opts,
-                       p.positionals
-                           .values()
-                           .fold(String::new(), |acc, p| format!("{} {}", acc, p)));
-        opts = format!("{} {}",
-                       opts,
-                       p.subcommands
-                           .iter()
-                           .fold(String::new(), |acc, s| format!("{} {}", acc, s.p.meta.name)));
+        opts = format!(
+            "{} {}",
+            opts,
+            longs!(p).fold(String::new(), |acc, l| format!("{} --{}", acc, l))
+        );
+        opts = format!(
+            "{} {}",
+            opts,
+            p.positionals
+                .values()
+                .fold(String::new(), |acc, p| format!("{} {}", acc, p))
+        );
+        opts = format!(
+            "{} {}",
+            opts,
+            p.subcommands
+                .iter()
+                .fold(String::new(), |acc, s| format!("{} {}", acc, s.p.meta.name))
+        );
         for sc in &p.subcommands {
             if let Some(ref aliases) = sc.p.meta.aliases {
-                opts = format!("{} {}",
-                               opts,
-                               aliases.iter()
-                                   .map(|&(n, _)| n)
-                                   .fold(String::new(), |acc, a| format!("{} {}", acc, a)));
+                opts = format!(
+                    "{} {}",
+                    opts,
+                    aliases
+                        .iter()
+                        .map(|&(n, _)| n)
+                        .fold(String::new(), |acc, a| format!("{} {}", acc, a))
+                );
             }
         }
         opts
     }
 }
--- a/third_party/rust/clap/src/completions/fish.rs
+++ b/third_party/rust/clap/src/completions/fish.rs
@@ -1,17 +1,17 @@
-
 // Std
 use std::io::Write;
 
 // Internal
 use app::parser::Parser;
 
 pub struct FishGen<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     p: &'b Parser<'a, 'b>,
 }
 
 impl<'a, 'b> FishGen<'a, 'b> {
     pub fn new(p: &'b Parser<'a, 'b>) -> Self { FishGen { p: p } }
 
     pub fn generate_to<W: Write>(&self, buf: &mut W) {
@@ -26,47 +26,46 @@ impl<'a, 'b> FishGen<'a, 'b> {
                 return 1
             end
         end
         return 0
     end
     return 1
 end
 
-"#
-            .to_string();
+"#.to_string();
 
         let mut buffer = detect_subcommand_function;
         gen_fish_inner(command, self, &command.to_string(), &mut buffer);
         w!(buf, buffer.as_bytes());
     }
 }
 
 // Escape string inside single quotes
-fn escape_string(string: &str) -> String {
-    string.replace("\\", "\\\\").replace("'", "\\'")
-}
+fn escape_string(string: &str) -> String { string.replace("\\", "\\\\").replace("'", "\\'") }
 
 fn gen_fish_inner(root_command: &str, comp_gen: &FishGen, parent_cmds: &str, buffer: &mut String) {
     debugln!("FishGen::gen_fish_inner;");
     // example :
     //
     // complete
     //      -c {command}
     //      -d "{description}"
     //      -s {short}
     //      -l {long}
     //      -a "{possible_arguments}"
     //      -r # if require parameter
     //      -f # don't use file completion
     //      -n "__fish_using_command myprog subcmd1" # complete for command "myprog subcmd1"
 
-    let basic_template = format!("complete -c {} -n \"__fish_using_command {}\"",
-                                 root_command,
-                                 parent_cmds);
+    let basic_template = format!(
+        "complete -c {} -n \"__fish_using_command {}\"",
+        root_command,
+        parent_cmds
+    );
 
     for option in comp_gen.p.opts() {
         let mut template = basic_template.clone();
         if let Some(data) = option.s.short {
             template.push_str(format!(" -s {}", data).as_str());
         }
         if let Some(data) = option.s.long {
             template.push_str(format!(" -l {}", data).as_str());
--- a/third_party/rust/clap/src/completions/macros.rs
+++ b/third_party/rust/clap/src/completions/macros.rs
@@ -1,9 +1,8 @@
-
 macro_rules! w {
     ($buf:expr, $to_w:expr) => {
         match $buf.write_all($to_w) {
             Ok(..) => (),
             Err(..) => panic!("Failed to write to completions file"),
         }
     };
 }
@@ -15,15 +14,15 @@ macro_rules! get_zsh_arg_conflicts {
             for arg_name in conf_vec {
                 let arg = $p.find_any_arg(arg_name).expect($msg);
                 if let Some(s) = arg.short() {
                     v.push(format!("-{}", s));
                 }
                 if let Some(l) = arg.long() {
                     v.push(format!("--{}", l));
                 }
-            } 
+            }
             v.join(" ")
         } else {
             String::new()
         }
     }
 }
--- a/third_party/rust/clap/src/completions/mod.rs
+++ b/third_party/rust/clap/src/completions/mod.rs
@@ -13,17 +13,18 @@ use std::io::Write;
 use app::parser::Parser;
 use self::bash::BashGen;
 use self::fish::FishGen;
 use self::zsh::ZshGen;
 use self::powershell::PowerShellGen;
 pub use self::shell::Shell;
 
 pub struct ComplGen<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     p: &'b Parser<'a, 'b>,
 }
 
 impl<'a, 'b> ComplGen<'a, 'b> {
     pub fn new(p: &'b Parser<'a, 'b>) -> Self { ComplGen { p: p } }
 
     pub fn generate<W: Write>(&self, for_shell: Shell, buf: &mut W) {
@@ -39,17 +40,20 @@ impl<'a, 'b> ComplGen<'a, 'b> {
 // Gets all subcommands including child subcommands in the form of 'name' where the name
 // is a single word (i.e. "install")  of the path to said subcommand (i.e.
 // "rustup toolchain install")
 //
 // Also note, aliases are treated as their own subcommands but duplicates of whatever they're
 // aliasing.
 pub fn all_subcommand_names(p: &Parser) -> Vec<String> {
     debugln!("all_subcommand_names;");
-    let mut subcmds: Vec<_> = subcommands_of(p).iter().map(|&(ref n, _)| n.clone()).collect();
+    let mut subcmds: Vec<_> = subcommands_of(p)
+        .iter()
+        .map(|&(ref n, _)| n.clone())
+        .collect();
     for sc_v in p.subcommands.iter().map(|s| all_subcommand_names(&s.p)) {
         subcmds.extend(sc_v);
     }
     subcmds.sort();
     subcmds.dedup();
     subcmds
 }
 
@@ -70,56 +74,71 @@ pub fn all_subcommands(p: &Parser) -> Ve
 
 // Gets all subcommands exlcuding child subcommands in the form of (name, bin_name) where the name
 // is a single word (i.e. "install") and the bin_name is a space deliniated list of the path to said
 // subcommand (i.e. "rustup toolchain install")
 //
 // Also note, aliases are treated as their own subcommands but duplicates of whatever they're
 // aliasing.
 pub fn subcommands_of(p: &Parser) -> Vec<(String, String)> {
-    debugln!("subcommands_of: name={}, bin_name={}",
-             p.meta.name,
-             p.meta.bin_name.as_ref().unwrap());
+    debugln!(
+        "subcommands_of: name={}, bin_name={}",
+        p.meta.name,
+        p.meta.bin_name.as_ref().unwrap()
+    );
     let mut subcmds = vec![];
 
-    debugln!("subcommands_of: Has subcommands...{:?}", p.has_subcommands());
+    debugln!(
+        "subcommands_of: Has subcommands...{:?}",
+        p.has_subcommands()
+    );
     if !p.has_subcommands() {
-        let mut ret = vec![(p.meta.name.clone(), p.meta.bin_name.as_ref().unwrap().clone())];
+        let mut ret = vec![
+            (
+                p.meta.name.clone(),
+                p.meta.bin_name.as_ref().unwrap().clone(),
+            ),
+        ];
         debugln!("subcommands_of: Looking for aliases...");
         if let Some(ref aliases) = p.meta.aliases {
             for &(n, _) in aliases {
                 debugln!("subcommands_of:iter:iter: Found alias...{}", n);
                 let mut als_bin_name: Vec<_> =
                     p.meta.bin_name.as_ref().unwrap().split(' ').collect();
                 als_bin_name.push(n);
                 let old = als_bin_name.len() - 2;
                 als_bin_name.swap_remove(old);
                 ret.push((n.to_owned(), als_bin_name.join(" ")));
             }
         }
         return ret;
     }
     for sc in &p.subcommands {
-        debugln!("subcommands_of:iter: name={}, bin_name={}",
-                 sc.p.meta.name,
-                 sc.p.meta.bin_name.as_ref().unwrap());
+        debugln!(
+            "subcommands_of:iter: name={}, bin_name={}",
+            sc.p.meta.name,
+            sc.p.meta.bin_name.as_ref().unwrap()
+        );
 
         debugln!("subcommands_of:iter: Looking for aliases...");
         if let Some(ref aliases) = sc.p.meta.aliases {
             for &(n, _) in aliases {
                 debugln!("subcommands_of:iter:iter: Found alias...{}", n);
                 let mut als_bin_name: Vec<_> =
                     p.meta.bin_name.as_ref().unwrap().split(' ').collect();
                 als_bin_name.push(n);
                 let old = als_bin_name.len() - 2;
                 als_bin_name.swap_remove(old);
                 subcmds.push((n.to_owned(), als_bin_name.join(" ")));
             }
         }
-        subcmds.push((sc.p.meta.name.clone(), sc.p.meta.bin_name.as_ref().unwrap().clone()));
+        subcmds.push((
+            sc.p.meta.name.clone(),
+            sc.p.meta.bin_name.as_ref().unwrap().clone(),
+        ));
     }
     subcmds
 }
 
 pub fn get_all_subcommand_paths(p: &Parser, first: bool) -> Vec<String> {
     debugln!("get_all_subcommand_paths;");
     let mut subcmds = vec![];
     if !p.has_subcommands() {
@@ -133,21 +152,30 @@ pub fn get_all_subcommand_paths(p: &Pars
                 }
             }
             return ret;
         }
         return vec![];
     }
     for sc in &p.subcommands {
         let name = &*sc.p.meta.name;
-        let path = sc.p.meta.bin_name.as_ref().unwrap().clone().replace(" ", "__");
+        let path = sc.p
+            .meta
+            .bin_name
+            .as_ref()
+            .unwrap()
+            .clone()
+            .replace(" ", "__");
         subcmds.push(path.clone());
         if let Some(ref aliases) = sc.p.meta.aliases {
             for &(n, _) in aliases {
                 subcmds.push(path.replace(name, n));
             }
         }
     }
-    for sc_v in p.subcommands.iter().map(|s| get_all_subcommand_paths(&s.p, false)) {
+    for sc_v in p.subcommands
+        .iter()
+        .map(|s| get_all_subcommand_paths(&s.p, false))
+    {
         subcmds.extend(sc_v);
     }
     subcmds
 }
--- a/third_party/rust/clap/src/completions/powershell.rs
+++ b/third_party/rust/clap/src/completions/powershell.rs
@@ -1,30 +1,31 @@
-
 // Std
 use std::io::Write;
 
 // Internal
 use app::parser::Parser;
 use INTERNAL_ERROR_MSG;
 
 pub struct PowerShellGen<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     p: &'b Parser<'a, 'b>,
 }
 
 impl<'a, 'b> PowerShellGen<'a, 'b> {
     pub fn new(p: &'b Parser<'a, 'b>) -> Self { PowerShellGen { p: p } }
 
     pub fn generate_to<W: Write>(&self, buf: &mut W) {
         let bin_name = self.p.meta.bin_name.as_ref().unwrap();
 
         let mut names = vec![];
-        let (subcommands_detection_cases, subcommands_cases) = generate_inner(self.p, "", &mut names);
+        let (subcommands_detection_cases, subcommands_cases) =
+            generate_inner(self.p, "", &mut names);
 
         let mut bin_names = vec![bin_name.to_string(), format!("./{0}", bin_name)];
         if cfg!(windows) {
             bin_names.push(format!("{0}.exe", bin_name));
             bin_names.push(format!(r".\{0}", bin_name));
             bin_names.push(format!(r".\{0}.exe", bin_name));
             bin_names.push(format!(r"./{0}.exe", bin_name));
         }
@@ -69,55 +70,67 @@ impl<'a, 'b> PowerShellGen<'a, 'b> {
             subcommands_detection_cases = subcommands_detection_cases,
             subcommands_cases = subcommands_cases
         );
 
         w!(buf, result.as_bytes());
     }
 }
 
-fn generate_inner<'a, 'b, 'p>(p: &'p Parser<'a, 'b>, previous_command_name: &str, names: &mut Vec<&'p str>) -> (String, String) {
+fn generate_inner<'a, 'b, 'p>(
+    p: &'p Parser<'a, 'b>,
+    previous_command_name: &str,
+    names: &mut Vec<&'p str>,
+) -> (String, String) {
     debugln!("PowerShellGen::generate_inner;");
     let command_name = if previous_command_name.is_empty() {
-        format!("{}_{}", previous_command_name, &p.meta.bin_name.as_ref().expect(INTERNAL_ERROR_MSG))
+        format!(
+            "{}_{}",
+            previous_command_name,
+            &p.meta.bin_name.as_ref().expect(INTERNAL_ERROR_MSG)
+        )
     } else {
         format!("{}_{}", previous_command_name, &p.meta.name)
     };
 
     let mut subcommands_detection_cases = if !names.contains(&&*p.meta.name) {
         names.push(&*p.meta.name);
-        format!(r"
+        format!(
+            r"
                     '{0}' {{
                         $command += '_{0}'
                         break
                     }}
 ",
-                &p.meta.name)
+            &p.meta.name
+        )
     } else {
         String::new()
     };
 
     let mut completions = String::new();
     for subcommand in &p.subcommands {
         completions.push_str(&format!("'{}', ", &subcommand.p.meta.name));
     }
     for short in shorts!(p) {
         completions.push_str(&format!("'-{}', ", short));
     }
     for long in longs!(p) {
         completions.push_str(&format!("'--{}', ", long));
     }
 
-    let mut subcommands_cases = format!(r"
+    let mut subcommands_cases = format!(
+        r"
             '{}' {{
                 $completions = @({})
             }}
 ",
-                                        &command_name,
-                                        completions.trim_right_matches(", "));
+        &command_name,
+        completions.trim_right_matches(", ")
+    );
 
     for subcommand in &p.subcommands {
         let (subcommand_subcommands_detection_cases, subcommand_subcommands_cases) =
             generate_inner(&subcommand.p, &command_name, names);
         subcommands_detection_cases.push_str(&subcommand_subcommands_detection_cases);
         subcommands_cases.push_str(&subcommand_subcommands_cases);
     }
 
--- a/third_party/rust/clap/src/completions/shell.rs
+++ b/third_party/rust/clap/src/completions/shell.rs
@@ -1,17 +1,18 @@
+#[allow(unused_imports)]
 use std::ascii::AsciiExt;
 use std::str::FromStr;
 use std::fmt;
 
 /// Describes which shell to produce a completions file for
 #[cfg_attr(feature = "lints", allow(enum_variant_names))]
 #[derive(Debug, Copy, Clone)]
 pub enum Shell {
-    /// Generates a .bash-completion completion file for the Bourne Again SHell (BASH)
+    /// Generates a .bash completion file for the Bourne Again SHell (BASH)
     Bash,
     /// Generates a .fish completion file for the Friendly Interactive SHell (fish)
     Fish,
     /// Generates a completion file for the Z SHell (ZSH)
     Zsh,
     /// Generates a completion file for PowerShell
     PowerShell,
 }
@@ -21,17 +22,16 @@ impl Shell {
     pub fn variants() -> [&'static str; 4] { ["zsh", "bash", "fish", "powershell"] }
 }
 
 impl FromStr for Shell {
     type Err = String;
 
     fn from_str(s: &str) -> Result<Self, Self::Err> {
         match s {
-
             "ZSH" | _ if s.eq_ignore_ascii_case("zsh") => Ok(Shell::Zsh),
             "FISH" | _ if s.eq_ignore_ascii_case("fish") => Ok(Shell::Fish),
             "BASH" | _ if s.eq_ignore_ascii_case("bash") => Ok(Shell::Bash),
             "POWERSHELL" | _ if s.eq_ignore_ascii_case("powershell") => Ok(Shell::PowerShell),
             _ => Err(String::from("[valid values: bash, fish, zsh, powershell]")),
         }
     }
 }
--- a/third_party/rust/clap/src/completions/zsh.rs
+++ b/third_party/rust/clap/src/completions/zsh.rs
@@ -1,55 +1,59 @@
-
 // Std
 use std::io::Write;
+#[allow(unused_imports)]
 use std::ascii::AsciiExt;
 
 // Internal
 use app::App;
 use app::parser::Parser;
-use args::{ArgSettings, AnyArg};
+use args::{AnyArg, ArgSettings};
 use completions;
 use INTERNAL_ERROR_MSG;
 
 pub struct ZshGen<'a, 'b>
-    where 'a: 'b
+where
+    'a: 'b,
 {
     p: &'b Parser<'a, 'b>,
 }
 
 impl<'a, 'b> ZshGen<'a, 'b> {
     pub fn new(p: &'b Parser<'a, 'b>) -> Self {
         debugln!("ZshGen::new;");
         ZshGen { p: p }
     }
 
     pub fn generate_to<W: Write>(&self, buf: &mut W) {
         debugln!("ZshGen::generate_to;");
-        w!(buf,
-            format!("\
+        w!(
+            buf,
+            format!(
+                "\
 #compdef {name}
 
 _{name}() {{
     typeset -A opt_args
     local ret=1
 
     local context curcontext=\"$curcontext\" state line
     {initial_args}
     {subcommands}
 }}
 
 {subcommand_details}
 
 _{name} \"$@\"",
-                   name = self.p.meta.bin_name.as_ref().unwrap(),
-                   initial_args = get_args_of(self.p),
-                   subcommands = get_subcommands_of(self.p),
-                   subcommand_details = subcommand_details(self.p)).as_bytes());
-
+                name = self.p.meta.bin_name.as_ref().unwrap(),
+                initial_args = get_args_of(self.p),
+                subcommands = get_subcommands_of(self.p),
+                subcommand_details = subcommand_details(self.p)
+            ).as_bytes()
+        );
     }
 }
 
 // Displays the positional args and commands of a subcommand
 // (( $+functions[_[bin_name_underscore]_commands] )) ||
 // _[bin_name_underscore]_commands() {
 // 	local commands; commands=(
 // 		'[arg_name]:[arg_help]'
@@ -73,45 +77,51 @@ impl<'a, 'b> ZshGen<'a, 'b> {
 //      # ... snip for brevity
 //      'help:Prints this message or the help of the given subcommand(s)'
 // 	)
 // 	_describe -t commands 'rustup commands' commands "$@"
 //
 fn subcommand_details(p: &Parser) -> String {
     debugln!("ZshGen::subcommand_details;");
     // First we do ourself
-    let mut ret = vec![format!("\
+    let mut ret = vec![
+        format!(
+            "\
 (( $+functions[_{bin_name_underscore}_commands] )) ||
 _{bin_name_underscore}_commands() {{
     local commands; commands=(
         {subcommands_and_args}
     )
     _describe -t commands '{bin_name} commands' commands \"$@\"
 }}",
             bin_name_underscore = p.meta.bin_name.as_ref().unwrap().replace(" ", "__"),
             bin_name = p.meta.bin_name.as_ref().unwrap(),
-            subcommands_and_args = subcommands_and_args_of(p))];
+            subcommands_and_args = subcommands_and_args_of(p)
+        ),
+    ];
 
     // Next we start looping through all the children, grandchildren, etc.
     let mut all_subcommands = completions::all_subcommands(p);
     all_subcommands.sort();
     all_subcommands.dedup();
     for &(_, ref bin_name) in &all_subcommands {
         debugln!("ZshGen::subcommand_details:iter: bin_name={}", bin_name);
-        ret.push(format!("\
+        ret.push(format!(
+            "\
 (( $+functions[_{bin_name_underscore}_commands] )) ||
 _{bin_name_underscore}_commands() {{
     local commands; commands=(
         {subcommands_and_args}
     )
     _describe -t commands '{bin_name} commands' commands \"$@\"
 }}",
             bin_name_underscore = bin_name.replace(" ", "__"),
             bin_name = bin_name,
-            subcommands_and_args = subcommands_and_args_of(parser_of(p, bin_name))));
+            subcommands_and_args = subcommands_and_args_of(parser_of(p, bin_name))
+        ));
     }
 
     ret.join("\n")
 }
 
 // Generates subcommand and positional argument completions in form of
 //
 // 		'[arg_name]:[arg_help]'
@@ -123,41 +133,57 @@ fn subcommand_details(p: &Parser) -> Str
 // A snippet from rustup:
 // 		'show:Show the active and installed toolchains'
 //      'update:Update Rust toolchains'
 fn subcommands_and_args_of(p: &Parser) -> String {
     debugln!("ZshGen::subcommands_and_args_of;");
     let mut ret = vec![];
     fn add_sc(sc: &App, n: &str, ret: &mut Vec<String>) {
         debugln!("ZshGen::add_sc;");
-        let s = format!("\"{name}:{help}\" \\", 
-            name = n, 
-            help = sc.p.meta.about.unwrap_or("").replace("[", "\\[").replace("]", "\\]"));
+        let s = format!(
+            "\"{name}:{help}\" \\",
+            name = n,
+            help = sc.p
+                .meta
+                .about
+                .unwrap_or("")
+                .replace("[", "\\[")
+                .replace("]", "\\]")
+        );
         if !s.is_empty() {
             ret.push(s);
         }
     }
 
     // First the subcommands
     for sc in p.subcommands() {
-        debugln!("ZshGen::subcommands_and_args_of:iter: subcommand={}", sc.p.meta.name);
+        debugln!(
+            "ZshGen::subcommands_and_args_of:iter: subcommand={}",
+            sc.p.meta.name
+        );
         add_sc(sc, &sc.p.meta.name, &mut ret);
         if let Some(ref v) = sc.p.meta.aliases {
             for alias in v.iter().filter(|&&(_, vis)| vis).map(|&(n, _)| n) {
                 add_sc(sc, alias, &mut ret);
             }
         }
     }
 
     // Then the positional args
     for arg in p.positionals() {
         debugln!("ZshGen::subcommands_and_args_of:iter: arg={}", arg.b.name);
-        let a = format!("\"{name}:{help}\" \\", 
-            name = arg.b.name.to_ascii_uppercase(), 
-            help = arg.b.help.unwrap_or("").replace("[", "\\[").replace("]", "\\]"));
+        let a = format!(
+            "\"{name}:{help}\" \\",
+            name = arg.b.name.to_ascii_uppercase(),
+            help = arg.b
+                .help
+                .unwrap_or("")
+                .replace("[", "\\[")
+                .replace("]", "\\]")
+        );
 
         if !a.is_empty() {
             ret.push(a);
         }
     }
 
     ret.join("\n")
 }
@@ -189,17 +215,20 @@ fn subcommands_and_args_of(p: &Parser) -
 //    [name] = The subcommand name in the form of "install" for "rustup toolchain install"
 //    [bin_name] = The full space deliniated bin_name such as "rustup toolchain install"
 //    [name_hyphen] = The full space deliniated bin_name, but replace spaces with hyphens
 //    [repeat] = From the same recursive calls, but for all subcommands
 //    [subcommand_args] = The same as zsh::get_args_of
 fn get_subcommands_of(p: &Parser) -> String {
     debugln!("get_subcommands_of;");
 
-    debugln!("get_subcommands_of: Has subcommands...{:?}", p.has_subcommands());
+    debugln!(
+        "get_subcommands_of: Has subcommands...{:?}",
+        p.has_subcommands()
+    );
     if !p.has_subcommands() {
         return String::new();
     }
 
     let sc_names = completions::subcommands_of(p);
 
     let mut subcmds = vec![];
     for &(ref name, ref bin_name) in &sc_names {
@@ -212,27 +241,28 @@ fn get_subcommands_of(p: &Parser) -> Str
         if !subcommands.is_empty() {
             v.push(subcommands);
         }
         v.push(String::from(";;"));
         subcmds.push(v.join("\n"));
     }
 
     format!(
-"case $state in
+        "case $state in
     ({name})
         curcontext=\"${{curcontext%:*:*}}:{name_hyphen}-command-$words[1]:\"
         case $line[1] in
             {subcommands}
         esac
     ;;
-esac", 
+esac",
         name = p.meta.name,
         name_hyphen = p.meta.bin_name.as_ref().unwrap().replace(" ", "-"),
-        subcommands = subcmds.join("\n"))
+        subcommands = subcmds.join("\n")
+    )
 }
 
 fn parser_of<'a, 'b>(p: &'b Parser<'a, 'b>, sc: &str) -> &'b Parser<'a, 'b> {
     debugln!("parser_of: sc={}", sc);
     if sc == p.meta.bin_name.as_ref().unwrap_or(&String::new()) {
         return p;
     }
     &p.find_subcommand(sc).expect(INTERNAL_ERROR_MSG).p
@@ -259,18 +289,20 @@ fn parser_of<'a, 'b>(p: &'b Parser<'a, '
 //    -s: Allow stacking of short args (i.e. -a -b -c => -abc)
 //    -S: Do not complete anything after '--' and treat those as argument values
 fn get_args_of(p: &Parser) -> String {
     debugln!("get_args_of;");
     let mut ret = vec![String::from("_arguments -s -S -C \\")];
     let opts = write_opts_of(p);
     let flags = write_flags_of(p);
     let sc_or_a = if p.has_subcommands() || p.has_positionals() {
-        format!("\"1:: :_{name}_commands\" \\", 
-                name = p.meta.bin_name.as_ref().unwrap().replace(" ", "__"))
+        format!(
+            "\"1:: :_{name}_commands\" \\",
+            name = p.meta.bin_name.as_ref().unwrap().replace(" ", "__")
+        )
     } else {
         String::new()
     };
     let sc = if p.has_subcommands() {
         format!("\"*:: :->{name}\" \\", name = p.meta.name)
     } else {
         String::new()
     };
@@ -289,17 +321,18 @@ fn get_args_of(p: &Parser) -> String {
     }
     ret.push(String::from("&& ret=0"));
 
     ret.join("\n")
 }
 
 // Escape string inside single quotes and brackets
 fn escape_string(string: &str) -> String {
-    string.replace("\\", "\\\\")
+    string
+        .replace("\\", "\\\\")
         .replace("'", "'\\''")
         .replace("[", "\\[")
         .replace("]", "\\]")
 }
 
 fn write_opts_of(p: &Parser) -> String {
     debugln!("write_opts_of;");
     let mut ret = vec![];
@@ -319,33 +352,37 @@ fn write_opts_of(p: &Parser) -> String {
             ""
         };
         let pv = if let Some(pv_vec) = o.possible_vals() {
             format!(": :({})", pv_vec.join(" "))
         } else {
             String::new()
         };
         if let Some(short) = o.short() {
-            let s = format!("'{conflicts}{multiple}-{arg}+[{help}]{possible_values}' \\",
+            let s = format!(
+                "'{conflicts}{multiple}-{arg}+[{help}]{possible_values}' \\",
                 conflicts = conflicts,
                 multiple = multiple,
                 arg = short,
                 possible_values = pv,
-                help = help);
+                help = help
+            );
 
             debugln!("write_opts_of:iter: Wrote...{}", &*s);
             ret.push(s);
         }
         if let Some(long) = o.long() {
-            let l = format!("'{conflicts}{multiple}--{arg}+[{help}]{possible_values}' \\",
+            let l = format!(
+                "'{conflicts}{multiple}--{arg}+[{help}]{possible_values}' \\",
                 conflicts = conflicts,
                 multiple = multiple,
                 arg = long,
                 possible_values = pv,
-                help = help);
+                help = help
+            );
 
             debugln!("write_opts_of:iter: Wrote...{}", &*l);
             ret.push(l);
         }
     }
 
     ret.join("\n")
 }
@@ -364,32 +401,36 @@ fn write_flags_of(p: &Parser) -> String 
         };
 
         let multiple = if f.is_set(ArgSettings::Multiple) {
             "*"
         } else {
             ""
         };
         if let Some(short) = f.short() {
-            let s = format!("'{conflicts}{multiple}-{arg}[{help}]' \\",
+            let s = format!(
+                "'{conflicts}{multiple}-{arg}[{help}]' \\",
                 multiple = multiple,
                 conflicts = conflicts,
                 arg = short,
-                help = help);
+                help = help
+            );
 
             debugln!("write_flags_of:iter: Wrote...{}", &*s);
             ret.push(s);
         }
 
         if let Some(long) = f.long() {
-            let l = format!("'{conflicts}{multiple}--{arg}[{help}]' \\",
+            let l = format!(
+                "'{conflicts}{multiple}--{arg}[{help}]' \\",
                 conflicts = conflicts,
                 multiple = multiple,
                 arg = long,
-                help = help);
+                help = help
+            );
 
             debugln!("write_flags_of:iter: Wrote...{}", &*l);
             ret.push(l);
         }
     }
 
     ret.join("\n")
 }
--- a/third_party/rust/clap/src/errors.rs
+++ b/third_party/rust/clap/src/errors.rs
@@ -3,18 +3,18 @@ use std::convert::From;
 use std::error::Error as StdError;
 use std::fmt as std_fmt;
 use std::fmt::Display;
 use std::io::{self, Write};
 use std::process;
 use std::result::Result as StdResult;
 
 // Internal
-use args::{FlagBuilder, AnyArg};
-use fmt::{Colorizer, ColorizerOption, ColorWhen};
+use args::{AnyArg, FlagBuilder};
+use fmt::{ColorWhen, Colorizer, ColorizerOption};
 use suggestions;
 
 /// Short hand for [`Result`] type
 /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
 pub type Result<T> = StdResult<T, Error>;
 
 /// Command line argument parser kind of error
 #[derive(Debug, Copy, Clone, PartialEq)]
@@ -53,18 +53,18 @@ pub enum ErrorKind {
 
     /// Occurs when the user provides an unrecognized [`SubCommand`] which meets the threshold for
     /// being similar enough to an existing subcommand.
     /// If it doesn't meet the threshold, or the 'suggestions' feature is disabled,
     /// the more general [`UnknownArgument`] error is returned.
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(feature="suggestions"), doc=" ```no_run")]
-    #[cfg_attr(    feature="suggestions" , doc=" ```")]
+    #[cfg_attr(not(feature = "suggestions"), doc = " ```no_run")]
+    #[cfg_attr(feature = "suggestions", doc = " ```")]
     /// # use clap::{App, Arg, ErrorKind, SubCommand};
     /// let result = App::new("prog")
     ///     .subcommand(SubCommand::with_name("config")
     ///         .about("Used for configuration")
     ///         .arg(Arg::with_name("config_file")
     ///             .help("The configuration file to use")
     ///             .index(1)))
     ///     .get_matches_from_safe(vec!["prog", "confi"]);
@@ -295,18 +295,18 @@ pub enum ErrorKind {
     /// [`AppSettings::StrictUtf8`] is set.
     ///
     /// # Platform Speicific
     ///
     /// Non-Windows platforms only (such as Linux, Unix, OSX, etc.)
     ///
     /// # Examples
     ///
-    #[cfg_attr(not(unix), doc=" ```ignore")]
-    #[cfg_attr(    unix , doc=" ```")]
+    #[cfg_attr(not(unix), doc = " ```ignore")]
+    #[cfg_attr(unix, doc = " ```")]
     /// # use clap::{App, Arg, ErrorKind, AppSettings};
     /// # use std::os::unix::ffi::OsStringExt;
     /// # use std::ffi::OsString;
     /// let result = App::new("prog")
     ///     .setting(AppSettings::StrictUtf8)
     ///     .arg(Arg::with_name("utf8")
     ///         .short("u")
     ///         .takes_value(true))
@@ -379,18 +379,17 @@ pub struct Error {
     /// Any additional information passed along, such as the argument name that caused the error
     pub info: Option<Vec<String>>,
 }
 
 impl Error {
     /// Should the message be written to `stdout` or not
     pub fn use_stderr(&self) -> bool {
         match self.kind {
-            ErrorKind::HelpDisplayed |
-            ErrorKind::VersionDisplayed => false,
+            ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed => false,
             _ => true,
         }
     }
 
     /// Prints the error to `stderr` and exits with a status of `1`
     pub fn exit(&self) -> ! {
         if self.use_stderr() {
             wlnerr!("{}", self.message);
@@ -400,423 +399,456 @@ impl Error {
         writeln!(&mut out.lock(), "{}", self.message).expect("Error writing Error to stdout");
         process::exit(0);
     }
 
     #[doc(hidden)]
     pub fn write_to<W: Write>(&self, w: &mut W) -> io::Result<()> { write!(w, "{}", self.message) }
 
     #[doc(hidden)]
-    pub fn argument_conflict<'a, 'b, A, O, U>(arg: &A,
-                                              other: Option<O>,
-                                              usage: U,
-                                              color: ColorWhen)
-                                              -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              O: Into<String>,
-              U: Display
+    pub fn argument_conflict<'a, 'b, A, O, U>(
+        arg: &A,
+        other: Option<O>,
+        usage: U,
+        color: ColorWhen,
+    ) -> Self
+    where
+        A: AnyArg<'a, 'b> + Display,
+        O: Into<String>,
+        U: Display,
     {
         let mut v = vec![arg.name().to_owned()];
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The argument '{}' cannot be used with {}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*arg.to_string()),
-                             match other {
-                                 Some(name) => {
-                                     let n = name.into();
-                                     v.push(n.clone());
-                                     c.warning(format!("'{}'", n))
-                                 }
-                                 None => {
-                                     c.none("one or more of the other specified arguments"
-                                         .to_owned())
-                                 }
-                             },
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The argument '{}' cannot be used with {}\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(&*arg.to_string()),
+                match other {
+                    Some(name) => {
+                        let n = name.into();
+                        v.push(n.clone());
+                        c.warning(format!("'{}'", n))
+                    }
+                    None => c.none("one or more of the other specified arguments".to_owned()),
+                },
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::ArgumentConflict,
             info: Some(v),
         }
     }
 
     #[doc(hidden)]
     pub fn empty_value<'a, 'b, A, U>(arg: &A, usage: U, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
+    where
+        A: AnyArg<'a, 'b> + Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The argument '{}' requires a value but none was supplied\
-                            \n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The argument '{}' requires a value but none was supplied\
+                 \n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(arg.to_string()),
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::EmptyValue,
             info: Some(vec![arg.name().to_owned()]),
         }
     }
 
     #[doc(hidden)]
-    pub fn invalid_value<'a, 'b, B, G, A, U>(bad_val: B,
-                                             good_vals: &[G],
-                                             arg: &A,
-                                             usage: U,
-                                             color: ColorWhen)
-                                             -> Self
-        where B: AsRef<str>,
-              G: AsRef<str> + Display,
-              A: AnyArg<'a, 'b> + Display,
-              U: Display
+    pub fn invalid_value<'a, 'b, B, G, A, U>(
+        bad_val: B,
+        good_vals: &[G],
+        arg: &A,
+        usage: U,
+        color: ColorWhen,
+    ) -> Self
+    where
+        B: AsRef<str>,
+        G: AsRef<str> + Display,
+        A: AnyArg<'a, 'b> + Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
-        let suffix =
-            suggestions::did_you_mean_value_suffix(
-                bad_val.as_ref(),
-                good_vals.iter());
+        let suffix = suggestions::did_you_mean_value_suffix(bad_val.as_ref(), good_vals.iter());
 
         let mut sorted = vec![];
         for v in good_vals {
             let val = format!("{}", c.good(v));
             sorted.push(val);
         }
         sorted.sort();
         let valid_values = sorted.join(", ");
         Error {
-            message: format!("{} '{}' isn't a valid value for '{}'\n\t\
-                            [values: {}]\n\
-                            {}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(bad_val.as_ref()),
-                             c.warning(arg.to_string()),
-                             valid_values,
-                             suffix.0,
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} '{}' isn't a valid value for '{}'\n\t\
+                 [values: {}]\n\
+                 {}\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(bad_val.as_ref()),
+                c.warning(arg.to_string()),
+                valid_values,
+                suffix.0,
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::InvalidValue,
             info: Some(vec![arg.name().to_owned(), bad_val.as_ref().to_owned()]),
         }
     }
 
     #[doc(hidden)]
-    pub fn invalid_subcommand<S, D, N, U>(subcmd: S,
-                                          did_you_mean: D,
-                                          name: N,
-                                          usage: U,
-                                          color: ColorWhen)
-                                          -> Self
-        where S: Into<String>,
-              D: AsRef<str> + Display,
-              N: Display,
-              U: Display
+    pub fn invalid_subcommand<S, D, N, U>(
+        subcmd: S,
+        did_you_mean: D,
+        name: N,
+        usage: U,
+        color: ColorWhen,
+    ) -> Self
+    where
+        S: Into<String>,
+        D: AsRef<str> + Display,
+        N: Display,
+        U: Display,
     {
         let s = subcmd.into();
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The subcommand '{}' wasn't recognized\n\t\
-                            Did you mean '{}'?\n\n\
-                            If you believe you received this message in error, try \
-                            re-running with '{} {} {}'\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*s),
-                             c.good(did_you_mean.as_ref()),
-                             name,
-                             c.good("--"),
-                             &*s,
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The subcommand '{}' wasn't recognized\n\t\
+                 Did you mean '{}'?\n\n\
+                 If you believe you received this message in error, try \
+                 re-running with '{} {} {}'\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(&*s),
+                c.good(did_you_mean.as_ref()),
+                name,
+                c.good("--"),
+                &*s,
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::InvalidSubcommand,
             info: Some(vec![s]),
         }
     }
 
     #[doc(hidden)]
     pub fn unrecognized_subcommand<S, N>(subcmd: S, name: N, color: ColorWhen) -> Self
-        where S: Into<String>,
-              N: Display
+    where
+        S: Into<String>,
+        N: Display,
     {
         let s = subcmd.into();
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The subcommand '{}' wasn't recognized\n\n\
-                            {}\n\t\
-                                {} help <subcommands>...\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*s),
-                             c.warning("USAGE:"),
-                             name,
-                             c.good("--help")),
+            message: format!(
+                "{} The subcommand '{}' wasn't recognized\n\n\
+                 {}\n\t\
+                 {} help <subcommands>...\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(&*s),
+                c.warning("USAGE:"),
+                name,
+                c.good("--help")
+            ),
             kind: ErrorKind::UnrecognizedSubcommand,
             info: Some(vec![s]),
         }
     }
 
     #[doc(hidden)]
     pub fn missing_required_argument<R, U>(required: R, usage: U, color: ColorWhen) -> Self
-        where R: Display,
-              U: Display
+    where
+        R: Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The following required arguments were not provided:{}\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             required,
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The following required arguments were not provided:{}\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                required,
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::MissingRequiredArgument,
             info: None,
         }
     }
 
     #[doc(hidden)]
     pub fn missing_subcommand<N, U>(name: N, usage: U, color: ColorWhen) -> Self
-        where N: AsRef<str> + Display,
-              U: Display
+    where
+        N: AsRef<str> + Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} '{}' requires a subcommand, but one was not provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(name),
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} '{}' requires a subcommand, but one was not provided\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(name),
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::MissingSubcommand,
             info: None,
         }
     }
 
 
     #[doc(hidden)]
     pub fn invalid_utf8<U>(usage: U, color: ColorWhen) -> Self
-        where U: Display
+    where
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} Invalid UTF-8 was detected in one or more arguments\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} Invalid UTF-8 was detected in one or more arguments\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::InvalidUtf8,
             info: None,
         }
     }
 
     #[doc(hidden)]
-    pub fn too_many_values<'a, 'b, V, A, U>(val: V,
-                                            arg: &A,
-                                            usage: U,
-                                            color: ColorWhen)
-                                            -> Self
-        where V: AsRef<str> + Display + ToOwned,
-              A: AnyArg<'a, 'b> + Display,
-              U: Display
+    pub fn too_many_values<'a, 'b, V, A, U>(val: V, arg: &A, usage: U, color: ColorWhen) -> Self
+    where
+        V: AsRef<str> + Display + ToOwned,
+        A: AnyArg<'a, 'b> + Display,
+        U: Display,
     {
         let v = val.as_ref();
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The value '{}' was provided to '{}', but it wasn't expecting \
-                            any more values\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(v),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The value '{}' was provided to '{}', but it wasn't expecting \
+                 any more values\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(v),
+                c.warning(arg.to_string()),
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::TooManyValues,
             info: Some(vec![arg.name().to_owned(), v.to_owned()]),
         }
     }
 
     #[doc(hidden)]
-    pub fn too_few_values<'a, 'b, A, U>(arg: &A,
-                                        min_vals: u64,
-                                        curr_vals: usize,
-                                        usage: U,
-                                        color: ColorWhen)
-                                        -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
+    pub fn too_few_values<'a, 'b, A, U>(
+        arg: &A,
+        min_vals: u64,
+        curr_vals: usize,
+        usage: U,
+        color: ColorWhen,
+    ) -> Self
+    where
+        A: AnyArg<'a, 'b> + Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The argument '{}' requires at least {} values, but only {} w{} \
-                            provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             c.warning(min_vals.to_string()),
-                             c.warning(curr_vals.to_string()),
-                             if curr_vals > 1 { "ere" } else { "as" },
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The argument '{}' requires at least {} values, but only {} w{} \
+                 provided\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(arg.to_string()),
+                c.warning(min_vals.to_string()),
+                c.warning(curr_vals.to_string()),
+                if curr_vals > 1 { "ere" } else { "as" },
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::TooFewValues,
             info: Some(vec![arg.name().to_owned()]),
         }
     }
 
     #[doc(hidden)]
     pub fn value_validation<'a, 'b, A>(arg: Option<&A>, err: String, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display
+    where
+        A: AnyArg<'a, 'b> + Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} Invalid value{}: {}",
-                             c.error("error:"),
-                             if let Some(a) = arg {
-                                 format!(" for '{}'", c.warning(a.to_string()))
-                             } else {
-                                 "".to_string()
-                             },
-                             err),
+            message: format!(
+                "{} Invalid value{}: {}",
+                c.error("error:"),
+                if let Some(a) = arg {
+                    format!(" for '{}'", c.warning(a.to_string()))
+                } else {
+                    "".to_string()
+                },
+                err
+            ),
             kind: ErrorKind::ValueValidation,
             info: None,
         }
     }
 
     #[doc(hidden)]
     pub fn value_validation_auto(err: String) -> Self {
-        let n: Option<&FlagBuilder> = None; 
+        let n: Option<&FlagBuilder> = None;
         Error::value_validation(n, err, ColorWhen::Auto)
     }
 
     #[doc(hidden)]
-    pub fn wrong_number_of_values<'a, 'b, A, S, U>(arg: &A,
-                                                   num_vals: u64,
-                                                   curr_vals: usize,
-                                                   suffix: S,
-                                                   usage: U,
-                                                   color: ColorWhen)
-                                                   -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              S: Display,
-              U: Display
+    pub fn wrong_number_of_values<'a, 'b, A, S, U>(
+        arg: &A,
+        num_vals: u64,
+        curr_vals: usize,
+        suffix: S,
+        usage: U,
+        color: ColorWhen,
+    ) -> Self
+    where
+        A: AnyArg<'a, 'b> + Display,
+        S: Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The argument '{}' requires {} values, but {} w{} \
-                            provided\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             c.warning(num_vals.to_string()),
-                             c.warning(curr_vals.to_string()),
-                             suffix,
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The argument '{}' requires {} values, but {} w{} \
+                 provided\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(arg.to_string()),
+                c.warning(num_vals.to_string()),
+                c.warning(curr_vals.to_string()),
+                suffix,
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::WrongNumberOfValues,
             info: Some(vec![arg.name().to_owned()]),
         }
     }
 
     #[doc(hidden)]
     pub fn unexpected_multiple_usage<'a, 'b, A, U>(arg: &A, usage: U, color: ColorWhen) -> Self
-        where A: AnyArg<'a, 'b> + Display,
-              U: Display
+    where
+        A: AnyArg<'a, 'b> + Display,
+        U: Display,
     {
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} The argument '{}' was provided more than once, but cannot \
-                            be used multiple times\n\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(arg.to_string()),
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} The argument '{}' was provided more than once, but cannot \
+                 be used multiple times\n\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(arg.to_string()),
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::UnexpectedMultipleUsage,
             info: Some(vec![arg.name().to_owned()]),
         }
     }
 
     #[doc(hidden)]
-    pub fn unknown_argument<A, U>(arg: A,
-                                  did_you_mean: &str,
-                                  usage: U,
-                                  color: ColorWhen)
-                                  -> Self
-        where A: Into<String>,
-              U: Display
+    pub fn unknown_argument<A, U>(arg: A, did_you_mean: &str, usage: U, color: ColorWhen) -> Self
+    where
+        A: Into<String>,
+        U: Display,
     {
         let a = arg.into();
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: color,
         });
         Error {
-            message: format!("{} Found argument '{}' which wasn't expected, or isn't valid in \
-            this context{}\n\
-                            {}\n\n\
-                            For more information try {}",
-                             c.error("error:"),
-                             c.warning(&*a),
-                             if did_you_mean.is_empty() {
-                                 "\n".to_owned()
-                             } else {
-                                 format!("{}\n", did_you_mean)
-                             },
-                             usage,
-                             c.good("--help")),
+            message: format!(
+                "{} Found argument '{}' which wasn't expected, or isn't valid in \
+                 this context{}\n\
+                 {}\n\n\
+                 For more information try {}",
+                c.error("error:"),
+                c.warning(&*a),
+                if did_you_mean.is_empty() {
+                    "\n".to_owned()
+                } else {
+                    format!("{}\n", did_you_mean)
+                },
+                usage,
+                c.good("--help")
+            ),
             kind: ErrorKind::UnknownArgument,
             info: Some(vec![a]),
         }
     }
 
     #[doc(hidden)]
     pub fn io_error(e: &Error, color: ColorWhen) -> Self {
         let c = Colorizer::new(ColorizerOption {
@@ -827,27 +859,30 @@ impl Error {
             message: format!("{} {}", c.error("error:"), e.description()),
             kind: ErrorKind::Io,
             info: None,
         }
     }
 
     #[doc(hidden)]
     pub fn argument_not_found_auto<A>(arg: A) -> Self
-        where A: Into<String>
+    where
+        A: Into<String>,
     {
         let a = arg.into();
         let c = Colorizer::new(ColorizerOption {
             use_stderr: true,
             when: ColorWhen::Auto,
         });
         Error {
-            message: format!("{} The argument '{}' wasn't found",
-                             c.error("error:"),
-                             a.clone()),
+            message: format!(
+                "{} The argument '{}' wasn't found",
+                c.error("error:"),
+                a.clone()
+            ),
             kind: ErrorKind::ArgumentNotFound,
             info: Some(vec![a]),
         }
     }
 
     /// Create an error with a custom description.
     ///
     /// This can be used in combination with `Error::exit` to exit your program
--- a/third_party/rust/clap/src/fmt.rs
+++ b/third_party/rust/clap/src/fmt.rs
@@ -66,38 +66,42 @@ impl Colorizer {
                 option.when
             } else {
                 ColorWhen::Never
             },
         }
     }
 
     pub fn good<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
+    where
+        T: fmt::Display + AsRef<str>,
     {
         debugln!("Colorizer::good;");
         color!(self, Good, msg)
     }
 
     pub fn warning<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
+    where
+        T: fmt::Display + AsRef<str>,
     {
         debugln!("Colorizer::warning;");
         color!(self, Warning, msg)
     }
 
     pub fn error<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
+    where
+        T: fmt::Display + AsRef<str>,
     {
         debugln!("Colorizer::error;");
         color!(self, Error, msg)
     }
 
     pub fn none<T>(&self, msg: T) -> Format<T>
-        where T: fmt::Display + AsRef<str>
+    where
+        T: fmt::Display + AsRef<str>,
     {
         debugln!("Colorizer::none;");
         Format::None(msg)
     }
 }
 
 impl Default for Colorizer {
     fn default() -> Self {
@@ -131,17 +135,17 @@ impl<T: AsRef<str>> Format<T> {
             Format::Warning(ref e) => Yellow.paint(e.as_ref()),
             Format::Good(ref e) => Green.paint(e.as_ref()),
             Format::None(ref e) => ANSIString::from(e.as_ref()),
         }
     }
 }
 
 #[cfg(any(not(feature = "color"), target_os = "windows"))]
-#[cfg_attr(feature="lints", allow(match_same_arms))]
+#[cfg_attr(feature = "lints", allow(match_same_arms))]
 impl<T: fmt::Display> Format<T> {
     fn format(&self) -> &T {
         match *self {
             Format::Error(ref e) => e,
             Format::Warning(ref e) => e,
             Format::Good(ref e) => e,
             Format::None(ref e) => e,
         }
@@ -163,19 +167,23 @@ impl<T: fmt::Display> fmt::Display for F
 mod test {
     use ansi_term::ANSIString;
     use ansi_term::Colour::{Green, Red, Yellow};
     use super::Format;
 
     #[test]
     fn colored_output() {
         let err = Format::Error("error");
-        assert_eq!(&*format!("{}", err),
-                   &*format!("{}", Red.bold().paint("error")));
+        assert_eq!(
+            &*format!("{}", err),
+            &*format!("{}", Red.bold().paint("error"))
+        );
         let good = Format::Good("good");
         assert_eq!(&*format!("{}", good), &*format!("{}", Green.paint("good")));
         let warn = Format::Warning("warn");
         assert_eq!(&*format!("{}", warn), &*format!("{}", Yellow.paint("warn")));
         let none = Format::None("none");
-        assert_eq!(&*format!("{}", none),
-                   &*format!("{}", ANSIString::from("none")));
+        assert_eq!(
+            &*format!("{}", none),
+            &*format!("{}", ANSIString::from("none"))
+        );
     }
 }
--- a/third_party/rust/clap/src/lib.rs
+++ b/third_party/rust/clap/src/lib.rs
@@ -507,57 +507,52 @@
 //! Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be
 //! clearly annotated in the `CHANGELOG.md`
 //!
 //! ## License
 //!
 //! `clap` is licensed under the MIT license. Please read the [LICENSE-MIT](LICENSE-MIT) file in
 //! this repository for more information.
 
-#![crate_type= "lib"]
-#![doc(html_root_url = "https://docs.rs/clap/2.27.1")]
-#![deny(
-        missing_docs,
-        missing_debug_implementations,
-        missing_copy_implementations,
-        trivial_casts,
-        unused_import_braces,
-        unused_allocation)]
+#![crate_type = "lib"]
+#![doc(html_root_url = "https://docs.rs/clap/2.29.0")]
+#![deny(missing_docs, missing_debug_implementations, missing_copy_implementations, trivial_casts,
+        unused_import_braces, unused_allocation)]
 // Lints we'd like to deny but are currently failing for upstream crates
 //      unused_qualifications       (bitflags, clippy)
 //      trivial_numeric_casts       (bitflags)
 #![cfg_attr(not(any(feature = "lints", feature = "nightly")), forbid(unstable_features))]
 #![cfg_attr(feature = "lints", feature(plugin))]
 #![cfg_attr(feature = "lints", plugin(clippy))]
 // Need to disable deny(warnings) while deprecations are active
 // #![cfg_attr(feature = "lints", deny(warnings))]
 #![cfg_attr(feature = "lints", allow(cyclomatic_complexity))]
 #![cfg_attr(feature = "lints", allow(doc_markdown))]
 #![cfg_attr(feature = "lints", allow(explicit_iter_loop))]
 
-#[cfg(feature = "suggestions")]
-extern crate strsim;
 #[cfg(feature = "color")]
 extern crate ansi_term;
-#[cfg(feature = "yaml")]
-extern crate yaml_rust;
-extern crate unicode_width;
+#[cfg(feature = "color")]
+extern crate atty;
 #[macro_use]
 extern crate bitflags;
-#[cfg(feature = "vec_map")]
-extern crate vec_map;
+#[cfg(feature = "suggestions")]
+extern crate strsim;
 #[cfg(feature = "wrap_help")]
 extern crate term_size;
 extern crate textwrap;
-#[cfg(feature = "color")]
-extern crate atty;
+extern crate unicode_width;
+#[cfg(feature = "vec_map")]
+extern crate vec_map;
+#[cfg(feature = "yaml")]
+extern crate yaml_rust;
 
 #[cfg(feature = "yaml")]
 pub use yaml_rust::YamlLoader;
-pub use args::{Arg, ArgGroup, ArgMatches, ArgSettings, SubCommand, Values, OsValues};
+pub use args::{Arg, ArgGroup, ArgMatches, ArgSettings, OsValues, SubCommand, Values};
 pub use app::{App, AppSettings};
 pub use fmt::Format;
 pub use errors::{Error, ErrorKind, Result};
 pub use completions::Shell;
 
 #[macro_use]
 mod macros;
 mod app;
@@ -569,8 +564,62 @@ mod errors;
 mod osstringext;
 mod strext;
 mod completions;
 mod map;
 
 const INTERNAL_ERROR_MSG: &'static str = "Fatal internal error. Please consider filing a bug \
                                           report at https://github.com/kbknapp/clap-rs/issues";
 const INVALID_UTF8: &'static str = "unexpected invalid UTF-8 code point";
+
+#[cfg(unstable)]
+pub use derive::{ArgEnum, ClapApp, FromArgMatches, IntoApp};
+
+#[cfg(unstable)]
+mod derive {
+    /// @TODO @release @docs
+    pub trait ClapApp: IntoApp + FromArgMatches + Sized {
+        /// @TODO @release @docs
+        fn parse() -> Self { Self::from_argmatches(Self::into_app().get_matches()) }
+
+        /// @TODO @release @docs
+        fn parse_from<I, T>(argv: I) -> Self
+        where
+            I: IntoIterator<Item = T>,
+            T: Into<OsString> + Clone,
+        {
+            Self::from_argmatches(Self::into_app().get_matches_from(argv))
+        }
+
+        /// @TODO @release @docs
+        fn try_parse() -> Result<Self, clap::Error> {
+            Self::try_from_argmatches(Self::into_app().get_matches_safe()?)
+        }
+
+
+        /// @TODO @release @docs
+        fn try_parse_from<I, T>(argv: I) -> Result<Self, clap::Error>
+        where
+            I: IntoIterator<Item = T>,
+            T: Into<OsString> + Clone,
+        {
+            Self::try_from_argmatches(Self::into_app().get_matches_from_safe(argv)?)
+        }
+    }
+
+    /// @TODO @release @docs
+    pub trait IntoApp {
+        /// @TODO @release @docs
+        fn into_app<'a, 'b>() -> clap::App<'a, 'b>;
+    }
+
+    /// @TODO @release @docs
+    pub trait FromArgMatches: Sized {
+        /// @TODO @release @docs
+        fn from_argmatches<'a>(matches: clap::ArgMatches<'a>) -> Self;
+
+        /// @TODO @release @docs
+        fn try_from_argmatches<'a>(matches: clap::ArgMatches<'a>) -> Result<Self, clap::Error>;
+    }
+
+    /// @TODO @release @docs
+    pub trait ArgEnum {}
+}
--- a/third_party/rust/clap/src/macros.rs
+++ b/third_party/rust/clap/src/macros.rs
@@ -257,62 +257,69 @@ macro_rules! _clap_count_exprs {
     ($e:expr, $($es:expr),+) => { 1 + _clap_count_exprs!($($es),*) };
 }
 
 /// Convenience macro to generate more complete enums with variants to be used as a type when
 /// parsing arguments. This enum also provides a `variants()` function which can be used to
 /// retrieve a `Vec<&'static str>` of the variant names, as well as implementing [`FromStr`] and
 /// [`Display`] automatically.
 ///
-/// **NOTE:** Case insensitivity is supported for ASCII characters only
+/// **NOTE:** Case insensitivity is supported for ASCII characters only. It's highly recommended to
+/// use [`Arg::case_insensitive(true)`] for args that will be used with these enums
 ///
 /// **NOTE:** This macro automatically implements [`std::str::FromStr`] and [`std::fmt::Display`]
 ///
 /// **NOTE:** These enums support pub (or not) and uses of the #[derive()] traits
 ///
 /// # Examples
 ///
-/// ```no_run
+/// ```rust
 /// # #[macro_use]
 /// # extern crate clap;
 /// # use clap::{App, Arg};
 /// arg_enum!{
-///     #[derive(Debug)]
+///     #[derive(PartialEq, Debug)]
 ///     pub enum Foo {
 ///         Bar,
 ///         Baz,
 ///         Qux
 ///     }
 /// }
 /// // Foo enum can now be used via Foo::Bar, or Foo::Baz, etc
 /// // and implements std::str::FromStr to use with the value_t! macros
 /// fn main() {
 ///     let m = App::new("app")
-///                 .arg_from_usage("<foo> 'the foo'")
-///                 .get_matches();
+///                 .arg(Arg::from_usage("<foo> 'the foo'")
+///                     .possible_values(&Foo::variants())
+///                     .case_insensitive(true))
+///                 .get_matches_from(vec![
+///                     "app", "baz"
+///                 ]);
 ///     let f = value_t!(m, "foo", Foo).unwrap_or_else(|e| e.exit());
 ///
-///     // Use f like any other Foo variant...
+///     assert_eq!(f, Foo::Baz);
 /// }
 /// ```
 /// [`FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
 /// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
 /// [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
 /// [`std::fmt::Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
+/// [`Arg::case_insensitive(true)`]: ./struct.Arg.html#method.case_insensitive
 #[macro_export]
 macro_rules! arg_enum {
     (@as_item $($i:item)*) => ($($i)*);
     (@impls ( $($tts:tt)* ) -> ($e:ident, $($v:ident),+)) => {
         arg_enum!(@as_item
         $($tts)*
 
         impl ::std::str::FromStr for $e {
             type Err = String;
 
             fn from_str(s: &str) -> ::std::result::Result<Self,Self::Err> {
+                #[allow(unused_imports)]
                 use ::std::ascii::AsciiExt;
                 match s {
                     $(stringify!($v) |
                     _ if s.eq_ignore_ascii_case(stringify!($v)) => Ok($e::$v)),+,
                     _ => Err({
                         let v = vec![
                             $(stringify!($v),)+
                         ];
@@ -333,39 +340,64 @@ macro_rules! arg_enum {
             #[allow(dead_code)]
             pub fn variants() -> [&'static str; _clap_count_exprs!($(stringify!($v)),+)] {
                 [
                     $(stringify!($v),)+
                 ]
             }
         });
     };
+    ($(#[$($m:meta),+])+ pub enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
+        arg_enum!(@impls
+            ($(#[$($m),+])+
+            pub enum $e {
+                $($v$(=$val)*),+
+            }) -> ($e, $($v),+)
+        );
+    };
     ($(#[$($m:meta),+])+ pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
         arg_enum!(@impls
             ($(#[$($m),+])+
             pub enum $e {
                 $($v$(=$val)*),+
             }) -> ($e, $($v),+)
         );
     };
-    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*),+  } ) => {
+    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
+        arg_enum!($(#[$($m:meta),+])+
+            enum $e:ident {
+                $($v:ident $(=$val:expr)*),+
+            }
+        );
+    };
+    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
         arg_enum!(@impls
             ($(#[$($m),+])+
             enum $e {
                 $($v$(=$val)*),+
             }) -> ($e, $($v),+)
         );
     };
+    (pub enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
+        arg_enum!(pub enum $e:ident {
+            $($v:ident $(=$val:expr)*),+
+        });
+    };
     (pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
         arg_enum!(@impls
             (pub enum $e {
                 $($v$(=$val)*),+
             }) -> ($e, $($v),+)
         );
     };
+    (enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
+        arg_enum!(enum $e:ident {
+            $($v:ident $(=$val:expr)*),+
+        });
+    };
     (enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
         arg_enum!(@impls
             (enum $e {
                 $($v$(=$val)*),+
             }) -> ($e, $($v),+)
         );
     };
 }
@@ -380,17 +412,17 @@ macro_rules! arg_enum {
 /// # extern crate clap;
 /// # use clap::App;
 /// # fn main() {
 /// let m = App::new("app")
 ///             .version(crate_version!())
 ///             .get_matches();
 /// # }
 /// ```
-#[cfg(not(feature="no_cargo"))]
+#[cfg(not(feature = "no_cargo"))]
 #[macro_export]
 macro_rules! crate_version {
     () => {
         env!("CARGO_PKG_VERSION")
     };
 }
 
 /// Allows you to pull the authors for the app from your Cargo.toml at
@@ -409,17 +441,17 @@ macro_rules! crate_version {
 /// # extern crate clap;
 /// # use clap::App;
 /// # fn main() {
 /// let m = App::new("app")
 ///             .author(crate_authors!("\n"))
 ///             .get_matches();
 /// # }
 /// ```
-#[cfg(not(feature="no_cargo"))]
+#[cfg(not(feature = "no_cargo"))]
 #[macro_export]
 macro_rules! crate_authors {
     ($sep:expr) => {{
         use std::ops::Deref;
         use std::sync::{ONCE_INIT, Once};
 
         #[allow(missing_copy_implementations)]
         #[allow(dead_code)]
@@ -460,17 +492,17 @@ macro_rules! crate_authors {
 /// # extern crate clap;
 /// # use clap::App;
 /// # fn main() {
 /// let m = App::new("app")
 ///             .about(crate_description!())
 ///             .get_matches();
 /// # }
 /// ```
-#[cfg(not(feature="no_cargo"))]
+#[cfg(not(feature = "no_cargo"))]
 #[macro_export]
 macro_rules! crate_description {
     () => {
         env!("CARGO_PKG_DESCRIPTION")
     };
 }
 
 /// Allows you to pull the name from your Cargo.toml at compile time.
@@ -481,17 +513,17 @@ macro_rules! crate_description {
 /// # #[macro_use]
 /// # extern crate clap;
 /// # use clap::App;
 /// # fn main() {
 /// let m = App::new(crate_name!())
 ///             .get_matches();
 /// # }
 /// ```
-#[cfg(not(feature="no_cargo"))]
+#[cfg(not(feature = "no_cargo"))]
 #[macro_export]
 macro_rules! crate_name {
     () => {
         env!("CARGO_PKG_NAME")
     };
 }
 
 /// Allows you to build the `App` instance from your Cargo.toml at compile time.
@@ -512,17 +544,17 @@ macro_rules! crate_name {
 ///
 /// ```no_run
 /// # #[macro_use]
 /// # extern crate clap;
 /// # fn main() {
 /// let m = app_from_crate!().get_matches();
 /// # }
 /// ```
-#[cfg(not(feature="no_cargo"))]
+#[cfg(not(feature = "no_cargo"))]
 #[macro_export]
 macro_rules! app_from_crate {
     () => {
         $crate::App::new(crate_name!())
             .version(crate_version!())
             .author(crate_authors!())
             .about(crate_description!())
     };
@@ -734,17 +766,17 @@ macro_rules! clap_app {
     }};
 
     ($name:ident => $($tail:tt)*) => {{
         clap_app!{ @app ($crate::App::new(stringify!($name))) $($tail)*}
     }};
 }
 
 macro_rules! impl_settings {
-    ($n:ident, $($v:ident => $c:ident),+) => {
+    ($n:ident, $($v:ident => $c:path),+) => {
         pub fn set(&mut self, s: $n) {
             match s {
                 $($n::$v => self.0.insert($c)),+
             }
         }
 
         pub fn unset(&mut self, s: $n) {
             match s {
@@ -765,16 +797,17 @@ macro_rules! wlnerr(
     ($($arg:tt)*) => ({
         use std::io::{Write, stderr};
         writeln!(&mut stderr(), $($arg)*).ok();
     })
 );
 
 #[cfg(feature = "debug")]
 #[cfg_attr(feature = "debug", macro_use)]
+#[cfg_attr(feature = "debug", allow(unused_macros))]
 mod debug_macros {
     macro_rules! debugln {
         ($fmt:expr) => (println!(concat!("DEBUG:clap:", $fmt)));
         ($fmt:expr, $($arg:tt)*) => (println!(concat!("DEBUG:clap:",$fmt), $($arg)*));
     }
     macro_rules! sdebugln {
         ($fmt:expr) => (println!($fmt));
         ($fmt:expr, $($arg:tt)*) => (println!($fmt, $($arg)*));
--- a/third_party/rust/clap/src/map.rs
+++ b/third_party/rust/clap/src/map.rs
@@ -1,61 +1,53 @@
 #[cfg(feature = "vec_map")]
-pub use vec_map::{VecMap, Values};
+pub use vec_map::{Values, VecMap};
 
 #[cfg(not(feature = "vec_map"))]
-pub use self::vec_map::{VecMap, Values};
+pub use self::vec_map::{Values, VecMap};
 
 #[cfg(not(feature = "vec_map"))]
 mod vec_map {
     use std::collections::BTreeMap;
     use std::collections::btree_map;
     use std::fmt::{self, Debug, Formatter};
 
     #[derive(Clone, Default, Debug)]
     pub struct VecMap<V> {
         inner: BTreeMap<usize, V>,
     }
 
     impl<V> VecMap<V> {
         pub fn new() -> Self {
-            VecMap { inner: Default::default() }
+            VecMap {
+                inner: Default::default(),
+            }
         }
 
-        pub fn len(&self) -> usize {
-            self.inner.len()
-        }
+        pub fn len(&self) -> usize { self.inner.len() }
 
-        pub fn is_empty(&self) -> bool {
-            self.inner.is_empty()
-        }
+        pub fn is_empty(&self) -> bool { self.inner.is_empty() }
 
         pub fn insert(&mut self, key: usize, value: V) -> Option<V> {
             self.inner.insert(key, value)
         }
 
-        pub fn values(&self) -> Values<V> {
-            self.inner.values()
-        }
+        pub fn values(&self) -> Values<V> { self.inner.values() }
 
         pub fn iter(&self) -> Iter<V> {
-            Iter { inner: self.inner.iter() }
+            Iter {
+                inner: self.inner.iter(),
+            }
         }
 
-        pub fn contains_key(&self, key: usize) -> bool {
-            self.inner.contains_key(&key)
-        }
+        pub fn contains_key(&self, key: usize) -> bool { self.inner.contains_key(&key) }
 
-        pub fn entry(&mut self, key: usize) -> Entry<V> {
-            self.inner.entry(key)
-        }
+        pub fn entry(&mut self, key: usize) -> Entry<V> { self.inner.entry(key) }
 
-        pub fn get(&self, key: usize) -> Option<&V> {
-            self.inner.get(&key)
-        }
+        pub fn get(&self, key: usize) -> Option<&V> { self.inner.get(&key) }
     }
 
     pub type Values<'a, V> = btree_map::Values<'a, usize, V>;
 
     pub type Entry<'a, V> = btree_map::Entry<'a, usize, V>;
 
     #[derive(Clone)]
     pub struct Iter<'a, V: 'a> {
@@ -66,19 +58,17 @@ mod vec_map {
         fn fmt(&self, f: &mut Formatter) -> fmt::Result {
             f.debug_list().entries(self.inner.clone()).finish()
         }
     }
 
     impl<'a, V: 'a> Iterator for Iter<'a, V> {
         type Item = (usize, &'a V);
 
-        fn next(&mut self) -> Option<Self::Item> {
-            self.inner.next().map(|(k, v)| (*k, v))
-        }
+        fn next(&mut self) -> Option<Self::Item> { self.inner.next().map(|(k, v)| (*k, v)) }
     }
 
     impl<'a, V: 'a> DoubleEndedIterator for Iter<'a, V> {
         fn next_back(&mut self) -> Option<Self::Item> {
             self.inner.next_back().map(|(k, v)| (*k, v))
         }
     }
 }
--- a/third_party/rust/clap/src/osstringext.rs
+++ b/third_party/rust/clap/src/osstringext.rs
@@ -43,34 +43,48 @@ impl OsStrExt2 for OsStr {
             }
         }
         false
     }
 
     fn split_at_byte(&self, byte: u8) -> (&OsStr, &OsStr) {
         for (i, b) in self.as_bytes().iter().enumerate() {
             if b == &byte {
-                return (OsStr::from_bytes(&self.as_bytes()[..i]),
-                        OsStr::from_bytes(&self.as_bytes()[i + 1..]));
+                return (
+                    OsStr::from_bytes(&self.as_bytes()[..i]),
+                    OsStr::from_bytes(&self.as_bytes()[i + 1..]),
+                );
             }
         }
-        (&*self, OsStr::from_bytes(&self.as_bytes()[self.len_()..self.len_()]))
+        (
+            &*self,
+            OsStr::from_bytes(&self.as_bytes()[self.len_()..self.len_()]),
+        )
     }
 
     fn trim_left_matches(&self, byte: u8) -> &OsStr {
+        let mut found = false;
         for (i, b) in self.as_bytes().iter().enumerate() {
             if b != &byte {
                 return OsStr::from_bytes(&self.as_bytes()[i..]);
+            } else {
+                found = true;
             }
         }
+        if found {
+            return OsStr::from_bytes(&self.as_bytes()[self.len_()..]);
+        }
         &*self
     }
 
     fn split_at(&self, i: usize) -> (&OsStr, &OsStr) {
-        (OsStr::from_bytes(&self.as_bytes()[..i]), OsStr::from_bytes(&self.as_bytes()[i..]))
+        (
+            OsStr::from_bytes(&self.as_bytes()[..i]),
+            OsStr::from_bytes(&self.as_bytes()[i..]),
+        )
     }
 
     fn len_(&self) -> usize { self.as_bytes().len() }
 
     fn split(&self, b: u8) -> OsSplit {
         OsSplit {
             sep: b,
             val: self.as_bytes(),
--- a/third_party/rust/clap/src/suggestions.rs
+++ b/third_party/rust/clap/src/suggestions.rs
@@ -8,77 +8,90 @@ use fmt::Format;
 
 /// Produces a string from a given list of possible values which is similar to
 /// the passed in value `v` with a certain confidence.
 /// Thus in a list of possible values like ["foo", "bar"], the value "fop" will yield
 /// `Some("foo")`, whereas "blark" would yield `None`.
 #[cfg(feature = "suggestions")]
 #[cfg_attr(feature = "lints", allow(needless_lifetimes))]
 pub fn did_you_mean<'a, T: ?Sized, I>(v: &str, possible_values: I) -> Option<&'a str>
-    where T: AsRef<str> + 'a,
-          I: IntoIterator<Item = &'a T>
+where
+    T: AsRef<str> + 'a,
+    I: IntoIterator<Item = &'a T>,
 {
-
     let mut candidate: Option<(f64, &str)> = None;
     for pv in possible_values {
         let confidence = strsim::jaro_winkler(v, pv.as_ref());
-        if confidence > 0.8 &&
-           (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence)) {
+        if confidence > 0.8 && (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence))
+        {
             candidate = Some((confidence, pv.as_ref()));
         }
     }
     match candidate {
         None => None,
         Some((_, candidate)) => Some(candidate),
     }
 }
 
 #[cfg(not(feature = "suggestions"))]
 pub fn did_you_mean<'a, T: ?Sized, I>(_: &str, _: I) -> Option<&'a str>
-    where T: AsRef<str> + 'a,
-          I: IntoIterator<Item = &'a T>
+where
+    T: AsRef<str> + 'a,
+    I: IntoIterator<Item = &'a T>,
 {
     None
 }
 
 /// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
 #[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean_flag_suffix<'z, T, I>(arg: &str, longs: I, subcommands: &'z [App])
-                                     -> (String, Option<&'z str>)
-    where T: AsRef<str> + 'z,
-          I: IntoIterator<Item = &'z T>
+pub fn did_you_mean_flag_suffix<'z, T, I>(
+    arg: &str,
+    longs: I,
+    subcommands: &'z [App],
+) -> (String, Option<&'z str>)
+where
+    T: AsRef<str> + 'z,
+    I: IntoIterator<Item = &'z T>,
 {
     match did_you_mean(arg, longs) {
         Some(candidate) => {
-            let suffix = format!("\n\tDid you mean {}{}?", Format::Good("--"), Format::Good(candidate));
-            return (suffix, Some(candidate))
+            let suffix = format!(
+                "\n\tDid you mean {}{}?",
+                Format::Good("--"),
+                Format::Good(candidate)
+            );
+            return (suffix, Some(candidate));
         }
-        None => {
-            for subcommand in subcommands {
-                let opts = subcommand.p.flags.iter().filter_map(|f| f.s.long).chain(
-                    subcommand.p.opts.iter().filter_map(|o| o.s.long));
+        None => for subcommand in subcommands {
+            let opts = subcommand
+                .p
+                .flags
+                .iter()
+                .filter_map(|f| f.s.long)
+                .chain(subcommand.p.opts.iter().filter_map(|o| o.s.long));
 
-                if let Some(candidate) = did_you_mean(arg, opts) {
-                    let suffix = format!(
-                        "\n\tDid you mean to put '{}{}' after the subcommand '{}'?",
-                        Format::Good("--"),
-                        Format::Good(candidate),
-                        Format::Good(subcommand.get_name()));
-                    return (suffix, Some(candidate));
-                }
+            if let Some(candidate) = did_you_mean(arg, opts) {
+                let suffix = format!(
+                    "\n\tDid you mean to put '{}{}' after the subcommand '{}'?",
+                    Format::Good("--"),
+                    Format::Good(candidate),
+                    Format::Good(subcommand.get_name())
+                );
+                return (suffix, Some(candidate));
             }
-        }
+        },
     }
     (String::new(), None)
 }
 
 /// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
 pub fn did_you_mean_value_suffix<'z, T, I>(arg: &str, values: I) -> (String, Option<&'z str>)
-    where T: AsRef<str> + 'z,
-          I: IntoIterator<Item = &'z T>
+where
+    T: AsRef<str> + 'z,
+    I: IntoIterator<Item = &'z T>,
 {
     match did_you_mean(arg, values) {
         Some(candidate) => {
             let suffix = format!("\n\tDid you mean '{}'?", Format::Good(candidate));
             (suffix, Some(candidate))
         }
         None => (String::new(), None),
     }
@@ -99,18 +112,24 @@ mod test {
         let p_vals = ["test", "possible", "values"];
         assert!(did_you_mean("hahaahahah", p_vals.iter()).is_none());
     }
 
     #[test]
     fn suffix_long() {
         let p_vals = ["test", "possible", "values"];
         let suffix = "\n\tDid you mean \'--test\'?";
-        assert_eq!(did_you_mean_flag_suffix("tst", p_vals.iter(), []), (suffix, Some("test")));
+        assert_eq!(
+            did_you_mean_flag_suffix("tst", p_vals.iter(), []),
+            (suffix, Some("test"))
+        );
     }
 
     #[test]
     fn suffix_enum() {
         let p_vals = ["test", "possible", "values"];
         let suffix = "\n\tDid you mean \'test\'?";
-        assert_eq!(did_you_mean_value_suffix("tst", p_vals.iter()), (suffix, Some("test")));
+        assert_eq!(
+            did_you_mean_value_suffix("tst", p_vals.iter()),
+            (suffix, Some("test"))
+        );
     }
 }
--- a/third_party/rust/clap/src/usage_parser.rs
+++ b/third_party/rust/clap/src/usage_parser.rs
@@ -1,9 +1,8 @@
-
 // Internal
 use INTERNAL_ERROR_MSG;
 use args::Arg;
 use args::settings::ArgSettings;
 use map::VecMap;
 
 #[derive(PartialEq, Debug)]
 enum UsageToken {
@@ -55,31 +54,38 @@ impl<'a> UsageParser<'a> {
                     b'.' => self.multiple(&mut arg),
                     b'\'' => self.help(&mut arg),
                     _ => self.name(&mut arg),
                 }
             } else {
                 break;
             }
         }
-        debug_assert!(!arg.b.name.is_empty(),
-                      format!("No name found for Arg when parsing usage string: {}",
-                              self.usage));
+        debug_assert!(
+            !arg.b.name.is_empty(),
+            format!(
+                "No name found for Arg when parsing usage string: {}",
+                self.usage
+            )
+        );
         arg.v.num_vals = match arg.v.val_names {
             Some(ref v) if v.len() >= 2 => Some(v.len() as u64),
             _ => None,
         };
         debugln!("UsageParser::parse: vals...{:?}", arg.v.val_names);
         arg
     }
 
     fn name(&mut self, arg: &mut Arg<'a, 'a>) {
         debugln!("UsageParser::name;");
-        if *self.usage.as_bytes().get(self.pos).expect(INTERNAL_ERROR_MSG) == b'<' &&
-           !self.explicit_name_set {
+        if *self.usage
+            .as_bytes()
+            .get(self.pos)
+            .expect(INTERNAL_ERROR_MSG) == b'<' && !self.explicit_name_set
+        {
             arg.setb(ArgSettings::Required);
         }
         self.pos += 1;
         self.stop_at(name_end);
         let name = &self.usage[self.start..self.pos];
         if self.prev == UsageToken::Unknown {
             debugln!("UsageParser::name: setting name...{}", name);
             arg.b.name = name;
@@ -99,27 +105,35 @@ impl<'a> UsageParser<'a> {
                 arg.v.val_names = Some(v);
                 arg.setb(ArgSettings::TakesValue);
             }
             self.prev = UsageToken::ValName;
         }
     }
 
     fn stop_at<F>(&mut self, f: F)
-        where F: Fn(u8) -> bool
+    where
+        F: Fn(u8) -> bool,
     {
         debugln!("UsageParser::stop_at;");
         self.start = self.pos;
-        self.pos += self.usage[self.start..].bytes().take_while(|&b| f(b)).count();
+        self.pos += self.usage[self.start..]
+            .bytes()
+            .take_while(|&b| f(b))
+            .count();
     }
 
     fn short_or_long(&mut self, arg: &mut Arg<'a, 'a>) {
         debugln!("UsageParser::short_or_long;");
         self.pos += 1;
-        if *self.usage.as_bytes().get(self.pos).expect(INTERNAL_ERROR_MSG) == b'-' {
+        if *self.usage
+            .as_bytes()
+            .get(self.pos)
+            .expect(INTERNAL_ERROR_MSG) == b'-'
+        {
             self.pos += 1;
             self.long(arg);
             return;
         }
         self.short(arg)
     }
 
     fn long(&mut self, arg: &mut Arg<'a, 'a>) {
@@ -176,19 +190,22 @@ impl<'a> UsageParser<'a> {
         }
     }
 
     fn help(&mut self, arg: &mut Arg<'a, 'a>) {
         debugln!("UsageParser::help;");
         self.stop_at(help_start);
         self.start = self.pos + 1;
         self.pos = self.usage.len() - 1;
-        debugln!("UsageParser::help: setting help...{}", &self.usage[self.start..self.pos]);
+        debugln!(
+            "UsageParser::help: setting help...{}",
+            &self.usage[self.start..self.pos]
+        );
         arg.b.help = Some(&self.usage[self.start..self.pos]);
-        self.pos += 1;   // Move to next byte to keep from thinking ending ' is a start
+        self.pos += 1; // Move to next byte to keep from thinking ending ' is a start
         self.prev = UsageToken::Help;
     }
 }
 
 #[inline]
 fn name_end(b: u8) -> bool { b != b']' && b != b'>' }
 
 #[inline]
@@ -327,727 +344,853 @@ mod test {
         let a = Arg::from_usage("[option] -o [opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert!(a.s.long.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(!a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage1() {
         let b = Arg::from_usage("-o [opt] 'some help info'");
         assert_eq!(b.b.name, "o");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert!(b.s.long.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(!b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage2() {
         let c = Arg::from_usage("<option> -o <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert!(c.s.long.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(!c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage3() {
         let d = Arg::from_usage("-o <opt> 'some help info'");
         assert_eq!(d.b.name, "o");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert!(d.s.long.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage4() {
         let a = Arg::from_usage("[option] -o [opt]... 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert!(a.s.long.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage5() {
         let a = Arg::from_usage("[option]... -o [opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert!(a.s.long.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage6() {
         let b = Arg::from_usage("-o [opt]... 'some help info'");
         assert_eq!(b.b.name, "o");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert!(b.s.long.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage7() {
         let c = Arg::from_usage("<option> -o <opt>... 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert!(c.s.long.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage8() {
         let c = Arg::from_usage("<option>... -o <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert!(c.s.long.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage9() {
         let d = Arg::from_usage("-o <opt>... 'some help info'");
         assert_eq!(d.b.name, "o");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert!(d.s.long.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long1() {
         let a = Arg::from_usage("[option] --opt [opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(!a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long2() {
         let b = Arg::from_usage("--opt [option] 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert!(b.s.short.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(!b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long3() {
         let c = Arg::from_usage("<option> --opt <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(!c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long4() {
         let d = Arg::from_usage("--opt <option> 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert!(d.s.short.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long5() {
         let a = Arg::from_usage("[option] --opt [opt]... 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long6() {
         let a = Arg::from_usage("[option]... --opt [opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long7() {
         let b = Arg::from_usage("--opt [option]... 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert!(b.s.short.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long8() {
         let c = Arg::from_usage("<option> --opt <opt>... 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long9() {
         let c = Arg::from_usage("<option>... --opt <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long10() {
         let d = Arg::from_usage("--opt <option>... 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert!(d.s.short.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals1() {
         let a = Arg::from_usage("[option] --opt=[opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(!a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals2() {
         let b = Arg::from_usage("--opt=[option] 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert!(b.s.short.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(!b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals3() {
         let c = Arg::from_usage("<option> --opt=<opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(!c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals4() {
         let d = Arg::from_usage("--opt=<option> 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert!(d.s.short.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals5() {
         let a = Arg::from_usage("[option] --opt=[opt]... 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals6() {
         let a = Arg::from_usage("[option]... --opt=[opt] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert!(a.s.short.is_none());
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals7() {
         let b = Arg::from_usage("--opt=[option]... 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert!(b.s.short.is_none());
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals8() {
         let c = Arg::from_usage("<option> --opt=<opt>... 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals9() {
         let c = Arg::from_usage("<option>... --opt=<opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert!(c.s.short.is_none());
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_long_equals10() {
         let d = Arg::from_usage("--opt=<option>... 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert!(d.s.short.is_none());
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both1() {
         let a = Arg::from_usage("[option] -o --opt [option] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(!a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both2() {
         let b = Arg::from_usage("-o --opt [option] 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(!b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both3() {
         let c = Arg::from_usage("<option> -o --opt <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(!c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both4() {
         let d = Arg::from_usage("-o --opt <option> 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both5() {
         let a = Arg::from_usage("[option]... -o --opt [option] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both6() {
         let b = Arg::from_usage("-o --opt [option]... 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both7() {
         let c = Arg::from_usage("<option>... -o --opt <opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both8() {
         let d = Arg::from_usage("-o --opt <option>... 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals1() {
         let a = Arg::from_usage("[option] -o --opt=[option] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(!a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals2() {
         let b = Arg::from_usage("-o --opt=[option] 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(!b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals3() {
         let c = Arg::from_usage("<option> -o --opt=<opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(!c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals4() {
         let d = Arg::from_usage("-o --opt=<option> 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals5() {
         let a = Arg::from_usage("[option]... -o --opt=[option] 'some help info'");
         assert_eq!(a.b.name, "option");
         assert_eq!(a.s.long.unwrap(), "opt");
         assert_eq!(a.s.short.unwrap(), 'o');
         assert_eq!(a.b.help.unwrap(), "some help info");
         assert!(a.is_set(ArgSettings::Multiple));
         assert!(a.is_set(ArgSettings::TakesValue));
         assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(a.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals6() {
         let b = Arg::from_usage("-o --opt=[option]... 'some help info'");
         assert_eq!(b.b.name, "opt");
         assert_eq!(b.s.long.unwrap(), "opt");
         assert_eq!(b.s.short.unwrap(), 'o');
         assert_eq!(b.b.help.unwrap(), "some help info");
         assert!(b.is_set(ArgSettings::Multiple));
         assert!(b.is_set(ArgSettings::TakesValue));
         assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(b.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals7() {
         let c = Arg::from_usage("<option>... -o --opt=<opt> 'some help info'");
         assert_eq!(c.b.name, "option");
         assert_eq!(c.s.long.unwrap(), "opt");
         assert_eq!(c.s.short.unwrap(), 'o');
         assert_eq!(c.b.help.unwrap(), "some help info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(c.is_set(ArgSettings::TakesValue));
         assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(c.v.val_names.unwrap().values().collect::<Vec<_>>(), [&"opt"]);
+        assert_eq!(
+            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"opt"]
+        );
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_usage_both_equals8() {
         let d = Arg::from_usage("-o --opt=<option>... 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"option"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"option"]
+        );
         assert!(d.v.num_vals.is_none());
     }
 
     #[test]
     fn create_option_with_vals1() {
         let d = Arg::from_usage("-o <file> <mode> 'some help info'");
         assert_eq!(d.b.name, "o");
         assert!(d.s.long.is_none());
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"file", &"mode"]
+        );
         assert_eq!(d.v.num_vals.unwrap(), 2);
     }
 
     #[test]
     fn create_option_with_vals2() {
         let d = Arg::from_usage("-o <file> <mode>... 'some help info'");
         assert_eq!(d.b.name, "o");
         assert!(d.s.long.is_none());
         assert_eq!(d.s.short.unwrap(), 'o');
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"file", &"mode"]
+        );
         assert_eq!(d.v.num_vals.unwrap(), 2);
     }
 
     #[test]
     fn create_option_with_vals3() {
         let d = Arg::from_usage("--opt <file> <mode>... 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert!(d.s.short.is_none());
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"file", &"mode"]
+        );
         assert_eq!(d.v.num_vals.unwrap(), 2);
     }
 
     #[test]
     fn create_option_with_vals4() {
         let d = Arg::from_usage("[myopt] --opt <file> <mode> 'some help info'");
         assert_eq!(d.b.name, "myopt");
         assert!(d.s.short.is_none());
         assert_eq!(d.s.long.unwrap(), "opt");
         assert_eq!(d.b.help.unwrap(), "some help info");
         assert!(!d.is_set(ArgSettings::Multiple));
         assert!(d.is_set(ArgSettings::TakesValue));
         assert!(!d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"file", &"mode"]);
+        assert_eq!(
+            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"file", &"mode"]
+        );
         assert_eq!(d.v.num_vals.unwrap(), 2);
     }
 
     #[test]
     fn create_option_with_vals5() {
         let d = Arg::from_usage("--opt <file> <mode> 'some help info'");
         assert_eq!(d.b.name, "opt");
         assert!(d.s.short.is_none());
@@ -1111,30 +1254,34 @@ mod test {
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(!c.is_set(ArgSettings::Required));
         assert!(c.v.val_names.is_none());
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn pos_help_newline() {
-        let c = Arg::from_usage("[pos]... 'some help{n}\
-                                           info'");
+        let c = Arg::from_usage(
+            "[pos]... 'some help{n}\
+             info'",
+        );
         assert_eq!(c.b.name, "pos");
         assert_eq!(c.b.help.unwrap(), "some help{n}info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(!c.is_set(ArgSettings::Required));
         assert!(c.v.val_names.is_none());
         assert!(c.v.num_vals.is_none());
     }
 
     #[test]
     fn pos_help_newline_lit_sq() {
-        let c = Arg::from_usage("[pos]... 'some help\' stuff{n}\
-                                           info'");
+        let c = Arg::from_usage(
+            "[pos]... 'some help\' stuff{n}\
+             info'",
+        );
         assert_eq!(c.b.name, "pos");
         assert_eq!(c.b.help.unwrap(), "some help' stuff{n}info");
         assert!(c.is_set(ArgSettings::Multiple));
         assert!(!c.is_set(ArgSettings::Required));
         assert!(c.v.val_names.is_none());
         assert!(c.v.num_vals.is_none());
     }
 
@@ -1186,13 +1333,15 @@ mod test {
         assert_eq!(a.b.help, Some("ø"));
         let a = Arg::from_usage("--üñíčöĐ€ 'Nōṫ ASCII'");
         assert_eq!(a.b.name, "üñíčöĐ€");
         assert_eq!(a.s.long, Some("üñíčöĐ€"));
         assert_eq!(a.b.help, Some("Nōṫ ASCII"));
         let a = Arg::from_usage("[ñämê] --ôpt=[üñíčöĐ€] 'hælp'");
         assert_eq!(a.b.name, "ñämê");
         assert_eq!(a.s.long, Some("ôpt"));
-        assert_eq!(a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-                   [&"üñíčöĐ€"]);
+        assert_eq!(
+            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
+            [&"üñíčöĐ€"]
+        );
         assert_eq!(a.b.help, Some("hælp"));
     }
 }
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"e68f9d10a8e367890cf734239c39952ee480cf0e8da9520b377df4a2b8ccc9e8","Cargo.toml":"4ae5b4d6f82bd2815ab930eada95a45905e64023d9d5442eebc52e348ae853be","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"ef945d1d641463da2a37f2743dcead1e8e928afbce0496f5d7682ac147327b85","appveyor.yml":"46c77d913eaa45871296942c2cd96ef092c9dcaf19201cb5c500a5107faeb06f","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/lib.rs":"28451f34b048a99fc17f0ef9a5f541efcf304dd36de589055d0d00f63561fb61","src/registry.rs":"3876ef9573e3bbc050aef41a684b9a510cc1a91b15ae874fe032cf4377b4d116","src/windows_registry.rs":"36c6a7f8322407faff2dcfd4789d0876d034885944bc0340ac7c1f7cbfc307f1","tests/cc_env.rs":"d92c5e3d3d43ac244e63b2cd2c93a521fcf124bf1ccf8d4c6bfa7f8333d88976","tests/support/mod.rs":"56bcfd1e2ff5ae8e581c71229444a3d96094bf689808808dd80e315bd6632083","tests/test.rs":"b63e74d571e7d585edc53693bcf0caae88fc040613ace91e32437d4a62cddb6a"},"package":"291055c78f59ca3d84c99026c9501c469413d386bb46be1e1cf1d285cd1db3b0"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/.travis.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-matrix:
-  include:
-    # Minimum version supported
-    - rust: 1.6.0
-      install:
-      script: cargo build
-
-sudo: false
-install:
-  - if [ "$TRAVIS_OS_NAME" = "linux" ]; then OS=unknown-linux-gnu; else OS=apple-darwin; fi
-  - export TARGET=$ARCH-$OS
-  - curl https://static.rust-lang.org/rustup.sh |
-    sh -s -- --add-target=$TARGET --disable-sudo -y --prefix=`rustc --print sysroot`
-before_script:
-  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
-script:
-  - cargo build --verbose
-  - cargo test --verbose
-  - cargo test --verbose --features parallel
-  - cargo test --manifest-path gcc-test/Cargo.toml --target $TARGET
-  - cargo test --manifest-path gcc-test/Cargo.toml --target $TARGET --features parallel
-  - cargo test --manifest-path gcc-test/Cargo.toml --target $TARGET --release
-  - cargo doc
-  - cargo clean && cargo build
-  - rustdoc --test README.md -L target/debug -L target/debug/deps
-after_success:
-  - travis-cargo --only nightly doc-upload
-env:
-  global:
-    secure: "CBtqrudgE0PS8x3kTr44jKbC2D4nfnmdYVecooNm0qnER4B4TSvZpZSQoCgKK6k4BYQuOSyFTOwYx6M79w39ZMOgyCP9ytB+tyMWL0/+ZuUQL04yVg4M5vd3oJMkOaXbvG56ncgPyFrseY+FPDg+mXAzvJk/nily37YXjkQj2D0="
-
-  matrix:
-    - ARCH=x86_64
-    - ARCH=i686
-notifications:
-  email:
-    on_success: never
-os:
-  - linux
-  - osx
-addons:
-  apt:
-    packages:
-      - g++-multilib
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/Cargo.toml
+++ /dev/null
@@ -1,27 +0,0 @@
-[package]
-
-name = "gcc"
-version = "0.3.42"
-authors = ["Alex Crichton <alex@alexcrichton.com>"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/alexcrichton/gcc-rs"
-documentation = "https://docs.rs/gcc"
-description = """
-A build-time dependency for Cargo build scripts to assist in invoking the native
-C compiler to compile native C code into a static archive to be linked into Rust
-code.
-"""
-keywords = ["build-dependencies"]
-
-[badges]
-travis-ci = { repository = "alexcrichton/gcc-rs" }
-appveyor = { repository = "alexcrichton/gcc-rs" }
-
-[dependencies]
-rayon = { version = "0.6", optional = true }
-
-[features]
-parallel = ["rayon"]
-
-[dev-dependencies]
-tempdir = "0.3"
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014 Alex Crichton
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/README.md
+++ /dev/null
@@ -1,161 +0,0 @@
-# gcc-rs
-
-A library to compile C/C++ code into a Rust library/application.
-
-[![Build Status](https://travis-ci.org/alexcrichton/gcc-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/gcc-rs)
-[![Build status](https://ci.appveyor.com/api/projects/status/onu270iw98h81nwv?svg=true)](https://ci.appveyor.com/project/alexcrichton/gcc-rs)
-
-[Documentation](https://docs.rs/gcc)
-
-A simple library meant to be used as a build dependency with Cargo packages in
-order to build a set of C/C++ files into a static archive. Note that while this
-crate is called "gcc", it actually calls out to the most relevant compile for
-a platform, for example using `cl` on MSVC. That is, this crate does indeed work
-on MSVC!
-
-## Using gcc-rs
-
-First, you'll want to both add a build script for your crate (`build.rs`) and
-also add this crate to your `Cargo.toml` via:
-
-```toml
-[package]
-# ...
-build = "build.rs"
-
-[build-dependencies]
-gcc = "0.3"
-```
-
-Next up, you'll want to write a build script like so:
-
-```rust,no_run
-// build.rs
-
-extern crate gcc;
-
-fn main() {
-    gcc::compile_library("libfoo.a", &["foo.c", "bar.c"]);
-}
-```
-
-And that's it! Running `cargo build` should take care of the rest and your Rust
-application will now have the C files `foo.c` and `bar.c` compiled into it. You
-can call the functions in Rust by declaring functions in your Rust code like so:
-
-```
-extern {
-    fn foo_function();
-    fn bar_function();
-}
-
-pub fn call() {
-    unsafe {
-        foo_function();
-        bar_function();
-    }
-}
-
-fn main() {
-    // ...
-}
-```
-
-## External configuration via environment variables
-
-To control the programs and flags used for building, the builder can set a
-number of different environment variables.
-
-* `CFLAGS` - a series of space separated flags passed to "gcc". Note that
-             individual flags cannot currently contain spaces, so doing
-             something like: "-L=foo\ bar" is not possible.
-* `CC` - the actual C compiler used. Note that this is used as an exact
-         executable name, so (for example) no extra flags can be passed inside
-         this variable, and the builder must ensure that there aren't any
-         trailing spaces. This compiler must understand the `-c` flag. For
-         certain `TARGET`s, it also is assumed to know about other flags (most
-         common is `-fPIC`).
-* `AR` - the `ar` (archiver) executable to use to build the static library.
-
-Each of these variables can also be supplied with certain prefixes and suffixes,
-in the following prioritized order:
-
-1. `<var>_<target>` - for example, `CC_x86_64-unknown-linux-gnu`
-2. `<var>_<target_with_underscores>` - for example, `CC_x86_64_unknown_linux_gnu`
-3. `<build-kind>_<var>` - for example, `HOST_CC` or `TARGET_CFLAGS`
-4. `<var>` - a plain `CC`, `AR` as above.
-
-If none of these variables exist, gcc-rs uses built-in defaults
-
-In addition to the the above optional environment variables, `gcc-rs` has some
-functions with hard requirements on some variables supplied by [cargo's
-build-script driver][cargo] that it has the `TARGET`, `OUT_DIR`, `OPT_LEVEL`,
-and `HOST` variables.
-
-[cargo]: http://doc.crates.io/build-script.html#inputs-to-the-build-script
-
-## Optional features
-
-Currently gcc-rs supports parallel compilation (think `make -jN`) but this
-feature is turned off by default. To enable gcc-rs to compile C/C++ in parallel,
-you can change your dependency to:
-
-```toml
-[build-dependencies]
-gcc = { version = "0.3", features = ["parallel"] }
-```
-
-By default gcc-rs will limit parallelism to `$NUM_JOBS`, or if not present it
-will limit it to the number of cpus on the machine.
-
-## Compile-time Requirements
-
-To work properly this crate needs access to a C compiler when the build script
-is being run. This crate does not ship a C compiler with it. The compiler
-required varies per platform, but there are three broad categories:
-
-* Unix platforms require `cc` to be the C compiler. This can be found by
-  installing gcc/clang on Linux distributions and Xcode on OSX, for example.
-* Windows platforms targeting MSVC (e.g. your target triple ends in `-msvc`)
-  require `cl.exe` to be available and in `PATH`. This is typically found in
-  standard Visual Studio installations and the `PATH` can be set up by running
-  the appropriate developer tools shell.
-* Windows platforms targeting MinGW (e.g. your target triple ends in `-gnu`)
-  require `gcc` to be available in `PATH`. We recommend the
-  [MinGW-w64](http://mingw-w64.org) distribution, which is using the
-  [Win-builds](http://win-builds.org) installation system.
-  You may also acquire it via
-  [MSYS2](http://msys2.github.io), as explained [here][msys2-help].  Make sure
-  to install the appropriate architecture corresponding to your installation of
-  rustc. GCC from older [MinGW](http://www.mingw.org) project is compatible
-  only with 32-bit rust compiler.
-
-[msys2-help]: http://github.com/rust-lang/rust#building-on-windows
-
-## C++ support
-
-`gcc-rs` supports C++ libraries compilation by using the `cpp` method on
-`Config`:
-
-```rust,no_run
-extern crate gcc;
-
-fn main() {
-    gcc::Config::new()
-        .cpp(true) // Switch to C++ library compilation.
-        .file("foo.cpp")
-        .compile("libfoo.a");
-}
-```
-
-When using C++ library compilation switch, the `CXX` and `CXXFLAGS` env
-variables are used instead of `CC` and `CFLAGS` and the C++ standard library is
-linked to the crate target.
-
-## License
-
-`gcc-rs` is primarily distributed under the terms of both the MIT license and
-the Apache License (Version 2.0), with portions covered by various BSD-like
-licenses.
-
-See LICENSE-APACHE, and LICENSE-MIT for details.
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/appveyor.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-    ARCH: amd64
-    VS: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
-  - TARGET: x86_64-pc-windows-msvc
-    ARCH: amd64
-    VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
-  - TARGET: i686-pc-windows-msvc
-    ARCH: x86
-    VS: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
-  - TARGET: i686-pc-windows-msvc
-    ARCH: x86
-    VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
-  - TARGET: x86_64-pc-windows-gnu
-    MSYS_BITS: 64
-  - TARGET: i686-pc-windows-gnu
-    MSYS_BITS: 32
-install:
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
-  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - if defined VS call "%VS%" %ARCH%
-  - set PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - if defined MSYS_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS_BITS%\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo test --target %TARGET%
-  - cargo test --features parallel --target %TARGET%
-  - cargo test --manifest-path gcc-test/Cargo.toml --target %TARGET%
-  - cargo test --manifest-path gcc-test/Cargo.toml --features parallel --target %TARGET%
-  - cargo test --manifest-path gcc-test/Cargo.toml --release --target %TARGET%
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/src/bin/gcc-shim.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-#![cfg_attr(test, allow(dead_code))]
-
-use std::env;
-use std::fs::File;
-use std::io::prelude::*;
-use std::path::PathBuf;
-
-fn main() {
-    let out_dir = PathBuf::from(env::var_os("GCCTEST_OUT_DIR").unwrap());
-    for i in 0.. {
-        let candidate = out_dir.join(format!("out{}", i));
-        if candidate.exists() {
-            continue;
-        }
-        let mut f = File::create(candidate).unwrap();
-        for arg in env::args().skip(1) {
-            writeln!(f, "{}", arg).unwrap();
-        }
-
-        File::create(out_dir.join("libfoo.a")).unwrap();
-        break;
-    }
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/src/lib.rs
+++ /dev/null
@@ -1,1128 +0,0 @@
-//! A library for build scripts to compile custom C code
-//!
-//! This library is intended to be used as a `build-dependencies` entry in
-//! `Cargo.toml`:
-//!
-//! ```toml
-//! [build-dependencies]
-//! gcc = "0.3"
-//! ```
-//!
-//! The purpose of this crate is to provide the utility functions necessary to
-//! compile C code into a static archive which is then linked into a Rust crate.
-//! The top-level `compile_library` function serves as a convenience and more
-//! advanced configuration is available through the `Config` builder.
-//!
-//! This crate will automatically detect situations such as cross compilation or
-//! other environment variables set by Cargo and will build code appropriately.
-//!
-//! # Examples
-//!
-//! Use the default configuration:
-//!
-//! ```no_run
-//! extern crate gcc;
-//!
-//! fn main() {
-//!     gcc::compile_library("libfoo.a", &["src/foo.c"]);
-//! }
-//! ```
-//!
-//! Use more advanced configuration:
-//!
-//! ```no_run
-//! extern crate gcc;
-//!
-//! fn main() {
-//!     gcc::Config::new()
-//!                 .file("src/foo.c")
-//!                 .define("FOO", Some("bar"))
-//!                 .include("src")
-//!                 .compile("libfoo.a");
-//! }
-//! ```
-
-#![doc(html_root_url = "https://docs.rs/gcc/0.3")]
-#![cfg_attr(test, deny(warnings))]
-#![deny(missing_docs)]
-
-#[cfg(feature = "parallel")]
-extern crate rayon;
-
-use std::env;
-use std::ffi::{OsString, OsStr};
-use std::fs;
-use std::path::{PathBuf, Path};
-use std::process::{Command, Stdio};
-use std::io::{self, BufReader, BufRead, Read, Write};
-use std::thread;
-
-#[cfg(windows)]
-mod registry;
-pub mod windows_registry;
-
-/// Extra configuration to pass to gcc.
-pub struct Config {
-    include_directories: Vec<PathBuf>,
-    definitions: Vec<(String, Option<String>)>,
-    objects: Vec<PathBuf>,
-    flags: Vec<String>,
-    files: Vec<PathBuf>,
-    cpp: bool,
-    cpp_link_stdlib: Option<Option<String>>,
-    cpp_set_stdlib: Option<String>,
-    target: Option<String>,
-    host: Option<String>,
-    out_dir: Option<PathBuf>,
-    opt_level: Option<String>,
-    debug: Option<bool>,
-    env: Vec<(OsString, OsString)>,
-    compiler: Option<PathBuf>,
-    archiver: Option<PathBuf>,
-    cargo_metadata: bool,
-    pic: Option<bool>,
-}
-
-/// Configuration used to represent an invocation of a C compiler.
-///
-/// This can be used to figure out what compiler is in use, what the arguments
-/// to it are, and what the environment variables look like for the compiler.
-/// This can be used to further configure other build systems (e.g. forward
-/// along CC and/or CFLAGS) or the `to_command` method can be used to run the
-/// compiler itself.
-pub struct Tool {
-    path: PathBuf,
-    args: Vec<OsString>,
-    env: Vec<(OsString, OsString)>,
-    family: ToolFamily
-}
-
-/// Represents the family of tools this tool belongs to.
-///
-/// Each family of tools differs in how and what arguments they accept.
-///
-/// Detection of a family is done on best-effort basis and may not accurately reflect the tool.
-#[derive(Copy, Clone, Debug)]
-enum ToolFamily {
-    /// Tool is GNU Compiler Collection-like.
-    Gnu,
-    /// Tool is Clang-like. It differs from the GCC in a sense that it accepts superset of flags
-    /// and its cross-compilation approach is different.
-    Clang,
-    /// Tool is the MSVC cl.exe.
-    Msvc,
-}
-
-impl ToolFamily {
-    /// What the flag to request debug info for this family of tools look like
-    fn debug_flag(&self) -> &'static str {
-        match *self {
-            ToolFamily::Msvc => "/Z7",
-            ToolFamily::Gnu |
-            ToolFamily::Clang => "-g",
-        }
-    }
-
-    /// What the flag to include directories into header search path looks like
-    fn include_flag(&self) -> &'static str {
-        match *self {
-            ToolFamily::Msvc => "/I",
-            ToolFamily::Gnu |
-            ToolFamily::Clang => "-I",
-        }
-    }
-
-    /// What the flag to request macro-expanded source output looks like
-    fn expand_flag(&self) -> &'static str {
-        match *self {
-            ToolFamily::Msvc => "/E",
-            ToolFamily::Gnu |
-            ToolFamily::Clang => "-E",
-        }
-    }
-}
-
-/// Compile a library from the given set of input C files.
-///
-/// This will simply compile all files into object files and then assemble them
-/// into the output. This will read the standard environment variables to detect
-/// cross compilations and such.
-///
-/// This function will also print all metadata on standard output for Cargo.
-///
-/// # Example
-///
-/// ```no_run
-/// gcc::compile_library("libfoo.a", &["foo.c", "bar.c"]);
-/// ```
-pub fn compile_library(output: &str, files: &[&str]) {
-    let mut c = Config::new();
-    for f in files.iter() {
-        c.file(*f);
-    }
-    c.compile(output);
-}
-
-impl Config {
-    /// Construct a new instance of a blank set of configuration.
-    ///
-    /// This builder is finished with the `compile` function.
-    pub fn new() -> Config {
-        Config {
-            include_directories: Vec::new(),
-            definitions: Vec::new(),
-            objects: Vec::new(),
-            flags: Vec::new(),
-            files: Vec::new(),
-            cpp: false,
-            cpp_link_stdlib: None,
-            cpp_set_stdlib: None,
-            target: None,
-            host: None,
-            out_dir: None,
-            opt_level: None,
-            debug: None,
-            env: Vec::new(),
-            compiler: None,
-            archiver: None,
-            cargo_metadata: true,
-            pic: None,
-        }
-    }
-
-    /// Add a directory to the `-I` or include path for headers
-    pub fn include<P: AsRef<Path>>(&mut self, dir: P) -> &mut Config {
-        self.include_directories.push(dir.as_ref().to_path_buf());
-        self
-    }
-
-    /// Specify a `-D` variable with an optional value.
-    pub fn define(&mut self, var: &str, val: Option<&str>) -> &mut Config {
-        self.definitions.push((var.to_string(), val.map(|s| s.to_string())));
-        self
-    }
-
-    /// Add an arbitrary object file to link in
-    pub fn object<P: AsRef<Path>>(&mut self, obj: P) -> &mut Config {
-        self.objects.push(obj.as_ref().to_path_buf());
-        self
-    }
-
-    /// Add an arbitrary flag to the invocation of the compiler
-    pub fn flag(&mut self, flag: &str) -> &mut Config {
-        self.flags.push(flag.to_string());
-        self
-    }
-
-    /// Add a file which will be compiled
-    pub fn file<P: AsRef<Path>>(&mut self, p: P) -> &mut Config {
-        self.files.push(p.as_ref().to_path_buf());
-        self
-    }
-
-    /// Set C++ support.
-    ///
-    /// The other `cpp_*` options will only become active if this is set to
-    /// `true`.
-    pub fn cpp(&mut self, cpp: bool) -> &mut Config {
-        self.cpp = cpp;
-        self
-    }
-
-    /// Set the standard library to link against when compiling with C++
-    /// support.
-    ///
-    /// The default value of this property depends on the current target: On
-    /// OS X `Some("c++")` is used, when compiling for a Visual Studio based
-    /// target `None` is used and for other targets `Some("stdc++")` is used.
-    ///
-    /// A value of `None` indicates that no automatic linking should happen,
-    /// otherwise cargo will link against the specified library.
-    ///
-    /// The given library name must not contain the `lib` prefix.
-    pub fn cpp_link_stdlib(&mut self, cpp_link_stdlib: Option<&str>) -> &mut Config {
-        self.cpp_link_stdlib = Some(cpp_link_stdlib.map(|s| s.into()));
-        self
-    }
-
-    /// Force the C++ compiler to use the specified standard library.
-    ///
-    /// Setting this option will automatically set `cpp_link_stdlib` to the same
-    /// value.
-    ///
-    /// The default value of this option is always `None`.
-    ///
-    /// This option has no effect when compiling for a Visual Studio based
-    /// target.
-    ///
-    /// This option sets the `-stdlib` flag, which is only supported by some
-    /// compilers (clang, icc) but not by others (gcc). The library will not
-    /// detect which compiler is used, as such it is the responsibility of the
-    /// caller to ensure that this option is only used in conjuction with a
-    /// compiler which supports the `-stdlib` flag.
-    ///
-    /// A value of `None` indicates that no specific C++ standard library should
-    /// be used, otherwise `-stdlib` is added to the compile invocation.
-    ///
-    /// The given library name must not contain the `lib` prefix.
-    pub fn cpp_set_stdlib(&mut self, cpp_set_stdlib: Option<&str>) -> &mut Config {
-        self.cpp_set_stdlib = cpp_set_stdlib.map(|s| s.into());
-        self.cpp_link_stdlib(cpp_set_stdlib);
-        self
-    }
-
-    /// Configures the target this configuration will be compiling for.
-    ///
-    /// This option is automatically scraped from the `TARGET` environment
-    /// variable by build scripts, so it's not required to call this function.
-    pub fn target(&mut self, target: &str) -> &mut Config {
-        self.target = Some(target.to_string());
-        self
-    }
-
-    /// Configures the host assumed by this configuration.
-    ///
-    /// This option is automatically scraped from the `HOST` environment
-    /// variable by build scripts, so it's not required to call this function.
-    pub fn host(&mut self, host: &str) -> &mut Config {
-        self.host = Some(host.to_string());
-        self
-    }
-
-    /// Configures the optimization level of the generated object files.
-    ///
-    /// This option is automatically scraped from the `OPT_LEVEL` environment
-    /// variable by build scripts, so it's not required to call this function.
-    pub fn opt_level(&mut self, opt_level: u32) -> &mut Config {
-        self.opt_level = Some(opt_level.to_string());
-        self
-    }
-
-    /// Configures the optimization level of the generated object files.
-    ///
-    /// This option is automatically scraped from the `OPT_LEVEL` environment
-    /// variable by build scripts, so it's not required to call this function.
-    pub fn opt_level_str(&mut self, opt_level: &str) -> &mut Config {
-        self.opt_level = Some(opt_level.to_string());
-        self
-    }
-
-    /// Configures whether the compiler will emit debug information when
-    /// generating object files.
-    ///
-    /// This option is automatically scraped from the `PROFILE` environment
-    /// variable by build scripts (only enabled when the profile is "debug"), so
-    /// it's not required to call this function.
-    pub fn debug(&mut self, debug: bool) -> &mut Config {
-        self.debug = Some(debug);
-        self
-    }
-
-    /// Configures the output directory where all object files and static
-    /// libraries will be located.
-    ///
-    /// This option is automatically scraped from the `OUT_DIR` environment
-    /// variable by build scripts, so it's not required to call this function.
-    pub fn out_dir<P: AsRef<Path>>(&mut self, out_dir: P) -> &mut Config {
-        self.out_dir = Some(out_dir.as_ref().to_owned());
-        self
-    }
-
-    /// Configures the compiler to be used to produce output.
-    ///
-    /// This option is automatically determined from the target platform or a
-    /// number of environment variables, so it's not required to call this
-    /// function.
-    pub fn compiler<P: AsRef<Path>>(&mut self, compiler: P) -> &mut Config {
-        self.compiler = Some(compiler.as_ref().to_owned());
-        self
-    }
-
-    /// Configures the tool used to assemble archives.
-    ///
-    /// This option is automatically determined from the target platform or a
-    /// number of environment variables, so it's not required to call this
-    /// function.
-    pub fn archiver<P: AsRef<Path>>(&mut self, archiver: P) -> &mut Config {
-        self.archiver = Some(archiver.as_ref().to_owned());
-        self
-    }
-    /// Define whether metadata should be emitted for cargo allowing it to
-    /// automatically link the binary. Defaults to `true`.
-    pub fn cargo_metadata(&mut self, cargo_metadata: bool) -> &mut Config {
-        self.cargo_metadata = cargo_metadata;
-        self
-    }
-
-    /// Configures whether the compiler will emit position independent code.
-    ///
-    /// This option defaults to `false` for `i686` and `windows-gnu` targets and to `true` for all
-    /// other targets.
-    pub fn pic(&mut self, pic: bool) -> &mut Config {
-        self.pic = Some(pic);
-        self
-    }
-
-
-    #[doc(hidden)]
-    pub fn __set_env<A, B>(&mut self, a: A, b: B) -> &mut Config
-        where A: AsRef<OsStr>,
-              B: AsRef<OsStr>
-    {
-        self.env.push((a.as_ref().to_owned(), b.as_ref().to_owned()));
-        self
-    }
-
-    /// Run the compiler, generating the file `output`
-    ///
-    /// The name `output` must begin with `lib` and end with `.a`
-    pub fn compile(&self, output: &str) {
-        assert!(output.starts_with("lib"));
-        assert!(output.ends_with(".a"));
-        let lib_name = &output[3..output.len() - 2];
-        let dst = self.get_out_dir();
-
-        let mut objects = Vec::new();
-        let mut src_dst = Vec::new();
-        for file in self.files.iter() {
-            let obj = dst.join(file).with_extension("o");
-            let obj = if !obj.starts_with(&dst) {
-                dst.join(obj.file_name().unwrap())
-            } else {
-                obj
-            };
-            fs::create_dir_all(&obj.parent().unwrap()).unwrap();
-            src_dst.push((file.to_path_buf(), obj.clone()));
-            objects.push(obj);
-        }
-        self.compile_objects(&src_dst);
-        self.assemble(lib_name, &dst.join(output), &objects);
-
-        if self.get_target().contains("msvc") {
-            let compiler = self.get_base_compiler();
-            let atlmfc_lib = compiler.env()
-                .iter()
-                .find(|&&(ref var, _)| var.as_os_str() == OsStr::new("LIB"))
-                .and_then(|&(_, ref lib_paths)| {
-                    env::split_paths(lib_paths).find(|path| {
-                        let sub = Path::new("atlmfc/lib");
-                        path.ends_with(sub) || path.parent().map_or(false, |p| p.ends_with(sub))
-                    })
-                });
-
-            if let Some(atlmfc_lib) = atlmfc_lib {
-                self.print(&format!("cargo:rustc-link-search=native={}", atlmfc_lib.display()));
-            }
-        }
-
-        self.print(&format!("cargo:rustc-link-lib=static={}",
-                            &output[3..output.len() - 2]));
-        self.print(&format!("cargo:rustc-link-search=native={}", dst.display()));
-
-        // Add specific C++ libraries, if enabled.
-        if self.cpp {
-            if let Some(stdlib) = self.get_cpp_link_stdlib() {
-                self.print(&format!("cargo:rustc-link-lib={}", stdlib));
-            }
-        }
-    }
-
-    #[cfg(feature = "parallel")]
-    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) {
-        use self::rayon::prelude::*;
-
-        let mut cfg = rayon::Configuration::new();
-        if let Ok(amt) = env::var("NUM_JOBS") {
-            if let Ok(amt) = amt.parse() {
-                cfg = cfg.set_num_threads(amt);
-            }
-        }
-        drop(rayon::initialize(cfg));
-
-        objs.par_iter().weight_max().for_each(|&(ref src, ref dst)| self.compile_object(src, dst));
-    }
-
-    #[cfg(not(feature = "parallel"))]
-    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) {
-        for &(ref src, ref dst) in objs {
-            self.compile_object(src, dst);
-        }
-    }
-
-    fn compile_object(&self, file: &Path, dst: &Path) {
-        let is_asm = file.extension().and_then(|s| s.to_str()) == Some("asm");
-        let msvc = self.get_target().contains("msvc");
-        let (mut cmd, name) = if msvc && is_asm {
-            self.msvc_macro_assembler()
-        } else {
-            let compiler = self.get_compiler();
-            let mut cmd = compiler.to_command();
-            for &(ref a, ref b) in self.env.iter() {
-                cmd.env(a, b);
-            }
-            (cmd,
-             compiler.path
-                 .file_name()
-                 .unwrap()
-                 .to_string_lossy()
-                 .into_owned())
-        };
-        if msvc && is_asm {
-            cmd.arg("/Fo").arg(dst);
-        } else if msvc {
-            let mut s = OsString::from("/Fo");
-            s.push(&dst);
-            cmd.arg(s);
-        } else {
-            cmd.arg("-o").arg(&dst);
-        }
-        cmd.arg(if msvc { "/c" } else { "-c" });
-        cmd.arg(file);
-
-        run(&mut cmd, &name);
-    }
-
-    /// Run the compiler, returning the macro-expanded version of the input files.
-    ///
-    /// This is only relevant for C and C++ files.
-    pub fn expand(&self) -> Vec<u8> {
-        let compiler = self.get_compiler();
-        let mut cmd = compiler.to_command();
-        for &(ref a, ref b) in self.env.iter() {
-            cmd.env(a, b);
-        }
-        cmd.arg(compiler.family.expand_flag());
-        for file in self.files.iter() {
-            cmd.arg(file);
-        }
-
-        let name = compiler.path
-            .file_name()
-            .unwrap()
-            .to_string_lossy()
-            .into_owned();
-
-        run(&mut cmd, &name)
-    }
-
-    /// Get the compiler that's in use for this configuration.
-    ///
-    /// This function will return a `Tool` which represents the culmination
-    /// of this configuration at a snapshot in time. The returned compiler can
-    /// be inspected (e.g. the path, arguments, environment) to forward along to
-    /// other tools, or the `to_command` method can be used to invoke the
-    /// compiler itself.
-    ///
-    /// This method will take into account all configuration such as debug
-    /// information, optimization level, include directories, defines, etc.
-    /// Additionally, the compiler binary in use follows the standard
-    /// conventions for this path, e.g. looking at the explicitly set compiler,
-    /// environment variables (a number of which are inspected here), and then
-    /// falling back to the default configuration.
-    pub fn get_compiler(&self) -> Tool {
-        let opt_level = self.get_opt_level();
-        let target = self.get_target();
-
-        let mut cmd = self.get_base_compiler();
-        let nvcc = cmd.path.file_name()
-            .and_then(|p| p.to_str()).map(|p| p.contains("nvcc"))
-            .unwrap_or(false);
-
-        // Non-target flags
-        // If the flag is not conditioned on target variable, it belongs here :)
-        match cmd.family {
-            ToolFamily::Msvc => {
-                cmd.args.push("/nologo".into());
-                let features = env::var("CARGO_CFG_TARGET_FEATURE")
-                                  .unwrap_or(String::new());
-                if features.contains("crt-static") {
-                    cmd.args.push("/MT".into());
-                } else {
-                    cmd.args.push("/MD".into());
-                }
-                match &opt_level[..] {
-                    "z" | "s" => cmd.args.push("/Os".into()),
-                    "1" => cmd.args.push("/O1".into()),
-                    // -O3 is a valid value for gcc and clang compilers, but not msvc. Cap to /O2.
-                    "2" | "3" => cmd.args.push("/O2".into()),
-                    _ => {}
-                }
-            }
-            ToolFamily::Gnu |
-            ToolFamily::Clang => {
-                cmd.args.push(format!("-O{}", opt_level).into());
-                if !nvcc {
-                    cmd.args.push("-ffunction-sections".into());
-                    cmd.args.push("-fdata-sections".into());
-                    if self.pic.unwrap_or(!target.contains("i686") &&
-                                          !target.contains("windows-gnu")) {
-                        cmd.args.push("-fPIC".into());
-                    }
-                } else if self.pic.unwrap_or(false) {
-                    cmd.args.push("-Xcompiler".into());
-                    cmd.args.push("\'-fPIC\'".into());
-                }
-            }
-        }
-        for arg in self.envflags(if self.cpp {"CXXFLAGS"} else {"CFLAGS"}) {
-            cmd.args.push(arg.into());
-        }
-
-        if self.get_debug() {
-            cmd.args.push(cmd.family.debug_flag().into());
-        }
-
-        // Target flags
-        match cmd.family {
-            ToolFamily::Clang => {
-                cmd.args.push(format!("--target={}", target).into());
-            }
-            ToolFamily::Msvc => {
-                if target.contains("i586") {
-                    cmd.args.push("/ARCH:IA32".into());
-                }
-            }
-            ToolFamily::Gnu => {
-                if target.contains("i686") || target.contains("i586") {
-                    cmd.args.push("-m32".into());
-                } else if target.contains("x86_64") || target.contains("powerpc64") {
-                    cmd.args.push("-m64".into());
-                }
-
-                if target.contains("musl") {
-                    cmd.args.push("-static".into());
-                }
-
-                // armv7 targets get to use armv7 instructions
-                if target.starts_with("armv7-unknown-linux-") {
-                    cmd.args.push("-march=armv7-a".into());
-                }
-
-                // On android we can guarantee some extra float instructions
-                // (specified in the android spec online)
-                if target.starts_with("armv7-linux-androideabi") {
-                    cmd.args.push("-march=armv7-a".into());
-                    cmd.args.push("-mfpu=vfpv3-d16".into());
-                }
-
-                // For us arm == armv6 by default
-                if target.starts_with("arm-unknown-linux-") {
-                    cmd.args.push("-march=armv6".into());
-                    cmd.args.push("-marm".into());
-                }
-
-                // Turn codegen down on i586 to avoid some instructions.
-                if target.starts_with("i586-unknown-linux-") {
-                    cmd.args.push("-march=pentium".into());
-                }
-
-                // Set codegen level for i686 correctly
-                if target.starts_with("i686-unknown-linux-") {
-                    cmd.args.push("-march=i686".into());
-                }
-
-                // Looks like `musl-gcc` makes is hard for `-m32` to make its way
-                // all the way to the linker, so we need to actually instruct the
-                // linker that we're generating 32-bit executables as well. This'll
-                // typically only be used for build scripts which transitively use
-                // these flags that try to compile executables.
-                if target == "i686-unknown-linux-musl" {
-                    cmd.args.push("-Wl,-melf_i386".into());
-                }
-
-                if target.starts_with("thumb") {
-                    cmd.args.push("-mthumb".into());
-
-                    if target.ends_with("eabihf") {
-                        cmd.args.push("-mfloat-abi=hard".into())
-                    }
-                }
-                if target.starts_with("thumbv6m") {
-                    cmd.args.push("-march=armv6s-m".into());
-                }
-                if target.starts_with("thumbv7em") {
-                    cmd.args.push("-march=armv7e-m".into());
-
-                    if target.ends_with("eabihf") {
-                        cmd.args.push("-mfpu=fpv4-sp-d16".into())
-                    }
-                }
-                if target.starts_with("thumbv7m") {
-                    cmd.args.push("-march=armv7-m".into());
-                }
-            }
-        }
-
-        if target.contains("-ios") {
-            // FIXME: potential bug. iOS is always compiled with Clang, but Gcc compiler may be
-            // detected instead.
-            self.ios_flags(&mut cmd);
-        }
-
-        if self.cpp {
-            match (self.cpp_set_stdlib.as_ref(), cmd.family) {
-                (Some(stdlib), ToolFamily::Gnu) |
-                (Some(stdlib), ToolFamily::Clang) => {
-                    cmd.args.push(format!("-stdlib=lib{}", stdlib).into());
-                }
-                _ => {
-                    println!("cargo:warning=cpp_set_stdlib is specified, but the {:?} compiler \
-                              does not support this option, ignored", cmd.family);
-                }
-            }
-        }
-
-        for directory in self.include_directories.iter() {
-            cmd.args.push(cmd.family.include_flag().into());
-            cmd.args.push(directory.into());
-        }
-
-        for flag in self.flags.iter() {
-            cmd.args.push(flag.into());
-        }
-
-        for &(ref key, ref value) in self.definitions.iter() {
-            let lead = if let ToolFamily::Msvc = cmd.family {"/"} else {"-"};
-            if let &Some(ref value) = value {
-                cmd.args.push(format!("{}D{}={}", lead, key, value).into());
-            } else {
-                cmd.args.push(format!("{}D{}", lead, key).into());
-            }
-        }
-        cmd
-    }
-
-    fn msvc_macro_assembler(&self) -> (Command, String) {
-        let target = self.get_target();
-        let tool = if target.contains("x86_64") {
-            "ml64.exe"
-        } else {
-            "ml.exe"
-        };
-        let mut cmd = windows_registry::find(&target, tool).unwrap_or_else(|| self.cmd(tool));
-        for directory in self.include_directories.iter() {
-            cmd.arg("/I").arg(directory);
-        }
-        for &(ref key, ref value) in self.definitions.iter() {
-            if let &Some(ref value) = value {
-                cmd.arg(&format!("/D{}={}", key, value));
-            } else {
-                cmd.arg(&format!("/D{}", key));
-            }
-        }
-
-        if target.contains("i686") || target.contains("i586") {
-            cmd.arg("/safeseh");
-        }
-        for flag in self.flags.iter() {
-            cmd.arg(flag);
-        }
-
-        (cmd, tool.to_string())
-    }
-
-    fn assemble(&self, lib_name: &str, dst: &Path, objects: &[PathBuf]) {
-        // Delete the destination if it exists as the `ar` tool at least on Unix
-        // appends to it, which we don't want.
-        let _ = fs::remove_file(&dst);
-
-        let target = self.get_target();
-        if target.contains("msvc") {
-            let mut cmd = match self.archiver {
-                Some(ref s) => self.cmd(s),
-                None => windows_registry::find(&target, "lib.exe").unwrap_or(self.cmd("lib.exe")),
-            };
-            let mut out = OsString::from("/OUT:");
-            out.push(dst);
-            run(cmd.arg(out)
-                    .arg("/nologo")
-                    .args(objects)
-                    .args(&self.objects),
-                "lib.exe");
-
-            // The Rust compiler will look for libfoo.a and foo.lib, but the
-            // MSVC linker will also be passed foo.lib, so be sure that both
-            // exist for now.
-            let lib_dst = dst.with_file_name(format!("{}.lib", lib_name));
-            let _ = fs::remove_file(&lib_dst);
-            fs::hard_link(&dst, &lib_dst)
-                .or_else(|_| {
-                    // if hard-link fails, just copy (ignoring the number of bytes written)
-                    fs::copy(&dst, &lib_dst).map(|_| ())
-                })
-                .ok()
-                .expect("Copying from {:?} to {:?} failed.");;
-        } else {
-            let ar = self.get_ar();
-            let cmd = ar.file_name().unwrap().to_string_lossy();
-            run(self.cmd(&ar)
-                    .arg("crs")
-                    .arg(dst)
-                    .args(objects)
-                    .args(&self.objects),
-                &cmd);
-        }
-    }
-
-    fn ios_flags(&self, cmd: &mut Tool) {
-        enum ArchSpec {
-            Device(&'static str),
-            Simulator(&'static str),
-        }
-
-        let target = self.get_target();
-        let arch = target.split('-').nth(0).unwrap();
-        let arch = match arch {
-            "arm" | "armv7" | "thumbv7" => ArchSpec::Device("armv7"),
-            "armv7s" | "thumbv7s" => ArchSpec::Device("armv7s"),
-            "arm64" | "aarch64" => ArchSpec::Device("arm64"),
-            "i386" | "i686" => ArchSpec::Simulator("-m32"),
-            "x86_64" => ArchSpec::Simulator("-m64"),
-            _ => fail("Unknown arch for iOS target"),
-        };
-
-        let sdk = match arch {
-            ArchSpec::Device(arch) => {
-                cmd.args.push("-arch".into());
-                cmd.args.push(arch.into());
-                cmd.args.push("-miphoneos-version-min=7.0".into());
-                "iphoneos"
-            }
-            ArchSpec::Simulator(arch) => {
-                cmd.args.push(arch.into());
-                cmd.args.push("-mios-simulator-version-min=7.0".into());
-                "iphonesimulator"
-            }
-        };
-
-        self.print(&format!("Detecting iOS SDK path for {}", sdk));
-        let sdk_path = self.cmd("xcrun")
-            .arg("--show-sdk-path")
-            .arg("--sdk")
-            .arg(sdk)
-            .stderr(Stdio::inherit())
-            .output()
-            .unwrap()
-            .stdout;
-
-        let sdk_path = String::from_utf8(sdk_path).unwrap();
-
-        cmd.args.push("-isysroot".into());
-        cmd.args.push(sdk_path.trim().into());
-    }
-
-    fn cmd<P: AsRef<OsStr>>(&self, prog: P) -> Command {
-        let mut cmd = Command::new(prog);
-        for &(ref a, ref b) in self.env.iter() {
-            cmd.env(a, b);
-        }
-        return cmd;
-    }
-
-    fn get_base_compiler(&self) -> Tool {
-        if let Some(ref c) = self.compiler {
-            return Tool::new(c.clone());
-        }
-        let host = self.get_host();
-        let target = self.get_target();
-        let (env, msvc, gnu, default) = if self.cpp {
-            ("CXX", "cl.exe", "g++", "c++")
-        } else {
-            ("CC", "cl.exe", "gcc", "cc")
-        };
-        self.env_tool(env)
-            .map(|(tool, args)| {
-                let mut t = Tool::new(PathBuf::from(tool));
-                for arg in args {
-                    t.args.push(arg.into());
-                }
-                return t;
-            })
-            .or_else(|| {
-                if target.contains("emscripten") {
-                    if self.cpp {
-                        Some(Tool::new(PathBuf::from("em++")))
-                    } else {
-                        Some(Tool::new(PathBuf::from("emcc")))
-                    }
-                } else {
-                    None
-                }
-            })
-            .or_else(|| windows_registry::find_tool(&target, "cl.exe"))
-            .unwrap_or_else(|| {
-                let compiler = if host.contains("windows") && target.contains("windows") {
-                    if target.contains("msvc") {
-                        msvc.to_string()
-                    } else {
-                        format!("{}.exe", gnu)
-                    }
-                } else if target.contains("android") {
-                    format!("{}-{}", target.replace("armv7", "arm"), gnu)
-                } else if self.get_host() != target {
-                    // CROSS_COMPILE is of the form: "arm-linux-gnueabi-"
-                    let cc_env = self.getenv("CROSS_COMPILE");
-                    let cross_compile = cc_env.as_ref().map(|s| s.trim_right_matches('-'));
-                    let prefix = cross_compile.or(match &target[..] {
-                        "aarch64-unknown-linux-gnu" => Some("aarch64-linux-gnu"),
-                        "arm-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
-                        "arm-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
-                        "arm-unknown-linux-musleabi" => Some("arm-linux-musleabi"),
-                        "arm-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
-                        "arm-unknown-netbsdelf-eabi" => Some("arm--netbsdelf-eabi"),
-                        "armv6-unknown-netbsdelf-eabihf" => Some("armv6--netbsdelf-eabihf"),
-                        "armv7-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
-                        "armv7-unknown-linux-musleabihf" => Some("arm-linux-musleabihf"),
-                        "armv7-unknown-netbsdelf-eabihf" => Some("armv7--netbsdelf-eabihf"),
-                        "i686-pc-windows-gnu" => Some("i686-w64-mingw32"),
-                        "i686-unknown-linux-musl" => Some("musl"),
-                        "i686-unknown-netbsdelf" => Some("i486--netbsdelf"),
-                        "mips-unknown-linux-gnu" => Some("mips-linux-gnu"),
-                        "mipsel-unknown-linux-gnu" => Some("mipsel-linux-gnu"),
-                        "mips64-unknown-linux-gnuabi64" => Some("mips64-linux-gnuabi64"),
-                        "mips64el-unknown-linux-gnuabi64" => Some("mips64el-linux-gnuabi64"),
-                        "powerpc-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
-                        "powerpc-unknown-netbsd" => Some("powerpc--netbsd"),
-                        "powerpc64-unknown-linux-gnu" => Some("powerpc-linux-gnu"),
-                        "powerpc64le-unknown-linux-gnu" => Some("powerpc64le-linux-gnu"),
-                        "s390x-unknown-linux-gnu" => Some("s390x-linux-gnu"),
-                        "sparc64-unknown-netbsd" => Some("sparc64--netbsd"),
-                        "thumbv6m-none-eabi" => Some("arm-none-eabi"),
-                        "thumbv7em-none-eabi" => Some("arm-none-eabi"),
-                        "thumbv7em-none-eabihf" => Some("arm-none-eabi"),
-                        "thumbv7m-none-eabi" => Some("arm-none-eabi"),
-                        "x86_64-pc-windows-gnu" => Some("x86_64-w64-mingw32"),
-                        "x86_64-rumprun-netbsd" => Some("x86_64-rumprun-netbsd"),
-                        "x86_64-unknown-linux-musl" => Some("musl"),
-                        "x86_64-unknown-netbsd" => Some("x86_64--netbsd"),
-                        _ => None,
-                    });
-                    match prefix {
-                        Some(prefix) => format!("{}-{}", prefix, gnu),
-                        None => default.to_string(),
-                    }
-                } else {
-                    default.to_string()
-                };
-                Tool::new(PathBuf::from(compiler))
-            })
-    }
-
-    fn get_var(&self, var_base: &str) -> Result<String, String> {
-        let target = self.get_target();
-        let host = self.get_host();
-        let kind = if host == target { "HOST" } else { "TARGET" };
-        let target_u = target.replace("-", "_");
-        let res = self.getenv(&format!("{}_{}", var_base, target))
-            .or_else(|| self.getenv(&format!("{}_{}", var_base, target_u)))
-            .or_else(|| self.getenv(&format!("{}_{}", kind, var_base)))
-            .or_else(|| self.getenv(var_base));
-
-        match res {
-            Some(res) => Ok(res),
-            None => Err("could not get environment variable".to_string()),
-        }
-    }
-
-    fn envflags(&self, name: &str) -> Vec<String> {
-        self.get_var(name)
-            .unwrap_or(String::new())
-            .split(|c: char| c.is_whitespace())
-            .filter(|s| !s.is_empty())
-            .map(|s| s.to_string())
-            .collect()
-    }
-
-    fn env_tool(&self, name: &str) -> Option<(String, Vec<String>)> {
-        self.get_var(name).ok().map(|tool| {
-            let whitelist = ["ccache", "distcc"];
-            for t in whitelist.iter() {
-                if tool.starts_with(t) && tool[t.len()..].starts_with(" ") {
-                    return (t.to_string(), vec![tool[t.len()..].trim_left().to_string()]);
-                }
-            }
-            (tool, Vec::new())
-        })
-    }
-
-    /// Returns the default C++ standard library for the current target: `libc++`
-    /// for OS X and `libstdc++` for anything else.
-    fn get_cpp_link_stdlib(&self) -> Option<String> {
-        self.cpp_link_stdlib.clone().unwrap_or_else(|| {
-            let target = self.get_target();
-            if target.contains("msvc") {
-                None
-            } else if target.contains("darwin") {
-                Some("c++".to_string())
-            } else if target.contains("freebsd") {
-                Some("c++".to_string())
-            } else {
-                Some("stdc++".to_string())
-            }
-        })
-    }
-
-    fn get_ar(&self) -> PathBuf {
-        self.archiver
-            .clone()
-            .or_else(|| self.get_var("AR").map(PathBuf::from).ok())
-            .unwrap_or_else(|| {
-                if self.get_target().contains("android") {
-                    PathBuf::from(format!("{}-ar", self.get_target().replace("armv7", "arm")))
-                } else if self.get_target().contains("emscripten") {
-                    PathBuf::from("emar")
-                } else {
-                    PathBuf::from("ar")
-                }
-            })
-    }
-
-    fn get_target(&self) -> String {
-        self.target.clone().unwrap_or_else(|| self.getenv_unwrap("TARGET"))
-    }
-
-    fn get_host(&self) -> String {
-        self.host.clone().unwrap_or_else(|| self.getenv_unwrap("HOST"))
-    }
-
-    fn get_opt_level(&self) -> String {
-        self.opt_level.as_ref().cloned().unwrap_or_else(|| self.getenv_unwrap("OPT_LEVEL"))
-    }
-
-    fn get_debug(&self) -> bool {
-        self.debug.unwrap_or_else(|| self.getenv_unwrap("PROFILE") == "debug")
-    }
-
-    fn get_out_dir(&self) -> PathBuf {
-        self.out_dir.clone().unwrap_or_else(|| env::var_os("OUT_DIR").map(PathBuf::from).unwrap())
-    }
-
-    fn getenv(&self, v: &str) -> Option<String> {
-        let r = env::var(v).ok();
-        self.print(&format!("{} = {:?}", v, r));
-        r
-    }
-
-    fn getenv_unwrap(&self, v: &str) -> String {
-        match self.getenv(v) {
-            Some(s) => s,
-            None => fail(&format!("environment variable `{}` not defined", v)),
-        }
-    }
-
-    fn print(&self, s: &str) {
-        if self.cargo_metadata {
-            println!("{}", s);
-        }
-    }
-}
-
-impl Tool {
-    fn new(path: PathBuf) -> Tool {
-        // Try to detect family of the tool from its name, falling back to Gnu.
-        let family = if let Some(fname) = path.file_name().and_then(|p| p.to_str()) {
-            if fname.contains("clang") {
-                ToolFamily::Clang
-            } else if fname.contains("cl") {
-                ToolFamily::Msvc
-            } else {
-                ToolFamily::Gnu
-            }
-        } else {
-            ToolFamily::Gnu
-        };
-        Tool {
-            path: path,
-            args: Vec::new(),
-            env: Vec::new(),
-            family: family
-        }
-    }
-
-    /// Converts this compiler into a `Command` that's ready to be run.
-    ///
-    /// This is useful for when the compiler needs to be executed and the
-    /// command returned will already have the initial arguments and environment
-    /// variables configured.
-    pub fn to_command(&self) -> Command {
-        let mut cmd = Command::new(&self.path);
-        cmd.args(&self.args);
-        for &(ref k, ref v) in self.env.iter() {
-            cmd.env(k, v);
-        }
-        cmd
-    }
-
-    /// Returns the path for this compiler.
-    ///
-    /// Note that this may not be a path to a file on the filesystem, e.g. "cc",
-    /// but rather something which will be resolved when a process is spawned.
-    pub fn path(&self) -> &Path {
-        &self.path
-    }
-
-    /// Returns the default set of arguments to the compiler needed to produce
-    /// executables for the target this compiler generates.
-    pub fn args(&self) -> &[OsString] {
-        &self.args
-    }
-
-    /// Returns the set of environment variables needed for this compiler to
-    /// operate.
-    ///
-    /// This is typically only used for MSVC compilers currently.
-    pub fn env(&self) -> &[(OsString, OsString)] {
-        &self.env
-    }
-}
-
-fn run(cmd: &mut Command, program: &str) -> Vec<u8> {
-    println!("running: {:?}", cmd);
-    // Capture the standard error coming from these programs, and write it out
-    // with cargo:warning= prefixes. Note that this is a bit wonky to avoid
-    // requiring the output to be UTF-8, we instead just ship bytes from one
-    // location to another.
-    let (spawn_result, stdout) = match cmd.stdout(Stdio::piped()).stderr(Stdio::piped()).spawn() {
-        Ok(mut child) => {
-            let stderr = BufReader::new(child.stderr.take().unwrap());
-            thread::spawn(move || {
-                for line in stderr.split(b'\n').filter_map(|l| l.ok()) {
-                    print!("cargo:warning=");
-                    std::io::stdout().write_all(&line).unwrap();
-                    println!("");
-                }
-            });
-            let mut stdout = vec![];
-            child.stdout.take().unwrap().read_to_end(&mut stdout).unwrap();
-            (child.wait(), stdout)
-        }
-        Err(e) => (Err(e), vec![]),
-    };
-    let status = match spawn_result {
-        Ok(status) => status,
-        Err(ref e) if e.kind() == io::ErrorKind::NotFound => {
-            let extra = if cfg!(windows) {
-                " (see https://github.com/alexcrichton/gcc-rs#compile-time-requirements \
-                   for help)"
-            } else {
-                ""
-            };
-            fail(&format!("failed to execute command: {}\nIs `{}` \
-                           not installed?{}",
-                          e,
-                          program,
-                          extra));
-        }
-        Err(e) => fail(&format!("failed to execute command: {}", e)),
-    };
-    println!("{:?}", status);
-    if !status.success() {
-        fail(&format!("command did not execute successfully, got: {}", status));
-    }
-    stdout
-}
-
-fn fail(s: &str) -> ! {
-    println!("\n\n{}\n\n", s);
-    panic!()
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/src/registry.rs
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use std::ffi::{OsString, OsStr};
-use std::io;
-use std::ops::RangeFrom;
-use std::os::raw;
-use std::os::windows::prelude::*;
-
-pub struct RegistryKey(Repr);
-
-type HKEY = *mut u8;
-type DWORD = u32;
-type LPDWORD = *mut DWORD;
-type LPCWSTR = *const u16;
-type LPWSTR = *mut u16;
-type LONG = raw::c_long;
-type PHKEY = *mut HKEY;
-type PFILETIME = *mut u8;
-type LPBYTE = *mut u8;
-type REGSAM = u32;
-
-const ERROR_SUCCESS: DWORD = 0;
-const ERROR_NO_MORE_ITEMS: DWORD = 259;
-const HKEY_LOCAL_MACHINE: HKEY = 0x80000002 as HKEY;
-const REG_SZ: DWORD = 1;
-const KEY_READ: DWORD = 0x20019;
-const KEY_WOW64_32KEY: DWORD = 0x200;
-
-#[link(name = "advapi32")]
-extern "system" {
-    fn RegOpenKeyExW(key: HKEY,
-                     lpSubKey: LPCWSTR,
-                     ulOptions: DWORD,
-                     samDesired: REGSAM,
-                     phkResult: PHKEY)
-                     -> LONG;
-    fn RegEnumKeyExW(key: HKEY,
-                     dwIndex: DWORD,
-                     lpName: LPWSTR,
-                     lpcName: LPDWORD,
-                     lpReserved: LPDWORD,
-                     lpClass: LPWSTR,
-                     lpcClass: LPDWORD,
-                     lpftLastWriteTime: PFILETIME)
-                     -> LONG;
-    fn RegQueryValueExW(hKey: HKEY,
-                        lpValueName: LPCWSTR,
-                        lpReserved: LPDWORD,
-                        lpType: LPDWORD,
-                        lpData: LPBYTE,
-                        lpcbData: LPDWORD)
-                        -> LONG;
-    fn RegCloseKey(hKey: HKEY) -> LONG;
-}
-
-struct OwnedKey(HKEY);
-
-enum Repr {
-    Const(HKEY),
-    Owned(OwnedKey),
-}
-
-pub struct Iter<'a> {
-    idx: RangeFrom<DWORD>,
-    key: &'a RegistryKey,
-}
-
-unsafe impl Sync for Repr {}
-unsafe impl Send for Repr {}
-
-pub static LOCAL_MACHINE: RegistryKey = RegistryKey(Repr::Const(HKEY_LOCAL_MACHINE));
-
-impl RegistryKey {
-    fn raw(&self) -> HKEY {
-        match self.0 {
-            Repr::Const(val) => val,
-            Repr::Owned(ref val) => val.0,
-        }
-    }
-
-    pub fn open(&self, key: &OsStr) -> io::Result<RegistryKey> {
-        let key = key.encode_wide().chain(Some(0)).collect::<Vec<_>>();
-        let mut ret = 0 as *mut _;
-        let err = unsafe {
-            RegOpenKeyExW(self.raw(),
-                          key.as_ptr(),
-                          0,
-                          KEY_READ | KEY_WOW64_32KEY,
-                          &mut ret)
-        };
-        if err == ERROR_SUCCESS as LONG {
-            Ok(RegistryKey(Repr::Owned(OwnedKey(ret))))
-        } else {
-            Err(io::Error::from_raw_os_error(err as i32))
-        }
-    }
-
-    pub fn iter(&self) -> Iter {
-        Iter {
-            idx: 0..,
-            key: self,
-        }
-    }
-
-    pub fn query_str(&self, name: &str) -> io::Result<OsString> {
-        let name: &OsStr = name.as_ref();
-        let name = name.encode_wide().chain(Some(0)).collect::<Vec<_>>();
-        let mut len = 0;
-        let mut kind = 0;
-        unsafe {
-            let err = RegQueryValueExW(self.raw(),
-                                       name.as_ptr(),
-                                       0 as *mut _,
-                                       &mut kind,
-                                       0 as *mut _,
-                                       &mut len);
-            if err != ERROR_SUCCESS as LONG {
-                return Err(io::Error::from_raw_os_error(err as i32));
-            }
-            if kind != REG_SZ {
-                return Err(io::Error::new(io::ErrorKind::Other, "registry key wasn't a string"));
-            }
-
-            // The length here is the length in bytes, but we're using wide
-            // characters so we need to be sure to halve it for the capacity
-            // passed in.
-            let mut v = Vec::with_capacity(len as usize / 2);
-            let err = RegQueryValueExW(self.raw(),
-                                       name.as_ptr(),
-                                       0 as *mut _,
-                                       0 as *mut _,
-                                       v.as_mut_ptr() as *mut _,
-                                       &mut len);
-            if err != ERROR_SUCCESS as LONG {
-                return Err(io::Error::from_raw_os_error(err as i32));
-            }
-            v.set_len(len as usize / 2);
-
-            // Some registry keys may have a terminating nul character, but
-            // we're not interested in that, so chop it off if it's there.
-            if v[v.len() - 1] == 0 {
-                v.pop();
-            }
-            Ok(OsString::from_wide(&v))
-        }
-    }
-}
-
-impl Drop for OwnedKey {
-    fn drop(&mut self) {
-        unsafe {
-            RegCloseKey(self.0);
-        }
-    }
-}
-
-impl<'a> Iterator for Iter<'a> {
-    type Item = io::Result<OsString>;
-
-    fn next(&mut self) -> Option<io::Result<OsString>> {
-        self.idx.next().and_then(|i| unsafe {
-            let mut v = Vec::with_capacity(256);
-            let mut len = v.capacity() as DWORD;
-            let ret = RegEnumKeyExW(self.key.raw(),
-                                    i,
-                                    v.as_mut_ptr(),
-                                    &mut len,
-                                    0 as *mut _,
-                                    0 as *mut _,
-                                    0 as *mut _,
-                                    0 as *mut _);
-            if ret == ERROR_NO_MORE_ITEMS as LONG {
-                None
-            } else if ret != ERROR_SUCCESS as LONG {
-                Some(Err(io::Error::from_raw_os_error(ret as i32)))
-            } else {
-                v.set_len(len as usize);
-                Some(Ok(OsString::from_wide(&v)))
-            }
-        })
-    }
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/src/windows_registry.rs
+++ /dev/null
@@ -1,424 +0,0 @@
-// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! A helper module to probe the Windows Registry when looking for
-//! windows-specific tools.
-
-use std::process::Command;
-
-use Tool;
-
-macro_rules! otry {
-    ($expr:expr) => (match $expr {
-        Some(val) => val,
-        None => return None,
-    })
-}
-
-/// Attempts to find a tool within an MSVC installation using the Windows
-/// registry as a point to search from.
-///
-/// The `target` argument is the target that the tool should work for (e.g.
-/// compile or link for) and the `tool` argument is the tool to find (e.g.
-/// `cl.exe` or `link.exe`).
-///
-/// This function will return `None` if the tool could not be found, or it will
-/// return `Some(cmd)` which represents a command that's ready to execute the
-/// tool with the appropriate environment variables set.
-///
-/// Note that this function always returns `None` for non-MSVC targets.
-pub fn find(target: &str, tool: &str) -> Option<Command> {
-    find_tool(target, tool).map(|c| c.to_command())
-}
-
-/// Similar to the `find` function above, this function will attempt the same
-/// operation (finding a MSVC tool in a local install) but instead returns a
-/// `Tool` which may be introspected.
-#[cfg(not(windows))]
-pub fn find_tool(_target: &str, _tool: &str) -> Option<Tool> {
-    None
-}
-
-/// Documented above.
-#[cfg(windows)]
-pub fn find_tool(target: &str, tool: &str) -> Option<Tool> {
-    use std::env;
-    use std::ffi::OsString;
-    use std::mem;
-    use std::path::{Path, PathBuf};
-    use registry::{RegistryKey, LOCAL_MACHINE};
-
-    struct MsvcTool {
-        tool: PathBuf,
-        libs: Vec<PathBuf>,
-        path: Vec<PathBuf>,
-        include: Vec<PathBuf>,
-    }
-
-    impl MsvcTool {
-        fn new(tool: PathBuf) -> MsvcTool {
-            MsvcTool {
-                tool: tool,
-                libs: Vec::new(),
-                path: Vec::new(),
-                include: Vec::new(),
-            }
-        }
-
-        fn into_tool(self) -> Tool {
-            let MsvcTool { tool, libs, path, include } = self;
-            let mut tool = Tool::new(tool.into());
-            add_env(&mut tool, "LIB", libs);
-            add_env(&mut tool, "PATH", path);
-            add_env(&mut tool, "INCLUDE", include);
-            tool
-        }
-    }
-
-    // This logic is all tailored for MSVC, if we're not that then bail out
-    // early.
-    if !target.contains("msvc") {
-        return None;
-    }
-
-    // Looks like msbuild isn't located in the same location as other tools like
-    // cl.exe and lib.exe. To handle this we probe for it manually with
-    // dedicated registry keys.
-    if tool.contains("msbuild") {
-        return find_msbuild(target);
-    }
-
-    // If VCINSTALLDIR is set, then someone's probably already run vcvars and we
-    // should just find whatever that indicates.
-    if env::var_os("VCINSTALLDIR").is_some() {
-        return env::var_os("PATH")
-            .and_then(|path| env::split_paths(&path).map(|p| p.join(tool)).find(|p| p.exists()))
-            .map(|path| Tool::new(path.into()));
-    }
-
-    // Ok, if we're here, now comes the fun part of the probing. Default shells
-    // or shells like MSYS aren't really configured to execute `cl.exe` and the
-    // various compiler tools shipped as part of Visual Studio. Here we try to
-    // first find the relevant tool, then we also have to be sure to fill in
-    // environment variables like `LIB`, `INCLUDE`, and `PATH` to ensure that
-    // the tool is actually usable.
-
-    return find_msvc_latest(tool, target, "15.0")
-        .or_else(|| find_msvc_latest(tool, target, "14.0"))
-        .or_else(|| find_msvc_12(tool, target))
-        .or_else(|| find_msvc_11(tool, target));
-
-    // For MSVC 14 or newer we need to find the Universal CRT as well as either
-    // the Windows 10 SDK or Windows 8.1 SDK.
-    fn find_msvc_latest(tool: &str, target: &str, ver: &str) -> Option<Tool> {
-        let vcdir = otry!(get_vc_dir(ver));
-        let mut tool = otry!(get_tool(tool, &vcdir, target));
-        let sub = otry!(lib_subdir(target));
-        let (ucrt, ucrt_version) = otry!(get_ucrt_dir());
-
-        let ucrt_include = ucrt.join("include").join(&ucrt_version);
-        tool.include.push(ucrt_include.join("ucrt"));
-
-        let ucrt_lib = ucrt.join("lib").join(&ucrt_version);
-        tool.libs.push(ucrt_lib.join("ucrt").join(sub));
-
-        if let Some((sdk, version)) = get_sdk10_dir() {
-            tool.path.push(sdk.join("bin").join(sub));
-            let sdk_lib = sdk.join("lib").join(&version);
-            tool.libs.push(sdk_lib.join("um").join(sub));
-            let sdk_include = sdk.join("include").join(&version);
-            tool.include.push(sdk_include.join("um"));
-            tool.include.push(sdk_include.join("winrt"));
-            tool.include.push(sdk_include.join("shared"));
-        } else if let Some(sdk) = get_sdk81_dir() {
-            tool.path.push(sdk.join("bin").join(sub));
-            let sdk_lib = sdk.join("lib").join("winv6.3");
-            tool.libs.push(sdk_lib.join("um").join(sub));
-            let sdk_include = sdk.join("include");
-            tool.include.push(sdk_include.join("um"));
-            tool.include.push(sdk_include.join("winrt"));
-            tool.include.push(sdk_include.join("shared"));
-        } else {
-            return None;
-        }
-        Some(tool.into_tool())
-    }
-
-    // For MSVC 12 we need to find the Windows 8.1 SDK.
-    fn find_msvc_12(tool: &str, target: &str) -> Option<Tool> {
-        let vcdir = otry!(get_vc_dir("12.0"));
-        let mut tool = otry!(get_tool(tool, &vcdir, target));
-        let sub = otry!(lib_subdir(target));
-        let sdk81 = otry!(get_sdk81_dir());
-        tool.path.push(sdk81.join("bin").join(sub));
-        let sdk_lib = sdk81.join("lib").join("winv6.3");
-        tool.libs.push(sdk_lib.join("um").join(sub));
-        let sdk_include = sdk81.join("include");
-        tool.include.push(sdk_include.join("shared"));
-        tool.include.push(sdk_include.join("um"));
-        tool.include.push(sdk_include.join("winrt"));
-        Some(tool.into_tool())
-    }
-
-    // For MSVC 11 we need to find the Windows 8 SDK.
-    fn find_msvc_11(tool: &str, target: &str) -> Option<Tool> {
-        let vcdir = otry!(get_vc_dir("11.0"));
-        let mut tool = otry!(get_tool(tool, &vcdir, target));
-        let sub = otry!(lib_subdir(target));
-        let sdk8 = otry!(get_sdk8_dir());
-        tool.path.push(sdk8.join("bin").join(sub));
-        let sdk_lib = sdk8.join("lib").join("win8");
-        tool.libs.push(sdk_lib.join("um").join(sub));
-        let sdk_include = sdk8.join("include");
-        tool.include.push(sdk_include.join("shared"));
-        tool.include.push(sdk_include.join("um"));
-        tool.include.push(sdk_include.join("winrt"));
-        Some(tool.into_tool())
-    }
-
-    fn add_env(tool: &mut Tool, env: &str, paths: Vec<PathBuf>) {
-        let prev = env::var_os(env).unwrap_or(OsString::new());
-        let prev = env::split_paths(&prev);
-        let new = paths.into_iter().chain(prev);
-        tool.env.push((env.to_string().into(), env::join_paths(new).unwrap()));
-    }
-
-    // Given a possible MSVC installation directory, we look for the linker and
-    // then add the MSVC library path.
-    fn get_tool(tool: &str, path: &Path, target: &str) -> Option<MsvcTool> {
-        bin_subdir(target)
-            .into_iter()
-            .map(|(sub, host)| (path.join("bin").join(sub).join(tool), path.join("bin").join(host)))
-            .filter(|&(ref path, _)| path.is_file())
-            .map(|(path, host)| {
-                let mut tool = MsvcTool::new(path);
-                tool.path.push(host);
-                tool
-            })
-            .filter_map(|mut tool| {
-                let sub = otry!(vc_lib_subdir(target));
-                tool.libs.push(path.join("lib").join(sub));
-                tool.include.push(path.join("include"));
-                let atlmfc_path = path.join("atlmfc");
-                if atlmfc_path.exists() {
-                    tool.libs.push(atlmfc_path.join("lib").join(sub));
-                    tool.include.push(atlmfc_path.join("include"));
-                }
-                Some(tool)
-            })
-            .next()
-    }
-
-    // To find MSVC we look in a specific registry key for the version we are
-    // trying to find.
-    fn get_vc_dir(ver: &str) -> Option<PathBuf> {
-        let key = r"SOFTWARE\Microsoft\VisualStudio\SxS\VC7";
-        let key = otry!(LOCAL_MACHINE.open(key.as_ref()).ok());
-        let path = otry!(key.query_str(ver).ok());
-        Some(path.into())
-    }
-
-    // To find the Universal CRT we look in a specific registry key for where
-    // all the Universal CRTs are located and then sort them asciibetically to
-    // find the newest version. While this sort of sorting isn't ideal,  it is
-    // what vcvars does so that's good enough for us.
-    //
-    // Returns a pair of (root, version) for the ucrt dir if found
-    fn get_ucrt_dir() -> Option<(PathBuf, String)> {
-        let key = r"SOFTWARE\Microsoft\Windows Kits\Installed Roots";
-        let key = otry!(LOCAL_MACHINE.open(key.as_ref()).ok());
-        let root = otry!(key.query_str("KitsRoot10").ok());
-        let readdir = otry!(Path::new(&root).join("lib").read_dir().ok());
-        let max_libdir = otry!(readdir.filter_map(|dir| dir.ok())
-            .map(|dir| dir.path())
-            .filter(|dir| {
-                dir.components()
-                    .last()
-                    .and_then(|c| c.as_os_str().to_str())
-                    .map(|c| c.starts_with("10.") && dir.join("ucrt").is_dir())
-                    .unwrap_or(false)
-            })
-            .max());
-        let version = max_libdir.components().last().unwrap();
-        let version = version.as_os_str().to_str().unwrap().to_string();
-        Some((root.into(), version))
-    }
-
-    // Vcvars finds the correct version of the Windows 10 SDK by looking
-    // for the include `um\Windows.h` because sometimes a given version will
-    // only have UCRT bits without the rest of the SDK. Since we only care about
-    // libraries and not includes, we instead look for `um\x64\kernel32.lib`.
-    // Since the 32-bit and 64-bit libraries are always installed together we
-    // only need to bother checking x64, making this code a tiny bit simpler.
-    // Like we do for the Universal CRT, we sort the possibilities
-    // asciibetically to find the newest one as that is what vcvars does.
-    fn get_sdk10_dir() -> Option<(PathBuf, String)> {
-        let key = r"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0";
-        let key = otry!(LOCAL_MACHINE.open(key.as_ref()).ok());
-        let root = otry!(key.query_str("InstallationFolder").ok());
-        let readdir = otry!(Path::new(&root).join("lib").read_dir().ok());
-        let mut dirs = readdir.filter_map(|dir| dir.ok())
-            .map(|dir| dir.path())
-            .collect::<Vec<_>>();
-        dirs.sort();
-        let dir = otry!(dirs.into_iter()
-            .rev()
-            .filter(|dir| dir.join("um").join("x64").join("kernel32.lib").is_file())
-            .next());
-        let version = dir.components().last().unwrap();
-        let version = version.as_os_str().to_str().unwrap().to_string();
-        Some((root.into(), version))
-    }
-
-    // Interestingly there are several subdirectories, `win7` `win8` and
-    // `winv6.3`. Vcvars seems to only care about `winv6.3` though, so the same
-    // applies to us. Note that if we were targetting kernel mode drivers
-    // instead of user mode applications, we would care.
-    fn get_sdk81_dir() -> Option<PathBuf> {
-        let key = r"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.1";
-        let key = otry!(LOCAL_MACHINE.open(key.as_ref()).ok());
-        let root = otry!(key.query_str("InstallationFolder").ok());
-        Some(root.into())
-    }
-
-    fn get_sdk8_dir() -> Option<PathBuf> {
-        let key = r"SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0";
-        let key = otry!(LOCAL_MACHINE.open(key.as_ref()).ok());
-        let root = otry!(key.query_str("InstallationFolder").ok());
-        Some(root.into())
-    }
-
-    const PROCESSOR_ARCHITECTURE_INTEL: u16 = 0;
-    const PROCESSOR_ARCHITECTURE_AMD64: u16 = 9;
-    const X86: u16 = PROCESSOR_ARCHITECTURE_INTEL;
-    const X86_64: u16 = PROCESSOR_ARCHITECTURE_AMD64;
-
-    // When choosing the tool to use, we have to choose the one which matches
-    // the target architecture. Otherwise we end up in situations where someone
-    // on 32-bit Windows is trying to cross compile to 64-bit and it tries to
-    // invoke the native 64-bit compiler which won't work.
-    //
-    // For the return value of this function, the first member of the tuple is
-    // the folder of the tool we will be invoking, while the second member is
-    // the folder of the host toolchain for that tool which is essential when
-    // using a cross linker. We return a Vec since on x64 there are often two
-    // linkers that can target the architecture we desire. The 64-bit host
-    // linker is preferred, and hence first, due to 64-bit allowing it more
-    // address space to work with and potentially being faster.
-    fn bin_subdir(target: &str) -> Vec<(&'static str, &'static str)> {
-        let arch = target.split('-').next().unwrap();
-        match (arch, host_arch()) {
-            ("i586", X86) | ("i686", X86) => vec![("", "")],
-            ("i586", X86_64) | ("i686", X86_64) => vec![("amd64_x86", "amd64"), ("", "")],
-            ("x86_64", X86) => vec![("x86_amd64", "")],
-            ("x86_64", X86_64) => vec![("amd64", "amd64"), ("x86_amd64", "")],
-            ("arm", X86) => vec![("x86_arm", "")],
-            ("arm", X86_64) => vec![("amd64_arm", "amd64"), ("x86_arm", "")],
-            _ => vec![],
-        }
-    }
-
-    fn lib_subdir(target: &str) -> Option<&'static str> {
-        let arch = target.split('-').next().unwrap();
-        match arch {
-            "i586" | "i686" => Some("x86"),
-            "x86_64" => Some("x64"),
-            "arm" => Some("arm"),
-            _ => None,
-        }
-    }
-
-    // MSVC's x86 libraries are not in a subfolder
-    fn vc_lib_subdir(target: &str) -> Option<&'static str> {
-        let arch = target.split('-').next().unwrap();
-        match arch {
-            "i586" | "i686" => Some(""),
-            "x86_64" => Some("amd64"),
-            "arm" => Some("arm"),
-            _ => None,
-        }
-    }
-
-    #[allow(bad_style)]
-    fn host_arch() -> u16 {
-        type DWORD = u32;
-        type WORD = u16;
-        type LPVOID = *mut u8;
-        type DWORD_PTR = usize;
-
-        #[repr(C)]
-        struct SYSTEM_INFO {
-            wProcessorArchitecture: WORD,
-            _wReserved: WORD,
-            _dwPageSize: DWORD,
-            _lpMinimumApplicationAddress: LPVOID,
-            _lpMaximumApplicationAddress: LPVOID,
-            _dwActiveProcessorMask: DWORD_PTR,
-            _dwNumberOfProcessors: DWORD,
-            _dwProcessorType: DWORD,
-            _dwAllocationGranularity: DWORD,
-            _wProcessorLevel: WORD,
-            _wProcessorRevision: WORD,
-        }
-
-        extern "system" {
-            fn GetNativeSystemInfo(lpSystemInfo: *mut SYSTEM_INFO);
-        }
-
-        unsafe {
-            let mut info = mem::zeroed();
-            GetNativeSystemInfo(&mut info);
-            info.wProcessorArchitecture
-        }
-    }
-
-    // Given a registry key, look at all the sub keys and find the one which has
-    // the maximal numeric value.
-    //
-    // Returns the name of the maximal key as well as the opened maximal key.
-    fn max_version(key: &RegistryKey) -> Option<(OsString, RegistryKey)> {
-        let mut max_vers = 0;
-        let mut max_key = None;
-        for subkey in key.iter().filter_map(|k| k.ok()) {
-            let val = subkey.to_str()
-                .and_then(|s| s.trim_left_matches("v").replace(".", "").parse().ok());
-            let val = match val {
-                Some(s) => s,
-                None => continue,
-            };
-            if val > max_vers {
-                if let Ok(k) = key.open(&subkey) {
-                    max_vers = val;
-                    max_key = Some((subkey, k));
-                }
-            }
-        }
-        max_key
-    }
-
-    // see http://stackoverflow.com/questions/328017/path-to-msbuild
-    fn find_msbuild(target: &str) -> Option<Tool> {
-        let key = r"SOFTWARE\Microsoft\MSBuild\ToolsVersions";
-        LOCAL_MACHINE.open(key.as_ref())
-            .ok()
-            .and_then(|key| {
-                max_version(&key).and_then(|(_vers, key)| key.query_str("MSBuildToolsPath").ok())
-            })
-            .map(|path| {
-                let mut path = PathBuf::from(path);
-                path.push("MSBuild.exe");
-                let mut tool = Tool::new(path);
-                if target.contains("x86_64") {
-                    tool.env.push(("Platform".into(), "X64".into()));
-                }
-                tool
-            })
-    }
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/tests/cc_env.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-extern crate tempdir;
-extern crate gcc;
-
-use std::env;
-
-mod support;
-use support::Test;
-
-#[test]
-fn main() {
-    ccache();
-    distcc();
-    ccache_spaces();
-}
-
-fn ccache() {
-    let test = Test::gnu();
-    test.shim("ccache");
-
-    env::set_var("CC", "ccache lol-this-is-not-a-compiler foo");
-    test.gcc().file("foo.c").compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("lol-this-is-not-a-compiler foo")
-        .must_have("foo.c")
-        .must_not_have("ccache");
-}
-
-fn ccache_spaces() {
-    let test = Test::gnu();
-    test.shim("ccache");
-
-    env::set_var("CC", "ccache        lol-this-is-not-a-compiler foo");
-    test.gcc().file("foo.c").compile("libfoo.a");
-    test.cmd(0).must_have("lol-this-is-not-a-compiler foo");
-}
-
-fn distcc() {
-    let test = Test::gnu();
-    test.shim("distcc");
-
-    env::set_var("CC", "distcc lol-this-is-not-a-compiler foo");
-    test.gcc().file("foo.c").compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("lol-this-is-not-a-compiler foo")
-        .must_have("foo.c")
-        .must_not_have("distcc");
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/tests/support/mod.rs
+++ /dev/null
@@ -1,112 +0,0 @@
-#![allow(dead_code)]
-
-use std::env;
-use std::ffi::OsStr;
-use std::fs::{self, File};
-use std::io::prelude::*;
-use std::path::PathBuf;
-
-use gcc;
-use tempdir::TempDir;
-
-pub struct Test {
-    pub td: TempDir,
-    pub gcc: PathBuf,
-    pub msvc: bool,
-}
-
-pub struct Execution {
-    args: Vec<String>,
-}
-
-impl Test {
-    pub fn new() -> Test {
-        let mut gcc = PathBuf::from(env::current_exe().unwrap());
-        gcc.pop();
-        if gcc.ends_with("deps") {
-            gcc.pop();
-        }
-        gcc.push(format!("gcc-shim{}", env::consts::EXE_SUFFIX));
-        Test {
-            td: TempDir::new("gcc-test").unwrap(),
-            gcc: gcc,
-            msvc: false,
-        }
-    }
-
-    pub fn gnu() -> Test {
-        let t = Test::new();
-        t.shim("cc").shim("ar");
-        t
-    }
-
-    pub fn msvc() -> Test {
-        let mut t = Test::new();
-        t.shim("cl").shim("lib.exe");
-        t.msvc = true;
-        t
-    }
-
-    pub fn shim(&self, name: &str) -> &Test {
-        let fname = format!("{}{}", name, env::consts::EXE_SUFFIX);
-        fs::hard_link(&self.gcc, self.td.path().join(&fname))
-            .or_else(|_| fs::copy(&self.gcc, self.td.path().join(&fname)).map(|_| ()))
-            .unwrap();
-        self
-    }
-
-    pub fn gcc(&self) -> gcc::Config {
-        let mut cfg = gcc::Config::new();
-        let mut path = env::split_paths(&env::var_os("PATH").unwrap()).collect::<Vec<_>>();
-        path.insert(0, self.td.path().to_owned());
-        let target = if self.msvc {
-            "x86_64-pc-windows-msvc"
-        } else {
-            "x86_64-unknown-linux-gnu"
-        };
-
-        cfg.target(target)
-            .host(target)
-            .opt_level(2)
-            .debug(false)
-            .out_dir(self.td.path())
-            .__set_env("PATH", env::join_paths(path).unwrap())
-            .__set_env("GCCTEST_OUT_DIR", self.td.path());
-        if self.msvc {
-            cfg.compiler(self.td.path().join("cl"));
-            cfg.archiver(self.td.path().join("lib.exe"));
-        }
-        cfg
-    }
-
-    pub fn cmd(&self, i: u32) -> Execution {
-        let mut s = String::new();
-        File::open(self.td.path().join(format!("out{}", i)))
-            .unwrap()
-            .read_to_string(&mut s)
-            .unwrap();
-        Execution { args: s.lines().map(|s| s.to_string()).collect() }
-    }
-}
-
-impl Execution {
-    pub fn must_have<P: AsRef<OsStr>>(&self, p: P) -> &Execution {
-        if !self.has(p.as_ref()) {
-            panic!("didn't find {:?} in {:?}", p.as_ref(), self.args);
-        } else {
-            self
-        }
-    }
-
-    pub fn must_not_have<P: AsRef<OsStr>>(&self, p: P) -> &Execution {
-        if self.has(p.as_ref()) {
-            panic!("found {:?}", p.as_ref());
-        } else {
-            self
-        }
-    }
-
-    pub fn has(&self, p: &OsStr) -> bool {
-        self.args.iter().any(|arg| OsStr::new(arg) == p)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/gcc-0.3.42/tests/test.rs
+++ /dev/null
@@ -1,230 +0,0 @@
-extern crate gcc;
-extern crate tempdir;
-
-use support::Test;
-
-mod support;
-
-#[test]
-fn gnu_smoke() {
-    let test = Test::gnu();
-    test.gcc()
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("-O2")
-        .must_have("foo.c")
-        .must_not_have("-g")
-        .must_have("-c")
-        .must_have("-ffunction-sections")
-        .must_have("-fdata-sections");
-    test.cmd(1).must_have(test.td.path().join("foo.o"));
-}
-
-#[test]
-fn gnu_opt_level_1() {
-    let test = Test::gnu();
-    test.gcc()
-        .opt_level(1)
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("-O1")
-        .must_not_have("-O2");
-}
-
-#[test]
-fn gnu_opt_level_s() {
-    let test = Test::gnu();
-    test.gcc()
-        .opt_level_str("s")
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("-Os")
-        .must_not_have("-O1")
-        .must_not_have("-O2")
-        .must_not_have("-O3")
-        .must_not_have("-Oz");
-}
-
-#[test]
-fn gnu_debug() {
-    let test = Test::gnu();
-    test.gcc()
-        .debug(true)
-        .file("foo.c")
-        .compile("libfoo.a");
-    test.cmd(0).must_have("-g");
-}
-
-#[test]
-fn gnu_x86_64() {
-    for vendor in &["unknown-linux-gnu", "apple-darwin"] {
-        let target = format!("x86_64-{}", vendor);
-        let test = Test::gnu();
-        test.gcc()
-            .target(&target)
-            .host(&target)
-            .file("foo.c")
-            .compile("libfoo.a");
-
-        test.cmd(0)
-            .must_have("-fPIC")
-            .must_have("-m64");
-    }
-}
-
-#[test]
-fn gnu_x86_64_no_pic() {
-    for vendor in &["unknown-linux-gnu", "apple-darwin"] {
-        let target = format!("x86_64-{}", vendor);
-        let test = Test::gnu();
-        test.gcc()
-            .pic(false)
-            .target(&target)
-            .host(&target)
-            .file("foo.c")
-            .compile("libfoo.a");
-
-        test.cmd(0).must_not_have("-fPIC");
-    }
-}
-
-#[test]
-fn gnu_i686() {
-    for vendor in &["unknown-linux-gnu", "apple-darwin"] {
-        let target = format!("i686-{}", vendor);
-        let test = Test::gnu();
-        test.gcc()
-            .target(&target)
-            .host(&target)
-            .file("foo.c")
-            .compile("libfoo.a");
-
-        test.cmd(0)
-            .must_not_have("-fPIC")
-            .must_have("-m32");
-    }
-}
-
-#[test]
-fn gnu_i686_pic() {
-    for vendor in &["unknown-linux-gnu", "apple-darwin"] {
-        let target = format!("i686-{}", vendor);
-        let test = Test::gnu();
-        test.gcc()
-            .pic(true)
-            .target(&target)
-            .host(&target)
-            .file("foo.c")
-            .compile("libfoo.a");
-
-        test.cmd(0).must_have("-fPIC");
-    }
-}
-
-#[test]
-fn gnu_set_stdlib() {
-    let test = Test::gnu();
-    test.gcc()
-        .cpp_set_stdlib(Some("foo"))
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_not_have("-stdlib=foo");
-}
-
-#[test]
-fn gnu_include() {
-    let test = Test::gnu();
-    test.gcc()
-        .include("foo/bar")
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_have("-I").must_have("foo/bar");
-}
-
-#[test]
-fn gnu_define() {
-    let test = Test::gnu();
-    test.gcc()
-        .define("FOO", Some("bar"))
-        .define("BAR", None)
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_have("-DFOO=bar").must_have("-DBAR");
-}
-
-#[test]
-fn gnu_compile_assembly() {
-    let test = Test::gnu();
-    test.gcc()
-        .file("foo.S")
-        .compile("libfoo.a");
-    test.cmd(0).must_have("foo.S");
-}
-
-#[test]
-fn msvc_smoke() {
-    let test = Test::msvc();
-    test.gcc()
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0)
-        .must_have("/O2")
-        .must_have("foo.c")
-        .must_not_have("/Z7")
-        .must_have("/c");
-    test.cmd(1).must_have(test.td.path().join("foo.o"));
-}
-
-#[test]
-fn msvc_opt_level_0() {
-    let test = Test::msvc();
-    test.gcc()
-        .opt_level(0)
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_not_have("/O2");
-}
-
-#[test]
-fn msvc_debug() {
-    let test = Test::msvc();
-    test.gcc()
-        .debug(true)
-        .file("foo.c")
-        .compile("libfoo.a");
-    test.cmd(0).must_have("/Z7");
-}
-
-#[test]
-fn msvc_include() {
-    let test = Test::msvc();
-    test.gcc()
-        .include("foo/bar")
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_have("/I").must_have("foo/bar");
-}
-
-#[test]
-fn msvc_define() {
-    let test = Test::msvc();
-    test.gcc()
-        .define("FOO", Some("bar"))
-        .define("BAR", None)
-        .file("foo.c")
-        .compile("libfoo.a");
-
-    test.cmd(0).must_have("/DFOO=bar").must_have("/DBAR");
-}
--- a/third_party/rust/gcc/.cargo-checksum.json
+++ b/third_party/rust/gcc/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"6ce870c5fe92cc982b64a0301241c2b911f3864a0cca53277ce0697b9a91810b","Cargo.toml":"16170865c061907d466ef8d0d772450a706e81dbdb99a6c5031f1531869b7899","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"b1a639560fd536f2c3ab708a8e1066b675edd4d018dfa4e5e18d0d7327d81c15","appveyor.yml":"46c77d913eaa45871296942c2cd96ef092c9dcaf19201cb5c500a5107faeb06f","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/com.rs":"0cb06f5db0fb70d27db0e5917ca337de6e7032119e6aabfea1bad9c719f5f34b","src/lib.rs":"d6a022eba51292e379c0ec092dfa2a931e2aa2dd3b5348740c61419a12676dd0","src/registry.rs":"3876ef9573e3bbc050aef41a684b9a510cc1a91b15ae874fe032cf4377b4d116","src/setup_config.rs":"1a3eeb11c6847c31f2a4685b62ab35c76f0b6d5a17f7ed99e9df164283a771f7","src/winapi.rs":"b8240086866595c57bc562bbf423e44fd5a286c9f25bbff8694fe4631e918518","src/windows_registry.rs":"54a4c024213dde0e0df4ed2e9e54fb4f4d72dbdc64a18cdab4c483adaf4aaeea","tests/cc_env.rs":"d92c5e3d3d43ac244e63b2cd2c93a521fcf124bf1ccf8d4c6bfa7f8333d88976","tests/support/mod.rs":"56bcfd1e2ff5ae8e581c71229444a3d96094bf689808808dd80e315bd6632083","tests/test.rs":"c1cbdff76d5912aa47732aed77aa845e989807ca3c84af3423b4c25232c72237"},"package":"120d07f202dcc3f72859422563522b66fe6463a4c513df062874daad05f85f0a"}
\ No newline at end of file
+{"files":{".travis.yml":"276069d13bb9d23f12fc0f8250fe43903a524b3694397f874eb586c34528aa86","Cargo.toml":"e18a122fb8451ad2de8cd9335509b3975d9456714e168884a41fa10c6faffb42","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"08c52530369790b6ac0c1044a938246a3d585ef4d2827649743e055dc3caa7b3","appveyor.yml":"ef04ec11eba1462746866e02e0f5336cc50b337f61884b6d2547253ddfd0b957","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/com.rs":"0cb06f5db0fb70d27db0e5917ca337de6e7032119e6aabfea1bad9c719f5f34b","src/lib.rs":"6d87931b2416b64f98cbc0ebc2b877afbc8d140885d31dde65a6cd235f8e6f94","src/registry.rs":"3876ef9573e3bbc050aef41a684b9a510cc1a91b15ae874fe032cf4377b4d116","src/setup_config.rs":"1a3eeb11c6847c31f2a4685b62ab35c76f0b6d5a17f7ed99e9df164283a771f7","src/winapi.rs":"cb5e6cab3eb570b0f97c660ca448ccfb5024262c0c7b245c181daad91a79f211","src/windows_registry.rs":"6de548aa94215e449f0e58e9a3b1702939d7c2f7b63a9040901c948bf138201d","tests/cc_env.rs":"d92c5e3d3d43ac244e63b2cd2c93a521fcf124bf1ccf8d4c6bfa7f8333d88976","tests/support/mod.rs":"d15a3a614ff7776a5eb1613fc6718c85910b6d0ab14bb13e86faecd16471a3f7","tests/test.rs":"54f5ddf1c1952821ead859fe8a57eae7dab94a407bbf6998010885fa47134364"},"package":"5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb"}
\ No newline at end of file
--- a/third_party/rust/gcc/.travis.yml
+++ b/third_party/rust/gcc/.travis.yml
@@ -1,17 +1,17 @@
 language: rust
 rust:
   - stable
   - beta
   - nightly
 matrix:
   include:
     # Minimum version supported
-    - rust: 1.6.0
+    - rust: 1.13.0
       install:
       script: cargo build
 
 sudo: false
 install:
   - if [ "$TRAVIS_OS_NAME" = "linux" ]; then OS=unknown-linux-gnu; else OS=apple-darwin; fi
   - export TARGET=$ARCH-$OS
   - if [ -z "$NO_ADD" ]; then rustup target add $TARGET; fi
--- a/third_party/rust/gcc/Cargo.toml
+++ b/third_party/rust/gcc/Cargo.toml
@@ -1,27 +1,36 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
 [package]
-
 name = "gcc"
-version = "0.3.51"
+version = "0.3.54"
 authors = ["Alex Crichton <alex@alexcrichton.com>"]
+description = "A build-time dependency for Cargo build scripts to assist in invoking the native\nC compiler to compile native C code into a static archive to be linked into Rust\ncode.\n"
+documentation = "https://docs.rs/gcc"
+readme = "README.md"
+keywords = ["build-dependencies"]
+categories = ["development-tools"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/alexcrichton/gcc-rs"
-documentation = "https://docs.rs/gcc"
-description = """
-A build-time dependency for Cargo build scripts to assist in invoking the native
-C compiler to compile native C code into a static archive to be linked into Rust
-code.
-"""
-keywords = ["build-dependencies"]
-
-[badges]
-travis-ci = { repository = "alexcrichton/gcc-rs" }
-appveyor = { repository = "alexcrichton/gcc-rs" }
-
-[dependencies]
-rayon = { version = "0.7", optional = true }
+[dependencies.rayon]
+version = "0.8"
+optional = true
+[dev-dependencies.tempdir]
+version = "0.3"
 
 [features]
 parallel = ["rayon"]
+[badges.travis-ci]
+repository = "alexcrichton/gcc-rs"
 
-[dev-dependencies]
-tempdir = "0.3"
+[badges.appveyor]
+repository = "alexcrichton/gcc-rs"
--- a/third_party/rust/gcc/README.md
+++ b/third_party/rust/gcc/README.md
@@ -30,23 +30,27 @@ gcc = "0.3"
 Next up, you'll want to write a build script like so:
 
 ```rust,no_run
 // build.rs
 
 extern crate gcc;
 
 fn main() {
-    gcc::compile_library("libfoo.a", &["foo.c", "bar.c"]);
+    gcc::Build::new()
+        .file("foo.c")
+        .file("bar.c")
+        .compile("foo");
 }
 ```
 
 And that's it! Running `cargo build` should take care of the rest and your Rust
-application will now have the C files `foo.c` and `bar.c` compiled into it. You
-can call the functions in Rust by declaring functions in your Rust code like so:
+application will now have the C files `foo.c` and `bar.c` compiled into a file
+named libfoo.a. You can call the functions in Rust by declaring functions in
+your Rust code like so:
 
 ```
 extern {
     fn foo_function();
     fn bar_function();
 }
 
 pub fn call() {
@@ -132,23 +136,23 @@ required varies per platform, but there 
   rustc. GCC from older [MinGW](http://www.mingw.org) project is compatible
   only with 32-bit rust compiler.
 
 [msys2-help]: http://github.com/rust-lang/rust#building-on-windows
 
 ## C++ support
 
 `gcc-rs` supports C++ libraries compilation by using the `cpp` method on
-`Config`:
+`Build`:
 
 ```rust,no_run
 extern crate gcc;
 
 fn main() {
-    gcc::Config::new()
+    gcc::Build::new()
         .cpp(true) // Switch to C++ library compilation.
         .file("foo.cpp")
         .compile("libfoo.a");
 }
 ```
 
 When using C++ library compilation switch, the `CXX` and `CXXFLAGS` env
 variables are used instead of `CC` and `CFLAGS` and the C++ standard library is
--- a/third_party/rust/gcc/appveyor.yml
+++ b/third_party/rust/gcc/appveyor.yml
@@ -1,9 +1,29 @@
 environment:
+
+  # At the time this was added AppVeyor was having troubles with checking
+  # revocation of SSL certificates of sites like static.rust-lang.org and what
+  # we think is crates.io. The libcurl HTTP client by default checks for
+  # revocation on Windows and according to a mailing list [1] this can be
+  # disabled.
+  #
+  # The `CARGO_HTTP_CHECK_REVOKE` env var here tells cargo to disable SSL
+  # revocation checking on Windows in libcurl. Note, though, that rustup, which
+  # we're using to download Rust here, also uses libcurl as the default backend.
+  # Unlike Cargo, however, rustup doesn't have a mechanism to disable revocation
+  # checking. To get rustup working we set `RUSTUP_USE_HYPER` which forces it to
+  # use the Hyper instead of libcurl backend. Both Hyper and libcurl use
+  # schannel on Windows but it appears that Hyper configures it slightly
+  # differently such that revocation checking isn't turned on by default.
+  #
+  # [1]: https://curl.haxx.se/mail/lib-2016-03/0202.html
+  RUSTUP_USE_HYPER: 1
+  CARGO_HTTP_CHECK_REVOKE: false
+
   matrix:
   - TARGET: x86_64-pc-windows-msvc
     ARCH: amd64
     VS: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat
   - TARGET: x86_64-pc-windows-msvc
     ARCH: amd64
     VS: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat
   - TARGET: i686-pc-windows-msvc
--- a/third_party/rust/gcc/src/lib.rs
+++ b/third_party/rust/gcc/src/lib.rs
@@ -5,45 +5,40 @@
 //!
 //! ```toml
 //! [build-dependencies]
 //! gcc = "0.3"
 //! ```
 //!
 //! The purpose of this crate is to provide the utility functions necessary to
 //! compile C code into a static archive which is then linked into a Rust crate.
-//! The top-level `compile_library` function serves as a convenience and more
-//! advanced configuration is available through the `Config` builder.
+//! Configuration is available through the `Build` struct.
 //!
 //! This crate will automatically detect situations such as cross compilation or
 //! other environment variables set by Cargo and will build code appropriately.
 //!
+//! The crate is not limited to C code, it can accept any source code that can
+//! be passed to a C or C++ compiler. As such, assembly files with extensions
+//! `.s` (gcc/clang) and `.asm` (MSVC) can also be compiled.
+//!
+//! [`Build`]: struct.Build.html
+//!
 //! # Examples
 //!
-//! Use the default configuration:
+//! Use the `Build` struct to compile `src/foo.c`:
 //!
 //! ```no_run
 //! extern crate gcc;
 //!
 //! fn main() {
-//!     gcc::compile_library("libfoo.a", &["src/foo.c"]);
-//! }
-//! ```
-//!
-//! Use more advanced configuration:
-//!
-//! ```no_run
-//! extern crate gcc;
-//!
-//! fn main() {
-//!     gcc::Config::new()
-//!                 .file("src/foo.c")
-//!                 .define("FOO", Some("bar"))
-//!                 .include("src")
-//!                 .compile("libfoo.a");
+//!     gcc::Build::new()
+//!                .file("src/foo.c")
+//!                .define("FOO", Some("bar"))
+//!                .include("src")
+//!                .compile("foo");
 //! }
 //! ```
 
 #![doc(html_root_url = "https://docs.rs/gcc/0.3")]
 #![cfg_attr(test, deny(warnings))]
 #![deny(missing_docs)]
 
 #[cfg(feature = "parallel")]
@@ -52,36 +47,45 @@ extern crate rayon;
 use std::env;
 use std::ffi::{OsString, OsStr};
 use std::fs;
 use std::path::{PathBuf, Path};
 use std::process::{Command, Stdio, Child};
 use std::io::{self, BufReader, BufRead, Read, Write};
 use std::thread::{self, JoinHandle};
 
+#[doc(hidden)]
+#[deprecated(since="0.3.51", note="gcc::Config has been renamed to gcc::Build")]
+pub type Config = Build;
+
+#[cfg(feature = "parallel")]
+use std::sync::Mutex;
+
 // These modules are all glue to support reading the MSVC version from
 // the registry and from COM interfaces
 #[cfg(windows)]
 mod registry;
 #[cfg(windows)]
 #[macro_use]
 mod winapi;
 #[cfg(windows)]
 mod com;
 #[cfg(windows)]
 mod setup_config;
 
 pub mod windows_registry;
 
 /// Extra configuration to pass to gcc.
-pub struct Config {
+#[derive(Clone, Debug)]
+pub struct Build {
     include_directories: Vec<PathBuf>,
     definitions: Vec<(String, Option<String>)>,
     objects: Vec<PathBuf>,
     flags: Vec<String>,
+    flags_supported: Vec<String>,
     files: Vec<PathBuf>,
     cpp: bool,
     cpp_link_stdlib: Option<Option<String>>,
     cpp_set_stdlib: Option<String>,
     target: Option<String>,
     host: Option<String>,
     out_dir: Option<PathBuf>,
     opt_level: Option<String>,
@@ -89,38 +93,77 @@ pub struct Config {
     env: Vec<(OsString, OsString)>,
     compiler: Option<PathBuf>,
     archiver: Option<PathBuf>,
     cargo_metadata: bool,
     pic: Option<bool>,
     static_crt: Option<bool>,
     shared_flag: Option<bool>,
     static_flag: Option<bool>,
+    warnings_into_errors: bool,
+    warnings: bool,
+}
+
+/// Represents the types of errors that may occur while using gcc-rs.
+#[derive(Clone, Debug)]
+enum ErrorKind {
+    /// Error occurred while performing I/O.
+    IOError,
+    /// Invalid architecture supplied.
+    ArchitectureInvalid,
+    /// Environment variable not found, with the var in question as extra info.
+    EnvVarNotFound,
+    /// Error occurred while using external tools (ie: invocation of compiler).
+    ToolExecError,
+    /// Error occurred due to missing external tools.
+    ToolNotFound,
+}
+
+/// Represents an internal error that occurred, with an explaination.
+#[derive(Clone, Debug)]
+pub struct Error {
+    /// Describes the kind of error that occurred.
+    kind: ErrorKind,
+    /// More explaination of error that occurred.
+    message: String,
+}
+
+impl Error {
+    fn new(kind: ErrorKind, message: &str) -> Error {
+        Error { kind: kind, message: message.to_owned() }
+    }
+}
+
+impl From<io::Error> for Error {
+    fn from(e: io::Error) -> Error {
+        Error::new(ErrorKind::IOError, &format!("{}", e))
+    }
 }
 
 /// Configuration used to represent an invocation of a C compiler.
 ///
 /// This can be used to figure out what compiler is in use, what the arguments
 /// to it are, and what the environment variables look like for the compiler.
 /// This can be used to further configure other build systems (e.g. forward
 /// along CC and/or CFLAGS) or the `to_command` method can be used to run the
 /// compiler itself.
+#[derive(Clone, Debug)]
 pub struct Tool {
     path: PathBuf,
     args: Vec<OsString>,
     env: Vec<(OsString, OsString)>,
     family: ToolFamily
 }
 
 /// Represents the family of tools this tool belongs to.
 ///
 /// Each family of tools differs in how and what arguments they accept.
 ///
 /// Detection of a family is done on best-effort basis and may not accurately reflect the tool.
-#[derive(Copy, Clone, Debug)]
+#[derive(Copy, Clone, Debug, PartialEq)]
 enum ToolFamily {
     /// Tool is GNU Compiler Collection-like.
     Gnu,
     /// Tool is Clang-like. It differs from the GCC in a sense that it accepts superset of flags
     /// and its cross-compilation approach is different.
     Clang,
     /// Tool is the MSVC cl.exe.
     Msvc,
@@ -148,49 +191,75 @@ impl ToolFamily {
     /// What the flag to request macro-expanded source output looks like
     fn expand_flag(&self) -> &'static str {
         match *self {
             ToolFamily::Msvc => "/E",
             ToolFamily::Gnu |
             ToolFamily::Clang => "-E",
         }
     }
+
+    /// What the flags to enable all warnings
+    fn warnings_flags(&self) -> &'static [&'static str] {
+        static MSVC_FLAGS: &'static [&'static str] = &["/W4"];
+        static GNU_CLANG_FLAGS: &'static [&'static str] = &["-Wall", "-Wextra"];
+
+        match *self {
+            ToolFamily::Msvc => &MSVC_FLAGS,
+            ToolFamily::Gnu |
+            ToolFamily::Clang => &GNU_CLANG_FLAGS,
+        }
+    }
+
+    /// What the flag to turn warning into errors
+    fn warnings_to_errors_flag(&self) -> &'static str {
+        match *self {
+            ToolFamily::Msvc => "/WX",
+            ToolFamily::Gnu |
+            ToolFamily::Clang => "-Werror"
+        }
+    }
 }
 
 /// Compile a library from the given set of input C files.
 ///
 /// This will simply compile all files into object files and then assemble them
 /// into the output. This will read the standard environment variables to detect
 /// cross compilations and such.
 ///
 /// This function will also print all metadata on standard output for Cargo.
 ///
 /// # Example
 ///
 /// ```no_run
-/// gcc::compile_library("libfoo.a", &["foo.c", "bar.c"]);
+/// gcc::compile_library("foo", &["foo.c", "bar.c"]);
 /// ```
+#[deprecated]
+#[doc(hidden)]
 pub fn compile_library(output: &str, files: &[&str]) {
-    let mut c = Config::new();
+    let mut c = Build::new();
     for f in files.iter() {
         c.file(*f);
     }
     c.compile(output);
 }
 
-impl Config {
+impl Build {
     /// Construct a new instance of a blank set of configuration.
     ///
-    /// This builder is finished with the `compile` function.
-    pub fn new() -> Config {
-        Config {
+    /// This builder is finished with the [`compile`] function.
+    ///
+    /// [`compile`]: struct.Build.html#method.compile
+    pub fn new() -> Build {
+        Build {
             include_directories: Vec::new(),
             definitions: Vec::new(),
             objects: Vec::new(),
             flags: Vec::new(),
+            flags_supported: Vec::new(),
             files: Vec::new(),
             shared_flag: None,
             static_flag: None,
             cpp: false,
             cpp_link_stdlib: None,
             cpp_set_stdlib: None,
             target: None,
             host: None,
@@ -198,89 +267,266 @@ impl Config {
             opt_level: None,
             debug: None,
             env: Vec::new(),
             compiler: None,
             archiver: None,
             cargo_metadata: true,
             pic: None,
             static_crt: None,
+            warnings: true,
+            warnings_into_errors: false,
         }
     }
 
     /// Add a directory to the `-I` or include path for headers
-    pub fn include<P: AsRef<Path>>(&mut self, dir: P) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// use std::path::Path;
+    ///
+    /// let library_path = Path::new("/path/to/library");
+    ///
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .include(library_path)
+    ///            .include("src")
+    ///            .compile("foo");
+    /// ```
+    pub fn include<P: AsRef<Path>>(&mut self, dir: P) -> &mut Build {
         self.include_directories.push(dir.as_ref().to_path_buf());
         self
     }
 
     /// Specify a `-D` variable with an optional value.
-    pub fn define(&mut self, var: &str, val: Option<&str>) -> &mut Config {
-        self.definitions.push((var.to_string(), val.map(|s| s.to_string())));
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .define("FOO", "BAR")
+    ///            .define("BAZ", None)
+    ///            .compile("foo");
+    /// ```
+    pub fn define<'a, V: Into<Option<&'a str>>>(&mut self, var: &str, val: V) -> &mut Build {
+        self.definitions.push((var.to_string(), val.into().map(|s| s.to_string())));
         self
     }
 
     /// Add an arbitrary object file to link in
-    pub fn object<P: AsRef<Path>>(&mut self, obj: P) -> &mut Config {
+    pub fn object<P: AsRef<Path>>(&mut self, obj: P) -> &mut Build {
         self.objects.push(obj.as_ref().to_path_buf());
         self
     }
 
     /// Add an arbitrary flag to the invocation of the compiler
-    pub fn flag(&mut self, flag: &str) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .flag("-ffunction-sections")
+    ///            .compile("foo");
+    /// ```
+    pub fn flag(&mut self, flag: &str) -> &mut Build {
         self.flags.push(flag.to_string());
         self
     }
 
+    fn ensure_check_file(&self) -> Result<PathBuf, Error> {
+        let out_dir = self.get_out_dir()?;
+        let src = if self.cpp {
+            out_dir.join("flag_check.cpp")
+        } else {
+            out_dir.join("flag_check.c")
+        };
+
+        if !src.exists() {
+            let mut f = fs::File::create(&src)?;
+            write!(f, "int main(void) {{ return 0; }}")?;
+        }
+
+        Ok(src)
+    }
+
+    fn is_flag_supported(&self, flag: &str) -> Result<bool, Error> {
+        let out_dir = self.get_out_dir()?;
+        let src = self.ensure_check_file()?;
+        let obj = out_dir.join("flag_check");
+        let target = self.get_target()?;
+        let mut cfg = Build::new();
+        cfg.flag(flag)
+           .target(&target)
+           .opt_level(0)
+           .host(&target)
+           .debug(false)
+           .cpp(self.cpp);
+        let compiler = cfg.try_get_compiler()?;
+        let mut cmd = compiler.to_command();
+        command_add_output_file(&mut cmd, &obj, target.contains("msvc"), false);
+        cmd.arg(&src);
+
+        let output = cmd.output()?;
+        Ok(output.stderr.is_empty())
+    }
+
+    /// Add an arbitrary flag to the invocation of the compiler if it supports it
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .flag_if_supported("-Wlogical-op") // only supported by GCC
+    ///            .flag_if_supported("-Wunreachable-code") // only supported by clang
+    ///            .compile("foo");
+    /// ```
+    pub fn flag_if_supported(&mut self, flag: &str) -> &mut Build {
+        self.flags_supported.push(flag.to_string());
+        self
+    }
+
     /// Set the `-shared` flag.
     ///
     /// When enabled, the compiler will produce a shared object which can
     /// then be linked with other objects to form an executable.
-    pub fn shared_flag(&mut self, shared_flag: bool) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .shared_flag(true)
+    ///            .compile("libfoo.so");
+    /// ```
+
+    pub fn shared_flag(&mut self, shared_flag: bool) -> &mut Build {
         self.shared_flag = Some(shared_flag);
         self
     }
 
     /// Set the `-static` flag.
     ///
     /// When enabled on systems that support dynamic linking, this prevents
     /// linking with the shared libraries.
-    pub fn static_flag(&mut self, static_flag: bool) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .shared_flag(true)
+    ///            .static_flag(true)
+    ///            .compile("foo");
+    /// ```
+    pub fn static_flag(&mut self, static_flag: bool) -> &mut Build {
         self.static_flag = Some(static_flag);
         self
     }
 
     /// Add a file which will be compiled
-    pub fn file<P: AsRef<Path>>(&mut self, p: P) -> &mut Config {
+    pub fn file<P: AsRef<Path>>(&mut self, p: P) -> &mut Build {
         self.files.push(p.as_ref().to_path_buf());
         self
     }
 
+    /// Add files which will be compiled
+    pub fn files<P>(&mut self, p: P) -> &mut Build
+        where P: IntoIterator,
+              P::Item: AsRef<Path> {
+        for file in p.into_iter() {
+            self.file(file);
+        }
+        self
+    }
+
     /// Set C++ support.
     ///
     /// The other `cpp_*` options will only become active if this is set to
     /// `true`.
-    pub fn cpp(&mut self, cpp: bool) -> &mut Config {
+    pub fn cpp(&mut self, cpp: bool) -> &mut Build {
         self.cpp = cpp;
         self
     }
 
+    /// Set warnings into errors flag.
+    ///
+    /// Disabled by default.
+    ///
+    /// Warning: turning warnings into errors only make sense
+    /// if you are a developer of the crate using gcc-rs.
+    /// Some warnings only appear on some architecture or
+    /// specific version of the compiler. Any user of this crate,
+    /// or any other crate depending on it, could fail during
+    /// compile time.
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .warnings_into_errors(true)
+    ///            .compile("libfoo.a");
+    /// ```
+    pub fn warnings_into_errors(&mut self, warnings_into_errors: bool) -> &mut Build {
+        self.warnings_into_errors = warnings_into_errors;
+        self
+    }
+
+    /// Set warnings flags.
+    ///
+    /// Adds some flags:
+    /// - "/Wall" for MSVC.
+    /// - "-Wall", "-Wextra" for GNU and Clang.
+    ///
+    /// Enabled by default.
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .warnings(false)
+    ///            .compile("libfoo.a");
+    /// ```
+    pub fn warnings(&mut self, warnings: bool) -> &mut Build {
+        self.warnings = warnings;
+        self
+    }
+
     /// Set the standard library to link against when compiling with C++
     /// support.
     ///
     /// The default value of this property depends on the current target: On
     /// OS X `Some("c++")` is used, when compiling for a Visual Studio based
     /// target `None` is used and for other targets `Some("stdc++")` is used.
     ///
     /// A value of `None` indicates that no automatic linking should happen,
     /// otherwise cargo will link against the specified library.
     ///
     /// The given library name must not contain the `lib` prefix.
-    pub fn cpp_link_stdlib(&mut self, cpp_link_stdlib: Option<&str>) -> &mut Config {
-        self.cpp_link_stdlib = Some(cpp_link_stdlib.map(|s| s.into()));
+    ///
+    /// Common values:
+    /// - `stdc++` for GNU
+    /// - `c++` for Clang
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .shared_flag(true)
+    ///            .cpp_link_stdlib("stdc++")
+    ///            .compile("libfoo.so");
+    /// ```
+    pub fn cpp_link_stdlib<'a, V: Into<Option<&'a str>>>(&mut self, cpp_link_stdlib: V) -> &mut Build {
+        self.cpp_link_stdlib = Some(cpp_link_stdlib.into().map(|s| s.into()));
         self
     }
 
     /// Force the C++ compiler to use the specified standard library.
     ///
     /// Setting this option will automatically set `cpp_link_stdlib` to the same
     /// value.
     ///
@@ -294,284 +540,395 @@ impl Config {
     /// detect which compiler is used, as such it is the responsibility of the
     /// caller to ensure that this option is only used in conjuction with a
     /// compiler which supports the `-stdlib` flag.
     ///
     /// A value of `None` indicates that no specific C++ standard library should
     /// be used, otherwise `-stdlib` is added to the compile invocation.
     ///
     /// The given library name must not contain the `lib` prefix.
-    pub fn cpp_set_stdlib(&mut self, cpp_set_stdlib: Option<&str>) -> &mut Config {
+    ///
+    /// Common values:
+    /// - `stdc++` for GNU
+    /// - `c++` for Clang
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .cpp_set_stdlib("c++")
+    ///            .compile("libfoo.a");
+    /// ```
+    pub fn cpp_set_stdlib<'a, V: Into<Option<&'a str>>>(&mut self, cpp_set_stdlib: V) -> &mut Build {
+        let cpp_set_stdlib = cpp_set_stdlib.into();
         self.cpp_set_stdlib = cpp_set_stdlib.map(|s| s.into());
         self.cpp_link_stdlib(cpp_set_stdlib);
         self
     }
 
     /// Configures the target this configuration will be compiling for.
     ///
     /// This option is automatically scraped from the `TARGET` environment
     /// variable by build scripts, so it's not required to call this function.
-    pub fn target(&mut self, target: &str) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .target("aarch64-linux-android")
+    ///            .compile("foo");
+    /// ```
+    pub fn target(&mut self, target: &str) -> &mut Build {
         self.target = Some(target.to_string());
         self
     }
 
     /// Configures the host assumed by this configuration.
     ///
     /// This option is automatically scraped from the `HOST` environment
     /// variable by build scripts, so it's not required to call this function.
-    pub fn host(&mut self, host: &str) -> &mut Config {
+    ///
+    /// # Example
+    ///
+    /// ```no_run
+    /// gcc::Build::new()
+    ///            .file("src/foo.c")
+    ///            .host("arm-linux-gnueabihf")
+    ///            .compile("foo");
+    /// ```
+    pub fn host(&mut self, host: &str) -> &mut Build {
         self.host = Some(host.to_string());
         self
     }
 
     /// Configures the optimization level of the generated object files.
     ///
     /// This option is automatically scraped from the `OPT_LEVEL` environment
     /// variable by build scripts, so it's not required to call this function.
-    pub fn opt_level(&mut self, opt_level: u32) -> &mut Config {
+    pub fn opt_level(&mut self, opt_level: u32) -> &mut Build {
         self.opt_level = Some(opt_level.to_string());
         self
     }
 
     /// Configures the optimization level of the generated object files.
     ///
     /// This option is automatically scraped from the `OPT_LEVEL` environment
     /// variable by build scripts, so it's not required to call this function.
-    pub fn opt_level_str(&mut self, opt_level: &str) -> &mut Config {
+    pub fn opt_level_str(&mut self, opt_level: &str) -> &mut Build {
         self.opt_level = Some(opt_level.to_string());
         self
     }
 
     /// Configures whether the compiler will emit debug information when
     /// generating object files.
     ///
     /// This option is automatically scraped from the `PROFILE` environment
     /// variable by build scripts (only enabled when the profile is "debug"), so
     /// it's not required to call this function.
-    pub fn debug(&mut self, debug: bool) -> &mut Config {
+    pub fn debug(&mut self, debug: bool) -> &mut Build {
         self.debug = Some(debug);
         self
     }
 
     /// Configures the output directory where all object files and static
     /// libraries will be located.
     ///
     /// This option is automatically scraped from the `OUT_DIR` environment
     /// variable by build scripts, so it's not required to call this function.
-    pub fn out_dir<P: AsRef<Path>>(&mut self, out_dir: P) -> &mut Config {
+    pub fn out_dir<P: AsRef<Path>>(&mut self, out_dir: P) -> &mut Build {
         self.out_dir = Some(out_dir.as_ref().to_owned());
         self
     }
 
     /// Configures the compiler to be used to produce output.
     ///
     /// This option is automatically determined from the target platform or a
     /// number of environment variables, so it's not required to call this
     /// function.
-    pub fn compiler<P: AsRef<Path>>(&mut self, compiler: P) -> &mut Config {
+    pub fn compiler<P: AsRef<Path>>(&mut self, compiler: P) -> &mut Build {
         self.compiler = Some(compiler.as_ref().to_owned());
         self
     }
 
     /// Configures the tool used to assemble archives.
     ///
     /// This option is automatically determined from the target platform or a
     /// number of environment variables, so it's not required to call this
     /// function.
-    pub fn archiver<P: AsRef<Path>>(&mut self, archiver: P) -> &mut Config {
+    pub fn archiver<P: AsRef<Path>>(&mut self, archiver: P) -> &mut Build {
         self.archiver = Some(archiver.as_ref().to_owned());
         self
     }
     /// Define whether metadata should be emitted for cargo allowing it to
     /// automatically link the binary. Defaults to `true`.
-    pub fn cargo_metadata(&mut self, cargo_metadata: bool) -> &mut Config {
+    ///
+    /// The emitted metadata is:
+    ///
+    ///  - `rustc-link-lib=static=`*compiled lib*
+    ///  - `rustc-link-search=native=`*target folder*
+    ///  - When target is MSVC, the ATL-MFC libs are added via `rustc-link-search=native=`
+    ///  - When C++ is enabled, the C++ stdlib is added via `rustc-link-lib`
+    ///
+    pub fn cargo_metadata(&mut self, cargo_metadata: bool) -> &mut Build {
         self.cargo_metadata = cargo_metadata;
         self
     }
 
     /// Configures whether the compiler will emit position independent code.
     ///
     /// This option defaults to `false` for `windows-gnu` targets and
     /// to `true` for all other targets.
-    pub fn pic(&mut self, pic: bool) -> &mut Config {
+    pub fn pic(&mut self, pic: bool) -> &mut Build {
         self.pic = Some(pic);
         self
     }
 
     /// Configures whether the /MT flag or the /MD flag will be passed to msvc build tools.
     ///
     /// This option defaults to `false`, and affect only msvc targets.
-    pub fn static_crt(&mut self, static_crt: bool) -> &mut Config {
+    pub fn static_crt(&mut self, static_crt: bool) -> &mut Build {
         self.static_crt = Some(static_crt);
         self
     }
 
-
     #[doc(hidden)]
-    pub fn __set_env<A, B>(&mut self, a: A, b: B) -> &mut Config
+    pub fn __set_env<A, B>(&mut self, a: A, b: B) -> &mut Build
         where A: AsRef<OsStr>,
               B: AsRef<OsStr>
     {
         self.env.push((a.as_ref().to_owned(), b.as_ref().to_owned()));
         self
     }
 
     /// Run the compiler, generating the file `output`
     ///
-    /// The name `output` must begin with `lib` and end with `.a`
-    pub fn compile(&self, output: &str) {
-        assert!(output.starts_with("lib"));
-        assert!(output.ends_with(".a"));
-        let lib_name = &output[3..output.len() - 2];
-        let dst = self.get_out_dir();
+    /// This will return a result instead of panicing; see compile() for the complete description.
+    pub fn try_compile(&self, output: &str) -> Result<(), Error> {
+        let (lib_name, gnu_lib_name) = if output.starts_with("lib") && output.ends_with(".a") {
+                (&output[3..output.len() - 2], output.to_owned())
+            } else {
+                let mut gnu = String::with_capacity(5 + output.len());
+                gnu.push_str("lib");
+                gnu.push_str(&output);
+                gnu.push_str(".a");
+                (output, gnu)
+            };
+        let dst = self.get_out_dir()?;
 
         let mut objects = Vec::new();
         let mut src_dst = Vec::new();
         for file in self.files.iter() {
             let obj = dst.join(file).with_extension("o");
             let obj = if !obj.starts_with(&dst) {
-                dst.join(obj.file_name().unwrap())
+                dst.join(obj.file_name().ok_or_else(|| Error::new(ErrorKind::IOError, "Getting object file details failed."))?)
             } else {
                 obj
             };
-            fs::create_dir_all(&obj.parent().unwrap()).unwrap();
+
+            match obj.parent() {
+                Some(s) => fs::create_dir_all(s)?,
+                None => return Err(Error::new(ErrorKind::IOError, "Getting object file details failed.")),
+            };
+
             src_dst.push((file.to_path_buf(), obj.clone()));
             objects.push(obj);
         }
-        self.compile_objects(&src_dst);
-        self.assemble(lib_name, &dst.join(output), &objects);
+        self.compile_objects(&src_dst)?;
+        self.assemble(lib_name, &dst.join(gnu_lib_name), &objects)?;
 
-        if self.get_target().contains("msvc") {
-            let compiler = self.get_base_compiler();
+        if self.get_target()?.contains("msvc") {
+            let compiler = self.get_base_compiler()?;
             let atlmfc_lib = compiler.env()
                 .iter()
                 .find(|&&(ref var, _)| var.as_os_str() == OsStr::new("LIB"))
                 .and_then(|&(_, ref lib_paths)| {
                     env::split_paths(lib_paths).find(|path| {
                         let sub = Path::new("atlmfc/lib");
                         path.ends_with(sub) || path.parent().map_or(false, |p| p.ends_with(sub))
                     })
                 });
 
             if let Some(atlmfc_lib) = atlmfc_lib {
                 self.print(&format!("cargo:rustc-link-search=native={}", atlmfc_lib.display()));
             }
         }
 
-        self.print(&format!("cargo:rustc-link-lib=static={}",
-                            &output[3..output.len() - 2]));
+        self.print(&format!("cargo:rustc-link-lib=static={}", lib_name));
         self.print(&format!("cargo:rustc-link-search=native={}", dst.display()));
 
         // Add specific C++ libraries, if enabled.
         if self.cpp {
-            if let Some(stdlib) = self.get_cpp_link_stdlib() {
+            if let Some(stdlib) = self.get_cpp_link_stdlib()? {
                 self.print(&format!("cargo:rustc-link-lib={}", stdlib));
             }
         }
+
+        Ok(())
+    }
+
+    /// Run the compiler, generating the file `output`
+    ///
+    /// The name `output` should be the name of the library.  For backwards compatibility,
+    /// the `output` may start with `lib` and end with `.a`.  The Rust compilier will create
+    /// the assembly with the lib prefix and .a extension.  MSVC will create a file without prefix,
+    /// ending with `.lib`.
+    ///
+    /// # Panics
+    ///
+    /// Panics if `output` is not formatted correctly or if one of the underlying
+    /// compiler commands fails. It can also panic if it fails reading file names
+    /// or creating directories.
+    pub fn compile(&self, output: &str) {
+        if let Err(e) = self.try_compile(output) {
+            fail(&e.message);
+        }
     }
 
     #[cfg(feature = "parallel")]
-    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) {
+    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) -> Result<(), Error> {
         use self::rayon::prelude::*;
 
         let mut cfg = rayon::Configuration::new();
         if let Ok(amt) = env::var("NUM_JOBS") {
             if let Ok(amt) = amt.parse() {
                 cfg = cfg.num_threads(amt);
             }
         }
         drop(rayon::initialize(cfg));
 
+        let results: Mutex<Vec<Result<(), Error>>> = Mutex::new(Vec::new());
+
         objs.par_iter().with_max_len(1)
-            .for_each(|&(ref src, ref dst)| self.compile_object(src, dst));
+            .for_each(|&(ref src, ref dst)| results.lock().unwrap().push(self.compile_object(src, dst)));
+
+        // Check for any errors and return the first one found.
+        for result in results.into_inner().unwrap().iter() {
+            if result.is_err() {
+                return result.clone();
+            }
+        }
+
+        Ok(())
     }
 
     #[cfg(not(feature = "parallel"))]
-    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) {
+    fn compile_objects(&self, objs: &[(PathBuf, PathBuf)]) -> Result<(), Error> {
         for &(ref src, ref dst) in objs {
-            self.compile_object(src, dst);
+            self.compile_object(src, dst)?;
         }
+        Ok(())
     }
 
-    fn compile_object(&self, file: &Path, dst: &Path) {
+    fn compile_object(&self, file: &Path, dst: &Path) -> Result<(), Error> {
         let is_asm = file.extension().and_then(|s| s.to_str()) == Some("asm");
-        let msvc = self.get_target().contains("msvc");
+        let msvc = self.get_target()?.contains("msvc");
         let (mut cmd, name) = if msvc && is_asm {
-            self.msvc_macro_assembler()
+            self.msvc_macro_assembler()?
         } else {
-            let compiler = self.get_compiler();
+            let compiler = self.try_get_compiler()?;
             let mut cmd = compiler.to_command();
             for &(ref a, ref b) in self.env.iter() {
                 cmd.env(a, b);
             }
             (cmd,
              compiler.path
                  .file_name()
-                 .unwrap()
+                 .ok_or_else(|| Error::new(ErrorKind::IOError, "Failed to get compiler path."))?
                  .to_string_lossy()
                  .into_owned())
         };
-        if msvc && is_asm {
-            cmd.arg("/Fo").arg(dst);
-        } else if msvc {
-            let mut s = OsString::from("/Fo");
-            s.push(&dst);
-            cmd.arg(s);
-        } else {
-            cmd.arg("-o").arg(&dst);
-        }
+        command_add_output_file(&mut cmd, dst, msvc, is_asm);
         cmd.arg(if msvc { "/c" } else { "-c" });
         cmd.arg(file);
 
-        run(&mut cmd, &name);
+        run(&mut cmd, &name)?;
+        Ok(())
     }
 
-    /// Run the compiler, returning the macro-expanded version of the input files.
-    ///
-    /// This is only relevant for C and C++ files.
-    pub fn expand(&self) -> Vec<u8> {
-        let compiler = self.get_compiler();
+    /// This will return a result instead of panicing; see expand() for the complete description.
+    pub fn try_expand(&self) -> Result<Vec<u8>, Error> {
+        let compiler = self.try_get_compiler()?;
         let mut cmd = compiler.to_command();
         for &(ref a, ref b) in self.env.iter() {
             cmd.env(a, b);
         }
         cmd.arg(compiler.family.expand_flag());
+
+        assert!(self.files.len() <= 1,
+                "Expand may only be called for a single file");
+
         for file in self.files.iter() {
             cmd.arg(file);
         }
 
         let name = compiler.path
             .file_name()
-            .unwrap()
+            .ok_or_else(|| Error::new(ErrorKind::IOError, "Failed to get compiler path."))?
             .to_string_lossy()
             .into_owned();
 
-        run_output(&mut cmd, &name)
+        Ok(run_output(&mut cmd, &name)?)
+    }
+
+    /// Run the compiler, returning the macro-expanded version of the input files.
+    ///
+    /// This is only relevant for C and C++ files.
+    ///
+    /// # Panics
+    /// Panics if more than one file is present in the config, or if compiler
+    /// path has an invalid file name.
+    ///
+    /// # Example
+    /// ```no_run
+    /// let out = gcc::Build::new()
+    ///                       .file("src/foo.c")
+    ///                       .expand();
+    /// ```
+    pub fn expand(&self) -> Vec<u8> {
+        match self.try_expand() {
+            Err(e) => fail(&e.message),
+            Ok(v) => v,
+        }
     }
 
     /// Get the compiler that's in use for this configuration.
     ///
     /// This function will return a `Tool` which represents the culmination
     /// of this configuration at a snapshot in time. The returned compiler can
     /// be inspected (e.g. the path, arguments, environment) to forward along to
     /// other tools, or the `to_command` method can be used to invoke the
     /// compiler itself.
     ///
     /// This method will take into account all configuration such as debug
     /// information, optimization level, include directories, defines, etc.
     /// Additionally, the compiler binary in use follows the standard
     /// conventions for this path, e.g. looking at the explicitly set compiler,
     /// environment variables (a number of which are inspected here), and then
     /// falling back to the default configuration.
+    ///
+    /// # Panics
+    ///
+    /// Panics if an error occurred while determining the architecture.
     pub fn get_compiler(&self) -> Tool {
-        let opt_level = self.get_opt_level();
-        let target = self.get_target();
+        match self.try_get_compiler() {
+            Ok(tool) => tool,
+            Err(e) => fail(&e.message),
+        }
+    }
 
-        let mut cmd = self.get_base_compiler();
+    /// Get the compiler that's in use for this configuration.
+    ///
+    /// This will return a result instead of panicing; see get_compiler() for the complete description.
+    pub fn try_get_compiler(&self) -> Result<Tool, Error> {
+        let opt_level = self.get_opt_level()?;
+        let target = self.get_target()?;
+
+        let mut cmd = self.get_base_compiler()?;
         let nvcc = cmd.path.file_name()
             .and_then(|p| p.to_str()).map(|p| p.contains("nvcc"))
             .unwrap_or(false);
 
         // Non-target flags
         // If the flag is not conditioned on target variable, it belongs here :)
         match cmd.family {
             ToolFamily::Msvc => {
@@ -597,17 +954,24 @@ impl Config {
                     "1" => cmd.args.push("/O1".into()),
                     // -O3 is a valid value for gcc and clang compilers, but not msvc. Cap to /O2.
                     "2" | "3" => cmd.args.push("/O2".into()),
                     _ => {}
                 }
             }
             ToolFamily::Gnu |
             ToolFamily::Clang => {
-                cmd.args.push(format!("-O{}", opt_level).into());
+                // arm-linux-androideabi-gcc 4.8 shipped with Android NDK does
+                // not support '-Oz'
+                if opt_level == "z" && cmd.family != ToolFamily::Clang {
+                    cmd.args.push("-Os".into());
+                } else {
+                    cmd.args.push(format!("-O{}", opt_level).into());
+                }
+
                 if !nvcc {
                     cmd.args.push("-ffunction-sections".into());
                     cmd.args.push("-fdata-sections".into());
                     if self.pic.unwrap_or(!target.contains("windows-gnu")) {
                         cmd.args.push("-fPIC".into());
                     }
                 } else if self.pic.unwrap_or(false) {
                     cmd.args.push("-Xcompiler".into());
@@ -712,17 +1076,17 @@ impl Config {
                     cmd.args.push("-march=armv7-m".into());
                 }
             }
         }
 
         if target.contains("-ios") {
             // FIXME: potential bug. iOS is always compiled with Clang, but Gcc compiler may be
             // detected instead.
-            self.ios_flags(&mut cmd);
+            self.ios_flags(&mut cmd)?;
         }
 
         if self.static_flag.unwrap_or(false) {
             cmd.args.push("-static".into());
         }
         if self.shared_flag.unwrap_or(false) {
             cmd.args.push("-shared".into());
         }
@@ -745,29 +1109,46 @@ impl Config {
             cmd.args.push(cmd.family.include_flag().into());
             cmd.args.push(directory.into());
         }
 
         for flag in self.flags.iter() {
             cmd.args.push(flag.into());
         }
 
+        for flag in self.flags_supported.iter() {
+            if self.is_flag_supported(flag).unwrap_or(false) {
+                cmd.args.push(flag.into());
+            }
+        }
+
         for &(ref key, ref value) in self.definitions.iter() {
             let lead = if let ToolFamily::Msvc = cmd.family {"/"} else {"-"};
             if let Some(ref value) = *value {
                 cmd.args.push(format!("{}D{}={}", lead, key, value).into());
             } else {
                 cmd.args.push(format!("{}D{}", lead, key).into());
             }
         }
-        cmd
+
+        if self.warnings {
+            for flag in cmd.family.warnings_flags().iter() {
+                cmd.args.push(flag.into());
+            }
+        }
+
+        if self.warnings_into_errors {
+            cmd.args.push(cmd.family.warnings_to_errors_flag().into());
+        }
+
+        Ok(cmd)
     }
 
-    fn msvc_macro_assembler(&self) -> (Command, String) {
-        let target = self.get_target();
+    fn msvc_macro_assembler(&self) -> Result<(Command, String), Error> {
+        let target = self.get_target()?;
         let tool = if target.contains("x86_64") {
             "ml64.exe"
         } else {
             "ml.exe"
         };
         let mut cmd = windows_registry::find(&target, tool).unwrap_or_else(|| self.cmd(tool));
         for directory in self.include_directories.iter() {
             cmd.arg("/I").arg(directory);
@@ -782,76 +1163,82 @@ impl Config {
 
         if target.contains("i686") || target.contains("i586") {
             cmd.arg("/safeseh");
         }
         for flag in self.flags.iter() {
             cmd.arg(flag);
         }
 
-        (cmd, tool.to_string())
+        Ok((cmd, tool.to_string()))
     }
 
-    fn assemble(&self, lib_name: &str, dst: &Path, objects: &[PathBuf]) {
+    fn assemble(&self, lib_name: &str, dst: &Path, objects: &[PathBuf]) -> Result<(), Error> {
         // Delete the destination if it exists as the `ar` tool at least on Unix
         // appends to it, which we don't want.
         let _ = fs::remove_file(&dst);
 
-        let target = self.get_target();
+        let target = self.get_target()?;
         if target.contains("msvc") {
             let mut cmd = match self.archiver {
                 Some(ref s) => self.cmd(s),
                 None => windows_registry::find(&target, "lib.exe").unwrap_or_else(|| self.cmd("lib.exe")),
             };
             let mut out = OsString::from("/OUT:");
             out.push(dst);
             run(cmd.arg(out)
                     .arg("/nologo")
                     .args(objects)
                     .args(&self.objects),
-                "lib.exe");
+                "lib.exe")?;
 
             // The Rust compiler will look for libfoo.a and foo.lib, but the
             // MSVC linker will also be passed foo.lib, so be sure that both
             // exist for now.
             let lib_dst = dst.with_file_name(format!("{}.lib", lib_name));
             let _ = fs::remove_file(&lib_dst);
-            fs::hard_link(&dst, &lib_dst)
+            match fs::hard_link(&dst, &lib_dst)
                 .or_else(|_| {
                     // if hard-link fails, just copy (ignoring the number of bytes written)
                     fs::copy(&dst, &lib_dst).map(|_| ())
-                })
-                .expect("Copying from {:?} to {:?} failed.");;
+                }) {
+                Ok(_) => (),
+                Err(_) => return Err(Error::new(ErrorKind::IOError, "Could not copy or create a hard-link to the generated lib file.")),
+            };
         } else {
-            let ar = self.get_ar();
-            let cmd = ar.file_name().unwrap().to_string_lossy();
+            let ar = self.get_ar()?;
+            let cmd = ar.file_name()
+                .ok_or_else(|| Error::new(ErrorKind::IOError, "Failed to get archiver (ar) path."))?
+                .to_string_lossy();
             run(self.cmd(&ar)
                     .arg("crs")
                     .arg(dst)
                     .args(objects)
                     .args(&self.objects),
-                &cmd);
+                &cmd)?;
         }
+
+        Ok(())
     }
 
-    fn ios_flags(&self, cmd: &mut Tool) {
+    fn ios_flags(&self, cmd: &mut Tool) -> Result<(), Error> {
         enum ArchSpec {
             Device(&'static str),
             Simulator(&'static str),
         }
 
-        let target = self.get_target();
-        let arch = target.split('-').nth(0).unwrap();
+        let target = self.get_target()?;
+        let arch = target.split('-').nth(0).ok_or_else(|| Error::new(ErrorKind::ArchitectureInvalid, "Unknown architecture for iOS target."))?;
         let arch = match arch {
             "arm" | "armv7" | "thumbv7" => ArchSpec::Device("armv7"),
             "armv7s" | "thumbv7s" => ArchSpec::Device("armv7s"),
             "arm64" | "aarch64" => ArchSpec::Device("arm64"),
             "i386" | "i686" => ArchSpec::Simulator("-m32"),
             "x86_64" => ArchSpec::Simulator("-m64"),
-            _ => fail("Unknown arch for iOS target"),
+            _ => return Err(Error::new(ErrorKind::ArchitectureInvalid, "Unknown architecture for iOS target.")),
         };
 
         let sdk = match arch {
             ArchSpec::Device(arch) => {
                 cmd.args.push("-arch".into());
                 cmd.args.push(arch.into());
                 cmd.args.push("-miphoneos-version-min=7.0".into());
                 "iphoneos"
@@ -864,96 +1251,101 @@ impl Config {
         };
 
         self.print(&format!("Detecting iOS SDK path for {}", sdk));
         let sdk_path = self.cmd("xcrun")
             .arg("--show-sdk-path")
             .arg("--sdk")
             .arg(sdk)
             .stderr(Stdio::inherit())
-            .output()
-            .unwrap()
+            .output()?
             .stdout;
 
-        let sdk_path = String::from_utf8(sdk_path).unwrap();
+        let sdk_path = match String::from_utf8(sdk_path) {
+            Ok(p) => p,
+            Err(_) => return Err(Error::new(ErrorKind::IOError, "Unable to determine iOS SDK path.")),
+        };
 
         cmd.args.push("-isysroot".into());
         cmd.args.push(sdk_path.trim().into());
+
+        Ok(())
     }
 
     fn cmd<P: AsRef<OsStr>>(&self, prog: P) -> Command {
         let mut cmd = Command::new(prog);
         for &(ref a, ref b) in self.env.iter() {
             cmd.env(a, b);
         }
         cmd
     }
 
-    fn get_base_compiler(&self) -> Tool {
+    fn get_base_compiler(&self) -> Result<Tool, Error> {
         if let Some(ref c) = self.compiler {
-            return Tool::new(c.clone());
+            return Ok(Tool::new(c.clone()));
         }
-        let host = self.get_host();
-        let target = self.get_target();
+        let host = self.get_host()?;
+        let target = self.get_target()?;
         let (env, msvc, gnu) = if self.cpp {
             ("CXX", "cl.exe", "g++")
         } else {
             ("CC", "cl.exe", "gcc")
         };
 
         let default = if host.contains("solaris") {
             // In this case, c++/cc unlikely to exist or be correct.
             gnu
         } else if self.cpp {
             "c++"
         } else {
             "cc"
         };
 
-        self.env_tool(env)
+        let tool_opt: Option<Tool> = self.env_tool(env)
             .map(|(tool, args)| {
                 let mut t = Tool::new(PathBuf::from(tool));
                 for arg in args {
                     t.args.push(arg.into());
                 }
                 t
             })
             .or_else(|| {
                 if target.contains("emscripten") {
-                    //Windows uses bat file so we have to be a bit more specific
                     let tool = if self.cpp {
-                        if cfg!(windows) {
-                            "em++.bat"
-                        } else {
-                            "em++"
-                        }
+                        "em++"
                     } else {
-                        if cfg!(windows) {
-                            "emcc.bat"
-                        } else {
-                            "emcc"
-                        }
+                        "emcc"
                     };
-
-                    Some(Tool::new(PathBuf::from(tool)))
+                    // Windows uses bat file so we have to be a bit more specific
+                    if cfg!(windows) {
+                        let mut t = Tool::new(PathBuf::from("cmd"));
+                        t.args.push("/c".into());
+                        t.args.push(format!("{}.bat", tool).into());
+                        Some(t)
+                    } else {
+                        Some(Tool::new(PathBuf::from(tool)))
+                    }
                 } else {
                     None
                 }
             })
-            .or_else(|| windows_registry::find_tool(&target, "cl.exe"))
-            .unwrap_or_else(|| {
+            .or_else(|| windows_registry::find_tool(&target, "cl.exe"));
+
+        let tool = match tool_opt {
+            Some(t) => t,
+            None => {
                 let compiler = if host.contains("windows") && target.contains("windows") {
                     if target.contains("msvc") {
                         msvc.to_string()
                     } else {
                         format!("{}.exe", gnu)
                     }
                 } else if target.contains("android") {
                     format!("{}-{}", target.replace("armv7", "arm"), gnu)
-                } else if self.get_host() != target {
+                } else if self.get_host()? != target {
                     // CROSS_COMPILE is of the form: "arm-linux-gnueabi-"
                     let cc_env = self.getenv("CROSS_COMPILE");
                     let cross_compile = cc_env.as_ref().map(|s| s.trim_right_matches('-'));
                     let prefix = cross_compile.or(match &target[..] {
                         "aarch64-unknown-linux-gnu" => Some("aarch64-linux-gnu"),
                         "arm-unknown-linux-gnueabi" => Some("arm-linux-gnueabi"),
                         "arm-frc-linux-gnueabi" => Some("arm-frc-linux-gnueabi"),
                         "arm-unknown-linux-gnueabihf" => Some("arm-linux-gnueabihf"),
@@ -991,135 +1383,168 @@ impl Config {
                     match prefix {
                         Some(prefix) => format!("{}-{}", prefix, gnu),
                         None => default.to_string(),
                     }
                 } else {
                     default.to_string()
                 };
                 Tool::new(PathBuf::from(compiler))
-            })
+            }
+        };
+
+        Ok(tool)
     }
 
-    fn get_var(&self, var_base: &str) -> Result<String, String> {
-        let target = self.get_target();
-        let host = self.get_host();
+    fn get_var(&self, var_base: &str) -> Result<String, Error> {
+        let target = self.get_target()?;
+        let host = self.get_host()?;
         let kind = if host == target { "HOST" } else { "TARGET" };
         let target_u = target.replace("-", "_");
         let res = self.getenv(&format!("{}_{}", var_base, target))
             .or_else(|| self.getenv(&format!("{}_{}", var_base, target_u)))
             .or_else(|| self.getenv(&format!("{}_{}", kind, var_base)))
             .or_else(|| self.getenv(var_base));
 
         match res {
             Some(res) => Ok(res),
-            None => Err("could not get environment variable".to_string()),
+            None => Err(Error::new(ErrorKind::EnvVarNotFound, &format!("Could not find environment variable {}.", var_base))),
         }
     }
 
     fn envflags(&self, name: &str) -> Vec<String> {
         self.get_var(name)
             .unwrap_or(String::new())
             .split(|c: char| c.is_whitespace())
             .filter(|s| !s.is_empty())
             .map(|s| s.to_string())
             .collect()
     }
 
     fn env_tool(&self, name: &str) -> Option<(String, Vec<String>)> {
         self.get_var(name).ok().map(|tool| {
-            let whitelist = ["ccache", "distcc"];
+            let whitelist = ["ccache", "distcc", "sccache"];
             for t in whitelist.iter() {
                 if tool.starts_with(t) && tool[t.len()..].starts_with(' ') {
                     return (t.to_string(), vec![tool[t.len()..].trim_left().to_string()]);
                 }
             }
             (tool, Vec::new())
         })
     }
 
     /// Returns the default C++ standard library for the current target: `libc++`
     /// for OS X and `libstdc++` for anything else.
-    fn get_cpp_link_stdlib(&self) -> Option<String> {
-        self.cpp_link_stdlib.clone().unwrap_or_else(|| {
-            let target = self.get_target();
-            if target.contains("msvc") {
-                None
-            } else if target.contains("darwin") {
-                Some("c++".to_string())
-            } else if target.contains("freebsd") {
-                Some("c++".to_string())
-            } else {
-                Some("stdc++".to_string())
+    fn get_cpp_link_stdlib(&self) -> Result<Option<String>, Error> {
+        match self.cpp_link_stdlib.clone() {
+            Some(s) => Ok(s),
+            None => {
+                let target = self.get_target()?;
+                if target.contains("msvc") {
+                    Ok(None)
+                } else if target.contains("darwin") {
+                    Ok(Some("c++".to_string()))
+                } else if target.contains("freebsd") {
+                    Ok(Some("c++".to_string()))
+                } else {
+                    Ok(Some("stdc++".to_string()))
+                }
+            },
+        }
+    }
+
+    fn get_ar(&self) -> Result<PathBuf, Error> {
+        match self.archiver
+            .clone()
+            .or_else(|| self.get_var("AR").map(PathBuf::from).ok()) {
+                Some(p) => Ok(p),
+                None => {
+                    if self.get_target()?.contains("android") {
+                        Ok(PathBuf::from(format!("{}-ar", self.get_target()?.replace("armv7", "arm"))))
+                    } else if self.get_target()?.contains("emscripten") {
+                        //Windows use bat files so we have to be a bit more specific
+                        let tool = if cfg!(windows) {
+                            "emar.bat"
+                        } else {
+                            "emar"
+                        };
+
+                        Ok(PathBuf::from(tool))
+                    } else {
+                        Ok(PathBuf::from("ar"))
+                    }
+                }
+            }
+    }
+
+    fn get_target(&self) -> Result<String, Error> {
+        match self.target.clone() {
+            Some(t) => Ok(t),
+            None => Ok(self.getenv_unwrap("TARGET")?),
+        }
+    }
+
+    fn get_host(&self) -> Result<String, Error> {
+        match self.host.clone() {
+            Some(h) => Ok(h),
+            None => Ok(self.getenv_unwrap("HOST")?),
+        }
+    }
+
+    fn get_opt_level(&self) -> Result<String, Error> {
+        match self.opt_level.as_ref().cloned() {
+            Some(ol) => Ok(ol),
+            None => Ok(self.getenv_unwrap("OPT_LEVEL")?),
+        }
+    }
+
+    fn get_debug(&self) -> bool {
+        self.debug.unwrap_or_else(|| {
+            match self.getenv("DEBUG") {
+                Some(s) => s != "false",
+                None => false,
             }
         })
     }
 
-    fn get_ar(&self) -> PathBuf {
-        self.archiver
-            .clone()
-            .or_else(|| self.get_var("AR").map(PathBuf::from).ok())
-            .unwrap_or_else(|| {
-                if self.get_target().contains("android") {
-                    PathBuf::from(format!("{}-ar", self.get_target().replace("armv7", "arm")))
-                } else if self.get_target().contains("emscripten") {
-                    //Windows use bat files so we have to be a bit more specific
-                    let tool = if cfg!(windows) {
-                        "emar.bat"
-                    } else {
-                        "emar"
-                    };
-
-                    PathBuf::from(tool)
-                } else {
-                    PathBuf::from("ar")
-                }
-            })
-    }
-
-    fn get_target(&self) -> String {
-        self.target.clone().unwrap_or_else(|| self.getenv_unwrap("TARGET"))
-    }
-
-    fn get_host(&self) -> String {
-        self.host.clone().unwrap_or_else(|| self.getenv_unwrap("HOST"))
-    }
-
-    fn get_opt_level(&self) -> String {
-        self.opt_level.as_ref().cloned().unwrap_or_else(|| self.getenv_unwrap("OPT_LEVEL"))
-    }
-
-    fn get_debug(&self) -> bool {
-        self.debug.unwrap_or_else(|| self.getenv_unwrap("PROFILE") == "debug")
-    }
-
-    fn get_out_dir(&self) -> PathBuf {
-        self.out_dir.clone().unwrap_or_else(|| env::var_os("OUT_DIR").map(PathBuf::from).unwrap())
+    fn get_out_dir(&self) -> Result<PathBuf, Error> {
+        match self.out_dir.clone() {
+            Some(p) => Ok(p),
+            None => Ok(env::var_os("OUT_DIR")
+                .map(PathBuf::from)
+                .ok_or_else(|| Error::new(ErrorKind::EnvVarNotFound, "Environment variable OUT_DIR not defined."))?),
+        }
     }
 
     fn getenv(&self, v: &str) -> Option<String> {
         let r = env::var(v).ok();
         self.print(&format!("{} = {:?}", v, r));
         r
     }
 
-    fn getenv_unwrap(&self, v: &str) -> String {
+    fn getenv_unwrap(&self, v: &str) -> Result<String, Error> {
         match self.getenv(v) {
-            Some(s) => s,
-            None => fail(&format!("environment variable `{}` not defined", v)),
+            Some(s) => Ok(s),
+            None => Err(Error::new(ErrorKind::EnvVarNotFound, &format!("Environment variable {} not defined.", v.to_string()))),
         }
     }
 
     fn print(&self, s: &str) {
         if self.cargo_metadata {
             println!("{}", s);
         }
     }
 }
 
+impl Default for Build {
+    fn default() -> Build {
+        Build::new()
+    }
+}
+
 impl Tool {
     fn new(path: PathBuf) -> Tool {
         // Try to detect family of the tool from its name, falling back to Gnu.
         let family = if let Some(fname) = path.file_name().and_then(|p| p.to_str()) {
             if fname.contains("clang") {
                 ToolFamily::Clang
             } else if fname.contains("cl") && !fname.contains("uclibc") {
                 ToolFamily::Msvc
@@ -1169,72 +1594,91 @@ impl Tool {
     /// operate.
     ///
     /// This is typically only used for MSVC compilers currently.
     pub fn env(&self) -> &[(OsString, OsString)] {
         &self.env
     }
 }
 
-fn run(cmd: &mut Command, program: &str) {
-    let (mut child, print) = spawn(cmd, program);
-    let status = child.wait().expect("failed to wait on child process");
+fn run(cmd: &mut Command, program: &str) -> Result<(), Error> {
+    let (mut child, print) = spawn(cmd, program)?;
+    let status = match child.wait() {
+        Ok(s) => s,
+        Err(_) => return Err(Error::new(ErrorKind::ToolExecError, &format!("Failed to wait on spawned child process, command {:?} with args {:?}.", cmd, program))),
+    };
     print.join().unwrap();
     println!("{}", status);
-    if !status.success() {
-        fail(&format!("command did not execute successfully, got: {}", status));
+
+    if status.success() {
+        Ok(())
+    } else {
+        Err(Error::new(ErrorKind::ToolExecError, &format!("Command {:?} with args {:?} did not execute successfully (status code {}).", cmd, program, status)))
     }
 }
 
-fn run_output(cmd: &mut Command, program: &str) -> Vec<u8> {
+fn run_output(cmd: &mut Command, program: &str) -> Result<Vec<u8>, Error> {
     cmd.stdout(Stdio::piped());
-    let (mut child, print) = spawn(cmd, program);
+    let (mut child, print) = spawn(cmd, program)?;
     let mut stdout = vec![];
     child.stdout.take().unwrap().read_to_end(&mut stdout).unwrap();
-    let status = child.wait().expect("failed to wait on child process");
+    let status = match child.wait() {
+        Ok(s) => s,
+        Err(_) => return Err(Error::new(ErrorKind::ToolExecError, &format!("Failed to wait on spawned child process, command {:?} with args {:?}.", cmd, program))),
+    };
     print.join().unwrap();
     println!("{}", status);
-    if !status.success() {
-        fail(&format!("command did not execute successfully, got: {}", status));
+
+    if status.success() {
+        Ok(stdout)
+    } else {
+        Err(Error::new(ErrorKind::ToolExecError, &format!("Command {:?} with args {:?} did not execute successfully (status code {}).", cmd, program, status)))
     }
-    stdout
 }
 
-fn spawn(cmd: &mut Command, program: &str) -> (Child, JoinHandle<()>) {
+fn spawn(cmd: &mut Command, program: &str) -> Result<(Child, JoinHandle<()>), Error> {
     println!("running: {:?}", cmd);
 
     // Capture the standard error coming from these programs, and write it out
     // with cargo:warning= prefixes. Note that this is a bit wonky to avoid
     // requiring the output to be UTF-8, we instead just ship bytes from one
     // location to another.
     match cmd.stderr(Stdio::piped()).spawn() {
         Ok(mut child) => {
             let stderr = BufReader::new(child.stderr.take().unwrap());
             let print = thread::spawn(move || {
                 for line in stderr.split(b'\n').filter_map(|l| l.ok()) {
                     print!("cargo:warning=");
                     std::io::stdout().write_all(&line).unwrap();
                     println!("");
                 }
             });
-            (child, print)
+            Ok((child, print))
         }
         Err(ref e) if e.kind() == io::ErrorKind::NotFound => {
             let extra = if cfg!(windows) {
                 " (see https://github.com/alexcrichton/gcc-rs#compile-time-requirements \
                    for help)"
             } else {
                 ""
             };
-            fail(&format!("failed to execute command: {}\nIs `{}` \
-                           not installed?{}",
-                          e,
-                          program,
-                          extra));
+            Err(Error::new(ErrorKind::ToolNotFound, &format!("Failed to find tool. Is `{}` installed?{}", program, extra)))
         }
-        Err(e) => fail(&format!("failed to execute command: {}", e)),
+        Err(_) => Err(Error::new(ErrorKind::ToolExecError, &format!("Command {:?} with args {:?} failed to start.", cmd, program))),
     }
 }
 
 fn fail(s: &str) -> ! {
-    println!("\n\n{}\n\n", s);
-    panic!()
+    panic!("\n\nInternal error occurred: {}\n\n", s)
 }
+
+
+fn command_add_output_file(cmd: &mut Command, dst: &Path, msvc: bool, is_asm: bool) {
+    if msvc && is_asm {
+        cmd.arg("/Fo").arg(dst);
+    } else if msvc {
+        let mut s = OsString::from("/Fo");
+        s.push(&dst);
+        cmd.arg(s);
+    } else {
+        cmd.arg("-o").arg(&dst);
+    }
+}
--- a/third_party/rust/gcc/src/winapi.rs
+++ b/third_party/rust/gcc/src/winapi.rs
@@ -62,18 +62,18 @@ pub struct FILETIME {
     pub dwLowDateTime: DWORD,
     pub dwHighDateTime: DWORD,
 }
 
 pub trait Interface {
     fn uuidof() -> GUID;
 }
 
-#[link(name = "Ole32")]
-#[link(name = "OleAut32")]
+#[link(name = "ole32")]
+#[link(name = "oleaut32")]
 extern { }
 
 extern "system" {
     pub fn CoInitializeEx(pvReserved: LPVOID, dwCoInit: DWORD) -> HRESULT;
     pub fn CoCreateInstance(rclsid: REFCLSID, pUnkOuter: LPUNKNOWN,
                             dwClsContext: DWORD, riid: REFIID,
                             ppv: *mut LPVOID) -> HRESULT;
     pub fn SysFreeString(bstrString: BSTR);
--- a/third_party/rust/gcc/src/windows_registry.rs
+++ b/third_party/rust/gcc/src/windows_registry.rs
@@ -82,16 +82,17 @@ pub fn find_tool(target: &str, tool: &st
 
     return impl_::find_msvc_15(tool, target)
         .or_else(|| impl_::find_msvc_14(tool, target))
         .or_else(|| impl_::find_msvc_12(tool, target))
         .or_else(|| impl_::find_msvc_11(tool, target));
 }
 
 /// A version of Visual Studio
+#[derive(Debug, PartialEq, Eq, Copy, Clone)]
 pub enum VsVers {
     /// Visual Studio 12 (2013)
     Vs12,
     /// Visual Studio 14 (2015)
     Vs14,
     /// Visual Studio 15 (2017)
     Vs15,
 
--- a/third_party/rust/gcc/tests/support/mod.rs
+++ b/third_party/rust/gcc/tests/support/mod.rs
@@ -31,17 +31,17 @@ impl Test {
             td: TempDir::new("gcc-test").unwrap(),
             gcc: gcc,
             msvc: false,
         }
     }
 
     pub fn gnu() -> Test {
         let t = Test::new();
-        t.shim("cc").shim("ar");
+        t.shim("cc").shim("c++").shim("ar");
         t
     }
 
     pub fn msvc() -> Test {
         let mut t = Test::new();
         t.shim("cl").shim("lib.exe");
         t.msvc = true;
         t
@@ -50,18 +50,18 @@ impl Test {
     pub fn shim(&self, name: &str) -> &Test {
         let fname = format!("{}{}", name, env::consts::EXE_SUFFIX);
         fs::hard_link(&self.gcc, self.td.path().join(&fname))
             .or_else(|_| fs::copy(&self.gcc, self.td.path().join(&fname)).map(|_| ()))
             .unwrap();
         self
     }
 
-    pub fn gcc(&self) -> gcc::Config {
-        let mut cfg = gcc::Config::new();
+    pub fn gcc(&self) -> gcc::Build {
+        let mut cfg = gcc::Build::new();
         let mut path = env::split_paths(&env::var_os("PATH").unwrap()).collect::<Vec<_>>();
         path.insert(0, self.td.path().to_owned());
         let target = if self.msvc {
             "x86_64-pc-windows-msvc"
         } else {
             "x86_64-unknown-linux-gnu"
         };
 
--- a/third_party/rust/gcc/tests/test.rs
+++ b/third_party/rust/gcc/tests/test.rs
@@ -5,17 +5,17 @@ use support::Test;
 
 mod support;
 
 #[test]
 fn gnu_smoke() {
     let test = Test::gnu();
     test.gcc()
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("-O2")
         .must_have("foo.c")
         .must_not_have("-g")
         .must_have("-c")
         .must_have("-ffunction-sections")
         .must_have("-fdata-sections");
@@ -23,59 +23,82 @@ fn gnu_smoke() {
 }
 
 #[test]
 fn gnu_opt_level_1() {
     let test = Test::gnu();
     test.gcc()
         .opt_level(1)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("-O1")
         .must_not_have("-O2");
 }
 
 #[test]
 fn gnu_opt_level_s() {
     let test = Test::gnu();
     test.gcc()
         .opt_level_str("s")
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("-Os")
         .must_not_have("-O1")
         .must_not_have("-O2")
         .must_not_have("-O3")
         .must_not_have("-Oz");
 }
 
 #[test]
 fn gnu_debug() {
     let test = Test::gnu();
     test.gcc()
         .debug(true)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
     test.cmd(0).must_have("-g");
 }
 
 #[test]
+fn gnu_warnings_into_errors() {
+    let test = Test::gnu();
+    test.gcc()
+        .warnings_into_errors(true)
+        .file("foo.c")
+        .compile("foo");
+
+    test.cmd(0).must_have("-Werror");
+}
+
+#[test]
+fn gnu_warnings() {
+    let test = Test::gnu();
+    test.gcc()
+        .warnings(true)
+        .file("foo.c")
+        .compile("foo");
+
+    test.cmd(0).must_have("-Wall")
+               .must_have("-Wextra");
+}
+
+#[test]
 fn gnu_x86_64() {
     for vendor in &["unknown-linux-gnu", "apple-darwin"] {
         let target = format!("x86_64-{}", vendor);
         let test = Test::gnu();
         test.gcc()
             .target(&target)
             .host(&target)
             .file("foo.c")
-            .compile("libfoo.a");
+            .compile("foo");
 
         test.cmd(0)
             .must_have("-fPIC")
             .must_have("-m64");
     }
 }
 
 #[test]
@@ -83,198 +106,233 @@ fn gnu_x86_64_no_pic() {
     for vendor in &["unknown-linux-gnu", "apple-darwin"] {
         let target = format!("x86_64-{}", vendor);
         let test = Test::gnu();
         test.gcc()
             .pic(false)
             .target(&target)
             .host(&target)
             .file("foo.c")
-            .compile("libfoo.a");
+            .compile("foo");
 
         test.cmd(0).must_not_have("-fPIC");
     }
 }
 
 #[test]
 fn gnu_i686() {
     for vendor in &["unknown-linux-gnu", "apple-darwin"] {
         let target = format!("i686-{}", vendor);
         let test = Test::gnu();
         test.gcc()
             .target(&target)
             .host(&target)
             .file("foo.c")
-            .compile("libfoo.a");
+            .compile("foo");
 
         test.cmd(0)
             .must_have("-m32");
     }
 }
 
 #[test]
 fn gnu_i686_pic() {
     for vendor in &["unknown-linux-gnu", "apple-darwin"] {
         let target = format!("i686-{}", vendor);
         let test = Test::gnu();
         test.gcc()
             .pic(true)
             .target(&target)
             .host(&target)
             .file("foo.c")
-            .compile("libfoo.a");
+            .compile("foo");
 
         test.cmd(0).must_have("-fPIC");
     }
 }
 
 #[test]
 fn gnu_set_stdlib() {
     let test = Test::gnu();
     test.gcc()
         .cpp_set_stdlib(Some("foo"))
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_not_have("-stdlib=foo");
 }
 
 #[test]
 fn gnu_include() {
     let test = Test::gnu();
     test.gcc()
         .include("foo/bar")
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("-I").must_have("foo/bar");
 }
 
 #[test]
 fn gnu_define() {
     let test = Test::gnu();
     test.gcc()
-        .define("FOO", Some("bar"))
+        .define("FOO", "bar")
         .define("BAR", None)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("-DFOO=bar").must_have("-DBAR");
 }
 
 #[test]
 fn gnu_compile_assembly() {
     let test = Test::gnu();
     test.gcc()
         .file("foo.S")
-        .compile("libfoo.a");
+        .compile("foo");
     test.cmd(0).must_have("foo.S");
 }
 
 #[test]
 fn gnu_shared() {
     let test = Test::gnu();
     test.gcc()
         .file("foo.c")
         .shared_flag(true)
         .static_flag(false)
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("-shared")
         .must_not_have("-static");
 }
 
 #[test]
+fn gnu_flag_if_supported() {
+    if cfg!(windows) {
+        return
+    }
+    let test = Test::gnu();
+    test.gcc()
+        .file("foo.c")
+        .flag_if_supported("-Wall")
+        .flag_if_supported("-Wflag-does-not-exist")
+        .flag_if_supported("-std=c++11")
+        .compile("foo");
+
+    test.cmd(0)
+        .must_have("-Wall")
+        .must_not_have("-Wflag-does-not-exist")
+        .must_not_have("-std=c++11");
+}
+
+#[test]
+fn gnu_flag_if_supported_cpp() {
+    if cfg!(windows) {
+        return
+    }
+    let test = Test::gnu();
+    test.gcc()
+        .cpp(true)
+        .file("foo.cpp")
+        .flag_if_supported("-std=c++11")
+        .compile("foo");
+
+    test.cmd(0)
+        .must_have("-std=c++11");
+}
+
+#[test]
 fn gnu_static() {
     let test = Test::gnu();
     test.gcc()
         .file("foo.c")
         .shared_flag(false)
         .static_flag(true)
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("-static")
         .must_not_have("-shared");
 }
 
 #[test]
 fn msvc_smoke() {
     let test = Test::msvc();
     test.gcc()
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0)
         .must_have("/O2")
         .must_have("foo.c")
         .must_not_have("/Z7")
         .must_have("/c")
         .must_have("/MD");
     test.cmd(1).must_have(test.td.path().join("foo.o"));
 }
 
 #[test]
 fn msvc_opt_level_0() {
     let test = Test::msvc();
     test.gcc()
         .opt_level(0)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_not_have("/O2");
 }
 
 #[test]
 fn msvc_debug() {
     let test = Test::msvc();
     test.gcc()
         .debug(true)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
     test.cmd(0).must_have("/Z7");
 }
 
 #[test]
 fn msvc_include() {
     let test = Test::msvc();
     test.gcc()
         .include("foo/bar")
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("/I").must_have("foo/bar");
 }
 
 #[test]
 fn msvc_define() {
     let test = Test::msvc();
     test.gcc()
-        .define("FOO", Some("bar"))
+        .define("FOO", "bar")
         .define("BAR", None)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("/DFOO=bar").must_have("/DBAR");
 }
 
 #[test]
 fn msvc_static_crt() {
     let test = Test::msvc();
     test.gcc()
         .static_crt(true)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("/MT");
 }
 
 #[test]
 fn msvc_no_static_crt() {
     let test = Test::msvc();
     test.gcc()
         .static_crt(false)
         .file("foo.c")
-        .compile("libfoo.a");
+        .compile("foo");
 
     test.cmd(0).must_have("/MD");
 }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"a1cad0121fd4c6507c8b709fee344367ea73eff40915c2fd6a6108762c84f8f2","Cargo.toml":"b598bd90e0cda5d1d3cec4042310a9e74afbe398a76af48e0d43ea5d3c51f137","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"c305f498e6d89730d84eaf92e980ba001e259dd40fcb40855947baece2af0895","appveyor.yml":"68c8ff7090ffdfa42b3d65b841d5de67d47a2206e02bf97aaca34b4500ae4bf1","src/core_lazy.rs":"2cea85ad0c2c4f88a5a927815a59270411daa4075510fad0faf671d5f5130fed","src/lazy.rs":"52912a897e8fcc95672e3b3068be82d56548f422edcb60e6ce9570779acb5bc0","src/lib.rs":"facd354cb716ee6941bf9bc8d34c27a2ecd752746c4d5164dbec8cedd80df605","src/nightly_lazy.rs":"34080822b27f3968c872867131448df76acc5aeff259852ff86f6e73b5a913b6","tests/compile-fail/README.md":"296216a459b7bf9947ba540c94b71a48ec90c2632ef5f05248a01dc8611ae149","tests/compile-fail/incorrect_visibility_restriction.rs":"557c94f781d6a2fb6c4be32a2ea252752195ff7b7c889581d95c39f2ce45e7d3","tests/compile-fail/static_is_private.rs":"f778f0759529b2dc8360f9abad1e09ea6662493493d707b3fba6cb1cb3d94af2","tests/compile-fail/static_is_sized.rs":"3b6d632f764ccee5fbd413324d7daeb2ab52dec0c99ea1db11a7eb2bbcad37cb","tests/compile-fail/static_never_used.rs":"5139e2459b4c68b0ed3f5a04452f60895b076acb1b5f344fb6b8ccbd50283a2d","tests/compile_tests.rs":"5710b2c0edc7623b895d67c26180a6c1d4022c154ecd616fab449afc9ba95109","tests/no_std.rs":"2a5236bd3892a253855b4dc192f63138239165fa23b9c3421a9faa5482c780aa","tests/test.rs":"12b100f4790037ca049692d896114d6361373c5321c29e0032c290ee39f1042c"},"package":"76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/.travis.yml
@@ -0,0 +1,31 @@
+language: rust
+rust:
+- nightly
+- beta
+- stable
+before_script:
+- |
+  pip install 'travis-cargo<0.2' --user &&
+  export PATH=`python -m site --user-base`/bin:$PATH
+script:
+- |
+  travis-cargo build &&
+  travis-cargo test &&
+  travis-cargo bench &&
+  travis-cargo --only nightly build -- --features spin_no_std &&
+  travis-cargo --only nightly test -- --features spin_no_std &&
+  travis-cargo --only nightly bench -- --features spin_no_std &&
+  travis-cargo --only nightly clean &&
+  travis-cargo --only nightly build -- --features compiletest &&
+  travis-cargo --only nightly test -- --features compiletest &&
+  travis-cargo --only nightly clean &&
+  travis-cargo --only stable doc
+after_success:
+- travis-cargo --only stable doc-upload
+env:
+  global:
+  - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
+  - secure: YXu24LptjeYirjWYjWGsMT2m3mB7LvQATE6TVo7VEUXv8GYoy2ORIHD83PeImxC93MmZ01QeUezRzuCW51ZcK92VnNSBttlF60SvIX18VsJrV92tsAhievFstqYQ+fB8DIuQ8noU0jPz7GpI+R9dlTRSImAqWOnVIghA+Wzz7Js=
+os:
+  - linux
+  - osx
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/Cargo.toml
@@ -0,0 +1,43 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "lazy_static"
+version = "0.2.11"
+authors = ["Marvin Löbel <loebel.marvin@gmail.com>"]
+description = "A macro for declaring lazily evaluated statics in Rust."
+documentation = "https://docs.rs/lazy_static"
+readme = "README.md"
+keywords = ["macro", "lazy", "static"]
+categories = ["no-std", "rust-patterns", "memory-management"]
+license = "MIT/Apache-2.0"
+repository = "https://github.com/rust-lang-nursery/lazy-static.rs"
+[dependencies.compiletest_rs]
+version = "0.3"
+optional = true
+
+[dependencies.spin]
+version = "0.4.6"
+optional = true
+
+[features]
+compiletest = ["compiletest_rs"]
+nightly = []
+spin_no_std = ["nightly", "spin"]
+[badges.appveyor]
+repository = "rust-lang-nursery/lazy-static.rs"
+
+[badges.maintenance]
+status = "passively-maintained"
+
+[badges.travis-ci]
+repository = "rust-lang-nursery/lazy-static.rs"
copy from third_party/rust/gcc-0.3.42/LICENSE-APACHE
copy to third_party/rust/lazy_static-0.2.11/LICENSE-APACHE
rename from third_party/rust/lazy_static-0.2.8/LICENSE-MIT
rename to third_party/rust/lazy_static-0.2.11/LICENSE-MIT
rename from third_party/rust/lazy_static-0.2.9/README.md
rename to third_party/rust/lazy_static-0.2.11/README.md
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/appveyor.yml
@@ -0,0 +1,59 @@
+environment:
+  global:
+    PROJECT_NAME: lazy_static
+    # When this was added there were revocation check failures when using the
+    # libcurl backend as libcurl checks by default, but rustup doesn't provide the
+    # switch to turn this off. Switch to Hyper which looks to not check for
+    # revocation by default like libcurl does.
+    RUSTUP_USE_REQWEST: 1
+    CARGO_HTTP_CHECK_REVOKE: false
+  matrix:
+    # Stable channel
+    - TARGET: i686-pc-windows-gnu
+      CHANNEL: stable
+    - TARGET: i686-pc-windows-msvc
+      CHANNEL: stable
+    - TARGET: x86_64-pc-windows-gnu
+      CHANNEL: stable
+    - TARGET: x86_64-pc-windows-msvc
+      CHANNEL: stable
+    # Beta channel
+    - TARGET: i686-pc-windows-gnu
+      CHANNEL: beta
+    - TARGET: i686-pc-windows-msvc
+      CHANNEL: beta
+    - TARGET: x86_64-pc-windows-gnu
+      CHANNEL: beta
+    - TARGET: x86_64-pc-windows-msvc
+      CHANNEL: beta
+    # Nightly channel
+    - TARGET: i686-pc-windows-gnu
+      CHANNEL: nightly
+    - TARGET: i686-pc-windows-msvc
+      CHANNEL: nightly
+    - TARGET: x86_64-pc-windows-gnu
+      CHANNEL: nightly
+    - TARGET: x86_64-pc-windows-msvc
+      CHANNEL: nightly
+
+# Install Rust and Cargo
+# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
+install:
+  - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
+  - rustup-init.exe -y --default-toolchain %CHANNEL% --default-host %TARGET%
+  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
+  - if "%TARGET%" == "i686-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw32\bin
+  - if "%TARGET%" == "x86_64-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw64\bin
+  - rustc -V
+  - cargo -V
+
+build: false
+
+test_script:
+  - cargo build --verbose
+  - cargo test
+  - if [%CHANNEL%]==[nightly] (
+      cargo clean &&
+      cargo build --verbose --features "compiletest" &&
+      cargo test --features "compiletest"
+    )
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/src/core_lazy.rs
@@ -0,0 +1,33 @@
+// Copyright 2016 lazy-static.rs Developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+
+extern crate spin;
+
+use self::spin::Once;
+
+pub struct Lazy<T: Sync>(Once<T>);
+
+impl<T: Sync> Lazy<T> {
+    #[inline(always)]
+    pub const fn new() -> Self {
+        Lazy(Once::new())
+    }
+
+    #[inline(always)]
+    pub fn get<F>(&'static self, builder: F) -> &T
+        where F: FnOnce() -> T
+    {
+        self.0.call_once(builder)
+    }
+}
+
+#[macro_export]
+macro_rules! __lazy_static_create {
+    ($NAME:ident, $T:ty) => {
+        static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::new();
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/src/lazy.rs
@@ -0,0 +1,39 @@
+// Copyright 2016 lazy-static.rs Developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+
+extern crate std;
+
+use self::std::prelude::v1::*;
+use self::std::sync::Once;
+pub use self::std::sync::ONCE_INIT;
+
+pub struct Lazy<T: Sync>(pub *const T, pub Once);
+
+impl<T: Sync> Lazy<T> {
+    #[inline(always)]
+    pub fn get<F>(&'static mut self, f: F) -> &T
+        where F: FnOnce() -> T
+    {
+        unsafe {
+            let r = &mut self.0;
+            self.1.call_once(|| {
+                *r = Box::into_raw(Box::new(f()));
+            });
+
+            &*self.0
+        }
+    }
+}
+
+unsafe impl<T: Sync> Sync for Lazy<T> {}
+
+#[macro_export]
+macro_rules! __lazy_static_create {
+    ($NAME:ident, $T:ty) => {
+        static mut $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy(0 as *const $T, $crate::lazy::ONCE_INIT);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/src/lib.rs
@@ -0,0 +1,212 @@
+// Copyright 2016 lazy-static.rs Developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+
+/*!
+A macro for declaring lazily evaluated statics.
+
+Using this macro, it is possible to have `static`s that require code to be
+executed at runtime in order to be initialized.
+This includes anything requiring heap allocations, like vectors or hash maps,
+as well as anything that requires function calls to be computed.
+
+# Syntax
+
+```ignore
+lazy_static! {
+    [pub] static ref NAME_1: TYPE_1 = EXPR_1;
+    [pub] static ref NAME_2: TYPE_2 = EXPR_2;
+    ...
+    [pub] static ref NAME_N: TYPE_N = EXPR_N;
+}
+```
+
+Attributes (including doc comments) are supported as well:
+
+```rust
+# #[macro_use]
+# extern crate lazy_static;
+# fn main() {
+lazy_static! {
+    /// This is an example for using doc comment attributes
+    static ref EXAMPLE: u8 = 42;
+}
+# }
+```
+
+# Semantics
+
+For a given `static ref NAME: TYPE = EXPR;`, the macro generates a unique type that
+implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Attributes end up
+attaching to this type.)
+
+On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
+can return a reference to the same object. Note that this can lead to deadlocks
+if you have multiple lazy statics that depend on each other in their initialization.
+
+Apart from the lazy initialization, the resulting "static ref" variables
+have generally the same properties as regular "static" variables:
+
+- Any type in them needs to fulfill the `Sync` trait.
+- If the type has a destructor, then it will not run when the process exits.
+
+# Example
+
+Using the macro:
+
+```rust
+#[macro_use]
+extern crate lazy_static;
+
+use std::collections::HashMap;
+
+lazy_static! {
+    static ref HASHMAP: HashMap<u32, &'static str> = {
+        let mut m = HashMap::new();
+        m.insert(0, "foo");
+        m.insert(1, "bar");
+        m.insert(2, "baz");
+        m
+    };
+    static ref COUNT: usize = HASHMAP.len();
+    static ref NUMBER: u32 = times_two(21);
+}
+
+fn times_two(n: u32) -> u32 { n * 2 }
+
+fn main() {
+    println!("The map has {} entries.", *COUNT);
+    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
+    println!("A expensive calculation on a static results in: {}.", *NUMBER);
+}
+```
+
+# Implementation details
+
+The `Deref` implementation uses a hidden static variable that is guarded by a atomic check on each access. On stable Rust, the macro may need to allocate each static on the heap.
+
+*/
+
+#![cfg_attr(feature="spin_no_std", feature(const_fn))]
+#![cfg_attr(feature="nightly", feature(unreachable))]
+
+#![doc(html_root_url = "https://docs.rs/lazy_static/0.2.11")]
+#![no_std]
+
+#[cfg(not(feature="nightly"))]
+#[doc(hidden)]
+pub mod lazy;
+
+#[cfg(all(feature="nightly", not(feature="spin_no_std")))]
+#[path="nightly_lazy.rs"]
+#[doc(hidden)]
+pub mod lazy;
+
+#[cfg(all(feature="nightly", feature="spin_no_std"))]
+#[path="core_lazy.rs"]
+#[doc(hidden)]
+pub mod lazy;
+
+#[doc(hidden)]
+pub use core::ops::Deref as __Deref;
+
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __lazy_static_internal {
+    // optional visibility restrictions are wrapped in `()` to allow for
+    // explicitly passing otherwise implicit information about private items
+    ($(#[$attr:meta])* ($($vis:tt)*) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        __lazy_static_internal!(@MAKE TY, $(#[$attr])*, ($($vis)*), $N);
+        __lazy_static_internal!(@TAIL, $N : $T = $e);
+        lazy_static!($($t)*);
+    };
+    (@TAIL, $N:ident : $T:ty = $e:expr) => {
+        impl $crate::__Deref for $N {
+            type Target = $T;
+            #[allow(unsafe_code)]
+            fn deref(&self) -> &$T {
+                unsafe {
+                    #[inline(always)]
+                    fn __static_ref_initialize() -> $T { $e }
+
+                    #[inline(always)]
+                    unsafe fn __stability() -> &'static $T {
+                        __lazy_static_create!(LAZY, $T);
+                        LAZY.get(__static_ref_initialize)
+                    }
+                    __stability()
+                }
+            }
+        }
+        impl $crate::LazyStatic for $N {
+            fn initialize(lazy: &Self) {
+                let _ = &**lazy;
+            }
+        }
+    };
+    // `vis` is wrapped in `()` to prevent parsing ambiguity
+    (@MAKE TY, $(#[$attr:meta])*, ($($vis:tt)*), $N:ident) => {
+        #[allow(missing_copy_implementations)]
+        #[allow(non_camel_case_types)]
+        #[allow(dead_code)]
+        $(#[$attr])*
+        $($vis)* struct $N {__private_field: ()}
+        #[doc(hidden)]
+        $($vis)* static $N: $N = $N {__private_field: ()};
+    };
+    () => ()
+}
+
+#[macro_export]
+macro_rules! lazy_static {
+    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        // use `()` to explicitly forward the information about private items
+        __lazy_static_internal!($(#[$attr])* () static ref $N : $T = $e; $($t)*);
+    };
+    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        __lazy_static_internal!($(#[$attr])* (pub) static ref $N : $T = $e; $($t)*);
+    };
+    ($(#[$attr:meta])* pub ($($vis:tt)+) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
+        __lazy_static_internal!($(#[$attr])* (pub ($($vis)+)) static ref $N : $T = $e; $($t)*);
+    };
+    () => ()
+}
+
+/// Support trait for enabling a few common operation on lazy static values.
+///
+/// This is implemented by each defined lazy static, and
+/// used by the free functions in this crate.
+pub trait LazyStatic {
+    #[doc(hidden)]
+    fn initialize(lazy: &Self);
+}
+
+/// Takes a shared reference to a lazy static and initializes
+/// it if it has not been already.
+///
+/// This can be used to control the initialization point of a lazy static.
+///
+/// Example:
+///
+/// ```rust
+/// #[macro_use]
+/// extern crate lazy_static;
+///
+/// lazy_static! {
+///     static ref BUFFER: Vec<u8> = (0..65537).collect();
+/// }
+///
+/// fn main() {
+///     lazy_static::initialize(&BUFFER);
+///
+///     // ...
+///     work_with_initialized_data(&BUFFER);
+/// }
+/// # fn work_with_initialized_data(_: &[u8]) {}
+/// ```
+pub fn initialize<T: LazyStatic>(lazy: &T) {
+    LazyStatic::initialize(lazy);
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/src/nightly_lazy.rs
@@ -0,0 +1,43 @@
+// Copyright 2016 lazy-static.rs Developers
+//
+// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
+// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
+// http://opensource.org/licenses/MIT>, at your option. This file may not be
+// copied, modified, or distributed except according to those terms.
+
+extern crate std;
+
+use self::std::prelude::v1::*;
+use self::std::sync::Once;
+pub use self::std::sync::ONCE_INIT;
+
+pub struct Lazy<T: Sync>(pub Option<T>, pub Once);
+
+impl<T: Sync> Lazy<T> {
+    #[inline(always)]
+    pub fn get<F>(&'static mut self, f: F) -> &T
+        where F: FnOnce() -> T
+    {
+        {
+            let r = &mut self.0;
+            self.1.call_once(|| {
+                *r = Some(f());
+            });
+        }
+        unsafe {
+            match self.0 {
+                Some(ref x) => x,
+                None => std::mem::unreachable(),
+            }
+        }
+    }
+}
+
+unsafe impl<T: Sync> Sync for Lazy<T> {}
+
+#[macro_export]
+macro_rules! __lazy_static_create {
+    ($NAME:ident, $T:ty) => {
+        static mut $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy(None, $crate::lazy::ONCE_INIT);
+    }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile-fail/README.md
@@ -0,0 +1,22 @@
+This directory contains snippets of code that should yield a
+warning/note/help/error at compilation. Syntax of annotations is described in
+[rust documentation](https://github.com/rust-lang/rust/blob/master/src/test/COMPILER_TESTS.md).
+For more information check out [`compiletest` crate](https://github.com/laumann/compiletest-rs).
+
+To run compile tests issue `cargo +nightly --test --features compiletest`.
+
+## Notes on working with `compiletest` crate
+
+* Currently code that is inside macro should not be annotated, as `compiletest`
+    crate cannot deal with the fact that macro invocations effectively changes
+    line numbering. To prevent this add a `// error-pattern:<your error message here>`
+    on the top of the file and make sure that you set `deny` lint level
+    if you want to test compiler message different than error.
+* `compiletest` crate by default sets `allow(dead_code)` lint level so make sure
+    that you change it to something suiting your needs even if the warning is
+    issued prior to any macro invocation.
+* If you get a message `error: 0 unexpected errors found, 1 expected errors not found`
+  despite the fact that some error was bound to occur don't worry - it's a known
+  issue in the `compiletest` crate and your error was probably not registered -
+  make sure that your annotations are correct and that you are setting correct
+  lint levels.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile-fail/incorrect_visibility_restriction.rs
@@ -0,0 +1,10 @@
+// incorrect visibility restriction
+#[macro_use]
+extern crate lazy_static;
+
+lazy_static! {
+    pub(nonsense) static ref WRONG: () = ();
+    //~^ ERROR incorrect visibility restriction
+}
+
+fn main() { }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_is_private.rs
@@ -0,0 +1,14 @@
+#[macro_use]
+extern crate lazy_static;
+
+mod outer {
+    pub mod inner {
+        lazy_static! {
+            pub(in outer) static ref FOO: () = ();
+        }
+    }
+}
+
+fn main() {
+    assert_eq!(*outer::inner::FOO, ()); //~ ERROR static `FOO` is private
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_is_sized.rs
@@ -0,0 +1,11 @@
+// error-pattern:the trait bound `str: std::marker::Sized` is not satisfied
+#[macro_use]
+extern crate lazy_static;
+
+lazy_static! {
+    pub static ref FOO: str = panic!();
+}
+
+
+fn main() {
+}
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile-fail/static_never_used.rs
@@ -0,0 +1,10 @@
+// error-pattern:static item is never used: `UNUSED`
+#![deny(dead_code)]
+#[macro_use]
+extern crate lazy_static;
+
+lazy_static! {
+    static ref UNUSED: () = ();
+}
+
+fn main() { }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/compile_tests.rs
@@ -0,0 +1,18 @@
+#![cfg(feature="compiletest")]
+extern crate compiletest_rs as compiletest;
+
+fn run_mode(mode: &'static str) {
+    let mut config = compiletest::Config::default();
+    config.mode = mode.parse().expect("Invalid mode");
+    config.src_base = ["tests", mode].iter().collect();
+    config.target_rustcflags = Some("-L target/debug/ -L target/debug/deps/".to_owned());
+
+    config.verbose = true;
+
+    compiletest::run_tests(&config);
+}
+
+#[test]
+fn compile_test() {
+    run_mode("compile-fail");
+}
rename from third_party/rust/lazy_static-0.2.8/tests/no_std.rs
rename to third_party/rust/lazy_static-0.2.11/tests/no_std.rs
new file mode 100644
--- /dev/null
+++ b/third_party/rust/lazy_static-0.2.11/tests/test.rs
@@ -0,0 +1,164 @@
+#![cfg_attr(feature="nightly", feature(const_fn))]
+
+#[macro_use]
+extern crate lazy_static;
+use std::collections::HashMap;
+
+lazy_static! {
+    /// Documentation!
+    pub static ref NUMBER: u32 = times_two(3);
+
+    static ref ARRAY_BOXES: [Box<u32>; 3] = [Box::new(1), Box::new(2), Box::new(3)];
+
+    /// More documentation!
+    #[allow(unused_variables)]
+    #[derive(Copy, Clone, Debug)]
+    pub static ref STRING: String = "hello".to_string();
+
+    static ref HASHMAP: HashMap<u32, &'static str> = {
+        let mut m = HashMap::new();
+        m.insert(0, "abc");
+        m.insert(1, "def");
+        m.insert(2, "ghi");
+        m
+    };
+
+    // This should not compile if the unsafe is removed.
+    static ref UNSAFE: u32 = unsafe {
+        std::mem::transmute::<i32, u32>(-1)
+    };
+}
+
+lazy_static! {
+    static ref S1: &'static str = "a";
+    static ref S2: &'static str = "b";
+}
+lazy_static! {
+    static ref S3: String = [*S1, *S2].join("");
+}
+
+#[test]
+fn s3() {
+    assert_eq!(&*S3, "ab");
+}
+
+fn times_two(n: u32) -> u32 {
+    n * 2
+}
+
+#[test]
+fn test_basic() {
+    assert_eq!(&**STRING, "hello");
+    assert_eq!(*NUMBER, 6);
+    assert!(HASHMAP.get(&1).is_some());
+    assert!(HASHMAP.get(&3).is_none());
+    assert_eq!(&*ARRAY_BOXES, &[Box::new(1), Box::new(2), Box::new(3)]);
+    assert_eq!(*UNSAFE, std::u32::MAX);
+}
+
+#[test]
+fn test_repeat() {
+    assert_eq!(*NUMBER, 6);
+    assert_eq!(*NUMBER, 6);
+    assert_eq!(*NUMBER, 6);
+}
+
+#[test]
+fn test_meta() {
+    // this would not compile if STRING were not marked #[derive(Copy, Clone)]
+    let copy_of_string = STRING;
+    // just to make sure it was copied
+    assert!(&STRING as *const _ != &copy_of_string as *const _);
+
+    // this would not compile if STRING were not marked #[derive(Debug)]
+    assert_eq!(format!("{:?}", STRING), "STRING { __private_field: () }".to_string());
+}
+
+mod visibility {
+    lazy_static! {
+        pub static ref FOO: Box<u32> = Box::new(0);
+        static ref BAR: Box<u32> = Box::new(98);
+    }
+
+    pub mod inner {
+        lazy_static! {
+            pub(in visibility) static ref BAZ: Box<u32> = Box::new(42);
+            pub(crate) static ref BAG: Box<u32> = Box::new(37);
+        }
+    }
+
+    #[test]
+    fn sub_test() {
+        assert_eq!(**FOO, 0);
+        assert_eq!(**BAR, 98);
+        assert_eq!(**inner::BAZ, 42);
+        assert_eq!(**inner::BAG, 37);
+    }
+}
+
+#[test]
+fn test_visibility() {
+    assert_eq!(*visibility::FOO, Box::new(0));
+    assert_eq!(*visibility::inner::BAG, Box::new(37));
+}
+
+// This should not cause a warning about a missing Copy implementation
+lazy_static! {
+    pub static ref VAR: i32 = { 0 };
+}
+
+#[derive(Copy, Clone, Debug, PartialEq)]
+struct X;
+struct Once(X);
+const ONCE_INIT: Once = Once(X);
+static DATA: X = X;
+static ONCE: X = X;
+fn require_sync() -> X { X }
+fn transmute() -> X { X }
+fn __static_ref_initialize() -> X { X }
+fn test(_: Vec<X>) -> X { X }
+
+// All these names should not be shadowed
+lazy_static! {
+    static ref ITEM_NAME_TEST: X = {
+        test(vec![X, Once(X).0, ONCE_INIT.0, DATA, ONCE,
+                  require_sync(), transmute(),
+                  // Except this, which will sadly be shadowed by internals:
+                  // __static_ref_initialize()
+                  ])
+    };
+}
+
+#[test]
+fn item_name_shadowing() {
+    assert_eq!(*ITEM_NAME_TEST, X);
+}
+
+use std::sync::atomic::AtomicBool;
+use std::sync::atomic::ATOMIC_BOOL_INIT;
+use std::sync::atomic::Ordering::SeqCst;
+
+static PRE_INIT_FLAG: AtomicBool = ATOMIC_BOOL_INIT;
+
+lazy_static! {
+    static ref PRE_INIT: () = {
+        PRE_INIT_FLAG.store(true, SeqCst);
+        ()
+    };
+}
+
+#[test]
+fn pre_init() {
+    assert_eq!(PRE_INIT_FLAG.load(SeqCst), false);
+    lazy_static::initialize(&PRE_INIT);
+    assert_eq!(PRE_INIT_FLAG.load(SeqCst), true);
+}
+
+lazy_static! {
+    static ref LIFETIME_NAME: for<'a> fn(&'a u8) = { fn f(_: &u8) {} f };
+}
+
+#[test]
+fn lifetime_name() {
+    let _ = LIFETIME_NAME;
+}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"b6983ce563e5ec756033bfef06e2f2b5f0ac2c1e8eb15803051c1929a328ce30","Cargo.toml":"23508414c154ab5ce9d5fc317a87f118395efc77c1edd9cbe75a08b11e4510c5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"ba1c9a9259f38b2db08a7d1edbfba89716aa23a4d4d0180a70ec74b33034ef05","src/core_lazy.rs":"9ecb52f663255829381bd8f00b295b915ea1beeac94e9db6ade3114b047e74ff","src/lazy.rs":"ddc4fd3c57910d89337705484882d3e5a611afc4e8342948dff901425a759463","src/lib.rs":"b480331f63e3e4a309b7d34c8e7d73a0d53332d30b7de2c56c90400422733634","src/nightly_lazy.rs":"4324572c84b8fbdfc7ddb1a6b3dbda843e95706272fc976ac9565f2875187fed","tests/no_std.rs":"2a5236bd3892a253855b4dc192f63138239165fa23b9c3421a9faa5482c780aa","tests/test.rs":"cfaf50ee913f63b7141a8f5ec537b481cde0a52d29dd900ddb0294f0b8925c93"},"package":"3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-language: rust
-rust:
-- nightly
-- beta
-- stable
-before_script:
-- |
-  pip install 'travis-cargo<0.2' --user &&
-  export PATH=$HOME/.local/bin:$PATH
-script:
-- |
-  travis-cargo build &&
-  travis-cargo test &&
-  travis-cargo bench &&
-  travis-cargo --only nightly build -- --features spin_no_std &&
-  travis-cargo --only nightly test -- --features spin_no_std &&
-  travis-cargo --only nightly bench -- --features spin_no_std &&
-  travis-cargo --only stable doc
-after_success:
-- travis-cargo --only stable doc-upload
-env:
-  global:
-  - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
-  - secure: YXu24LptjeYirjWYjWGsMT2m3mB7LvQATE6TVo7VEUXv8GYoy2ORIHD83PeImxC93MmZ01QeUezRzuCW51ZcK92VnNSBttlF60SvIX18VsJrV92tsAhievFstqYQ+fB8DIuQ8noU0jPz7GpI+R9dlTRSImAqWOnVIghA+Wzz7Js=
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-name = "lazy_static"
-# NB: When modifying, also modify html_root_url in lib.rs
-version = "0.2.8"
-authors = ["Marvin Löbel <loebel.marvin@gmail.com>"]
-license = "MIT/Apache-2.0"
-
-description = "A macro for declaring lazily evaluated statics in Rust."
-readme = "README.md"
-documentation = "https://docs.rs/lazy_static"
-
-repository = "https://github.com/rust-lang-nursery/lazy-static.rs"
-keywords = ["macro", "lazy", "static"]
-
-[dependencies.spin]
-version = "0.4"
-optional = true
-
-[features]
-nightly = []
-spin_no_std = ["nightly", "spin"]
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-lazy-static.rs
-==============
-
-A macro for declaring lazily evaluated statics in Rust.
-
-Using this macro, it is possible to have `static`s that require code to be
-executed at runtime in order to be initialized.
-This includes anything requiring heap allocations, like vectors or hash maps,
-as well as anything that requires non-const function calls to be computed.
-
-[![Travis-CI Status](https://travis-ci.org/rust-lang-nursery/lazy-static.rs.svg?branch=master)](https://travis-ci.org/rust-lang-nursery/lazy-static.rs)
-
-# Getting Started
-
-[lazy-static.rs is available on crates.io](https://crates.io/crates/lazy_static).
-It is recommended to look there for the newest released version, as well as links to the newest builds of the docs.
-
-At the point of the last update of this README, the latest published version could be used like this:
-
-Add the following dependency to your Cargo manifest...
-
-```toml
-[dependencies]
-lazy_static = "0.2"
-```
-
-...and see the [docs](http://rust-lang-nursery.github.io/lazy-static.rs/lazy_static/index.html) for how to use it.
-
-# Example
-
-```rust
-#[macro_use]
-extern crate lazy_static;
-
-use std::collections::HashMap;
-
-lazy_static! {
-    static ref HASHMAP: HashMap<u32, &'static str> = {
-        let mut m = HashMap::new();
-        m.insert(0, "foo");
-        m.insert(1, "bar");
-        m.insert(2, "baz");
-        m
-    };
-}
-
-fn main() {
-    // First access to `HASHMAP` initializes it
-    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
-
-    // Any further access to `HASHMAP` just returns the computed value
-    println!("The entry for `1` is \"{}\".", HASHMAP.get(&1).unwrap());
-}
-```
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
-additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/src/core_lazy.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate spin;
-
-use self::spin::Once;
-
-pub struct Lazy<T: Sync>(Once<T>);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub const fn new() -> Self {
-        Lazy(Once::new())
-    }
-
-    #[inline(always)]
-    pub fn get<F>(&'static self, builder: F) -> &T
-        where F: FnOnce() -> T
-    {
-        self.0.call_once(builder)
-    }
-}
-
-#[macro_export]
-#[allow_internal_unstable]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::new();
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/src/lazy.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate std;
-
-use self::std::prelude::v1::*;
-use self::std::sync::Once;
-
-pub struct Lazy<T: Sync>(pub *const T, pub Once);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub fn get<F>(&'static mut self, f: F) -> &T
-        where F: FnOnce() -> T
-    {
-        unsafe {
-            let r = &mut self.0;
-            self.1.call_once(|| {
-                *r = Box::into_raw(Box::new(f()));
-            });
-
-            &*self.0
-        }
-    }
-}
-
-unsafe impl<T: Sync> Sync for Lazy<T> {}
-
-#[macro_export]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        use std::sync::ONCE_INIT;
-        static mut $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy(0 as *const $T, ONCE_INIT);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/src/lib.rs
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-/*!
-A macro for declaring lazily evaluated statics.
-
-Using this macro, it is possible to have `static`s that require code to be
-executed at runtime in order to be initialized.
-This includes anything requiring heap allocations, like vectors or hash maps,
-as well as anything that requires function calls to be computed.
-
-# Syntax
-
-```ignore
-lazy_static! {
-    [pub] static ref NAME_1: TYPE_1 = EXPR_1;
-    [pub] static ref NAME_2: TYPE_2 = EXPR_2;
-    ...
-    [pub] static ref NAME_N: TYPE_N = EXPR_N;
-}
-```
-
-Attributes (including doc comments) are supported as well:
-
-```rust
-# #[macro_use]
-# extern crate lazy_static;
-# fn main() {
-lazy_static! {
-    /// This is an example for using doc comment attributes
-    static ref EXAMPLE: u8 = 42;
-}
-# }
-```
-
-# Semantics
-
-For a given `static ref NAME: TYPE = EXPR;`, the macro generates a unique type that
-implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Attributes end up
-attaching to this type.)
-
-On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
-can return a reference to the same object. Note that this can lead to deadlocks
-if you have multiple lazy statics that depend on each other in their initialization.
-
-Apart from the lazy initialization, the resulting "static ref" variables
-have generally the same properties as regular "static" variables:
-
-- Any type in them needs to fulfill the `Sync` trait.
-- If the type has a destructor, then it will not run when the process exits.
-
-# Example
-
-Using the macro:
-
-```rust
-#[macro_use]
-extern crate lazy_static;
-
-use std::collections::HashMap;
-
-lazy_static! {
-    static ref HASHMAP: HashMap<u32, &'static str> = {
-        let mut m = HashMap::new();
-        m.insert(0, "foo");
-        m.insert(1, "bar");
-        m.insert(2, "baz");
-        m
-    };
-    static ref COUNT: usize = HASHMAP.len();
-    static ref NUMBER: u32 = times_two(21);
-}
-
-fn times_two(n: u32) -> u32 { n * 2 }
-
-fn main() {
-    println!("The map has {} entries.", *COUNT);
-    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
-    println!("A expensive calculation on a static results in: {}.", *NUMBER);
-}
-```
-
-# Implementation details
-
-The `Deref` implementation uses a hidden static variable that is guarded by a atomic check on each access. On stable Rust, the macro may need to allocate each static on the heap.
-
-*/
-
-#![cfg_attr(feature="nightly", feature(const_fn, allow_internal_unstable, core_intrinsics))]
-
-#![doc(html_root_url = "https://docs.rs/lazy_static/0.2.8")]
-#![no_std]
-
-#[cfg(not(feature="nightly"))]
-#[doc(hidden)]
-pub mod lazy;
-
-#[cfg(all(feature="nightly", not(feature="spin_no_std")))]
-#[path="nightly_lazy.rs"]
-#[doc(hidden)]
-pub mod lazy;
-
-#[cfg(all(feature="nightly", feature="spin_no_std"))]
-#[path="core_lazy.rs"]
-#[doc(hidden)]
-pub mod lazy;
-
-#[doc(hidden)]
-pub use core::ops::Deref as __Deref;
-
-#[macro_export]
-#[cfg_attr(feature="nightly", allow_internal_unstable)]
-#[doc(hidden)]
-macro_rules! __lazy_static_internal {
-    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PRIV, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    (@$VIS:ident, $(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@MAKE TY, $VIS, $(#[$attr])*, $N);
-        impl $crate::__Deref for $N {
-            type Target = $T;
-            #[allow(unsafe_code)]
-            fn deref(&self) -> &$T {
-                unsafe {
-                    #[inline(always)]
-                    fn __static_ref_initialize() -> $T { $e }
-
-                    #[inline(always)]
-                    unsafe fn __stability() -> &'static $T {
-                        __lazy_static_create!(LAZY, $T);
-                        LAZY.get(__static_ref_initialize)
-                    }
-                    __stability()
-                }
-            }
-        }
-        impl $crate::LazyStatic for $N {
-            fn initialize(lazy: &Self) {
-                let _ = &**lazy;
-            }
-        }
-        __lazy_static_internal!($($t)*);
-    };
-    (@MAKE TY, PUB, $(#[$attr:meta])*, $N:ident) => {
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        $(#[$attr])*
-        pub struct $N {__private_field: ()}
-        #[doc(hidden)]
-        pub static $N: $N = $N {__private_field: ()};
-    };
-    (@MAKE TY, PRIV, $(#[$attr:meta])*, $N:ident) => {
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        $(#[$attr])*
-        struct $N {__private_field: ()}
-        #[doc(hidden)]
-        static $N: $N = $N {__private_field: ()};
-    };
-    () => ()
-}
-
-#[macro_export]
-#[cfg_attr(feature="nightly", allow_internal_unstable)]
-macro_rules! lazy_static {
-    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PRIV, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    () => ()
-}
-
-/// Support trait for enabling a few common operation on lazy static values.
-///
-/// This is implemented by each defined lazy static, and
-/// used by the free functions in this crate.
-pub trait LazyStatic {
-    #[doc(hidden)]
-    fn initialize(lazy: &Self);
-}
-
-/// Takes a shared reference to a lazy static and initializes
-/// it if it has not been already.
-///
-/// This can be used to control the initialization point of a lazy static.
-///
-/// Example:
-///
-/// ```rust
-/// #[macro_use]
-/// extern crate lazy_static;
-///
-/// lazy_static! {
-///     static ref BUFFER: Vec<u8> = (0..65537).collect();
-/// }
-///
-/// fn main() {
-///     lazy_static::initialize(&BUFFER);
-///
-///     // ...
-///     work_with_initialized_data(&BUFFER);
-/// }
-/// # fn work_with_initialized_data(_: &[u8]) {}
-/// ```
-pub fn initialize<T: LazyStatic>(lazy: &T) {
-    LazyStatic::initialize(lazy);
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/src/nightly_lazy.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate std;
-
-use self::std::prelude::v1::*;
-use self::std::cell::UnsafeCell;
-use self::std::sync::{Once, ONCE_INIT};
-
-pub struct Lazy<T: Sync>(UnsafeCell<Option<T>>, Once);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub const fn new() -> Self {
-        Lazy(UnsafeCell::new(None), ONCE_INIT)
-    }
-
-    #[inline(always)]
-    pub fn get<F>(&'static self, f: F) -> &T
-        where F: FnOnce() -> T
-    {
-        unsafe {
-            self.1.call_once(|| {
-                *self.0.get() = Some(f());
-            });
-
-            match *self.0.get() {
-                Some(ref x) => x,
-                None => std::intrinsics::unreachable(),
-            }
-        }
-    }
-}
-
-unsafe impl<T: Sync> Sync for Lazy<T> {}
-
-#[macro_export]
-#[allow_internal_unstable]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::new();
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.8/tests/test.rs
+++ /dev/null
@@ -1,158 +0,0 @@
-#![cfg_attr(feature="nightly", feature(const_fn))]
-
-#[macro_use]
-extern crate lazy_static;
-use std::collections::HashMap;
-
-lazy_static! {
-    /// Documentation!
-    pub static ref NUMBER: u32 = times_two(3);
-
-    static ref ARRAY_BOXES: [Box<u32>; 3] = [Box::new(1), Box::new(2), Box::new(3)];
-
-    /// More documentation!
-    #[allow(unused_variables)]
-    #[derive(Copy, Clone, Debug)]
-    pub static ref STRING: String = "hello".to_string();
-
-    static ref HASHMAP: HashMap<u32, &'static str> = {
-        let mut m = HashMap::new();
-        m.insert(0, "abc");
-        m.insert(1, "def");
-        m.insert(2, "ghi");
-        m
-    };
-
-    // This should not compile if the unsafe is removed.
-    static ref UNSAFE: u32 = unsafe {
-        std::mem::transmute::<i32, u32>(-1)
-    };
-
-    // This *should* triggger warn(dead_code) by design.
-    static ref UNUSED: () = ();
-
-}
-
-lazy_static! {
-    static ref S1: &'static str = "a";
-    static ref S2: &'static str = "b";
-}
-lazy_static! {
-    static ref S3: String = [*S1, *S2].join("");
-}
-
-#[test]
-fn s3() {
-    assert_eq!(&*S3, "ab");
-}
-
-fn times_two(n: u32) -> u32 {
-    n * 2
-}
-
-#[test]
-fn test_basic() {
-    assert_eq!(&**STRING, "hello");
-    assert_eq!(*NUMBER, 6);
-    assert!(HASHMAP.get(&1).is_some());
-    assert!(HASHMAP.get(&3).is_none());
-    assert_eq!(&*ARRAY_BOXES, &[Box::new(1), Box::new(2), Box::new(3)]);
-    assert_eq!(*UNSAFE, std::u32::MAX);
-}
-
-#[test]
-fn test_repeat() {
-    assert_eq!(*NUMBER, 6);
-    assert_eq!(*NUMBER, 6);
-    assert_eq!(*NUMBER, 6);
-}
-
-#[test]
-fn test_meta() {
-    // this would not compile if STRING were not marked #[derive(Copy, Clone)]
-    let copy_of_string = STRING;
-    // just to make sure it was copied
-    assert!(&STRING as *const _ != &copy_of_string as *const _);
-
-    // this would not compile if STRING were not marked #[derive(Debug)]
-    assert_eq!(format!("{:?}", STRING), "STRING { __private_field: () }".to_string());
-}
-
-mod visibility {
-    lazy_static! {
-        pub static ref FOO: Box<u32> = Box::new(0);
-        static ref BAR: Box<u32> = Box::new(98);
-    }
-
-    #[test]
-    fn sub_test() {
-        assert_eq!(**FOO, 0);
-        assert_eq!(**BAR, 98);
-    }
-}
-
-#[test]
-fn test_visibility() {
-    assert_eq!(*visibility::FOO, Box::new(0));
-}
-
-// This should not cause a warning about a missing Copy implementation
-lazy_static! {
-    pub static ref VAR: i32 = { 0 };
-}
-
-#[derive(Copy, Clone, Debug, PartialEq)]
-struct X;
-struct Once(X);
-const ONCE_INIT: Once = Once(X);
-static DATA: X = X;
-static ONCE: X = X;
-fn require_sync() -> X { X }
-fn transmute() -> X { X }
-fn __static_ref_initialize() -> X { X }
-fn test(_: Vec<X>) -> X { X }
-
-// All these names should not be shadowed
-lazy_static! {
-    static ref ITEM_NAME_TEST: X = {
-        test(vec![X, Once(X).0, ONCE_INIT.0, DATA, ONCE,
-                  require_sync(), transmute(),
-                  // Except this, which will sadly be shadowed by internals:
-                  // __static_ref_initialize()
-                  ])
-    };
-}
-
-#[test]
-fn item_name_shadowing() {
-    assert_eq!(*ITEM_NAME_TEST, X);
-}
-
-use std::sync::atomic::AtomicBool;
-use std::sync::atomic::ATOMIC_BOOL_INIT;
-use std::sync::atomic::Ordering::SeqCst;
-
-static PRE_INIT_FLAG: AtomicBool = ATOMIC_BOOL_INIT;
-
-lazy_static! {
-    static ref PRE_INIT: () = {
-        PRE_INIT_FLAG.store(true, SeqCst);
-        ()
-    };
-}
-
-#[test]
-fn pre_init() {
-    assert_eq!(PRE_INIT_FLAG.load(SeqCst), false);
-    lazy_static::initialize(&PRE_INIT);
-    assert_eq!(PRE_INIT_FLAG.load(SeqCst), true);
-}
-
-lazy_static! {
-    static ref LIFETIME_NAME: for<'a> fn(&'a u8) = { fn f(_: &u8) {} f };
-}
-
-#[test]
-fn lifetime_name() {
-    let _ = LIFETIME_NAME;
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"c4736f91b288af76d37be054444139cbde202ce0694aca5d0fd8d78e75c098fc","Cargo.toml":"931c84434a9ec6a4e98b7fe0287aa795971c1e981d697236544f878036657e94","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"c305f498e6d89730d84eaf92e980ba001e259dd40fcb40855947baece2af0895","appveyor.yml":"58b03a74386dac972230381a831b582ec3992aab1256c06f22bc6130784bf3ec","src/core_lazy.rs":"9ecb52f663255829381bd8f00b295b915ea1beeac94e9db6ade3114b047e74ff","src/lazy.rs":"ddc4fd3c57910d89337705484882d3e5a611afc4e8342948dff901425a759463","src/lib.rs":"a3fd642b35c05e44df84a434dcbcc12bbfb78e21fa332f2057701076642a0dac","src/nightly_lazy.rs":"4324572c84b8fbdfc7ddb1a6b3dbda843e95706272fc976ac9565f2875187fed","tests/no_std.rs":"2a5236bd3892a253855b4dc192f63138239165fa23b9c3421a9faa5482c780aa","tests/test.rs":"cfaf50ee913f63b7141a8f5ec537b481cde0a52d29dd900ddb0294f0b8925c93"},"package":"c9e5e58fa1a4c3b915a561a78a22ee0cac6ab97dca2504428bc1cb074375f8d5"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/.travis.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-language: rust
-rust:
-- nightly
-- beta
-- stable
-before_script:
-- |
-  pip install 'travis-cargo<0.2' --user &&
-  export PATH=`python -m site --user-base`/bin:$PATH
-script:
-- |
-  travis-cargo build &&
-  travis-cargo test &&
-  travis-cargo bench &&
-  travis-cargo --only nightly build -- --features spin_no_std &&
-  travis-cargo --only nightly test -- --features spin_no_std &&
-  travis-cargo --only nightly bench -- --features spin_no_std &&
-  travis-cargo --only stable doc
-after_success:
-- travis-cargo --only stable doc-upload
-env:
-  global:
-  - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
-  - secure: YXu24LptjeYirjWYjWGsMT2m3mB7LvQATE6TVo7VEUXv8GYoy2ORIHD83PeImxC93MmZ01QeUezRzuCW51ZcK92VnNSBttlF60SvIX18VsJrV92tsAhievFstqYQ+fB8DIuQ8noU0jPz7GpI+R9dlTRSImAqWOnVIghA+Wzz7Js=
-os:
-  - linux
-  - osx
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/Cargo.toml
+++ /dev/null
@@ -1,35 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "lazy_static"
-version = "0.2.9"
-authors = ["Marvin Löbel <loebel.marvin@gmail.com>"]
-description = "A macro for declaring lazily evaluated statics in Rust."
-documentation = "https://docs.rs/lazy_static"
-readme = "README.md"
-keywords = ["macro", "lazy", "static"]
-categories = ["no-std", "rust-patterns"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/rust-lang-nursery/lazy-static.rs"
-[dependencies.spin]
-version = "0.4"
-optional = true
-
-[features]
-spin_no_std = ["nightly", "spin"]
-nightly = []
-[badges.appveyor]
-repository = "rust-lang-nursery/lazy-static.rs"
-
-[badges.travis-ci]
-repository = "rust-lang-nursery/lazy-static.rs"
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2010 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/appveyor.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-environment:
-  global:
-    PROJECT_NAME: lazy_static
-  matrix:
-    # Stable channel
-    - TARGET: i686-pc-windows-gnu
-      CHANNEL: stable
-    - TARGET: i686-pc-windows-msvc
-      CHANNEL: stable
-    - TARGET: x86_64-pc-windows-gnu
-      CHANNEL: stable
-    - TARGET: x86_64-pc-windows-msvc
-      CHANNEL: stable
-    # Beta channel
-    - TARGET: i686-pc-windows-gnu
-      CHANNEL: beta
-    - TARGET: i686-pc-windows-msvc
-      CHANNEL: beta
-    - TARGET: x86_64-pc-windows-gnu
-      CHANNEL: beta
-    - TARGET: x86_64-pc-windows-msvc
-      CHANNEL: beta
-    # Nightly channel
-    - TARGET: i686-pc-windows-gnu
-      CHANNEL: nightly
-    - TARGET: i686-pc-windows-msvc
-      CHANNEL: nightly
-    - TARGET: x86_64-pc-windows-gnu
-      CHANNEL: nightly
-    - TARGET: x86_64-pc-windows-msvc
-      CHANNEL: nightly
-
-# Install Rust and Cargo
-# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
-install:
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/channel-rust-stable"
-  - ps: $env:RUST_VERSION = Get-Content channel-rust-stable | select -first 1 | %{$_.split('-')[1]}
-  - if NOT "%CHANNEL%" == "stable" set RUST_VERSION=%CHANNEL%
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-${env:RUST_VERSION}-${env:TARGET}.exe"
-  - rust-%RUST_VERSION%-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - if "%TARGET%" == "i686-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw32\bin
-  - if "%TARGET%" == "x86_64-pc-windows-gnu" set PATH=%PATH%;C:\msys64\mingw64\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo build --verbose
-  - cargo test
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/src/core_lazy.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate spin;
-
-use self::spin::Once;
-
-pub struct Lazy<T: Sync>(Once<T>);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub const fn new() -> Self {
-        Lazy(Once::new())
-    }
-
-    #[inline(always)]
-    pub fn get<F>(&'static self, builder: F) -> &T
-        where F: FnOnce() -> T
-    {
-        self.0.call_once(builder)
-    }
-}
-
-#[macro_export]
-#[allow_internal_unstable]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::new();
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/src/lazy.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate std;
-
-use self::std::prelude::v1::*;
-use self::std::sync::Once;
-
-pub struct Lazy<T: Sync>(pub *const T, pub Once);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub fn get<F>(&'static mut self, f: F) -> &T
-        where F: FnOnce() -> T
-    {
-        unsafe {
-            let r = &mut self.0;
-            self.1.call_once(|| {
-                *r = Box::into_raw(Box::new(f()));
-            });
-
-            &*self.0
-        }
-    }
-}
-
-unsafe impl<T: Sync> Sync for Lazy<T> {}
-
-#[macro_export]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        use std::sync::ONCE_INIT;
-        static mut $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy(0 as *const $T, ONCE_INIT);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/src/lib.rs
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-/*!
-A macro for declaring lazily evaluated statics.
-
-Using this macro, it is possible to have `static`s that require code to be
-executed at runtime in order to be initialized.
-This includes anything requiring heap allocations, like vectors or hash maps,
-as well as anything that requires function calls to be computed.
-
-# Syntax
-
-```ignore
-lazy_static! {
-    [pub] static ref NAME_1: TYPE_1 = EXPR_1;
-    [pub] static ref NAME_2: TYPE_2 = EXPR_2;
-    ...
-    [pub] static ref NAME_N: TYPE_N = EXPR_N;
-}
-```
-
-Attributes (including doc comments) are supported as well:
-
-```rust
-# #[macro_use]
-# extern crate lazy_static;
-# fn main() {
-lazy_static! {
-    /// This is an example for using doc comment attributes
-    static ref EXAMPLE: u8 = 42;
-}
-# }
-```
-
-# Semantics
-
-For a given `static ref NAME: TYPE = EXPR;`, the macro generates a unique type that
-implements `Deref<TYPE>` and stores it in a static with name `NAME`. (Attributes end up
-attaching to this type.)
-
-On first deref, `EXPR` gets evaluated and stored internally, such that all further derefs
-can return a reference to the same object. Note that this can lead to deadlocks
-if you have multiple lazy statics that depend on each other in their initialization.
-
-Apart from the lazy initialization, the resulting "static ref" variables
-have generally the same properties as regular "static" variables:
-
-- Any type in them needs to fulfill the `Sync` trait.
-- If the type has a destructor, then it will not run when the process exits.
-
-# Example
-
-Using the macro:
-
-```rust
-#[macro_use]
-extern crate lazy_static;
-
-use std::collections::HashMap;
-
-lazy_static! {
-    static ref HASHMAP: HashMap<u32, &'static str> = {
-        let mut m = HashMap::new();
-        m.insert(0, "foo");
-        m.insert(1, "bar");
-        m.insert(2, "baz");
-        m
-    };
-    static ref COUNT: usize = HASHMAP.len();
-    static ref NUMBER: u32 = times_two(21);
-}
-
-fn times_two(n: u32) -> u32 { n * 2 }
-
-fn main() {
-    println!("The map has {} entries.", *COUNT);
-    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
-    println!("A expensive calculation on a static results in: {}.", *NUMBER);
-}
-```
-
-# Implementation details
-
-The `Deref` implementation uses a hidden static variable that is guarded by a atomic check on each access. On stable Rust, the macro may need to allocate each static on the heap.
-
-*/
-
-#![cfg_attr(feature="nightly", feature(const_fn, allow_internal_unstable, core_intrinsics, const_unsafe_cell_new))]
-
-#![doc(html_root_url = "https://docs.rs/lazy_static/0.2.8")]
-#![no_std]
-
-#[cfg(not(feature="nightly"))]
-#[doc(hidden)]
-pub mod lazy;
-
-#[cfg(all(feature="nightly", not(feature="spin_no_std")))]
-#[path="nightly_lazy.rs"]
-#[doc(hidden)]
-pub mod lazy;
-
-#[cfg(all(feature="nightly", feature="spin_no_std"))]
-#[path="core_lazy.rs"]
-#[doc(hidden)]
-pub mod lazy;
-
-#[doc(hidden)]
-pub use core::ops::Deref as __Deref;
-
-#[macro_export]
-#[cfg_attr(feature="nightly", allow_internal_unstable)]
-#[doc(hidden)]
-macro_rules! __lazy_static_internal {
-    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PRIV, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub(in $pub_in:path) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB_IN, $pub_in, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    (@PUB_IN, $pub_in:path, $(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@MAKE TY, PUB_IN, $pub_in, $(#[$attr])*, $N);
-        __lazy_static_internal!(@TAIL, $N : $T = $e);
-        __lazy_static_internal!($($t)*);
-    };
-    (@$VIS:ident, $(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@MAKE TY, $VIS, $(#[$attr])*, $N);
-        __lazy_static_internal!(@TAIL, $N : $T = $e);
-        __lazy_static_internal!($($t)*);
-    };
-    (@TAIL, $N:ident : $T:ty = $e:expr) => {
-        impl $crate::__Deref for $N {
-            type Target = $T;
-            #[allow(unsafe_code)]
-            fn deref(&self) -> &$T {
-                unsafe {
-                    #[inline(always)]
-                    fn __static_ref_initialize() -> $T { $e }
-
-                    #[inline(always)]
-                    unsafe fn __stability() -> &'static $T {
-                        __lazy_static_create!(LAZY, $T);
-                        LAZY.get(__static_ref_initialize)
-                    }
-                    __stability()
-                }
-            }
-        }
-        impl $crate::LazyStatic for $N {
-            fn initialize(lazy: &Self) {
-                let _ = &**lazy;
-            }
-        }
-    };
-    (@MAKE TY, PUB, $(#[$attr:meta])*, $N:ident) => {
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        $(#[$attr])*
-        pub struct $N {__private_field: ()}
-        #[doc(hidden)]
-        pub static $N: $N = $N {__private_field: ()};
-    };
-    (@MAKE TY, PUB_IN, $pub_in:path, $(#[$attr:meta])*, $N:ident) => {
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        $(#[$attr])*
-        pub(in $pub_in) struct $N {__private_field: ()}
-        #[doc(hidden)]
-        pub(in $pub_in) static $N: $N = $N {__private_field: ()};
-    };
-    (@MAKE TY, PRIV, $(#[$attr:meta])*, $N:ident) => {
-        #[allow(missing_copy_implementations)]
-        #[allow(non_camel_case_types)]
-        #[allow(dead_code)]
-        $(#[$attr])*
-        struct $N {__private_field: ()}
-        #[doc(hidden)]
-        static $N: $N = $N {__private_field: ()};
-    };
-    () => ()
-}
-
-#[macro_export]
-#[cfg_attr(feature="nightly", allow_internal_unstable)]
-macro_rules! lazy_static {
-    ($(#[$attr:meta])* static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PRIV, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub (in $pub_in:path) static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB_IN, $pub_in, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    ($(#[$attr:meta])* pub static ref $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
-        __lazy_static_internal!(@PUB, $(#[$attr])* static ref $N : $T = $e; $($t)*);
-    };
-    () => ()
-}
-
-/// Support trait for enabling a few common operation on lazy static values.
-///
-/// This is implemented by each defined lazy static, and
-/// used by the free functions in this crate.
-pub trait LazyStatic {
-    #[doc(hidden)]
-    fn initialize(lazy: &Self);
-}
-
-/// Takes a shared reference to a lazy static and initializes
-/// it if it has not been already.
-///
-/// This can be used to control the initialization point of a lazy static.
-///
-/// Example:
-///
-/// ```rust
-/// #[macro_use]
-/// extern crate lazy_static;
-///
-/// lazy_static! {
-///     static ref BUFFER: Vec<u8> = (0..65537).collect();
-/// }
-///
-/// fn main() {
-///     lazy_static::initialize(&BUFFER);
-///
-///     // ...
-///     work_with_initialized_data(&BUFFER);
-/// }
-/// # fn work_with_initialized_data(_: &[u8]) {}
-/// ```
-pub fn initialize<T: LazyStatic>(lazy: &T) {
-    LazyStatic::initialize(lazy);
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/src/nightly_lazy.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 lazy-static.rs Developers
-//
-// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
-// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-// http://opensource.org/licenses/MIT>, at your option. This file may not be
-// copied, modified, or distributed except according to those terms.
-
-extern crate std;
-
-use self::std::prelude::v1::*;
-use self::std::cell::UnsafeCell;
-use self::std::sync::{Once, ONCE_INIT};
-
-pub struct Lazy<T: Sync>(UnsafeCell<Option<T>>, Once);
-
-impl<T: Sync> Lazy<T> {
-    #[inline(always)]
-    pub const fn new() -> Self {
-        Lazy(UnsafeCell::new(None), ONCE_INIT)
-    }
-
-    #[inline(always)]
-    pub fn get<F>(&'static self, f: F) -> &T
-        where F: FnOnce() -> T
-    {
-        unsafe {
-            self.1.call_once(|| {
-                *self.0.get() = Some(f());
-            });
-
-            match *self.0.get() {
-                Some(ref x) => x,
-                None => std::intrinsics::unreachable(),
-            }
-        }
-    }
-}
-
-unsafe impl<T: Sync> Sync for Lazy<T> {}
-
-#[macro_export]
-#[allow_internal_unstable]
-#[doc(hidden)]
-macro_rules! __lazy_static_create {
-    ($NAME:ident, $T:ty) => {
-        static $NAME: $crate::lazy::Lazy<$T> = $crate::lazy::Lazy::new();
-    }
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/tests/no_std.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-#![cfg(feature="spin_no_std")]
-#![feature(const_fn)]
-
-#![no_std]
-
-#[macro_use]
-extern crate lazy_static;
-
-lazy_static! {
-    /// Documentation!
-    pub static ref NUMBER: u32 = times_two(3);
-}
-
-fn times_two(n: u32) -> u32 {
-    n * 2
-}
-
-#[test]
-fn test_basic() {
-    assert_eq!(*NUMBER, 6);
-}
deleted file mode 100644
--- a/third_party/rust/lazy_static-0.2.9/tests/test.rs
+++ /dev/null
@@ -1,158 +0,0 @@
-#![cfg_attr(feature="nightly", feature(const_fn))]
-
-#[macro_use]
-extern crate lazy_static;
-use std::collections::HashMap;
-
-lazy_static! {
-    /// Documentation!
-    pub static ref NUMBER: u32 = times_two(3);
-
-    static ref ARRAY_BOXES: [Box<u32>; 3] = [Box::new(1), Box::new(2), Box::new(3)];
-
-    /// More documentation!
-    #[allow(unused_variables)]
-    #[derive(Copy, Clone, Debug)]
-    pub static ref STRING: String = "hello".to_string();
-
-    static ref HASHMAP: HashMap<u32, &'static str> = {
-        let mut m = HashMap::new();
-        m.insert(0, "abc");
-        m.insert(1, "def");
-        m.insert(2, "ghi");
-        m
-    };
-
-    // This should not compile if the unsafe is removed.
-    static ref UNSAFE: u32 = unsafe {
-        std::mem::transmute::<i32, u32>(-1)
-    };
-
-    // This *should* triggger warn(dead_code) by design.
-    static ref UNUSED: () = ();
-
-}
-
-lazy_static! {
-    static ref S1: &'static str = "a";
-    static ref S2: &'static str = "b";
-}
-lazy_static! {
-    static ref S3: String = [*S1, *S2].join("");
-}
-
-#[test]
-fn s3() {
-    assert_eq!(&*S3, "ab");
-}
-
-fn times_two(n: u32) -> u32 {
-    n * 2
-}
-
-#[test]
-fn test_basic() {
-    assert_eq!(&**STRING, "hello");
-    assert_eq!(*NUMBER, 6);
-    assert!(HASHMAP.get(&1).is_some());
-    assert!(HASHMAP.get(&3).is_none());
-    assert_eq!(&*ARRAY_BOXES, &[Box::new(1), Box::new(2), Box::new(3)]);
-    assert_eq!(*UNSAFE, std::u32::MAX);
-}
-
-#[test]
-fn test_repeat() {
-    assert_eq!(*NUMBER, 6);
-    assert_eq!(*NUMBER, 6);
-    assert_eq!(*NUMBER, 6);
-}
-
-#[test]
-fn test_meta() {
-    // this would not compile if STRING were not marked #[derive(Copy, Clone)]
-    let copy_of_string = STRING;
-    // just to make sure it was copied
-    assert!(&STRING as *const _ != &copy_of_string as *const _);
-
-    // this would not compile if STRING were not marked #[derive(Debug)]
-    assert_eq!(format!("{:?}", STRING), "STRING { __private_field: () }".to_string());
-}
-
-mod visibility {
-    lazy_static! {
-        pub static ref FOO: Box<u32> = Box::new(0);
-        static ref BAR: Box<u32> = Box::new(98);
-    }
-
-    #[test]
-    fn sub_test() {
-        assert_eq!(**FOO, 0);
-        assert_eq!(**BAR, 98);
-    }
-}
-
-#[test]
-fn test_visibility() {
-    assert_eq!(*visibility::FOO, Box::new(0));
-}
-
-// This should not cause a warning about a missing Copy implementation
-lazy_static! {
-    pub static ref VAR: i32 = { 0 };
-}
-
-#[derive(Copy, Clone, Debug, PartialEq)]
-struct X;
-struct Once(X);
-const ONCE_INIT: Once = Once(X);
-static DATA: X = X;
-static ONCE: X = X;
-fn require_sync() -> X { X }
-fn transmute() -> X { X }
-fn __static_ref_initialize() -> X { X }
-fn test(_: Vec<X>) -> X { X }
-
-// All these names should not be shadowed
-lazy_static! {
-    static ref ITEM_NAME_TEST: X = {
-        test(vec![X, Once(X).0, ONCE_INIT.0, DATA, ONCE,
-                  require_sync(), transmute(),
-                  // Except this, which will sadly be shadowed by internals:
-                  // __static_ref_initialize()
-                  ])
-    };
-}
-
-#[test]
-fn item_name_shadowing() {
-    assert_eq!(*ITEM_NAME_TEST, X);
-}
-
-use std::sync::atomic::AtomicBool;
-use std::sync::atomic::ATOMIC_BOOL_INIT;
-use std::sync::atomic::Ordering::SeqCst;
-
-static PRE_INIT_FLAG: AtomicBool = ATOMIC_BOOL_INIT;
-
-lazy_static! {
-    static ref PRE_INIT: () = {
-        PRE_INIT_FLAG.store(true, SeqCst);
-        ()
-    };
-}
-
-#[test]
-fn pre_init() {
-    assert_eq!(PRE_INIT_FLAG.load(SeqCst), false);
-    lazy_static::initialize(&PRE_INIT);
-    assert_eq!(PRE_INIT_FLAG.load(SeqCst), true);
-}
-
-lazy_static! {
-    static ref LIFETIME_NAME: for<'a> fn(&'a u8) = { fn f(_: &u8) {} f };
-}
-
-#[test]
-fn lifetime_name() {
-    let _ = LIFETIME_NAME;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"85d7a35a85a0653ea7072811fd0ba37cf00df4e0b2bcc3781bfc171220046001","Cargo.toml":"7ea5ce66ef7d756befcc155bdeb4135171920a934ecd384eb9f54359a4ce547a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"8a9859c60f78d9075e22bc9f85b40e0b0216cccaeb7025c9f464cc33dcddaf5c","appveyor.yml":"483ae27670e061eb91f055699a9ad88255050b7b300f183b8580340407751bb4","ci/README.md":"be804f15e2128e5fd4b160cb0b13cff5f19e7d77b55ec5254aa6fd8731c84f0d","ci/android-accept-licenses.sh":"84ad00815f628005ed22c5d6cd14990ebc97812a7163bd275b2877904eddab53","ci/android-install-ndk.sh":"73c5f21438c024ce1b8c793184447ff9aecd83c87cbde8de580b782842b3563f","ci/android-install-sdk.sh":"891900fe4e4ceb04717b91a253753858270defc6d6401936d08c09801c1de178","ci/android-sysimage.sh":"901415631752827454c827e8c51906ba4260612e4021eda98eb7fff771c7d0e8","ci/docker/aarch64-linux-android/Dockerfile":"68f375c6e0b3716f8c0b6ed217bc6c3631fa2b86c578b983a0bf60d0344efd74","ci/docker/aarch64-unknown-linux-gnu/Dockerfile":"62ca7317439f9c303990e897450a91cd467be05eb75dfc01456d417932ac8672","ci/docker/arm-linux-androideabi/Dockerfile":"1193bf048efbeb9be3c9fac0836dcf6ae07e12cdf09b36b386dd4cbd62abbffa","ci/docker/arm-unknown-linux-gnueabihf/Dockerfile":"e349f7caa463adbde8d6ec4d2b9f7720ed81c77f48d75bbfb78c89751f55c2dc","ci/docker/i686-linux-android/Dockerfile":"7c353aecdf0b21d8584392cc6ea31d455adad769034c3ea09191a1b26a2521e1","ci/docker/i686-unknown-linux-gnu/Dockerfile":"07e9df6ba91025cbec7ae81ade63f8cfb8a54c5e1e5a8f8def0617e17bd59db0","ci/docker/i686-unknown-linux-musl/Dockerfile":"fcaedc90fbb90375186b36b4324bff0a042aae70695be0f2b632e3cf7479eae6","ci/docker/mips-unknown-linux-gnu/Dockerfile":"860299d96ee50ebdbd788e65eb6ba1f561ef66107647bddffcb2567ac350896b","ci/docker/mips-unknown-linux-musl/Dockerfile":"711c43122fa34cee83a69944493213924b0ff1fccd78c7a141cb2b2127526484","ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile":"163776e0fd38f66df7415421202ac29efc7d345a628947434e573c3885594ab5","ci/docker/mipsel-unknown-linux-musl/Dockerfile":"aef213df08da03ab6a723c3e6e5594a0586251950d81482cf53179d8e64e95c7","ci/docker/powerpc-unknown-linux-gnu/Dockerfile":"08b846a338c2ee70100f4e80db812668dc58bfb536c44a95cd1cf004d965186b","ci/docker/powerpc64-unknown-linux-gnu/Dockerfile":"4da285ffd035d16f5da9e3701841eb86049c8cfa417fa81e53da4ef74152eac0","ci/docker/x86_64-linux-android/Dockerfile":"a73a344c60575b8ef78b0178f93285ffa2e2d9aa5eb0d2e86d4bad3cab63276f","ci/docker/x86_64-rumprun-netbsd/Dockerfile":"44c3107fb30380785aaed6ff73fa334017a5bb4e3b5c7d4876154f09023a2b99","ci/docker/x86_64-unknown-freebsd/Dockerfile":"ef0f9f63065218728d2daafaa5ba71b17e4ccc23d72e859e0a7133fc64c0815e","ci/docker/x86_64-unknown-linux-gnu/Dockerfile":"67fabbc8c6ac02376cf9344251ad49ecdac396b71accb572fd1ae65225325bc0","ci/docker/x86_64-unknown-linux-musl/Dockerfile":"f71019fed5204b950843ef5e56144161fda7e27fad68ed0e8bc4353c388c7bcf","ci/docker/x86_64-unknown-openbsd/Dockerfile":"dfa5c23a6cff8c7a9a846668118c71a8406a360801fd3632fb12e8fbda6b7338","ci/dox.sh":"9ea240a4a607036235fd68c01b5d2a59f365768d103d3be774dcf34aa3ff563e","ci/ios/deploy_and_run_on_ios_simulator.rs":"3175066fd7f82390f6226d881e1a1dda9767ea2705656870e0d7774e2731800e","ci/landing-page-footer.html":"b70b3112c2147f5c967e7481061ef38bc2d79a28dd55a16fb916d9c9426da2c4","ci/landing-page-head.html":"ad69663fac7924f27d0209bc519d55838e86edfc4133713a6fd08caadac1b142","ci/run-docker.sh":"655712ba6127eb2efe2c641cf4cf1246f3e485096d72ec57b423e9d2bff6fb73","ci/run-qemu.sh":"bb859421170871ef23a8940c5e150efec0c01b95e32d2ce2d37b79a45d9d346c","ci/run.sh":"48c0318287f02889cb73a55e3e2058e79c556d11797d47a1ed66d7c55d1be12f","ci/style.rs":"60564abc1d5197ed1598426dd0d6ee9939a16d2875b03373538f58843bb616c4","src/dox.rs":"bb9a85519e0d4a8d3bfb81301759b9b938435d79da9ce2918248fb2b0df19638","src/lib.rs":"651696755aed40230cde8a505a2dfef61bea52d6349c9b9343497a5c7158ec92","src/macros.rs":"bd9802772b0e5c8b3c550d1c24307f06c0d1e4ce656b4ae1cf092142bbe5412c","src/redox.rs":"3dd158ba9fbbabe96ce2607e91dbf07b93b37c0427734118702dcb4901fe8964","src/unix/bsd/apple/b32.rs":"110ecff78da0e8d405d861447904da403d8b3f6da1f0f9dc9987633f3f04fe46","src/unix/bsd/apple/b64.rs":"2c51c1c063bfb5076ecf08fbc9371ce9473878d2e046c186eb9433955f6f8ba6","src/unix/bsd/apple/mod.rs":"8e437addefb32336671f46b93a5a8827260163abcf623c0f1613d4d685faca34","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"54b3b30c4cac35ced9197e7267f209b0f168de8a6899ab0cba290c5ae399f0e7","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/freebsd/mod.rs":"ba1bd1487b41be91115a21e3968d15e4d877043ba4946cd11ed2be2ee66afc19","src/unix/bsd/freebsdlike/freebsd/x86.rs":"54311d3ebf2bb091ab22361e377e6ef9224aec2ecfe459fbfcedde4932db9c58","src/unix/bsd/freebsdlike/freebsd/x86_64.rs":"c7f46b9ae23fde5a9e245a28ed1380066e67f081323b4d253a18e9da3b97b860","src/unix/bsd/freebsdlike/mod.rs":"6b184872bf7979e5da042399a8aa3a46fff6716301f3d068912a2d6296c6ab94","src/unix/bsd/mod.rs":"c75c328dc62a621ce2a9408cb8764206e365e6f14db1bfe535a23c4728521d97","src/unix/bsd/netbsdlike/mod.rs":"50ca4e29f06669a0ebff72f2f24b2b08ff55478f580b1684e16a0cf6938a6a50","src/unix/bsd/netbsdlike/netbsd/mod.rs":"51f6f2309d59f8fb5dbd6b29ac4aa7ad431f1dddae151aef2db9f66c5f3362b0","src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/netbsd/other/mod.rs":"4d9f7091af8e166943ac6f42ce85558909e5b6e61325039bff7adfbcf4b90212","src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs":"f8cd05dacd3a3136c58da5a2fbe26f703767823b28e74fe8a2b57a7bd98d6d5c","src/unix/bsd/netbsdlike/openbsdlike/mod.rs":"97a7cdb8824949e6ca7202691bde4e1c46c2cfdeb5f3735a033448b52da1bb59","src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs":"31686679c2df5f11437a338b9281fa0dd4f8d061dcd895d67619992171e115c9","src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs":"927eeccaf3269d299db4c2a55f8010807bf43dfa894aea6a783215f5d3560baa","src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs":"f5d8db6f54efd05520b31b764a6bacbf612e1aebce097d2d5bfaaef3b91f37b5","src/unix/haiku/b32.rs":"bd251a102bed65d5cb3459275f6ec3310fe5803ff4c9651212115548f86256d0","src/unix/haiku/b64.rs":"b422430c550c0ba833c9206d1350861e344e3a2eb33d7d58693efb35044be1cc","src/unix/haiku/mod.rs":"f0daa9910d2beade8be1d67bab652c239e779a27e4be54f93b7bceb7afe45d30","src/unix/mod.rs":"841d523014553865ee35355425da44fe1a31944a991831efc7c046263ad44a89","src/unix/notbsd/android/b32/arm.rs":"d63a234f3a2399bdef1fa13c6a209386cb5ddac04c90f2c6d42badc8235dc49d","src/unix/notbsd/android/b32/mod.rs":"c09b53e42b286a7ec56fb28d0a3e71ec42fecaec39b2015d1d4a3338b172c570","src/unix/notbsd/android/b32/x86.rs":"10e6879dcbf136f0e907337987a0609b357e27e0f24ccb907525fcad881c24c3","src/unix/notbsd/android/b64/aarch64.rs":"d0a25e73f8d02f8412fa9237e41d3f4993b45603a2a8f8d1690bc6624a190d42","src/unix/notbsd/android/b64/mod.rs":"172d704a50d6fb9f67683c7e66ff15b5c9f7b11e7064aa8bd129228ff074393f","src/unix/notbsd/android/b64/x86_64.rs":"a2b048dad18c60ede035645bbfea2ba3dd75197c1ee0d54fb5fcab14d6c35194","src/unix/notbsd/android/mod.rs":"25d09d308f0beb7925a3efdf1fae8412251ea04f595f6852e52114df51b6747e","src/unix/notbsd/linux/mips/mips32.rs":"003b4e204e13380cd7f1ce783a0eded0f520f4e7d25634738e8ee50fc09b07c9","src/unix/notbsd/linux/mips/mips64.rs":"a8d3e38e9f9359233db04c66d7a8de957530ad2b8596661d3ac25ea81ee44a78","src/unix/notbsd/linux/mips/mod.rs":"7157a427fabff6e970288c75cb246981e316f76f3c2bb59b254d613a8389f859","src/unix/notbsd/linux/mod.rs":"c200ff5e7c7ad5d0b4c01531384acd408057665cb49175fba0d453b08c166bcf","src/unix/notbsd/linux/musl/b32/arm.rs":"d43ba5c528926261b1ccd529ab55636254360a084ab84a7ec22a4eb5afddb8f8","src/unix/notbsd/linux/musl/b32/asmjs.rs":"085e410f990312de76f74cb9bbf9fcc27d686e94334143b34511f565d1b8bb91","src/unix/notbsd/linux/musl/b32/mips.rs":"941c88bc413ba2b87eb6a6cfe03355ee148b865f39598456965b3d04b3adbbe6","src/unix/notbsd/linux/musl/b32/mod.rs":"fc7e055edbe6fa170c2bda6b3415066c1871b3e60ebb70a6329d008f77100f0b","src/unix/notbsd/linux/musl/b32/x86.rs":"ffa5781b52a7d2774a34b1e3e2034a498b919fd96eb85e88098dba2e674a3797","src/unix/notbsd/linux/musl/b64/aarch64.rs":"4009c7eaf703472daef2a70bdac910d9fc395a33689ef2e8cf1c4e692445d3f0","src/unix/notbsd/linux/musl/b64/mod.rs":"d9b03a59a54a568b07ffa4380103a926cbb45dbfd87745edef79cd971ef31283","src/unix/notbsd/linux/musl/b64/powerpc64.rs":"dc28f5b7284235d6cf5519053cac59a1c16dc39223b71cca0871e4880755f852","src/unix/notbsd/linux/musl/b64/x86_64.rs":"43291acc0dfc92c2fec8ba6ce77ee9ca3c20bcdccec18e149f95ba911cee704b","src/unix/notbsd/linux/musl/mod.rs":"0bd97702f5c84181c53f45466fb04afb9441f6950580b6ad59257e5c73089796","src/unix/notbsd/linux/other/b32/arm.rs":"d373022fd152341ec8f5d106937c7898dd68fb4c0346bd94a37526542a605e9a","src/unix/notbsd/linux/other/b32/mod.rs":"6122be151c5d85b9df6a3aaefc5cafd0657b371cafa9cb31ed9b1a394976af45","src/unix/notbsd/linux/other/b32/powerpc.rs":"cc85e75675abc37414fc7701dda7c3f6396e7b2d3c52eea7febdc41f7b033ea9","src/unix/notbsd/linux/other/b32/x86.rs":"5a6c789355da5abf64c2a0c867d2dfd4f72f004d0bd6c476fd34172b340ea1c3","src/unix/notbsd/linux/other/b64/aarch64.rs":"ce342b37a4a60c216625c8e177a50b3f328bdfd5c527e32e06c73f4aa5926829","src/unix/notbsd/linux/other/b64/mod.rs":"bee90e8d9217ee344d0e99fd483766a1b28e8b1ded930d44a0400a5e5224bb6a","src/unix/notbsd/linux/other/b64/powerpc64.rs":"fc7131f39a75a9e35d474d70b0bc829c52590dadf472ae5785972a94ffb95f12","src/unix/notbsd/linux/other/b64/sparc64.rs":"0ba7f399349bc586ebb73d0caef5c67f195c9e3a942eabfb2efd133b4cea9872","src/unix/notbsd/linux/other/b64/x86_64.rs":"bf17645b237d8059da5e9cc0f6d2d56bc665b0946a6deb8aedf46e5b44578fa6","src/unix/notbsd/linux/other/mod.rs":"46b060787a60493e71406be35b77c24048cdc54326b65c9961fbb1fb9d354de3","src/unix/notbsd/linux/s390x.rs":"2dec96036cadd8354cd56ef8dd7018e75ae92326ec7b5963bc9cdbba0c7d694b","src/unix/notbsd/mod.rs":"bb4550e749328a3aebc450a1684c136821babc3fc161093eecb231f3998cfe8c","src/unix/solaris/mod.rs":"ba70c4ebd371f2580c1fb8f3f6cd32a391ec017e1eed9812137caa94e5149a03","src/unix/uclibc/mips/mips32.rs":"31b23e466cffb86116421ec9240b86e7419aacd84b0b1b04d23c7142c8717566","src/unix/uclibc/mips/mips64.rs":"e67eec1636a998b047d89a4cda1c99cb6bc3071db017762675179a68201c4438","src/unix/uclibc/mips/mod.rs":"74817a9b1ee3998d8e0b751a555d57225f70fd979c283c94ada344a162a8b856","src/unix/uclibc/mod.rs":"3cef4087b743e5af239a8c699c2eeaeda4e19bb57a3683736c8bd87dc71e0a2d","src/unix/uclibc/x86_64/mod.rs":"98e6685519372f7b247e3bb0008ed2ee8d94fd7cca0ed2f0b9336485c734d8a9","src/windows.rs":"acccbd341e81206cb1dc66af41762c193ac0dd719d700b64f7e26c967ee7d670"},"package":"38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/.travis.yml
+++ /dev/null
@@ -1,136 +0,0 @@
-language: rust
-sudo: required
-dist: trusty
-services:
-  - docker
-install:
-  - if [ -z "$NO_ADD" ]; then rustup target add $TARGET; fi
-script:
-  - cargo build
-  - cargo build --no-default-features
-  - cargo generate-lockfile --manifest-path libc-test/Cargo.toml
-  - if [[ $TRAVIS_OS_NAME = "linux" ]]; then
-      sh ci/run-docker.sh $TARGET;
-    else
-      export CARGO_TARGET_DIR=`pwd`/target;
-      sh ci/run.sh $TARGET;
-    fi
-  - rustc ci/style.rs && ./style src
-env:
-  global:
-    secure: "e2/3QjgRN9atOuSHp22TrYG7QVKcYUWY48Hi9b60w+r1+BhPkTseIJLte7WefRhdXtqpjjUJTooKDhnurFOeHaCT+nmBgiv+FPU893sBl4bhesY4m0vgUJVbNZcs6lTImYekWVb+aqjGdgV/XAgCw7c3kPmrZV0MzGDWL64Xaps="
-matrix:
-  include:
-    # 1.0.0 compat
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
-      rust: 1.0.0
-      script: cargo build
-      install:
-
-    # build documentation
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
-      rust: nightly
-      script: sh ci/dox.sh
-
-    # stable compat
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
-      rust: stable
-    - os: linux
-      env: TARGET=i686-unknown-linux-gnu
-      rust: stable
-    - os: osx
-      env: TARGET=x86_64-apple-darwin NO_ADD=1
-      rust: stable
-    - os: osx
-      env: TARGET=i686-apple-darwin
-      rust: stable
-    - os: linux
-      env: TARGET=arm-linux-androideabi
-      rust: stable
-    - os: linux
-      env: TARGET=aarch64-linux-android
-      rust: stable
-    - os: linux
-      env: TARGET=i686-linux-android
-      rust: stable
-    # as of 2017/05/03 x86_64-linux-android are not on stable
-    - os: linux
-      env: TARGET=x86_64-linux-android
-      rust: beta
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-musl
-      rust: stable
-    - os: linux
-      env: TARGET=i686-unknown-linux-musl
-      rust: stable
-    - os: linux
-      env: TARGET=arm-unknown-linux-gnueabihf
-      rust: stable
-    - os: linux
-      env: TARGET=aarch64-unknown-linux-gnu
-      rust: stable
-    - os: osx
-      osx_image: xcode8.2
-      env: TARGET=i386-apple-ios
-      rust: stable
-    - os: osx
-      osx_image: xcode8.2
-      env: TARGET=x86_64-apple-ios
-      rust: stable
-    - os: linux
-      env: TARGET=x86_64-rumprun-netbsd
-      rust: stable
-    - os: linux
-      env: TARGET=powerpc-unknown-linux-gnu
-      rust: stable
-    - os: linux
-      env: TARGET=powerpc64-unknown-linux-gnu
-      rust: beta
-    - os: linux
-      env: TARGET=mips-unknown-linux-musl
-      rust: stable
-    - os: linux
-      env: TARGET=mipsel-unknown-linux-musl
-      rust: stable
-    - os: linux
-      env: TARGET=mips64-unknown-linux-gnuabi64
-      rust: beta
-    - os: linux
-      env: TARGET=mips-unknown-linux-gnu
-      rust: beta
-
-    # beta
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
-      rust: beta
-    - os: osx
-      env: TARGET=x86_64-apple-darwin NO_ADD=1
-      rust: beta
-
-    # nightly
-    - os: linux
-      env: TARGET=x86_64-unknown-linux-gnu NO_ADD=1
-      rust: nightly
-    - os: osx
-      env: TARGET=x86_64-apple-darwin NO_ADD=1
-      rust: nightly
-
-    # QEMU based targets that compile in an emulator
-    - os: linux
-      env: TARGET=x86_64-unknown-freebsd
-      rust: stable
-    - os: linux
-      env: TARGET=x86_64-unknown-openbsd QEMU=openbsd.qcow2
-      rust: stable
-      script: sh ci/run-docker.sh $TARGET
-      install:
-
-cache: cargo
-
-notifications:
-  email:
-    on_success: never
-  webhooks: https://buildbot.rust-lang.org/homu/travis
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/Cargo.toml
+++ /dev/null
@@ -1,21 +0,0 @@
-[package]
-
-name = "libc"
-version = "0.2.24"
-authors = ["The Rust Project Developers"]
-license = "MIT/Apache-2.0"
-readme = "README.md"
-repository = "https://github.com/rust-lang/libc"
-homepage = "https://github.com/rust-lang/libc"
-documentation = "http://doc.rust-lang.org/libc"
-description = """
-A library for types and bindings to native C functions often found in libc or
-other common platform libraries.
-"""
-
-[features]
-default = ["use_std"]
-use_std = []
-
-[workspace]
-members = ["libc-test", "libc-test/generate-files"]
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/README.md
+++ /dev/null
@@ -1,156 +0,0 @@
-libc
-====
-
-A Rust library with native bindings to the types and functions commonly found on
-various systems, including libc.
-
-[![Build Status](https://travis-ci.org/rust-lang/libc.svg?branch=master)](https://travis-ci.org/rust-lang/libc)
-[![Build status](https://ci.appveyor.com/api/projects/status/github/rust-lang/libc?svg=true)](https://ci.appveyor.com/project/rust-lang-libs/libc)
-
-[Documentation](#platforms-and-documentation)
-
-## Usage
-
-First, add the following to your `Cargo.toml`:
-
-```toml
-[dependencies]
-libc = "0.2"
-```
-
-Next, add this to your crate root:
-
-```rust
-extern crate libc;
-```
-
-Currently libc by default links to the standard library, but if you would
-instead like to use libc in a `#![no_std]` situation or crate you can request
-this via:
-
-```toml
-[dependencies]
-libc = { version = "0.2", default-features = false }
-```
-
-## What is libc?
-
-The primary purpose of this crate is to provide all of the definitions necessary
-to easily interoperate with C code (or "C-like" code) on each of the platforms
-that Rust supports. This includes type definitions (e.g. `c_int`), constants
-(e.g. `EINVAL`) as well as function headers (e.g. `malloc`).
-
-This crate does not strive to have any form of compatibility across platforms,
-but rather it is simply a straight binding to the system libraries on the
-platform in question.
-
-## Public API
-
-This crate exports all underlying platform types, functions, and constants under
-the crate root, so all items are accessible as `libc::foo`. The types and values
-of all the exported APIs match the platform that libc is compiled for.
-
-More detailed information about the design of this library can be found in its
-[associated RFC][rfc].
-
-[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1291-promote-libc.md
-
-## Adding an API
-
-Want to use an API which currently isn't bound in `libc`? It's quite easy to add
-one!
-
-The internal structure of this crate is designed to minimize the number of
-`#[cfg]` attributes in order to easily be able to add new items which apply
-to all platforms in the future. As a result, the crate is organized
-hierarchically based on platform. Each module has a number of `#[cfg]`'d
-children, but only one is ever actually compiled. Each module then reexports all
-the contents of its children.
-
-This means that for each platform that libc supports, the path from a
-leaf module to the root will contain all bindings for the platform in question.
-Consequently, this indicates where an API should be added! Adding an API at a
-particular level in the hierarchy means that it is supported on all the child
-platforms of that level. For example, when adding a Unix API it should be added
-to `src/unix/mod.rs`, but when adding a Linux-only API it should be added to
-`src/unix/notbsd/linux/mod.rs`.
-
-If you're not 100% sure at what level of the hierarchy an API should be added
-at, fear not! This crate has CI support which tests any binding against all
-platforms supported, so you'll see failures if an API is added at the wrong
-level or has different signatures across platforms.
-
-With that in mind, the steps for adding a new API are:
-
-1. Determine where in the module hierarchy your API should be added.
-2. Add the API.
-3. Send a PR to this repo.
-4. Wait for CI to pass, fixing errors.
-5. Wait for a merge!
-
-### Test before you commit
-
-We have two automated tests running on [Travis](https://travis-ci.org/rust-lang/libc):
-
-1. [`libc-test`](https://github.com/alexcrichton/ctest)
-  - `cd libc-test && cargo run`
-  - Use the `skip_*()` functions in `build.rs` if you really need a workaround.
-2. Style checker
-  - `rustc ci/style.rs && ./style src`
-
-### Releasing your change to crates.io
-
-Now that you've done the amazing job of landing your new API or your new
-platform in this crate, the next step is to get that sweet, sweet usage from
-crates.io! The only next step is to bump the version of libc and then publish
-it. If you'd like to get a release out ASAP you can follow these steps:
-
-1. Update the version number in `Cargo.toml`, you'll just be bumping the patch
-   version number.
-2. Run `cargo update` to regenerate the lockfile to encode your version bump in
-   the lock file. You may pull in some other updated dependencies, that's ok.
-3. Send a PR to this repository. It should [look like this][example], but it'd
-   also be nice to fill out the description with a small rationale for the
-   release (any rationale is ok though!)
-4. Once merged the release will be tagged and published by one of the libc crate
-   maintainers.
-
-[example]: https://github.com/rust-lang/libc/pull/583
-
-## Platforms and Documentation
-
-The following platforms are currently tested and have documentation available:
-
-Tested:
-  * [`i686-pc-windows-msvc`](https://doc.rust-lang.org/libc/i686-pc-windows-msvc/libc/)
-  * [`x86_64-pc-windows-msvc`](https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc/libc/)
-    (Windows)
-  * [`i686-pc-windows-gnu`](https://doc.rust-lang.org/libc/i686-pc-windows-gnu/libc/)
-  * [`x86_64-pc-windows-gnu`](https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu/libc/)
-  * [`i686-apple-darwin`](https://doc.rust-lang.org/libc/i686-apple-darwin/libc/)
-  * [`x86_64-apple-darwin`](https://doc.rust-lang.org/libc/x86_64-apple-darwin/libc/)
-    (OSX)
-  * `i386-apple-ios`
-  * `x86_64-apple-ios`
-  * [`i686-unknown-linux-gnu`](https://doc.rust-lang.org/libc/i686-unknown-linux-gnu/libc/)
-  * [`x86_64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu/libc/)
-    (Linux)
-  * [`x86_64-unknown-linux-musl`](https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl/libc/)
-    (Linux MUSL)
-  * [`aarch64-unknown-linux-gnu`](https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu/libc/)
-  * [`mips-unknown-linux-gnu`](https://doc.rust-lang.org/libc/mips-unknown-linux-gnu/libc/)
-  * [`arm-unknown-linux-gnueabihf`](https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf/libc/)
-  * [`arm-linux-androideabi`](https://doc.rust-lang.org/libc/arm-linux-androideabi/libc/)
-    (Android)
-  * [`x86_64-unknown-freebsd`](https://doc.rust-lang.org/libc/x86_64-unknown-freebsd/libc/)
-  * [`x86_64-unknown-openbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-openbsd/libc/)
-  * [`x86_64-rumprun-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/)
-
-The following may be supported, but are not guaranteed to always work:
-
-  * `i686-unknown-freebsd`
-  * [`x86_64-unknown-bitrig`](https://doc.rust-lang.org/libc/x86_64-unknown-bitrig/libc/)
-  * [`x86_64-unknown-dragonfly`](https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly/libc/)
-  * `i686-unknown-haiku`
-  * `x86_64-unknown-haiku`
-  * [`x86_64-unknown-netbsd`](https://doc.rust-lang.org/libc/x86_64-unknown-netbsd/libc/)
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/appveyor.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-gnu
-    MSYS2_BITS: 64
-  - TARGET: i686-pc-windows-gnu
-    MSYS2_BITS: 32
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-install:
-  - appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
-  - rustup-init.exe -y --default-host %TARGET%
-  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
-  - if defined MSYS2_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS2_BITS%\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo test --target %TARGET%
-  - cargo run --manifest-path libc-test/Cargo.toml --target %TARGET%
-
-cache:
-  - target
-  - C:\Users\appveyor\.cargo\registry
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/README.md
+++ /dev/null
@@ -1,203 +0,0 @@
-The goal of the libc crate is to have CI running everywhere to have the
-strongest guarantees about the definitions that this library contains, and as a
-result the CI is pretty complicated and also pretty large! Hopefully this can
-serve as a guide through the sea of scripts in this directory and elsewhere in
-this project.
-
-# Files
-
-First up, let's talk about the files in this directory:
-
-* `run-travis.sh` - a shell script run by all Travis builders, this is
-  responsible for setting up the rest of the environment such as installing new
-  packages, downloading Rust target libraries, etc.
-
-* `run.sh` - the actual script which runs tests for a particular architecture.
-  Called from the `run-travis.sh` script this will run all tests for the target
-  specified.
-
-* `cargo-config` - Cargo configuration of linkers to use copied into place by
-  the `run-travis.sh` script before builds are run.
-
-* `dox.sh` - script called from `run-travis.sh` on only the linux 64-bit nightly
-  Travis bots to build documentation for this crate.
-
-* `landing-page-*.html` - used by `dox.sh` to generate a landing page for all
-  architectures' documentation.
-
-* `run-qemu.sh` - see discussion about QEMU below
-
-* `mips`, `rumprun` - instructions to build the docker image for each respective
-  CI target
-
-# CI Systems
-
-Currently this repository leverages a combination of Travis CI and AppVeyor for
-running tests. The triples tested are:
-
-* AppVeyor
-  * `{i686,x86_64}-pc-windows-{msvc,gnu}`
-* Travis
-  * `{i686,x86_64,mips,aarch64}-unknown-linux-gnu`
-  * `x86_64-unknown-linux-musl`
-  * `arm-unknown-linux-gnueabihf`
-  * `arm-linux-androideabi`
-  * `{i686,x86_64}-apple-{darwin,ios}`
-  * `x86_64-rumprun-netbsd`
-  * `x86_64-unknown-freebsd`
-  * `x86_64-unknown-openbsd`
-
-The Windows triples are all pretty standard, they just set up their environment
-then run tests, no need for downloading any extra target libs (we just download
-the right installer). The Intel Linux/OSX builds are similar in that we just
-download the right target libs and run tests. Note that the Intel Linux/OSX
-builds are run on stable/beta/nightly, but are the only ones that do so.
-
-The remaining architectures look like:
-
-* Android runs in a [docker image][android-docker] with an emulator, the NDK,
-  and the SDK already set up. The entire build happens within the docker image.
-* The MIPS, ARM, and AArch64 builds all use the QEMU userspace emulator to run
-  the generated binary to actually verify the tests pass.
-* The MUSL build just has to download a MUSL compiler and target libraries and
-  then otherwise runs tests normally.
-* iOS builds need an extra linker flag currently, but beyond that they're built
-  as standard as everything else.
-* The rumprun target builds an entire kernel from the test suite and then runs
-  it inside QEMU using the serial console to test whether it succeeded or
-  failed.
-* The BSD builds, currently OpenBSD and FreeBSD, use QEMU to boot up a system
-  and compile/run tests. More information on that below.
-
-[android-docker]: https://github.com/rust-lang/rust-buildbot/blob/master/slaves/android/Dockerfile
-
-## QEMU
-
-Lots of the architectures tested here use QEMU in the tests, so it's worth going
-over all the crazy capabilities QEMU has and the various flavors in which we use
-it!
-
-First up, QEMU has userspace emulation where it doesn't boot a full kernel, it
-just runs a binary from another architecture (using the `qemu-<arch>` wrappers).
-We provide it the runtime path for the dynamically loaded system libraries,
-however. This strategy is used for all Linux architectures that aren't intel.
-Note that one downside of this QEMU system is that threads are barely
-implemented, so we're careful to not spawn many threads.
-
-For the rumprun target the only output is a kernel image, so we just use that
-plus the `rumpbake` command to create a full kernel image which is then run from
-within QEMU.
-
-Finally, the fun part, the BSDs. Quite a few hoops are jumped through to get CI
-working for these platforms, but the gist of it looks like:
-
-* Cross compiling from Linux to any of the BSDs seems to be quite non-standard.
-  We may be able to get it working but it might be difficult at that point to
-  ensure that the libc definitions align with what you'd get on the BSD itself.
-  As a result, we try to do compiles within the BSD distro.
-* On Travis we can't run a VM-in-a-VM, so we resort to userspace emulation
-  (QEMU).
-* Unfortunately on Travis we also can't use KVM, so the emulation is super slow.
-
-With all that in mind, the way BSD is tested looks like:
-
-1. Download a pre-prepared image for the OS being tested.
-2. Generate the tests for the OS being tested. This involves running the `ctest`
-   library over libc to generate a Rust file and a C file which will then be
-   compiled into the final test.
-3. Generate a disk image which will later be mounted by the OS being tested.
-   This image is mostly just the libc directory, but some modifications are made
-   to compile the generated files from step 2.
-4. The kernel is booted in QEMU, and it is configured to detect the libc-test
-   image being available, run the test script, and then shut down afterwards.
-5. Look for whether the tests passed in the serial console output of the kernel.
-
-There's some pretty specific instructions for setting up each image (detailed
-below), but the main gist of this is that we must avoid a vanilla `cargo run`
-inside of the `libc-test` directory (which is what it's intended for) because
-that would compile `syntex_syntax`, a large library, with userspace emulation.
-This invariably times out on Travis, so we can't do that.
-
-Once all those hoops are jumped through, however, we can be happy that we're
-testing almost everything!
-
-Below are some details of how to set up the initial OS images which are
-downloaded. Each image must be enabled have input/output over the serial
-console, log in automatically at the serial console, detect if a second drive in
-QEMU is available, and if so mount it, run a script (it'll specifically be
-`run-qemu.sh` in this folder which is copied into the generated image talked
-about above), and then shut down.
-
-### QEMU setup - FreeBSD
-
-1. Download CD installer (most minimal is fine)
-2. `qemu-img create -f qcow2 foo.qcow2 2G`
-3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user`
-4. run installer
-5. `echo 'console="comconsole"' >> /boot/loader.conf`
-6. `echo 'autoboot_delay="0"' >> /boot/loader.conf`
-7. look at /etc/ttys, see what getty argument is for ttyu0
-8. edit /etc/gettytab, look for ttyu0 argument, prepend `:al=root` to line
-   beneath
-
-(note that the current image has a `freebsd` user, but this isn't really
-necessary)
-
-Once that's done, arrange for this script to run at login:
-
-```
-#!/bin/sh
-
-sudo kldload ext2fs
-[ -e /dev/vtbd1 ] || exit 0
-sudo mount -t ext2fs /dev/vtbd1 /mnt
-sh /mnt/run.sh /mnt
-sudo poweroff
-```
-
-Helpful links
-
-* https://en.wikibooks.org/wiki/QEMU/Images
-* https://blog.nekoconeko.nl/blog/2015/06/04/creating-an-openstack-freebsd-image.html
-* https://www.freebsd.org/doc/handbook/serialconsole-setup.html
-
-
-### QEMU setup - OpenBSD
-
-1. Download CD installer
-2. `qemu-img create -f qcow2 foo.qcow2 2G`
-3. `qemu -cdrom foo.iso -drive if=virtio,file=foo.qcow2 -net nic,model=virtio -net user`
-4. run installer
-5. `echo 'set tty com0' >> /etc/boot.conf`
-6. `echo 'boot' >> /etc/boot.conf`
-7. Modify /etc/ttys, change the `tty00` at the end from 'unknown off' to
-   'vt220 on secure'
-8. Modify same line in /etc/ttys to have `"/root/foo.sh"` as the shell
-9. Add this script to `/root/foo.sh`
-
-```
-#!/bin/sh
-exec 1>/dev/tty00
-exec 2>&1
-
-if mount -t ext2fs /dev/sd1c /mnt; then
-  sh /mnt/run.sh /mnt
-  shutdown -ph now
-fi
-
-# limited shell...
-exec /bin/sh < /dev/tty00
-```
-
-10. `chmod +x /root/foo.sh`
-
-Helpful links:
-
-* https://en.wikibooks.org/wiki/QEMU/Images
-* http://www.openbsd.org/faq/faq7.html#SerCon
-
-# Questions?
-
-Hopefully that's at least somewhat of an introduction to everything going on
-here, and feel free to ping @alexcrichton with questions!
-
deleted file mode 100755
--- a/third_party/rust/libc-0.2.24/ci/android-accept-licenses.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/expect -f
-# ignore-license
-
-set timeout 1800
-set cmd [lindex $argv 0]
-set licenses [lindex $argv 1]
-
-spawn {*}$cmd
-expect {
-  "Do you accept the license '*'*" {
-        exp_send "y\r"
-        exp_continue
-  }
-  eof
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/android-install-ndk.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/sh
-# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-set -ex
-
-curl -O https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip
-unzip -q android-ndk-r13b-linux-x86_64.zip
-
-case "$1" in
-  aarch64)
-    arch=arm64
-    ;;
-
-  i686)
-    arch=x86
-    ;;
-
-  *)
-    arch=$1
-    ;;
-esac;
-
-android-ndk-r13b/build/tools/make_standalone_toolchain.py \
-        --install-dir /android/ndk-$1 \
-        --arch $arch \
-        --api 24
-
-rm -rf ./android-ndk-r13b-linux-x86_64.zip ./android-ndk-r13b
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/android-install-sdk.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/sh
-# Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-set -ex
-
-# Prep the SDK and emulator
-#
-# Note that the update process requires that we accept a bunch of licenses, and
-# we can't just pipe `yes` into it for some reason, so we take the same strategy
-# located in https://github.com/appunite/docker by just wrapping it in a script
-# which apparently magically accepts the licenses.
-
-mkdir sdk
-curl https://dl.google.com/android/repository/tools_r25.2.5-linux.zip -O
-unzip -d sdk tools_r25.2.5-linux.zip
-
-filter="platform-tools,android-24"
-
-case "$1" in
-  arm | armv7)
-    abi=armeabi-v7a
-    ;;
-
-  aarch64)
-    abi=arm64-v8a
-    ;;
-
-  i686)
-    abi=x86
-    ;;
-
-  x86_64)
-    abi=x86_64
-    ;;
-
-  *)
-    echo "invalid arch: $1"
-    exit 1
-    ;;
-esac;
-
-filter="$filter,sys-img-$abi-android-24"
-
-./android-accept-licenses.sh "android - update sdk -a --no-ui --filter $filter"
-
-echo "no" | android create avd \
-                --name $1 \
-                --target android-24 \
-                --abi $abi
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/android-sysimage.sh
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright 2017 The Rust Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-set -ex
-
-URL=https://dl.google.com/android/repository/sys-img/android
-
-main() {
-    local arch=$1
-    local name=$2
-    local dest=/system
-    local td=$(mktemp -d)
-
-    apt-get install --no-install-recommends e2tools
-
-    pushd $td
-    curl -O $URL/$name
-    unzip -q $name
-
-    local system=$(find . -name system.img)
-    mkdir -p $dest/{bin,lib,lib64}
-
-    # Extract android linker and libraries to /system
-    # This allows android executables to be run directly (or with qemu)
-    if [ $arch = "x86_64" -o $arch = "arm64" ]; then
-        e2cp -p $system:/bin/linker64 $dest/bin/
-        e2cp -p $system:/lib64/libdl.so $dest/lib64/
-        e2cp -p $system:/lib64/libc.so $dest/lib64/
-        e2cp -p $system:/lib64/libm.so $dest/lib64/
-    else
-        e2cp -p $system:/bin/linker $dest/bin/
-        e2cp -p $system:/lib/libdl.so $dest/lib/
-        e2cp -p $system:/lib/libc.so $dest/lib/
-        e2cp -p $system:/lib/libm.so $dest/lib/
-    fi
-
-    # clean up
-    apt-get purge --auto-remove -y e2tools
-
-    popd
-
-    rm -rf $td
-}
-
-main "${@}"
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/aarch64-linux-android/Dockerfile
+++ /dev/null
@@ -1,32 +0,0 @@
-FROM ubuntu:16.04
-
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
-    apt-get install -y --no-install-recommends \
-  file \
-  curl \
-  ca-certificates \
-  python \
-  unzip \
-  expect \
-  openjdk-9-jre \
-  libstdc++6:i386 \
-  libpulse0 \
-  gcc \
-  libc6-dev
-
-WORKDIR /android/
-COPY android* /android/
-
-ENV ANDROID_ARCH=aarch64
-ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
-
-RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
-RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
-RUN mv /root/.android /tmp
-RUN chmod 777 -R /tmp/.android
-RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
-
-ENV PATH=$PATH:/rust/bin \
-    CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \
-    HOME=/tmp
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/aarch64-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,7 +0,0 @@
-FROM ubuntu:16.10
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc libc6-dev ca-certificates \
-  gcc-aarch64-linux-gnu libc6-dev-arm64-cross qemu-user
-ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/arm-linux-androideabi/Dockerfile
+++ /dev/null
@@ -1,32 +0,0 @@
-FROM ubuntu:16.04
-
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
-    apt-get install -y --no-install-recommends \
-  file \
-  curl \
-  ca-certificates \
-  python \
-  unzip \
-  expect \
-  openjdk-9-jre \
-  libstdc++6:i386 \
-  libpulse0 \
-  gcc \
-  libc6-dev
-
-WORKDIR /android/
-COPY android* /android/
-
-ENV ANDROID_ARCH=arm
-ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
-
-RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
-RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
-RUN mv /root/.android /tmp
-RUN chmod 777 -R /tmp/.android
-RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
-
-ENV PATH=$PATH:/rust/bin \
-    CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \
-    HOME=/tmp
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/arm-unknown-linux-gnueabihf/Dockerfile
+++ /dev/null
@@ -1,7 +0,0 @@
-FROM ubuntu:16.10
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc libc6-dev ca-certificates \
-  gcc-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user
-ENV CARGO_TARGET_ARM_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/i686-linux-android/Dockerfile
+++ /dev/null
@@ -1,32 +0,0 @@
-FROM ubuntu:16.04
-
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
-    apt-get install -y --no-install-recommends \
-  file \
-  curl \
-  ca-certificates \
-  python \
-  unzip \
-  expect \
-  openjdk-9-jre \
-  libstdc++6:i386 \
-  libpulse0 \
-  gcc \
-  libc6-dev
-
-WORKDIR /android/
-COPY android* /android/
-
-ENV ANDROID_ARCH=i686
-ENV PATH=$PATH:/android/ndk-$ANDROID_ARCH/bin:/android/sdk/tools:/android/sdk/platform-tools
-
-RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
-RUN sh /android/android-install-sdk.sh $ANDROID_ARCH
-RUN mv /root/.android /tmp
-RUN chmod 777 -R /tmp/.android
-RUN chmod 755 /android/sdk/tools/* /android/sdk/tools/qemu/linux-x86_64/*
-
-ENV PATH=$PATH:/rust/bin \
-    CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \
-    HOME=/tmp
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/i686-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM ubuntu:16.10
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc-multilib libc6-dev ca-certificates
-ENV PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/i686-unknown-linux-musl/Dockerfile
+++ /dev/null
@@ -1,23 +0,0 @@
-FROM ubuntu:16.10
-
-RUN dpkg --add-architecture i386
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc-multilib make libc6-dev git curl ca-certificates libc6:i386
-# Below we're cross-compiling musl for i686 using the system compiler on an
-# x86_64 system. This is an awkward thing to be doing and so we have to jump
-# through a couple hoops to get musl to be happy. In particular:
-#
-# * We specifically pass -m32 in CFLAGS and override CC when running ./configure,
-#   since otherwise the script will fail to find a compiler.
-# * We manually unset CROSS_COMPILE when running make; otherwise the makefile
-#   will call the non-existent binary 'i686-ar'.
-RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \
-    tar xzf - && \
-    cd musl-1.1.15 && \
-    CC=gcc CFLAGS=-m32 ./configure --prefix=/musl-i686 --disable-shared --target=i686 && \
-    make CROSS_COMPILE= install -j4 && \
-    cd .. && \
-    rm -rf musl-1.1.15
-ENV PATH=$PATH:/musl-i686/bin:/rust/bin \
-    CC_i686_unknown_linux_musl=musl-gcc
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/mips-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates \
-        gcc-mips-linux-gnu libc6-dev-mips-cross \
-        qemu-system-mips
-
-ENV CARGO_TARGET_MIPS_UNKNOWN_LINUX_GNU_LINKER=mips-linux-gnu-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/mips-unknown-linux-musl/Dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \
-        bzip2
-
-RUN mkdir /toolchain
-
-# Note that this originally came from:
-# https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2
-RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-SDK-ar71xx-generic_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \
-      tar xjf - -C /toolchain --strip-components=1
-
-ENV PATH=$PATH:/rust/bin:/toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15/bin \
-    CC_mips_unknown_linux_musl=mips-openwrt-linux-gcc \
-    CARGO_TARGET_MIPS_UNKNOWN_LINUX_MUSL_LINKER=mips-openwrt-linux-gcc
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/mips64-unknown-linux-gnuabi64/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates \
-        gcc-mips64-linux-gnuabi64 libc6-dev-mips64-cross \
-        qemu-system-mips64
-
-ENV CARGO_TARGET_MIPS64_UNKNOWN_LINUX_GNUABI64_LINKER=mips64-linux-gnuabi64-gcc \
-    CC_mips64_unknown_linux_gnuabi64=mips64-linux-gnuabi64-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/mipsel-unknown-linux-musl/Dockerfile
+++ /dev/null
@@ -1,17 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates qemu-system-mips curl \
-        bzip2
-
-RUN mkdir /toolchain
-
-# Note that this originally came from:
-# https://downloads.openwrt.org/snapshots/trunk/malta/generic/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2
-RUN curl -L https://s3.amazonaws.com/rust-lang-ci/libc/OpenWrt-Toolchain-malta-le_gcc-5.3.0_musl-1.1.15.Linux-x86_64.tar.bz2 | \
-      tar xjf - -C /toolchain --strip-components=2
-
-ENV PATH=$PATH:/rust/bin:/toolchain/bin \
-    CC_mipsel_unknown_linux_musl=mipsel-openwrt-linux-gcc \
-    CARGO_TARGET_MIPSEL_UNKNOWN_LINUX_MUSL_LINKER=mipsel-openwrt-linux-gcc
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/powerpc-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates \
-        gcc-powerpc-linux-gnu libc6-dev-powerpc-cross \
-        qemu-system-ppc
-
-ENV CARGO_TARGET_POWERPC_UNKNOWN_LINUX_GNU_LINKER=powerpc-linux-gnu-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/powerpc64-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-        gcc libc6-dev qemu-user ca-certificates \
-        gcc-powerpc64-linux-gnu libc6-dev-ppc64-cross \
-        qemu-system-ppc
-
-ENV CARGO_TARGET_POWERPC64_UNKNOWN_LINUX_GNU_LINKER=powerpc64-linux-gnu-gcc \
-    CC=powerpc64-linux-gnu-gcc \
-    PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-linux-android/Dockerfile
+++ /dev/null
@@ -1,26 +0,0 @@
-FROM ubuntu:16.04
-
-RUN apt-get update && \
-    apt-get install -y --no-install-recommends \
-  ca-certificates \
-  curl \
-  gcc \
-  libc-dev \
-  python \
-  unzip
-
-WORKDIR /android/
-ENV ANDROID_ARCH=x86_64
-COPY android-install-ndk.sh /android/
-RUN sh /android/android-install-ndk.sh $ANDROID_ARCH
-
-# We do not run x86_64-linux-android tests on an android emulator.
-# See ci/android-sysimage.sh for informations about how tests are run.
-COPY android-sysimage.sh /android/
-RUN bash /android/android-sysimage.sh x86_64 x86_64-21_r04.zip
-
-ENV PATH=$PATH:/rust/bin:/android/ndk-$ANDROID_ARCH/bin \
-    CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android-gcc \
-    CC_x86_64_linux_android=x86_64-linux-android-gcc \
-    CXX_x86_64_linux_android=x86_64-linux-android-g++ \
-    HOME=/tmp
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-rumprun-netbsd/Dockerfile
+++ /dev/null
@@ -1,6 +0,0 @@
-FROM mato/rumprun-toolchain-hw-x86_64
-USER root
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  qemu
-ENV PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-freebsd/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-FROM alexcrichton/rust-slave-linux-cross:2016-04-15
-USER root
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  qemu genext2fs
-
-ENTRYPOINT ["sh"]
-
-ENV PATH=$PATH:/rust/bin \
-    QEMU=2016-11-06/freebsd.qcow2.gz \
-    CAN_CROSS=1 \
-    CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_LINKER=x86_64-unknown-freebsd10-gcc
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-linux-gnu/Dockerfile
+++ /dev/null
@@ -1,5 +0,0 @@
-FROM ubuntu:16.10
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc libc6-dev ca-certificates
-ENV PATH=$PATH:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-linux-musl/Dockerfile
+++ /dev/null
@@ -1,13 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc make libc6-dev git curl ca-certificates
-RUN curl https://www.musl-libc.org/releases/musl-1.1.15.tar.gz | \
-    tar xzf - && \
-    cd musl-1.1.15 && \
-    ./configure --prefix=/musl-x86_64 && \
-    make install -j4 && \
-    cd .. && \
-    rm -rf musl-1.1.15
-ENV PATH=$PATH:/musl-x86_64/bin:/rust/bin
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/docker/x86_64-unknown-openbsd/Dockerfile
+++ /dev/null
@@ -1,8 +0,0 @@
-FROM ubuntu:16.10
-
-RUN apt-get update
-RUN apt-get install -y --no-install-recommends \
-  gcc libc6-dev qemu curl ca-certificates \
-  genext2fs
-ENV PATH=$PATH:/rust/bin \
-    QEMU=2016-11-06/openbsd-6.0-without-pkgs.qcow2
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/dox.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-
-# Builds documentation for all target triples that we have a registered URL for
-# in liblibc. This scrapes the list of triples to document from `src/lib.rs`
-# which has a bunch of `html_root_url` directives we pick up.
-
-set -e
-
-TARGETS=`grep html_root_url src/lib.rs | sed 's/.*".*\/\(.*\)"/\1/'`
-
-rm -rf target/doc
-mkdir -p target/doc
-
-cp ci/landing-page-head.html target/doc/index.html
-
-for target in $TARGETS; do
-  echo documenting $target
-
-  rustdoc -o target/doc/$target --target $target src/lib.rs --cfg dox \
-    --crate-name libc
-
-  echo "<li><a href="/libc/$target/libc/index.html">$target</a></li>" \
-    >> target/doc/index.html
-done
-
-cat ci/landing-page-footer.html >> target/doc/index.html
-
-# If we're on travis, not a PR, and on the right branch, publish!
-if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "$TRAVIS_BRANCH" = "master" ]; then
-  pip install ghp_import --install-option="--prefix=$HOME/.local"
-  $HOME/.local/bin/ghp-import -n target/doc
-  git push -qf https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git gh-pages
-fi
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/ios/deploy_and_run_on_ios_simulator.rs
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// This is a script to deploy and execute a binary on an iOS simulator.
-// The primary use of this is to be able to run unit tests on the simulator and
-// retrieve the results.
-//
-// To do this through Cargo instead, use Dinghy
-// (https://github.com/snipsco/dinghy): cargo dinghy install, then cargo dinghy
-// test.
-
-use std::env;
-use std::fs::{self, File};
-use std::io::Write;
-use std::path::Path;
-use std::process;
-use std::process::Command;
-
-macro_rules! t {
-    ($e:expr) => (match $e {
-        Ok(e) => e,
-        Err(e) => panic!("{} failed with: {}", stringify!($e), e),
-    })
-}
-
-// Step one: Wrap as an app
-fn package_as_simulator_app(crate_name: &str, test_binary_path: &Path) {
-    println!("Packaging simulator app");
-    drop(fs::remove_dir_all("ios_simulator_app"));
-    t!(fs::create_dir("ios_simulator_app"));
-    t!(fs::copy(test_binary_path,
-                Path::new("ios_simulator_app").join(crate_name)));
-
-    let mut f = t!(File::create("ios_simulator_app/Info.plist"));
-    t!(f.write_all(format!(r#"
-        <?xml version="1.0" encoding="UTF-8"?>
-        <!DOCTYPE plist PUBLIC
-                "-//Apple//DTD PLIST 1.0//EN"
-                "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-        <plist version="1.0">
-            <dict>
-                <key>CFBundleExecutable</key>
-                <string>{}</string>
-                <key>CFBundleIdentifier</key>
-                <string>com.rust.unittests</string>
-            </dict>
-        </plist>
-    "#, crate_name).as_bytes()));
-}
-
-// Step two: Start the iOS simulator
-fn start_simulator() {
-    println!("Looking for iOS simulator");
-    let output = t!(Command::new("xcrun").arg("simctl").arg("list").output());
-    assert!(output.status.success());
-    let mut simulator_exists = false;
-    let mut simulator_booted = false;
-    let mut found_rust_sim = false;
-    let stdout = t!(String::from_utf8(output.stdout));
-    for line in stdout.lines() {
-        if line.contains("rust_ios") {
-            if found_rust_sim {
-                panic!("Duplicate rust_ios simulators found. Please \
-                        double-check xcrun simctl list.");
-            }
-            simulator_exists = true;
-            simulator_booted = line.contains("(Booted)");
-            found_rust_sim = true;
-        }
-    }
-
-    if simulator_exists == false {
-        println!("Creating iOS simulator");
-        Command::new("xcrun")
-                .arg("simctl")
-                .arg("create")
-                .arg("rust_ios")
-                .arg("com.apple.CoreSimulator.SimDeviceType.iPhone-SE")
-                .arg("com.apple.CoreSimulator.SimRuntime.iOS-10-2")
-                .check_status();
-    } else if simulator_booted == true {
-        println!("Shutting down already-booted simulator");
-        Command::new("xcrun")
-                .arg("simctl")
-                .arg("shutdown")
-                .arg("rust_ios")
-                .check_status();
-    }
-
-    println!("Starting iOS simulator");
-    // We can't uninstall the app (if present) as that will hang if the
-    // simulator isn't completely booted; just erase the simulator instead.
-    Command::new("xcrun").arg("simctl").arg("erase").arg("rust_ios").check_status();
-    Command::new("xcrun").arg("simctl").arg("boot").arg("rust_ios").check_status();
-}
-
-// Step three: Install the app
-fn install_app_to_simulator() {
-    println!("Installing app to simulator");
-    Command::new("xcrun")
-            .arg("simctl")
-            .arg("install")
-            .arg("booted")
-            .arg("ios_simulator_app/")
-            .check_status();
-}
-
-// Step four: Run the app
-fn run_app_on_simulator() {
-    println!("Running app");
-    let output = t!(Command::new("xcrun")
-                    .arg("simctl")
-                    .arg("launch")
-                    .arg("--console")
-                    .arg("booted")
-                    .arg("com.rust.unittests")
-                    .output());
-
-    println!("stdout --\n{}\n", String::from_utf8_lossy(&output.stdout));
-    println!("stderr --\n{}\n", String::from_utf8_lossy(&output.stderr));
-
-    let stdout = String::from_utf8_lossy(&output.stdout);
-    let passed = stdout.lines()
-                       .find(|l| l.contains("PASSED"))
-                       .map(|l| l.contains("tests"))
-                       .unwrap_or(false);
-
-    println!("Shutting down simulator");
-    Command::new("xcrun")
-        .arg("simctl")
-        .arg("shutdown")
-        .arg("rust_ios")
-        .check_status();
-    if !passed {
-        panic!("tests didn't pass");
-    }
-}
-
-trait CheckStatus {
-    fn check_status(&mut self);
-}
-
-impl CheckStatus for Command {
-    fn check_status(&mut self) {
-        println!("\trunning: {:?}", self);
-        assert!(t!(self.status()).success());
-    }
-}
-
-fn main() {
-    let args: Vec<String> = env::args().collect();
-    if args.len() != 2 {
-        println!("Usage: {} <executable>", args[0]);
-        process::exit(-1);
-    }
-
-    let test_binary_path = Path::new(&args[1]);
-    let crate_name = test_binary_path.file_name().unwrap();
-
-    package_as_simulator_app(crate_name.to_str().unwrap(), test_binary_path);
-    start_simulator();
-    install_app_to_simulator();
-    run_app_on_simulator();
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/landing-page-footer.html
+++ /dev/null
@@ -1,3 +0,0 @@
-    </ul>
-  </body>
-</html>
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/landing-page-head.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-  </head>
-  <body>
-    <ul>
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/run-docker.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-# Small script to run tests for a target (or all targets) inside all the
-# respective docker images.
-
-set -ex
-
-run() {
-    echo $1
-    # use -f so we can use ci/ as build context
-    docker build -t libc -f ci/docker/$1/Dockerfile ci/
-    mkdir -p target
-    if [ -w /dev/kvm ]; then
-      kvm="--volume /dev/kvm:/dev/kvm"
-    fi
-    docker run \
-      --user `id -u`:`id -g` \
-      --rm \
-      --volume $HOME/.cargo:/cargo \
-      $kvm \
-      --env CARGO_HOME=/cargo \
-      --volume `rustc --print sysroot`:/rust:ro \
-      --volume `pwd`:/checkout:ro \
-      --volume `pwd`/target:/checkout/target \
-      --env CARGO_TARGET_DIR=/checkout/target \
-      --workdir /checkout \
-      --privileged \
-      libc \
-      ci/run.sh $1
-}
-
-if [ -z "$1" ]; then
-  for d in `ls ci/docker/`; do
-    run $d
-  done
-else
-  run $1
-fi
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/run-qemu.sh
+++ /dev/null
@@ -1,32 +0,0 @@
-# Initial script which is run inside of all qemu images. The first argument to
-# this script (as arranged by the qemu image itself) is the path to where the
-# libc crate is mounted.
-#
-# For qemu images we currently need to install Rust manually as this wasn't done
-# by the initial run-travis.sh script
-#
-# FIXME: feels like run-travis.sh should be responsible for downloading the
-#        compiler.
-
-set -ex
-
-ROOT=$1
-cp -r $ROOT/libc /tmp/libc
-cd /tmp/libc
-
-TARGET=$(cat $ROOT/TARGET)
-export CARGO_TARGET_DIR=/tmp
-
-case $TARGET in
-  *-openbsd)
-    pkg_add cargo gcc%4.9 rust
-    export CC=egcc
-    ;;
-
-  *)
-    echo "Unknown target: $TARGET"
-    exit 1
-    ;;
-esac
-
-exec sh ci/run.sh $TARGET
deleted file mode 100755
--- a/third_party/rust/libc-0.2.24/ci/run.sh
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/bin/sh
-
-# Builds and runs tests for a particular target passed as an argument to this
-# script.
-
-set -ex
-
-TARGET=$1
-
-# If we're going to run tests inside of a qemu image, then we don't need any of
-# the scripts below. Instead, download the image, prepare a filesystem which has
-# the current state of this repository, and then run the image.
-#
-# It's assume that all images, when run with two disks, will run the `run.sh`
-# script from the second which we place inside.
-if [ "$QEMU" != "" ]; then
-  tmpdir=/tmp/qemu-img-creation
-  mkdir -p $tmpdir
-
-  if [ -z "${QEMU#*.gz}" ]; then
-    # image is .gz : download and uncompress it
-    qemufile=$(echo ${QEMU%.gz} | sed 's/\//__/g')
-    if [ ! -f $tmpdir/$qemufile ]; then
-      curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU | \
-        gunzip -d > $tmpdir/$qemufile
-    fi
-  else
-    # plain qcow2 image: just download it
-    qemufile=$(echo ${QEMU} | sed 's/\//__/g')
-    if [ ! -f $tmpdir/$qemufile ]; then
-      curl https://s3.amazonaws.com/rust-lang-ci/libc/$QEMU \
-        > $tmpdir/$qemufile
-    fi
-  fi
-
-  # Create a mount a fresh new filesystem image that we'll later pass to QEMU.
-  # This will have a `run.sh` script will which use the artifacts inside to run
-  # on the host.
-  rm -f $tmpdir/libc-test.img
-  mkdir $tmpdir/mount
-
-  # If we have a cross compiler, then we just do the standard rigamarole of
-  # cross-compiling an executable and then the script to run just executes the
-  # binary.
-  #
-  # If we don't have a cross-compiler, however, then we need to do some crazy
-  # acrobatics to get this to work.  Generate all.{c,rs} on the host which will
-  # be compiled inside QEMU. Do this here because compiling syntex_syntax in
-  # QEMU would time out basically everywhere.
-  if [ "$CAN_CROSS" = "1" ]; then
-    cargo build --manifest-path libc-test/Cargo.toml --target $TARGET
-    cp $CARGO_TARGET_DIR/$TARGET/debug/libc-test $tmpdir/mount/
-    echo 'exec $1/libc-test' > $tmpdir/mount/run.sh
-  else
-    rm -rf $tmpdir/generated
-    mkdir -p $tmpdir/generated
-    cargo build --manifest-path libc-test/generate-files/Cargo.toml
-    (cd libc-test && TARGET=$TARGET OUT_DIR=$tmpdir/generated SKIP_COMPILE=1 \
-      $CARGO_TARGET_DIR/debug/generate-files)
-
-    # Copy this folder into the mounted image, the `run.sh` entry point, and
-    # overwrite the standard libc-test Cargo.toml with the overlay one which will
-    # assume the all.{c,rs} test files have already been generated
-    mkdir $tmpdir/mount/libc
-    cp -r Cargo.* libc-test src ci $tmpdir/mount/libc/
-    ln -s libc-test/target $tmpdir/mount/libc/target
-    cp ci/run-qemu.sh $tmpdir/mount/run.sh
-    echo $TARGET | tee -a $tmpdir/mount/TARGET
-    cp $tmpdir/generated/* $tmpdir/mount/libc/libc-test
-    cp libc-test/run-generated-Cargo.toml $tmpdir/mount/libc/libc-test/Cargo.toml
-  fi
-
-  du -sh $tmpdir/mount
-  genext2fs \
-      --root $tmpdir/mount \
-      --size-in-blocks 100000 \
-      $tmpdir/libc-test.img
-
-  # Pass -snapshot to prevent tampering with the disk images, this helps when
-  # running this script in development. The two drives are then passed next,
-  # first is the OS and second is the one we just made. Next the network is
-  # configured to work (I'm not entirely sure how), and then finally we turn off
-  # graphics and redirect the serial console output to out.log.
-  qemu-system-x86_64 \
-    -m 1024 \
-    -snapshot \
-    -drive if=virtio,file=$tmpdir/$qemufile \
-    -drive if=virtio,file=$tmpdir/libc-test.img \
-    -net nic,model=virtio \
-    -net user \
-    -nographic \
-    -vga none 2>&1 | tee $CARGO_TARGET_DIR/out.log
-  exec grep "^PASSED .* tests" $CARGO_TARGET_DIR/out.log
-fi
-
-case "$TARGET" in
-  *-apple-ios)
-    cargo rustc --manifest-path libc-test/Cargo.toml --target $TARGET -- \
-        -C link-args=-mios-simulator-version-min=7.0
-    ;;
-
-  *)
-    cargo build --manifest-path libc-test/Cargo.toml --target $TARGET
-    ;;
-esac
-
-case "$TARGET" in
-  # Android emulator for x86_64 does not work on travis (missing hardware
-  # acceleration). Tests are run on case *). See ci/android-sysimage.sh for
-  # informations about how tests are run.
-  arm-linux-androideabi | aarch64-linux-android | i686-linux-android)
-    # set SHELL so android can detect a 64bits system, see
-    # http://stackoverflow.com/a/41789144
-    # https://issues.jenkins-ci.org/browse/JENKINS-26930?focusedCommentId=230791&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-230791
-    export SHELL=/bin/dash
-    arch=$(echo $TARGET | cut -d- -f1)
-    accel="-no-accel"
-    if emulator -accel-check; then
-      accel=""
-    fi
-    emulator @$arch -no-window $accel &
-    adb wait-for-device
-    adb push $CARGO_TARGET_DIR/$TARGET/debug/libc-test /data/local/tmp/libc-test
-    adb shell /data/local/tmp/libc-test 2>&1 | tee /tmp/out
-    grep "^PASSED .* tests" /tmp/out
-    ;;
-
-  i386-apple-ios)
-    rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs
-    ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  x86_64-apple-ios)
-    rustc -O ./ci/ios/deploy_and_run_on_ios_simulator.rs
-    ./deploy_and_run_on_ios_simulator $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  arm-unknown-linux-gnueabihf)
-    qemu-arm -L /usr/arm-linux-gnueabihf $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  mips-unknown-linux-gnu)
-    qemu-mips -L /usr/mips-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  mips64-unknown-linux-gnuabi64)
-    qemu-mips64 -L /usr/mips64-linux-gnuabi64 $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  mips-unknown-linux-musl)
-    qemu-mips -L /toolchain/staging_dir/toolchain-mips_34kc_gcc-5.3.0_musl-1.1.15 \
-              $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  mipsel-unknown-linux-musl)
-      qemu-mipsel -L /toolchain $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-      ;;
-
-  powerpc-unknown-linux-gnu)
-    qemu-ppc -L /usr/powerpc-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  powerpc64-unknown-linux-gnu)
-    qemu-ppc64 -L /usr/powerpc64-linux-gnu $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  aarch64-unknown-linux-gnu)
-    qemu-aarch64 -L /usr/aarch64-linux-gnu/ $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-
-  *-rumprun-netbsd)
-    rumprun-bake hw_virtio /tmp/libc-test.img $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    qemu-system-x86_64 -nographic -vga none -m 64 \
-        -kernel /tmp/libc-test.img 2>&1 | tee /tmp/out &
-    sleep 5
-    grep "^PASSED .* tests" /tmp/out
-    ;;
-
-  *)
-    $CARGO_TARGET_DIR/$TARGET/debug/libc-test
-    ;;
-esac
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/ci/style.rs
+++ /dev/null
@@ -1,204 +0,0 @@
-//! Simple script to verify the coding style of this library
-//!
-//! ## How to run
-//!
-//! The first argument to this script is the directory to run on, so running
-//! this script should be as simple as:
-//!
-//! ```notrust
-//! rustc ci/style.rs
-//! ./style src
-//! ```
-//!
-//! ## Guidelines
-//!
-//! The current style is:
-//!
-//! * No trailing whitespace
-//! * No tabs
-//! * 80-character lines
-//! * `extern` instead of `extern "C"`
-//! * Specific module layout:
-//!     1. use directives
-//!     2. typedefs
-//!     3. structs
-//!     4. constants
-//!     5. f! { ... } functions
-//!     6. extern functions
-//!     7. modules + pub use
-//!
-//! Things not verified:
-//!
-//! * alignment
-//! * 4-space tabs
-//! * leading colons on paths
-
-use std::env;
-use std::fs;
-use std::io::prelude::*;
-use std::path::Path;
-
-macro_rules! t {
-    ($e:expr) => (match $e {
-        Ok(e) => e,
-        Err(e) => panic!("{} failed with {}", stringify!($e), e),
-    })
-}
-
-fn main() {
-    let arg = env::args().skip(1).next().unwrap_or(".".to_string());
-
-    let mut errors = Errors { errs: false };
-    walk(Path::new(&arg), &mut errors);
-
-    if errors.errs {
-        panic!("found some lint errors");
-    } else {
-        println!("good style!");
-    }
-}
-
-fn walk(path: &Path, err: &mut Errors) {
-    for entry in t!(path.read_dir()).map(|e| t!(e)) {
-        let path = entry.path();
-        if t!(entry.file_type()).is_dir() {
-            walk(&path, err);
-            continue
-        }
-
-        let name = entry.file_name().into_string().unwrap();
-        match &name[..] {
-            n if !n.ends_with(".rs") => continue,
-
-            "dox.rs" |
-            "lib.rs" |
-            "macros.rs" => continue,
-
-            _ => {}
-        }
-
-        let mut contents = String::new();
-        t!(t!(fs::File::open(&path)).read_to_string(&mut contents));
-
-        check_style(&contents, &path, err);
-    }
-}
-
-struct Errors {
-    errs: bool,
-}
-
-#[derive(Clone, Copy, PartialEq)]
-enum State {
-    Start,
-    Imports,
-    Typedefs,
-    Structs,
-    Constants,
-    FunctionDefinitions,
-    Functions,
-    Modules,
-}
-
-fn check_style(file: &str, path: &Path, err: &mut Errors) {
-    let mut state = State::Start;
-    let mut s_macros = 0;
-    let mut f_macros = 0;
-    let mut prev_blank = false;
-
-    for (i, line) in file.lines().enumerate() {
-        if line == "" {
-            if prev_blank {
-                err.error(path, i, "double blank line");
-            }
-            prev_blank = true;
-        } else {
-            prev_blank = false;
-        }
-        if line != line.trim_right() {
-            err.error(path, i, "trailing whitespace");
-        }
-        if line.contains("\t") {
-            err.error(path, i, "tab character");
-        }
-        if line.len() > 80 {
-            err.error(path, i, "line longer than 80 chars");
-        }
-        if line.contains("extern \"C\"") {
-            err.error(path, i, "use `extern` instead of `extern \"C\"");
-        }
-        if line.contains("#[cfg(") && !line.contains(" if ") {
-            if state != State::Structs {
-                err.error(path, i, "use cfg_if! and submodules \
-                                    instead of #[cfg]");
-            }
-        }
-
-        let line = line.trim_left();
-        let is_pub = line.starts_with("pub ");
-        let line = if is_pub {&line[4..]} else {line};
-
-        let line_state = if line.starts_with("use ") {
-            if is_pub {
-                State::Modules
-            } else {
-                State::Imports
-            }
-        } else if line.starts_with("const ") {
-            State::Constants
-        } else if line.starts_with("type ") {
-            State::Typedefs
-        } else if line.starts_with("s! {") {
-            s_macros += 1;
-            State::Structs
-        } else if line.starts_with("f! {") {
-            f_macros += 1;
-            State::FunctionDefinitions
-        } else if line.starts_with("extern ") {
-            State::Functions
-        } else if line.starts_with("mod ") {
-            State::Modules
-        } else {
-            continue
-        };
-
-        if state as usize > line_state as usize {
-            err.error(path, i, &format!("{} found after {} when \
-                                         it belongs before",
-                                        line_state.desc(), state.desc()));
-        }
-
-        if f_macros == 2 {
-            f_macros += 1;
-            err.error(path, i, "multiple f! macros in one module");
-        }
-        if s_macros == 2 {
-            s_macros += 1;
-            err.error(path, i, "multiple s! macros in one module");
-        }
-
-        state = line_state;
-    }
-}
-
-impl State {
-    fn desc(&self) -> &str {
-        match *self {
-            State::Start => "start",
-            State::Imports => "import",
-            State::Typedefs => "typedef",
-            State::Structs => "struct",
-            State::Constants => "constant",
-            State::FunctionDefinitions => "function definition",
-            State::Functions => "extern function",
-            State::Modules => "module",
-        }
-    }
-}
-
-impl Errors {
-    fn error(&mut self, path: &Path, line: usize, msg: &str) {
-        self.errs = true;
-        println!("{}:{} - {}", path.display(), line + 1, msg);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/dox.rs
+++ /dev/null
@@ -1,175 +0,0 @@
-pub use self::imp::*;
-
-#[cfg(not(dox))]
-mod imp {
-    pub use core::option::Option;
-    pub use core::clone::Clone;
-    pub use core::marker::Copy;
-    pub use core::mem;
-}
-
-#[cfg(dox)]
-mod imp {
-    pub enum Option<T> {
-        Some(T),
-        None,
-    }
-    impl<T: Copy> Copy for Option<T> {}
-    impl<T: Clone> Clone for Option<T> {
-        fn clone(&self) -> Option<T> { loop {} }
-    }
-
-    pub trait Clone {
-        fn clone(&self) -> Self;
-    }
-
-    #[lang = "copy"]
-    pub trait Copy {}
-
-    #[lang = "freeze"]
-    pub trait Freeze {}
-
-    #[lang = "sync"]
-    pub trait Sync {}
-    impl<T> Sync for T {}
-
-    #[lang = "sized"]
-    pub trait Sized {}
-
-    macro_rules! each_int {
-        ($mac:ident) => (
-            $mac!(u8);
-            $mac!(u16);
-            $mac!(u32);
-            $mac!(u64);
-            $mac!(usize);
-            each_signed_int!($mac);
-        )
-    }
-
-    macro_rules! each_signed_int {
-        ($mac:ident) => (
-            $mac!(i8);
-            $mac!(i16);
-            $mac!(i32);
-            $mac!(i64);
-            $mac!(isize);
-        )
-    }
-
-    #[lang = "div"]
-    pub trait Div<RHS> {
-        type Output;
-        fn div(self, rhs: RHS) -> Self::Output;
-    }
-
-    macro_rules! impl_div {
-        ($($i:ident)*) => ($(
-            impl Div<$i> for $i {
-                type Output = $i;
-                fn div(self, rhs: $i) -> $i { self / rhs }
-            }
-        )*)
-    }
-    each_int!(impl_div);
-
-    #[lang = "shl"]
-    pub trait Shl<RHS> {
-        type Output;
-        fn shl(self, rhs: RHS) -> Self::Output;
-    }
-
-    macro_rules! impl_shl {
-        ($($i:ident)*) => ($(
-            impl Shl<$i> for $i {
-                type Output = $i;
-                fn shl(self, rhs: $i) -> $i { self << rhs }
-            }
-        )*)
-    }
-    each_int!(impl_shl);
-
-    #[lang = "mul"]
-    pub trait Mul<RHS=Self> {
-        type Output;
-        fn mul(self, rhs: RHS) -> Self::Output;
-    }
-
-    macro_rules! impl_mul {
-        ($($i:ident)*) => ($(
-            impl Mul for $i {
-                type Output = $i;
-                fn mul(self, rhs: $i) -> $i { self * rhs }
-            }
-        )*)
-    }
-    each_int!(impl_mul);
-
-    #[lang = "sub"]
-    pub trait Sub<RHS=Self> {
-        type Output;
-        fn sub(self, rhs: RHS) -> Self::Output;
-    }
-
-    macro_rules! impl_sub {
-        ($($i:ident)*) => ($(
-            impl Sub for $i {
-                type Output = $i;
-                fn sub(self, rhs: $i) -> $i { self - rhs }
-            }
-        )*)
-    }
-    each_int!(impl_sub);
-
-    #[lang = "bitor"]
-    pub trait Bitor<RHS=Self> {
-        type Output;
-        fn bitor(self, rhs: RHS) -> Self::Output;
-    }
-
-    macro_rules! impl_bitor {
-        ($($i:ident)*) => ($(
-            impl Bitor for $i {
-                type Output = $i;
-                fn bitor(self, rhs: $i) -> $i { self | rhs }
-            }
-        )*)
-    }
-    each_int!(impl_bitor);
-
-    #[lang = "neg"]
-    pub trait Neg {
-        type Output;
-        fn neg(self) -> Self::Output;
-    }
-
-    macro_rules! impl_neg {
-        ($($i:ident)*) => ($(
-            impl Neg for $i {
-                type Output = $i;
-                fn neg(self) -> $i { -self }
-            }
-        )*)
-    }
-    each_signed_int!(impl_neg);
-
-    #[lang = "not"]
-    pub trait Not {
-        type Output;
-        fn not(self) -> Self::Output;
-    }
-
-    macro_rules! impl_not {
-        ($($i:ident)*) => ($(
-            impl Not for $i {
-                type Output = $i;
-                fn not(self) -> $i { !self }
-            }
-        )*)
-    }
-    each_int!(impl_not);
-
-    pub mod mem {
-        pub fn size_of_val<T>(_: &T) -> usize { 4 }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/lib.rs
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Crate docs
-
-#![allow(bad_style, overflowing_literals, improper_ctypes)]
-#![crate_type = "rlib"]
-#![crate_name = "libc"]
-#![cfg_attr(dox, feature(no_core, lang_items))]
-#![cfg_attr(dox, no_core)]
-#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
-       html_favicon_url = "https://doc.rust-lang.org/favicon.ico")]
-
-#![cfg_attr(all(target_os = "linux", target_arch = "x86_64"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-gnu"
-))]
-#![cfg_attr(all(target_os = "linux", target_arch = "x86"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/i686-unknown-linux-gnu"
-))]
-#![cfg_attr(all(target_os = "linux", target_arch = "arm"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/arm-unknown-linux-gnueabihf"
-))]
-#![cfg_attr(all(target_os = "linux", target_arch = "mips"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/mips-unknown-linux-gnu"
-))]
-#![cfg_attr(all(target_os = "linux", target_arch = "aarch64"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/aarch64-unknown-linux-gnu"
-))]
-#![cfg_attr(all(target_os = "linux", target_env = "musl"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-linux-musl"
-))]
-#![cfg_attr(all(target_os = "macos", target_arch = "x86_64"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-apple-darwin"
-))]
-#![cfg_attr(all(target_os = "macos", target_arch = "x86"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/i686-apple-darwin"
-))]
-#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "gnu"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-gnu"
-))]
-#![cfg_attr(all(windows, target_arch = "x86", target_env = "gnu"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-gnu"
-))]
-#![cfg_attr(all(windows, target_arch = "x86_64", target_env = "msvc"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-pc-windows-msvc"
-))]
-#![cfg_attr(all(windows, target_arch = "x86", target_env = "msvc"), doc(
-    html_root_url = "https://doc.rust-lang.org/libc/i686-pc-windows-msvc"
-))]
-#![cfg_attr(target_os = "android", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/arm-linux-androideabi"
-))]
-#![cfg_attr(target_os = "freebsd", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-freebsd"
-))]
-#![cfg_attr(target_os = "openbsd", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-openbsd"
-))]
-#![cfg_attr(target_os = "bitrig", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-bitrig"
-))]
-#![cfg_attr(target_os = "netbsd", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-netbsd"
-))]
-#![cfg_attr(target_os = "dragonfly", doc(
-    html_root_url = "https://doc.rust-lang.org/libc/x86_64-unknown-dragonfly"
-))]
-
-// Attributes needed when building as part of the standard library
-#![cfg_attr(stdbuild, feature(no_std, core, core_slice_ext, staged_api, custom_attribute, cfg_target_vendor))]
-#![cfg_attr(stdbuild, feature(link_cfg))]
-#![cfg_attr(stdbuild, no_std)]
-#![cfg_attr(stdbuild, staged_api)]
-#![cfg_attr(stdbuild, allow(warnings))]
-#![cfg_attr(stdbuild, unstable(feature = "libc",
-                               reason = "use `libc` from crates.io",
-                               issue = "27783"))]
-
-#![cfg_attr(not(feature = "use_std"), no_std)]
-
-#[cfg(all(not(stdbuild), not(dox), feature = "use_std"))]
-extern crate std as core;
-
-#[macro_use] mod macros;
-mod dox;
-
-// Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable
-// more optimization opportunities around it recognizing things like
-// malloc/free.
-#[repr(u8)]
-pub enum c_void {
-    // Two dummy variants so the #[repr] attribute can be used.
-    #[doc(hidden)]
-    __variant1,
-    #[doc(hidden)]
-    __variant2,
-}
-
-pub type int8_t = i8;
-pub type int16_t = i16;
-pub type int32_t = i32;
-pub type int64_t = i64;
-pub type uint8_t = u8;
-pub type uint16_t = u16;
-pub type uint32_t = u32;
-pub type uint64_t = u64;
-
-pub type c_schar = i8;
-pub type c_uchar = u8;
-pub type c_short = i16;
-pub type c_ushort = u16;
-pub type c_int = i32;
-pub type c_uint = u32;
-pub type c_float = f32;
-pub type c_double = f64;
-pub type c_longlong = i64;
-pub type c_ulonglong = u64;
-pub type intmax_t = i64;
-pub type uintmax_t = u64;
-
-pub type size_t = usize;
-pub type ptrdiff_t = isize;
-pub type intptr_t = isize;
-pub type uintptr_t = usize;
-pub type ssize_t = isize;
-
-pub enum FILE {}
-pub enum fpos_t {} // TODO: fill this out with a struct
-
-extern {
-    pub fn isalnum(c: c_int) -> c_int;
-    pub fn isalpha(c: c_int) -> c_int;
-    pub fn iscntrl(c: c_int) -> c_int;
-    pub fn isdigit(c: c_int) -> c_int;
-    pub fn isgraph(c: c_int) -> c_int;
-    pub fn islower(c: c_int) -> c_int;
-    pub fn isprint(c: c_int) -> c_int;
-    pub fn ispunct(c: c_int) -> c_int;
-    pub fn isspace(c: c_int) -> c_int;
-    pub fn isupper(c: c_int) -> c_int;
-    pub fn isxdigit(c: c_int) -> c_int;
-    pub fn tolower(c: c_int) -> c_int;
-    pub fn toupper(c: c_int) -> c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fopen$UNIX2003")]
-    pub fn fopen(filename: *const c_char,
-                 mode: *const c_char) -> *mut FILE;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "freopen$UNIX2003")]
-    pub fn freopen(filename: *const c_char, mode: *const c_char,
-                   file: *mut FILE) -> *mut FILE;
-    pub fn fflush(file: *mut FILE) -> c_int;
-    pub fn fclose(file: *mut FILE) -> c_int;
-    pub fn remove(filename: *const c_char) -> c_int;
-    pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int;
-    pub fn tmpfile() -> *mut FILE;
-    pub fn setvbuf(stream: *mut FILE,
-                   buffer: *mut c_char,
-                   mode: c_int,
-                   size: size_t) -> c_int;
-    pub fn setbuf(stream: *mut FILE, buf: *mut c_char);
-    pub fn getchar() -> c_int;
-    pub fn putchar(c: c_int) -> c_int;
-    pub fn fgetc(stream: *mut FILE) -> c_int;
-    pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) -> *mut c_char;
-    pub fn fputc(c: c_int, stream: *mut FILE) -> c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fputs$UNIX2003")]
-    pub fn fputs(s: *const c_char, stream: *mut FILE)-> c_int;
-    pub fn puts(s: *const c_char) -> c_int;
-    pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int;
-    pub fn fread(ptr: *mut c_void,
-                 size: size_t,
-                 nobj: size_t,
-                 stream: *mut FILE)
-                 -> size_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fwrite$UNIX2003")]
-    pub fn fwrite(ptr: *const c_void,
-                  size: size_t,
-                  nobj: size_t,
-                  stream: *mut FILE)
-                  -> size_t;
-    pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int;
-    pub fn ftell(stream: *mut FILE) -> c_long;
-    pub fn rewind(stream: *mut FILE);
-    #[cfg_attr(target_os = "netbsd", link_name = "__fgetpos50")]
-    pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__fsetpos50")]
-    pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int;
-    pub fn feof(stream: *mut FILE) -> c_int;
-    pub fn ferror(stream: *mut FILE) -> c_int;
-    pub fn perror(s: *const c_char);
-    pub fn atoi(s: *const c_char) -> c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "strtod$UNIX2003")]
-    pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double;
-    pub fn strtol(s: *const c_char,
-                  endp: *mut *mut c_char, base: c_int) -> c_long;
-    pub fn strtoul(s: *const c_char, endp: *mut *mut c_char,
-                   base: c_int) -> c_ulong;
-    pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
-    pub fn malloc(size: size_t) -> *mut c_void;
-    pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
-    pub fn free(p: *mut c_void);
-    pub fn abort() -> !;
-    pub fn exit(status: c_int) -> !;
-    pub fn _exit(status: c_int) -> !;
-    pub fn atexit(cb: extern fn()) -> c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "system$UNIX2003")]
-    pub fn system(s: *const c_char) -> c_int;
-    pub fn getenv(s: *const c_char) -> *mut c_char;
-
-    pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char;
-    pub fn strncpy(dst: *mut c_char, src: *const c_char, n: size_t)
-                   -> *mut c_char;
-    pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char;
-    pub fn strncat(s: *mut c_char, ct: *const c_char, n: size_t) -> *mut c_char;
-    pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int;
-    pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int;
-    pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int;
-    pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char;
-    pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char;
-    pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t;
-    pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t;
-    pub fn strdup(cs: *const c_char) -> *mut c_char;
-    pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char;
-    pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char;
-    pub fn strlen(cs: *const c_char) -> size_t;
-    pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "strerror$UNIX2003")]
-    pub fn strerror(n: c_int) -> *mut c_char;
-    pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char;
-    pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t;
-    pub fn wcslen(buf: *const wchar_t) -> size_t;
-    pub fn wcstombs(dest: *mut c_char, src: *const wchar_t, n: size_t) -> ::size_t;
-
-    pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void;
-    pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int;
-    pub fn memcpy(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void;
-    pub fn memmove(dest: *mut c_void, src: *const c_void, n: size_t) -> *mut c_void;
-    pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void;
-}
-
-// These are all inline functions on android, so they end up just being entirely
-// missing on that platform.
-#[cfg(not(target_os = "android"))]
-extern {
-    pub fn abs(i: c_int) -> c_int;
-    pub fn atof(s: *const c_char) -> c_double;
-    pub fn labs(i: c_long) -> c_long;
-    pub fn rand() -> c_int;
-    pub fn srand(seed: c_uint);
-}
-
-cfg_if! {
-    if #[cfg(windows)] {
-        mod windows;
-        pub use windows::*;
-    } else if #[cfg(target_os = "redox")] {
-        mod redox;
-        pub use redox::*;
-    } else if #[cfg(unix)] {
-        mod unix;
-        pub use unix::*;
-    } else {
-        // Unknown target_family
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/macros.rs
+++ /dev/null
@@ -1,108 +0,0 @@
-/// A macro for defining #[cfg] if-else statements.
-///
-/// This is similar to the `if/elif` C preprocessor macro by allowing definition
-/// of a cascade of `#[cfg]` cases, emitting the implementation which matches
-/// first.
-///
-/// This allows you to conveniently provide a long list #[cfg]'d blocks of code
-/// without having to rewrite each clause multiple times.
-macro_rules! cfg_if {
-    ($(
-        if #[cfg($($meta:meta),*)] { $($it:item)* }
-    ) else * else {
-        $($it2:item)*
-    }) => {
-        __cfg_if_items! {
-            () ;
-            $( ( ($($meta),*) ($($it)*) ), )*
-            ( () ($($it2)*) ),
-        }
-    }
-}
-
-macro_rules! __cfg_if_items {
-    (($($not:meta,)*) ; ) => {};
-    (($($not:meta,)*) ; ( ($($m:meta),*) ($($it:item)*) ), $($rest:tt)*) => {
-        __cfg_if_apply! { cfg(all(not(any($($not),*)), $($m,)*)), $($it)* }
-        __cfg_if_items! { ($($not,)* $($m,)*) ; $($rest)* }
-    }
-}
-
-macro_rules! __cfg_if_apply {
-    ($m:meta, $($it:item)*) => {
-        $(#[$m] $it)*
-    }
-}
-
-macro_rules! s {
-    ($($(#[$attr:meta])* pub struct $i:ident { $($field:tt)* })*) => ($(
-        __item! {
-            #[repr(C)]
-            $(#[$attr])*
-            pub struct $i { $($field)* }
-        }
-        impl ::dox::Copy for $i {}
-        impl ::dox::Clone for $i {
-            fn clone(&self) -> $i { *self }
-        }
-    )*)
-}
-
-macro_rules! f {
-    ($(pub fn $i:ident($($arg:ident: $argty:ty),*) -> $ret:ty {
-        $($body:stmt);*
-    })*) => ($(
-        #[inline]
-        #[cfg(not(dox))]
-        pub unsafe extern fn $i($($arg: $argty),*) -> $ret {
-            $($body);*
-        }
-
-        #[cfg(dox)]
-        #[allow(dead_code)]
-        pub unsafe extern fn $i($($arg: $argty),*) -> $ret {
-            loop {}
-        }
-    )*)
-}
-
-macro_rules! __item {
-    ($i:item) => ($i)
-}
-
-#[cfg(test)]
-mod tests {
-    cfg_if! {
-        if #[cfg(test)] {
-            use std::option::Option as Option2;
-            fn works1() -> Option2<u32> { Some(1) }
-        } else {
-            fn works1() -> Option<u32> { None }
-        }
-    }
-
-    cfg_if! {
-        if #[cfg(foo)] {
-            fn works2() -> bool { false }
-        } else if #[cfg(test)] {
-            fn works2() -> bool { true }
-        } else {
-            fn works2() -> bool { false }
-        }
-    }
-
-    cfg_if! {
-        if #[cfg(foo)] {
-            fn works3() -> bool { false }
-        } else {
-            fn works3() -> bool { true }
-        }
-    }
-
-    #[test]
-    fn it_works() {
-        assert!(works1().is_some());
-        assert!(works2());
-        assert!(works3());
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/redox.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-pub type c_char = i8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-
-pub type wchar_t = i16;
-
-pub type off_t = usize;
-pub type mode_t = u16;
-pub type time_t = i64;
-pub type pid_t = usize;
-pub type gid_t = usize;
-pub type uid_t = usize;
-
-pub type in_addr_t = u32;
-pub type in_port_t = u16;
-
-pub type socklen_t = u32;
-pub type sa_family_t = u16;
-
-s! {
-    pub struct in_addr {
-        pub s_addr: in_addr_t,
-    }
-
-    pub struct in6_addr {
-        pub s6_addr: [u8; 16],
-        __align: [u32; 0],
-    }
-
-    pub struct sockaddr {
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [u8; 8],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_family: sa_family_t,
-        pub sin6_port: in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-}
-
-extern {
-    pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
-}
-
-#[link(name = "c")]
-#[link(name = "m")]
-extern {}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/apple/b32.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-//! 32-bit specific Apple (ios/darwin) definitions
-
-pub type c_long = i32;
-pub type c_ulong = u32;
-
-s! {
-    pub struct pthread_attr_t {
-        __sig: c_long,
-        __opaque: [::c_char; 36]
-    }
-}
-
-pub const __PTHREAD_MUTEX_SIZE__: usize = 40;
-pub const __PTHREAD_COND_SIZE__: usize = 24;
-pub const __PTHREAD_CONDATTR_SIZE__: usize = 4;
-pub const __PTHREAD_RWLOCK_SIZE__: usize = 124;
-
-pub const TIOCTIMESTAMP: ::c_ulong = 0x40087459;
-pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40087458;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/apple/b64.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-//! 64-bit specific Apple (ios/darwin) definitions
-
-pub type c_long = i64;
-pub type c_ulong = u64;
-
-s! {
-    pub struct pthread_attr_t {
-        __sig: c_long,
-        __opaque: [::c_char; 56]
-    }
-}
-
-pub const __PTHREAD_MUTEX_SIZE__: usize = 56;
-pub const __PTHREAD_COND_SIZE__: usize = 40;
-pub const __PTHREAD_CONDATTR_SIZE__: usize = 8;
-pub const __PTHREAD_RWLOCK_SIZE__: usize = 192;
-
-pub const TIOCTIMESTAMP: ::c_ulong = 0x40107459;
-pub const TIOCDCDTIMESTAMP: ::c_ulong = 0x40107458;
-
-pub const FIONREAD: ::c_ulong = 0x4004667f;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/apple/mod.rs
+++ /dev/null
@@ -1,1719 +0,0 @@
-//! Apple (ios/darwin)-specific definitions
-//!
-//! This covers *-apple-* triples currently
-
-pub type clock_t = c_ulong;
-pub type time_t = c_long;
-pub type suseconds_t = i32;
-pub type dev_t = i32;
-pub type ino_t = u64;
-pub type mode_t = u16;
-pub type nlink_t = u16;
-pub type blksize_t = i32;
-pub type rlim_t = u64;
-pub type mach_timebase_info_data_t = mach_timebase_info;
-pub type pthread_key_t = c_ulong;
-pub type sigset_t = u32;
-pub type fsblkcnt_t = ::c_uint;
-pub type fsfilcnt_t = ::c_uint;
-pub type speed_t = ::c_ulong;
-pub type tcflag_t = ::c_ulong;
-pub type nl_item = ::c_int;
-pub type id_t = ::c_uint;
-pub type sem_t = ::c_int;
-pub type idtype_t = ::c_uint;
-
-pub enum timezone {}
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_offset: ::off_t,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_reqprio: ::c_int,
-        pub aio_sigevent: sigevent,
-        pub aio_lio_opcode: ::c_int
-    }
-
-    pub struct utmpx {
-        pub ut_user: [::c_char; _UTX_USERSIZE],
-        pub ut_id: [::c_char; _UTX_IDSIZE],
-        pub ut_line: [::c_char; _UTX_LINESIZE],
-        pub ut_pid: ::pid_t,
-        pub ut_type: ::c_short,
-        pub ut_tv: ::timeval,
-        pub ut_host: [::c_char; _UTX_HOSTSIZE],
-        ut_pad: [::uint32_t; 16],
-    }
-
-    pub struct glob_t {
-        pub gl_pathc:  ::size_t,
-        __unused1: ::c_int,
-        pub gl_offs:   ::size_t,
-        __unused2: ::c_int,
-        pub gl_pathv:  *mut *mut ::c_char,
-
-        __unused3: *mut ::c_void,
-
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-        __unused8: *mut ::c_void,
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_len: u8,
-        pub ss_family: ::sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_align: i64,
-        __ss_pad2: [u8; 112],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: ::socklen_t,
-        pub ai_canonname: *mut ::c_char,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct mach_timebase_info {
-        pub numer: u32,
-        pub denom: u32,
-    }
-
-    pub struct stat {
-        pub st_dev: dev_t,
-        pub st_mode: mode_t,
-        pub st_nlink: nlink_t,
-        pub st_ino: ino_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: dev_t,
-        pub st_atime: time_t,
-        pub st_atime_nsec: c_long,
-        pub st_mtime: time_t,
-        pub st_mtime_nsec: c_long,
-        pub st_ctime: time_t,
-        pub st_ctime_nsec: c_long,
-        pub st_birthtime: time_t,
-        pub st_birthtime_nsec: c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: blksize_t,
-        pub st_flags: ::uint32_t,
-        pub st_gen: ::uint32_t,
-        pub st_lspare: ::int32_t,
-        pub st_qspare: [::int64_t; 2],
-    }
-
-    pub struct dirent {
-        pub d_ino: u64,
-        pub d_seekoff: u64,
-        pub d_reclen: u16,
-        pub d_namlen: u16,
-        pub d_type: u8,
-        pub d_name: [::c_char; 1024],
-    }
-
-    pub struct pthread_mutex_t {
-        __sig: ::c_long,
-        __opaque: [u8; __PTHREAD_MUTEX_SIZE__],
-    }
-
-    pub struct pthread_mutexattr_t {
-        __sig: ::c_long,
-        __opaque: [u8; 8],
-    }
-
-    pub struct pthread_cond_t {
-        __sig: ::c_long,
-        __opaque: [u8; __PTHREAD_COND_SIZE__],
-    }
-
-    pub struct pthread_condattr_t {
-        __sig: ::c_long,
-        __opaque: [u8; __PTHREAD_CONDATTR_SIZE__],
-    }
-
-    pub struct pthread_rwlock_t {
-        __sig: ::c_long,
-        __opaque: [u8; __PTHREAD_RWLOCK_SIZE__],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub si_pid: ::pid_t,
-        pub si_uid: ::uid_t,
-        pub si_status: ::c_int,
-        pub si_addr: *mut ::c_void,
-        _pad: [usize; 9],
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-        pub sa_flags: ::c_int,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct fstore_t {
-        pub fst_flags: ::c_uint,
-        pub fst_posmode: ::c_int,
-        pub fst_offset: ::off_t,
-        pub fst_length: ::off_t,
-        pub fst_bytesalloc: ::off_t,
-    }
-
-    pub struct radvisory {
-        pub ra_offset: ::off_t,
-        pub ra_count: ::c_int,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    pub struct sockaddr_in {
-        pub sin_len: u8,
-        pub sin_family: ::sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [::c_char; 8],
-    }
-
-    pub struct statfs {
-        pub f_bsize: ::uint32_t,
-        pub f_iosize: ::int32_t,
-        pub f_blocks: ::uint64_t,
-        pub f_bfree: ::uint64_t,
-        pub f_bavail: ::uint64_t,
-        pub f_files: ::uint64_t,
-        pub f_ffree: ::uint64_t,
-        pub f_fsid: ::fsid_t,
-        pub f_owner: ::uid_t,
-        pub f_type: ::uint32_t,
-        pub f_flags: ::uint32_t,
-        pub f_fssubtype: ::uint32_t,
-        pub f_fstypename: [::c_char; 16],
-        pub f_mntonname: [::c_char; 1024],
-        pub f_mntfromname: [::c_char; 1024],
-        pub f_reserved: [::uint32_t; 8],
-    }
-
-    // FIXME: this should have align 4 but it's got align 8 on 64-bit
-    pub struct kevent {
-        pub ident: ::uintptr_t,
-        pub filter: ::int16_t,
-        pub flags: ::uint16_t,
-        pub fflags: ::uint32_t,
-        pub data: ::intptr_t,
-        pub udata: *mut ::c_void,
-    }
-
-    pub struct kevent64_s {
-        pub ident: ::uint64_t,
-        pub filter: ::int16_t,
-        pub flags: ::uint16_t,
-        pub fflags: ::uint32_t,
-        pub data: ::int64_t,
-        pub udata: ::uint64_t,
-        pub ext: [::uint64_t; 2],
-    }
-
-    pub struct dqblk {
-        pub dqb_bhardlimit: ::uint64_t,
-        pub dqb_bsoftlimit: ::uint64_t,
-        pub dqb_curbytes: ::uint64_t,
-        pub dqb_ihardlimit: ::uint32_t,
-        pub dqb_isoftlimit: ::uint32_t,
-        pub dqb_curinodes: ::uint32_t,
-        pub dqb_btime: ::uint32_t,
-        pub dqb_itime: ::uint32_t,
-        pub dqb_id: ::uint32_t,
-        pub dqb_spare: [::uint32_t; 4],
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        pub c_ispeed: ::speed_t,
-        pub c_ospeed: ::speed_t,
-    }
-
-    pub struct flock {
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-    }
-
-    pub struct sf_hdtr {
-        pub headers: *mut ::iovec,
-        pub hdr_cnt: ::c_int,
-        pub trailers: *mut ::iovec,
-        pub trl_cnt: ::c_int,
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-
-    pub struct sigevent {
-        pub sigev_notify: ::c_int,
-        pub sigev_signo: ::c_int,
-        pub sigev_value: ::sigval,
-        __unused1: *mut ::c_void,       //actually a function pointer
-        pub sigev_notify_attributes: *mut ::pthread_attr_t
-    }
-}
-
-pub const _UTX_USERSIZE: usize = 256;
-pub const _UTX_LINESIZE: usize = 32;
-pub const _UTX_IDSIZE: usize = 4;
-pub const _UTX_HOSTSIZE: usize = 256;
-
-pub const EMPTY: ::c_short = 0;
-pub const RUN_LVL: ::c_short = 1;
-pub const BOOT_TIME: ::c_short = 2;
-pub const OLD_TIME: ::c_short = 3;
-pub const NEW_TIME: ::c_short = 4;
-pub const INIT_PROCESS: ::c_short = 5;
-pub const LOGIN_PROCESS: ::c_short = 6;
-pub const USER_PROCESS: ::c_short = 7;
-pub const DEAD_PROCESS: ::c_short = 8;
-pub const ACCOUNTING: ::c_short = 9;
-pub const SIGNATURE: ::c_short = 10;
-pub const SHUTDOWN_TIME: ::c_short = 11;
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << 0);
-pub const LC_CTYPE_MASK: ::c_int = (1 << 1);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << 2);
-pub const LC_MONETARY_MASK: ::c_int = (1 << 3);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << 4);
-pub const LC_TIME_MASK: ::c_int = (1 << 5);
-pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK
-                               | LC_CTYPE_MASK
-                               | LC_MESSAGES_MASK
-                               | LC_MONETARY_MASK
-                               | LC_NUMERIC_MASK
-                               | LC_TIME_MASK;
-
-pub const CODESET: ::nl_item = 0;
-pub const D_T_FMT: ::nl_item = 1;
-pub const D_FMT: ::nl_item = 2;
-pub const T_FMT: ::nl_item = 3;
-pub const T_FMT_AMPM: ::nl_item = 4;
-pub const AM_STR: ::nl_item = 5;
-pub const PM_STR: ::nl_item = 6;
-
-pub const DAY_1: ::nl_item = 7;
-pub const DAY_2: ::nl_item = 8;
-pub const DAY_3: ::nl_item = 9;
-pub const DAY_4: ::nl_item = 10;
-pub const DAY_5: ::nl_item = 11;
-pub const DAY_6: ::nl_item = 12;
-pub const DAY_7: ::nl_item = 13;
-
-pub const ABDAY_1: ::nl_item = 14;
-pub const ABDAY_2: ::nl_item = 15;
-pub const ABDAY_3: ::nl_item = 16;
-pub const ABDAY_4: ::nl_item = 17;
-pub const ABDAY_5: ::nl_item = 18;
-pub const ABDAY_6: ::nl_item = 19;
-pub const ABDAY_7: ::nl_item = 20;
-
-pub const MON_1: ::nl_item = 21;
-pub const MON_2: ::nl_item = 22;
-pub const MON_3: ::nl_item = 23;
-pub const MON_4: ::nl_item = 24;
-pub const MON_5: ::nl_item = 25;
-pub const MON_6: ::nl_item = 26;
-pub const MON_7: ::nl_item = 27;
-pub const MON_8: ::nl_item = 28;
-pub const MON_9: ::nl_item = 29;
-pub const MON_10: ::nl_item = 30;
-pub const MON_11: ::nl_item = 31;
-pub const MON_12: ::nl_item = 32;
-
-pub const ABMON_1: ::nl_item = 33;
-pub const ABMON_2: ::nl_item = 34;
-pub const ABMON_3: ::nl_item = 35;
-pub const ABMON_4: ::nl_item = 36;
-pub const ABMON_5: ::nl_item = 37;
-pub const ABMON_6: ::nl_item = 38;
-pub const ABMON_7: ::nl_item = 39;
-pub const ABMON_8: ::nl_item = 40;
-pub const ABMON_9: ::nl_item = 41;
-pub const ABMON_10: ::nl_item = 42;
-pub const ABMON_11: ::nl_item = 43;
-pub const ABMON_12: ::nl_item = 44;
-
-pub const ERA: ::nl_item = 45;
-pub const ERA_D_FMT: ::nl_item = 46;
-pub const ERA_D_T_FMT: ::nl_item = 47;
-pub const ERA_T_FMT: ::nl_item = 48;
-pub const ALT_DIGITS: ::nl_item = 49;
-
-pub const RADIXCHAR: ::nl_item = 50;
-pub const THOUSEP: ::nl_item = 51;
-
-pub const YESEXPR: ::nl_item = 52;
-pub const NOEXPR: ::nl_item = 53;
-
-pub const YESSTR: ::nl_item = 54;
-pub const NOSTR: ::nl_item = 55;
-
-pub const CRNCYSTR: ::nl_item = 56;
-
-pub const D_MD_ORDER: ::nl_item = 57;
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 2147483647;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 2;
-pub const _IOLBF: ::c_int = 1;
-pub const BUFSIZ: ::c_uint = 1024;
-pub const FOPEN_MAX: ::c_uint = 20;
-pub const FILENAME_MAX: ::c_uint = 1024;
-pub const L_tmpnam: ::c_uint = 1024;
-pub const TMP_MAX: ::c_uint = 308915776;
-pub const _PC_LINK_MAX: ::c_int = 1;
-pub const _PC_MAX_CANON: ::c_int = 2;
-pub const _PC_MAX_INPUT: ::c_int = 3;
-pub const _PC_NAME_MAX: ::c_int = 4;
-pub const _PC_PATH_MAX: ::c_int = 5;
-pub const _PC_PIPE_BUF: ::c_int = 6;
-pub const _PC_CHOWN_RESTRICTED: ::c_int = 7;
-pub const _PC_NO_TRUNC: ::c_int = 8;
-pub const _PC_VDISABLE: ::c_int = 9;
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 512;
-pub const O_EXCL: ::c_int = 2048;
-pub const O_NOCTTY: ::c_int = 131072;
-pub const O_TRUNC: ::c_int = 1024;
-pub const O_CLOEXEC: ::c_int = 0x1000000;
-pub const O_DIRECTORY: ::c_int = 0x100000;
-pub const S_IFIFO: mode_t = 4096;
-pub const S_IFCHR: mode_t = 8192;
-pub const S_IFBLK: mode_t = 24576;
-pub const S_IFDIR: mode_t = 16384;
-pub const S_IFREG: mode_t = 32768;
-pub const S_IFLNK: mode_t = 40960;
-pub const S_IFSOCK: mode_t = 49152;
-pub const S_IFMT: mode_t = 61440;
-pub const S_IEXEC: mode_t = 64;
-pub const S_IWRITE: mode_t = 128;
-pub const S_IREAD: mode_t = 256;
-pub const S_IRWXU: mode_t = 448;
-pub const S_IXUSR: mode_t = 64;
-pub const S_IWUSR: mode_t = 128;
-pub const S_IRUSR: mode_t = 256;
-pub const S_IRWXG: mode_t = 56;
-pub const S_IXGRP: mode_t = 8;
-pub const S_IWGRP: mode_t = 16;
-pub const S_IRGRP: mode_t = 32;
-pub const S_IRWXO: mode_t = 7;
-pub const S_IXOTH: mode_t = 1;
-pub const S_IWOTH: mode_t = 2;
-pub const S_IROTH: mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const F_LOCK: ::c_int = 1;
-pub const F_TEST: ::c_int = 3;
-pub const F_TLOCK: ::c_int = 2;
-pub const F_ULOCK: ::c_int = 0;
-pub const F_GETLK: ::c_int = 7;
-pub const F_SETLK: ::c_int = 8;
-pub const F_SETLKW: ::c_int = 9;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGEMT: ::c_int = 7;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const MAP_FILE: ::c_int = 0x0000;
-pub const MAP_SHARED: ::c_int = 0x0001;
-pub const MAP_PRIVATE: ::c_int = 0x0002;
-pub const MAP_FIXED: ::c_int = 0x0010;
-pub const MAP_ANON: ::c_int = 0x1000;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const MS_ASYNC: ::c_int = 0x0001;
-pub const MS_INVALIDATE: ::c_int = 0x0002;
-pub const MS_SYNC: ::c_int = 0x0010;
-
-pub const MS_KILLPAGES: ::c_int = 0x0004;
-pub const MS_DEACTIVATE: ::c_int = 0x0008;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EDEADLK: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const ENOTBLK: ::c_int = 15;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const ETXTBSY: ::c_int = 26;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const EAGAIN: ::c_int = 35;
-pub const EWOULDBLOCK: ::c_int = EAGAIN;
-pub const EINPROGRESS: ::c_int = 36;
-pub const EALREADY: ::c_int = 37;
-pub const ENOTSOCK: ::c_int = 38;
-pub const EDESTADDRREQ: ::c_int = 39;
-pub const EMSGSIZE: ::c_int = 40;
-pub const EPROTOTYPE: ::c_int = 41;
-pub const ENOPROTOOPT: ::c_int = 42;
-pub const EPROTONOSUPPORT: ::c_int = 43;
-pub const ESOCKTNOSUPPORT: ::c_int = 44;
-pub const ENOTSUP: ::c_int = 45;
-pub const EPFNOSUPPORT: ::c_int = 46;
-pub const EAFNOSUPPORT: ::c_int = 47;
-pub const EADDRINUSE: ::c_int = 48;
-pub const EADDRNOTAVAIL: ::c_int = 49;
-pub const ENETDOWN: ::c_int = 50;
-pub const ENETUNREACH: ::c_int = 51;
-pub const ENETRESET: ::c_int = 52;
-pub const ECONNABORTED: ::c_int = 53;
-pub const ECONNRESET: ::c_int = 54;
-pub const ENOBUFS: ::c_int = 55;
-pub const EISCONN: ::c_int = 56;
-pub const ENOTCONN: ::c_int = 57;
-pub const ESHUTDOWN: ::c_int = 58;
-pub const ETOOMANYREFS: ::c_int = 59;
-pub const ETIMEDOUT: ::c_int = 60;
-pub const ECONNREFUSED: ::c_int = 61;
-pub const ELOOP: ::c_int = 62;
-pub const ENAMETOOLONG: ::c_int = 63;
-pub const EHOSTDOWN: ::c_int = 64;
-pub const EHOSTUNREACH: ::c_int = 65;
-pub const ENOTEMPTY: ::c_int = 66;
-pub const EPROCLIM: ::c_int = 67;
-pub const EUSERS: ::c_int = 68;
-pub const EDQUOT: ::c_int = 69;
-pub const ESTALE: ::c_int = 70;
-pub const EREMOTE: ::c_int = 71;
-pub const EBADRPC: ::c_int = 72;
-pub const ERPCMISMATCH: ::c_int = 73;
-pub const EPROGUNAVAIL: ::c_int = 74;
-pub const EPROGMISMATCH: ::c_int = 75;
-pub const EPROCUNAVAIL: ::c_int = 76;
-pub const ENOLCK: ::c_int = 77;
-pub const ENOSYS: ::c_int = 78;
-pub const EFTYPE: ::c_int = 79;
-pub const EAUTH: ::c_int = 80;
-pub const ENEEDAUTH: ::c_int = 81;
-pub const EPWROFF: ::c_int = 82;
-pub const EDEVERR: ::c_int = 83;
-pub const EOVERFLOW: ::c_int = 84;
-pub const EBADEXEC: ::c_int = 85;
-pub const EBADARCH: ::c_int = 86;
-pub const ESHLIBVERS: ::c_int = 87;
-pub const EBADMACHO: ::c_int = 88;
-pub const ECANCELED: ::c_int = 89;
-pub const EIDRM: ::c_int = 90;
-pub const ENOMSG: ::c_int = 91;
-pub const EILSEQ: ::c_int = 92;
-pub const ENOATTR: ::c_int = 93;
-pub const EBADMSG: ::c_int = 94;
-pub const EMULTIHOP: ::c_int = 95;
-pub const ENODATA: ::c_int = 96;
-pub const ENOLINK: ::c_int = 97;
-pub const ENOSR: ::c_int = 98;
-pub const ENOSTR: ::c_int = 99;
-pub const EPROTO: ::c_int = 100;
-pub const ETIME: ::c_int = 101;
-pub const EOPNOTSUPP: ::c_int = 102;
-pub const ENOPOLICY: ::c_int = 103;
-pub const ENOTRECOVERABLE: ::c_int = 104;
-pub const EOWNERDEAD: ::c_int = 105;
-pub const EQFULL: ::c_int = 106;
-pub const ELAST: ::c_int = 106;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_DUPFD_CLOEXEC: ::c_int = 67;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-pub const F_PREALLOCATE: ::c_int = 42;
-pub const F_RDADVISE: ::c_int = 44;
-pub const F_RDAHEAD: ::c_int = 45;
-pub const F_NOCACHE: ::c_int = 48;
-pub const F_GETPATH: ::c_int = 50;
-pub const F_FULLFSYNC: ::c_int = 51;
-pub const F_FREEZE_FS: ::c_int = 53;
-pub const F_THAW_FS: ::c_int = 54;
-pub const F_GLOBAL_NOCACHE: ::c_int = 55;
-pub const F_NODIRECT: ::c_int = 62;
-
-pub const F_ALLOCATECONTIG: ::c_uint = 0x02;
-pub const F_ALLOCATEALL: ::c_uint = 0x04;
-
-pub const F_PEOFPOSMODE: ::c_int = 3;
-pub const F_VOLPOSMODE: ::c_int = 4;
-
-pub const AT_FDCWD: ::c_int = -2;
-pub const AT_EACCESS: ::c_int = 0x0010;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x0020;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x0040;
-pub const AT_REMOVEDIR: ::c_int = 0x0080;
-
-pub const O_ACCMODE: ::c_int = 3;
-
-pub const TIOCMODG: ::c_ulong = 0x40047403;
-pub const TIOCMODS: ::c_ulong = 0x80047404;
-pub const TIOCM_LE: ::c_int = 0x1;
-pub const TIOCM_DTR: ::c_int = 0x2;
-pub const TIOCM_RTS: ::c_int = 0x4;
-pub const TIOCM_ST: ::c_int = 0x8;
-pub const TIOCM_SR: ::c_int = 0x10;
-pub const TIOCM_CTS: ::c_int = 0x20;
-pub const TIOCM_CAR: ::c_int = 0x40;
-pub const TIOCM_CD: ::c_int = 0x40;
-pub const TIOCM_RNG: ::c_int = 0x80;
-pub const TIOCM_RI: ::c_int = 0x80;
-pub const TIOCM_DSR: ::c_int = 0x100;
-pub const TIOCEXCL: ::c_int = 0x2000740d;
-pub const TIOCNXCL: ::c_int = 0x2000740e;
-pub const TIOCFLUSH: ::c_ulong = 0x80047410;
-pub const TIOCGETD: ::c_ulong = 0x4004741a;
-pub const TIOCSETD: ::c_ulong = 0x8004741b;
-pub const TIOCIXON: ::c_uint = 0x20007481;
-pub const TIOCIXOFF: ::c_uint = 0x20007480;
-pub const TIOCSBRK: ::c_uint = 0x2000747b;
-pub const TIOCCBRK: ::c_uint = 0x2000747a;
-pub const TIOCSDTR: ::c_uint = 0x20007479;
-pub const TIOCCDTR: ::c_uint = 0x20007478;
-pub const TIOCGPGRP: ::c_ulong = 0x40047477;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCOUTQ: ::c_ulong = 0x40047473;
-pub const TIOCSTI: ::c_ulong = 0x80017472;
-pub const TIOCNOTTY: ::c_uint = 0x20007471;
-pub const TIOCPKT: ::c_ulong = 0x80047470;
-pub const TIOCPKT_DATA: ::c_int = 0x0;
-pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1;
-pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2;
-pub const TIOCPKT_STOP: ::c_int = 0x4;
-pub const TIOCPKT_START: ::c_int = 0x8;
-pub const TIOCPKT_NOSTOP: ::c_int = 0x10;
-pub const TIOCPKT_DOSTOP: ::c_int = 0x20;
-pub const TIOCPKT_IOCTL: ::c_int = 0x40;
-pub const TIOCSTOP: ::c_uint = 0x2000746f;
-pub const TIOCSTART: ::c_uint = 0x2000746e;
-pub const TIOCMSET: ::c_ulong = 0x8004746d;
-pub const TIOCMBIS: ::c_ulong = 0x8004746c;
-pub const TIOCMBIC: ::c_ulong = 0x8004746b;
-pub const TIOCMGET: ::c_ulong = 0x4004746a;
-pub const TIOCREMOTE: ::c_ulong = 0x80047469;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const TIOCUCNTL: ::c_ulong = 0x80047466;
-pub const TIOCSTAT: ::c_uint = 0x20007465;
-pub const TIOCSCONS: ::c_uint = 0x20007463;
-pub const TIOCCONS: ::c_ulong = 0x80047462;
-pub const TIOCSCTTY: ::c_uint = 0x20007461;
-pub const TIOCEXT: ::c_ulong = 0x80047460;
-pub const TIOCSIG: ::c_uint = 0x2000745f;
-pub const TIOCDRAIN: ::c_uint = 0x2000745e;
-pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b;
-pub const TIOCMGDTRWAIT: ::c_ulong = 0x4004745a;
-pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457;
-pub const TIOCGDRAINWAIT: ::c_ulong = 0x40047456;
-pub const TIOCDSIMICROCODE: ::c_uint = 0x20007455;
-pub const TIOCPTYGRANT: ::c_uint = 0x20007454;
-pub const TIOCPTYGNAME: ::c_uint = 0x40807453;
-pub const TIOCPTYUNLK: ::c_uint = 0x20007452;
-
-pub const B0: speed_t = 0;
-pub const B50: speed_t = 50;
-pub const B75: speed_t = 75;
-pub const B110: speed_t = 110;
-pub const B134: speed_t = 134;
-pub const B150: speed_t = 150;
-pub const B200: speed_t = 200;
-pub const B300: speed_t = 300;
-pub const B600: speed_t = 600;
-pub const B1200: speed_t = 1200;
-pub const B1800: speed_t = 1800;
-pub const B2400: speed_t = 2400;
-pub const B4800: speed_t = 4800;
-pub const B9600: speed_t = 9600;
-pub const B19200: speed_t = 19200;
-pub const B38400: speed_t = 38400;
-pub const B7200: speed_t = 7200;
-pub const B14400: speed_t = 14400;
-pub const B28800: speed_t = 28800;
-pub const B57600: speed_t = 57600;
-pub const B76800: speed_t = 76800;
-pub const B115200: speed_t = 115200;
-pub const B230400: speed_t = 230400;
-pub const EXTA: speed_t = 19200;
-pub const EXTB: speed_t = 38400;
-
-pub const SIGTRAP: ::c_int = 5;
-
-pub const GLOB_APPEND  : ::c_int = 0x0001;
-pub const GLOB_DOOFFS  : ::c_int = 0x0002;
-pub const GLOB_ERR     : ::c_int = 0x0004;
-pub const GLOB_MARK    : ::c_int = 0x0008;
-pub const GLOB_NOCHECK : ::c_int = 0x0010;
-pub const GLOB_NOSORT  : ::c_int = 0x0020;
-pub const GLOB_NOESCAPE: ::c_int = 0x2000;
-
-pub const GLOB_NOSPACE : ::c_int = -1;
-pub const GLOB_ABORTED : ::c_int = -2;
-pub const GLOB_NOMATCH : ::c_int = -3;
-
-pub const POSIX_MADV_NORMAL: ::c_int = 0;
-pub const POSIX_MADV_RANDOM: ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_MADV_WILLNEED: ::c_int = 3;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-
-pub const _SC_IOV_MAX: ::c_int = 56;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 73;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 75;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 86;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89;
-pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 93;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 94;
-pub const _SC_THREADS: ::c_int = 96;
-pub const _SC_TTY_NAME_MAX: ::c_int = 101;
-pub const _SC_ATEXIT_MAX: ::c_int = 107;
-pub const _SC_XOPEN_CRYPT: ::c_int = 108;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 109;
-pub const _SC_XOPEN_LEGACY: ::c_int = 110;
-pub const _SC_XOPEN_REALTIME: ::c_int = 111;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112;
-pub const _SC_XOPEN_SHM: ::c_int = 113;
-pub const _SC_XOPEN_UNIX: ::c_int = 115;
-pub const _SC_XOPEN_VERSION: ::c_int = 116;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 121;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 1;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 2;
-pub const PTHREAD_STACK_MIN: ::size_t = 8192;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_AS: ::c_int = 5;
-pub const RLIMIT_RSS: ::c_int = RLIMIT_AS;
-pub const RLIMIT_MEMLOCK: ::c_int = 6;
-pub const RLIMIT_NPROC: ::c_int = 7;
-pub const RLIMIT_NOFILE: ::c_int = 8;
-pub const RLIM_NLIMITS: ::c_int = 9;
-pub const _RLIMIT_POSIX_FLAG: ::c_int = 0x1000;
-
-pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const MADV_NORMAL: ::c_int = 0;
-pub const MADV_RANDOM: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_WILLNEED: ::c_int = 3;
-pub const MADV_DONTNEED: ::c_int = 4;
-pub const MADV_FREE: ::c_int = 5;
-pub const MADV_ZERO_WIRED_PAGES: ::c_int = 6;
-pub const MADV_FREE_REUSABLE: ::c_int = 7;
-pub const MADV_FREE_REUSE: ::c_int = 8;
-pub const MADV_CAN_REUSE: ::c_int = 9;
-
-pub const MINCORE_INCORE: ::c_int =  0x1;
-pub const MINCORE_REFERENCED: ::c_int = 0x2;
-pub const MINCORE_MODIFIED: ::c_int = 0x4;
-pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8;
-pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10;
-
-pub const AF_UNSPEC: ::c_int = 0;
-pub const AF_LOCAL: ::c_int = 1;
-pub const AF_UNIX: ::c_int = AF_LOCAL;
-pub const AF_INET: ::c_int = 2;
-pub const AF_IMPLINK: ::c_int = 3;
-pub const AF_PUP: ::c_int = 4;
-pub const AF_CHAOS: ::c_int = 5;
-pub const AF_NS: ::c_int = 6;
-pub const AF_ISO: ::c_int = 7;
-pub const AF_OSI: ::c_int = AF_ISO;
-pub const AF_ECMA: ::c_int = 8;
-pub const AF_DATAKIT: ::c_int = 9;
-pub const AF_CCITT: ::c_int = 10;
-pub const AF_SNA: ::c_int = 11;
-pub const AF_DECnet: ::c_int = 12;
-pub const AF_DLI: ::c_int = 13;
-pub const AF_LAT: ::c_int = 14;
-pub const AF_HYLINK: ::c_int = 15;
-pub const AF_APPLETALK: ::c_int = 16;
-pub const AF_ROUTE: ::c_int = 17;
-pub const AF_LINK: ::c_int = 18;
-pub const pseudo_AF_XTP: ::c_int = 19;
-pub const AF_COIP: ::c_int = 20;
-pub const AF_CNT: ::c_int = 21;
-pub const pseudo_AF_RTIP: ::c_int = 22;
-pub const AF_IPX: ::c_int = 23;
-pub const AF_SIP: ::c_int = 24;
-pub const pseudo_AF_PIP: ::c_int = 25;
-pub const AF_ISDN: ::c_int = 28;
-pub const AF_E164: ::c_int = AF_ISDN;
-pub const pseudo_AF_KEY: ::c_int = 29;
-pub const AF_INET6: ::c_int = 30;
-pub const AF_NATM: ::c_int = 31;
-pub const AF_SYSTEM: ::c_int = 32;
-pub const AF_NETBIOS: ::c_int = 33;
-pub const AF_PPP: ::c_int = 34;
-pub const pseudo_AF_HDRCMPLT: ::c_int = 35;
-#[doc(hidden)]
-pub const AF_MAX: ::c_int = 40;
-
-pub const PF_UNSPEC: ::c_int = AF_UNSPEC;
-pub const PF_LOCAL: ::c_int = AF_LOCAL;
-pub const PF_UNIX: ::c_int =  PF_LOCAL;
-pub const PF_INET: ::c_int =  AF_INET;
-pub const PF_IMPLINK: ::c_int = AF_IMPLINK;
-pub const PF_PUP: ::c_int =  AF_PUP;
-pub const PF_CHAOS: ::c_int = AF_CHAOS;
-pub const PF_NS: ::c_int =  AF_NS;
-pub const PF_ISO: ::c_int =  AF_ISO;
-pub const PF_OSI: ::c_int =  AF_ISO;
-pub const PF_ECMA: ::c_int =  AF_ECMA;
-pub const PF_DATAKIT: ::c_int = AF_DATAKIT;
-pub const PF_CCITT: ::c_int = AF_CCITT;
-pub const PF_SNA: ::c_int =  AF_SNA;
-pub const PF_DECnet: ::c_int = AF_DECnet;
-pub const PF_DLI: ::c_int =  AF_DLI;
-pub const PF_LAT: ::c_int =  AF_LAT;
-pub const PF_HYLINK: ::c_int = AF_HYLINK;
-pub const PF_APPLETALK: ::c_int = AF_APPLETALK;
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_LINK: ::c_int =  AF_LINK;
-pub const PF_XTP: ::c_int =  pseudo_AF_XTP;
-pub const PF_COIP: ::c_int =  AF_COIP;
-pub const PF_CNT: ::c_int =  AF_CNT;
-pub const PF_SIP: ::c_int =  AF_SIP;
-pub const PF_IPX: ::c_int =  AF_IPX;
-pub const PF_RTIP: ::c_int =  pseudo_AF_RTIP;
-pub const PF_PIP: ::c_int =  pseudo_AF_PIP;
-pub const PF_ISDN: ::c_int =  AF_ISDN;
-pub const PF_KEY: ::c_int =  pseudo_AF_KEY;
-pub const PF_INET6: ::c_int = AF_INET6;
-pub const PF_NATM: ::c_int =  AF_NATM;
-pub const PF_SYSTEM: ::c_int = AF_SYSTEM;
-pub const PF_NETBIOS: ::c_int = AF_NETBIOS;
-pub const PF_PPP: ::c_int =  AF_PPP;
-#[doc(hidden)]
-pub const PF_MAX: ::c_int =  AF_MAX;
-
-#[doc(hidden)]
-pub const NET_MAXID: ::c_int = AF_MAX;
-
-pub const NET_RT_DUMP: ::c_int = 1;
-pub const NET_RT_FLAGS: ::c_int = 2;
-pub const NET_RT_IFLIST: ::c_int = 3;
-#[doc(hidden)]
-pub const NET_RT_MAXID: ::c_int = 10;
-
-pub const SOMAXCONN: ::c_int = 128;
-
-pub const SOCK_MAXADDRLEN: ::c_int = 255;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_RAW: ::c_int = 3;
-pub const SOCK_RDM: ::c_int = 4;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 10;
-pub const IP_MULTICAST_LOOP: ::c_int = 11;
-pub const IP_TTL: ::c_int = 4;
-pub const IP_HDRINCL: ::c_int = 2;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 12;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 13;
-pub const IPV6_JOIN_GROUP: ::c_int = 12;
-pub const IPV6_LEAVE_GROUP: ::c_int = 13;
-
-pub const TCP_NODELAY: ::c_int = 0x01;
-pub const TCP_KEEPALIVE: ::c_int = 0x10;
-pub const SOL_SOCKET: ::c_int = 0xffff;
-
-pub const SO_DEBUG: ::c_int = 0x01;
-pub const SO_ACCEPTCONN: ::c_int = 0x0002;
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_USELOOPBACK: ::c_int = 0x0040;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_TIMESTAMP: ::c_int = 0x0400;
-pub const SO_DONTTRUNC: ::c_int = 0x2000;
-pub const SO_WANTMORE: ::c_int = 0x4000;
-pub const SO_WANTOOBFLAG: ::c_int = 0x8000;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_TYPE: ::c_int = 0x1008;
-pub const SO_NREAD: ::c_int = 0x1020;
-pub const SO_NKE: ::c_int = 0x1021;
-pub const SO_NOSIGPIPE: ::c_int = 0x1022;
-pub const SO_NOADDRERR: ::c_int = 0x1023;
-pub const SO_NWRITE: ::c_int = 0x1024;
-
-pub const MSG_OOB: ::c_int =  0x1;
-pub const MSG_PEEK: ::c_int = 0x2;
-pub const MSG_DONTROUTE: ::c_int = 0x4;
-pub const MSG_EOR: ::c_int =  0x8;
-pub const MSG_TRUNC: ::c_int = 0x10;
-pub const MSG_CTRUNC: ::c_int = 0x20;
-pub const MSG_WAITALL: ::c_int = 0x40;
-pub const MSG_DONTWAIT: ::c_int = 0x80;
-pub const MSG_EOF: ::c_int =  0x100;
-pub const MSG_FLUSH: ::c_int = 0x400;
-pub const MSG_HOLD: ::c_int = 0x800;
-pub const MSG_SEND: ::c_int = 0x1000;
-pub const MSG_HAVEMORE: ::c_int = 0x2000;
-pub const MSG_RCVMORE: ::c_int = 0x4000;
-// pub const MSG_COMPAT: ::c_int = 0x8000;
-
-pub const SCM_RIGHTS: ::c_int = 0x01;
-pub const SCM_TIMESTAMP: ::c_int = 0x02;
-pub const SCM_CREDS: ::c_int = 0x03;
-
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const O_DSYNC: ::c_int = 4194304;
-pub const O_SYNC: ::c_int = 128;
-pub const O_NONBLOCK: ::c_int = 4;
-
-pub const MAP_COPY: ::c_int = 0x0002;
-pub const MAP_RENAME: ::c_int = 0x0020;
-pub const MAP_NORESERVE: ::c_int = 0x0040;
-pub const MAP_NOEXTEND: ::c_int = 0x0100;
-pub const MAP_HASSEMAPHORE: ::c_int = 0x0200;
-pub const MAP_NOCACHE: ::c_int = 0x0400;
-pub const MAP_JIT: ::c_int = 0x0800;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-pub const _SC_ARG_MAX: ::c_int = 1;
-pub const _SC_CHILD_MAX: ::c_int = 2;
-pub const _SC_CLK_TCK: ::c_int = 3;
-pub const _SC_NGROUPS_MAX: ::c_int = 4;
-pub const _SC_OPEN_MAX: ::c_int = 5;
-pub const _SC_JOB_CONTROL: ::c_int = 6;
-pub const _SC_SAVED_IDS: ::c_int = 7;
-pub const _SC_VERSION: ::c_int = 8;
-pub const _SC_BC_BASE_MAX: ::c_int = 9;
-pub const _SC_BC_DIM_MAX: ::c_int = 10;
-pub const _SC_BC_SCALE_MAX: ::c_int = 11;
-pub const _SC_BC_STRING_MAX: ::c_int = 12;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 14;
-pub const _SC_LINE_MAX: ::c_int = 15;
-pub const _SC_RE_DUP_MAX: ::c_int = 16;
-pub const _SC_2_VERSION: ::c_int = 17;
-pub const _SC_2_C_BIND: ::c_int = 18;
-pub const _SC_2_C_DEV: ::c_int = 19;
-pub const _SC_2_CHAR_TERM: ::c_int = 20;
-pub const _SC_2_FORT_DEV: ::c_int = 21;
-pub const _SC_2_FORT_RUN: ::c_int = 22;
-pub const _SC_2_LOCALEDEF: ::c_int = 23;
-pub const _SC_2_SW_DEV: ::c_int = 24;
-pub const _SC_2_UPE: ::c_int = 25;
-pub const _SC_STREAM_MAX: ::c_int = 26;
-pub const _SC_TZNAME_MAX: ::c_int = 27;
-pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28;
-pub const _SC_PAGESIZE: ::c_int = 29;
-pub const _SC_MEMLOCK: ::c_int = 30;
-pub const _SC_MEMLOCK_RANGE: ::c_int = 31;
-pub const _SC_MEMORY_PROTECTION: ::c_int = 32;
-pub const _SC_MESSAGE_PASSING: ::c_int = 33;
-pub const _SC_PRIORITIZED_IO: ::c_int = 34;
-pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35;
-pub const _SC_REALTIME_SIGNALS: ::c_int = 36;
-pub const _SC_SEMAPHORES: ::c_int = 37;
-pub const _SC_FSYNC: ::c_int = 38;
-pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39;
-pub const _SC_SYNCHRONIZED_IO: ::c_int = 40;
-pub const _SC_TIMERS: ::c_int = 41;
-pub const _SC_AIO_LISTIO_MAX: ::c_int = 42;
-pub const _SC_AIO_MAX: ::c_int = 43;
-pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44;
-pub const _SC_DELAYTIMER_MAX: ::c_int = 45;
-pub const _SC_MQ_OPEN_MAX: ::c_int = 46;
-pub const _SC_MAPPED_FILES: ::c_int = 47;
-pub const _SC_RTSIG_MAX: ::c_int = 48;
-pub const _SC_SEM_NSEMS_MAX: ::c_int = 49;
-pub const _SC_SEM_VALUE_MAX: ::c_int = 50;
-pub const _SC_SIGQUEUE_MAX: ::c_int = 51;
-pub const _SC_TIMER_MAX: ::c_int = 52;
-pub const _SC_NPROCESSORS_CONF: ::c_int = 57;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 58;
-pub const _SC_2_PBS: ::c_int = 59;
-pub const _SC_2_PBS_ACCOUNTING: ::c_int = 60;
-pub const _SC_2_PBS_CHECKPOINT: ::c_int = 61;
-pub const _SC_2_PBS_LOCATE: ::c_int = 62;
-pub const _SC_2_PBS_MESSAGE: ::c_int = 63;
-pub const _SC_2_PBS_TRACK: ::c_int = 64;
-pub const _SC_ADVISORY_INFO: ::c_int = 65;
-pub const _SC_BARRIERS: ::c_int = 66;
-pub const _SC_CLOCK_SELECTION: ::c_int = 67;
-pub const _SC_CPUTIME: ::c_int = 68;
-pub const _SC_FILE_LOCKING: ::c_int = 69;
-pub const _SC_HOST_NAME_MAX: ::c_int = 72;
-pub const _SC_MONOTONIC_CLOCK: ::c_int = 74;
-pub const _SC_READER_WRITER_LOCKS: ::c_int = 76;
-pub const _SC_REGEXP: ::c_int = 77;
-pub const _SC_SHELL: ::c_int = 78;
-pub const _SC_SPAWN: ::c_int = 79;
-pub const _SC_SPIN_LOCKS: ::c_int = 80;
-pub const _SC_SPORADIC_SERVER: ::c_int = 81;
-pub const _SC_THREAD_CPUTIME: ::c_int = 84;
-pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 92;
-pub const _SC_TIMEOUTS: ::c_int = 95;
-pub const _SC_TRACE: ::c_int = 97;
-pub const _SC_TRACE_EVENT_FILTER: ::c_int = 98;
-pub const _SC_TRACE_INHERIT: ::c_int = 99;
-pub const _SC_TRACE_LOG: ::c_int = 100;
-pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 102;
-pub const _SC_V6_ILP32_OFF32: ::c_int = 103;
-pub const _SC_V6_ILP32_OFFBIG: ::c_int = 104;
-pub const _SC_V6_LP64_OFF64: ::c_int = 105;
-pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 106;
-pub const _SC_IPV6: ::c_int = 118;
-pub const _SC_RAW_SOCKETS: ::c_int = 119;
-pub const _SC_SYMLOOP_MAX: ::c_int = 120;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_XOPEN_STREAMS: ::c_int = 114;
-pub const _SC_XBS5_ILP32_OFF32: ::c_int = 122;
-pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 123;
-pub const _SC_XBS5_LP64_OFF64: ::c_int = 124;
-pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 125;
-pub const _SC_SS_REPL_MAX: ::c_int = 126;
-pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 127;
-pub const _SC_TRACE_NAME_MAX: ::c_int = 128;
-pub const _SC_TRACE_SYS_MAX: ::c_int = 129;
-pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 130;
-pub const _SC_PASS_MAX: ::c_int = 131;
-
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-pub const _PTHREAD_MUTEX_SIG_init: ::c_long = 0x32AAABA7;
-pub const _PTHREAD_COND_SIG_init: ::c_long = 0x3CB0B1BB;
-pub const _PTHREAD_RWLOCK_SIG_init: ::c_long = 0x2DA8B3B4;
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    __sig: _PTHREAD_MUTEX_SIG_init,
-    __opaque: [0; __PTHREAD_MUTEX_SIZE__],
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    __sig: _PTHREAD_COND_SIG_init,
-    __opaque: [0; __PTHREAD_COND_SIZE__],
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    __sig: _PTHREAD_RWLOCK_SIG_init,
-    __opaque: [0; __PTHREAD_RWLOCK_SIZE__],
-};
-
-pub const SIGSTKSZ: ::size_t = 131072;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const ST_NOSUID: ::c_ulong = 2;
-
-pub const EVFILT_READ: ::int16_t = -1;
-pub const EVFILT_WRITE: ::int16_t = -2;
-pub const EVFILT_AIO: ::int16_t = -3;
-pub const EVFILT_VNODE: ::int16_t = -4;
-pub const EVFILT_PROC: ::int16_t = -5;
-pub const EVFILT_SIGNAL: ::int16_t = -6;
-pub const EVFILT_TIMER: ::int16_t = -7;
-pub const EVFILT_MACHPORT: ::int16_t = -8;
-pub const EVFILT_FS: ::int16_t = -9;
-pub const EVFILT_USER: ::int16_t = -10;
-pub const EVFILT_VM: ::int16_t = -12;
-
-pub const EV_ADD: ::uint16_t = 0x1;
-pub const EV_DELETE: ::uint16_t = 0x2;
-pub const EV_ENABLE: ::uint16_t = 0x4;
-pub const EV_DISABLE: ::uint16_t = 0x8;
-pub const EV_ONESHOT: ::uint16_t = 0x10;
-pub const EV_CLEAR: ::uint16_t = 0x20;
-pub const EV_RECEIPT: ::uint16_t = 0x40;
-pub const EV_DISPATCH: ::uint16_t = 0x80;
-pub const EV_FLAG0: ::uint16_t = 0x1000;
-pub const EV_POLL: ::uint16_t = 0x1000;
-pub const EV_FLAG1: ::uint16_t = 0x2000;
-pub const EV_OOBAND: ::uint16_t = 0x2000;
-pub const EV_ERROR: ::uint16_t = 0x4000;
-pub const EV_EOF: ::uint16_t = 0x8000;
-pub const EV_SYSFLAGS: ::uint16_t = 0xf000;
-
-pub const NOTE_TRIGGER: ::uint32_t = 0x01000000;
-pub const NOTE_FFNOP: ::uint32_t = 0x00000000;
-pub const NOTE_FFAND: ::uint32_t = 0x40000000;
-pub const NOTE_FFOR: ::uint32_t = 0x80000000;
-pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000;
-pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000;
-pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff;
-pub const NOTE_LOWAT: ::uint32_t = 0x00000001;
-pub const NOTE_DELETE: ::uint32_t = 0x00000001;
-pub const NOTE_WRITE: ::uint32_t = 0x00000002;
-pub const NOTE_EXTEND: ::uint32_t = 0x00000004;
-pub const NOTE_ATTRIB: ::uint32_t = 0x00000008;
-pub const NOTE_LINK: ::uint32_t = 0x00000010;
-pub const NOTE_RENAME: ::uint32_t = 0x00000020;
-pub const NOTE_REVOKE: ::uint32_t = 0x00000040;
-pub const NOTE_NONE: ::uint32_t = 0x00000080;
-pub const NOTE_EXIT: ::uint32_t = 0x80000000;
-pub const NOTE_FORK: ::uint32_t = 0x40000000;
-pub const NOTE_EXEC: ::uint32_t = 0x20000000;
-pub const NOTE_REAP: ::uint32_t = 0x10000000;
-pub const NOTE_SIGNAL: ::uint32_t = 0x08000000;
-pub const NOTE_EXITSTATUS: ::uint32_t = 0x04000000;
-pub const NOTE_EXIT_DETAIL: ::uint32_t = 0x02000000;
-pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff;
-pub const NOTE_PCTRLMASK: ::uint32_t = 0xfff00000;
-pub const NOTE_EXIT_REPARENTED: ::uint32_t = 0x00080000;
-pub const NOTE_EXIT_DETAIL_MASK: ::uint32_t = 0x00070000;
-pub const NOTE_EXIT_DECRYPTFAIL: ::uint32_t = 0x00010000;
-pub const NOTE_EXIT_MEMORY: ::uint32_t = 0x00020000;
-pub const NOTE_EXIT_CSERROR: ::uint32_t = 0x00040000;
-pub const NOTE_VM_PRESSURE: ::uint32_t = 0x80000000;
-pub const NOTE_VM_PRESSURE_TERMINATE: ::uint32_t = 0x40000000;
-pub const NOTE_VM_PRESSURE_SUDDEN_TERMINATE: ::uint32_t = 0x20000000;
-pub const NOTE_VM_ERROR: ::uint32_t = 0x10000000;
-pub const NOTE_SECONDS: ::uint32_t = 0x00000001;
-pub const NOTE_USECONDS: ::uint32_t = 0x00000002;
-pub const NOTE_NSECONDS: ::uint32_t = 0x00000004;
-pub const NOTE_ABSOLUTE: ::uint32_t = 0x00000008;
-pub const NOTE_LEEWAY: ::uint32_t = 0x00000010;
-pub const NOTE_CRITICAL: ::uint32_t = 0x00000020;
-pub const NOTE_BACKGROUND: ::uint32_t = 0x00000040;
-pub const NOTE_TRACK: ::uint32_t = 0x00000001;
-pub const NOTE_TRACKERR: ::uint32_t = 0x00000002;
-pub const NOTE_CHILD: ::uint32_t = 0x00000004;
-
-pub const NL0: ::c_int  = 0x00000000;
-pub const NL1: ::c_int  = 0x00000100;
-pub const TAB0: ::c_int = 0x00000000;
-pub const TAB1: ::c_int = 0x00000400;
-pub const TAB2: ::c_int = 0x00000800;
-pub const CR0: ::c_int  = 0x00000000;
-pub const CR1: ::c_int  = 0x00001000;
-pub const CR2: ::c_int  = 0x00002000;
-pub const CR3: ::c_int  = 0x00003000;
-pub const FF0: ::c_int  = 0x00000000;
-pub const FF1: ::c_int  = 0x00004000;
-pub const BS0: ::c_int  = 0x00000000;
-pub const BS1: ::c_int  = 0x00008000;
-pub const TAB3: ::c_int = 0x00000004;
-pub const VT0: ::c_int  = 0x00000000;
-pub const VT1: ::c_int  = 0x00010000;
-pub const IUTF8: ::tcflag_t = 0x00004000;
-pub const CRTSCTS: ::tcflag_t = 0x00030000;
-
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const Q_GETQUOTA: ::c_int = 0x300;
-pub const Q_SETQUOTA: ::c_int = 0x400;
-
-pub const RTLD_LOCAL: ::c_int = 0x4;
-pub const RTLD_FIRST: ::c_int = 0x100;
-pub const RTLD_NODELETE: ::c_int = 0x80;
-pub const RTLD_NOLOAD: ::c_int = 0x10;
-pub const RTLD_GLOBAL: ::c_int = 0x8;
-
-pub const _WSTOPPED: ::c_int = 0o177;
-
-pub const LOG_NETINFO: ::c_int = 12 << 3;
-pub const LOG_REMOTEAUTH: ::c_int = 13 << 3;
-pub const LOG_INSTALL: ::c_int = 14 << 3;
-pub const LOG_RAS: ::c_int = 15 << 3;
-pub const LOG_LAUNCHD: ::c_int = 24 << 3;
-pub const LOG_NFACILITIES: ::c_int = 25;
-
-pub const CTLTYPE: ::c_int = 0xf;
-pub const CTLTYPE_NODE: ::c_int = 1;
-pub const CTLTYPE_INT: ::c_int = 2;
-pub const CTLTYPE_STRING: ::c_int = 3;
-pub const CTLTYPE_QUAD: ::c_int = 4;
-pub const CTLTYPE_OPAQUE: ::c_int = 5;
-pub const CTLTYPE_STRUCT: ::c_int = CTLTYPE_OPAQUE;
-pub const CTLFLAG_RD: ::c_int = 0x80000000;
-pub const CTLFLAG_WR: ::c_int = 0x40000000;
-pub const CTLFLAG_RW: ::c_int = CTLFLAG_RD | CTLFLAG_WR;
-pub const CTLFLAG_NOLOCK: ::c_int = 0x20000000;
-pub const CTLFLAG_ANYBODY: ::c_int = 0x10000000;
-pub const CTLFLAG_SECURE: ::c_int = 0x08000000;
-pub const CTLFLAG_MASKED: ::c_int = 0x04000000;
-pub const CTLFLAG_NOAUTO: ::c_int = 0x02000000;
-pub const CTLFLAG_KERN: ::c_int = 0x01000000;
-pub const CTLFLAG_LOCKED: ::c_int = 0x00800000;
-pub const CTLFLAG_OID2: ::c_int = 0x00400000;
-pub const CTL_UNSPEC: ::c_int = 0;
-pub const CTL_KERN: ::c_int = 1;
-pub const CTL_VM: ::c_int = 2;
-pub const CTL_VFS: ::c_int = 3;
-pub const CTL_NET: ::c_int = 4;
-pub const CTL_DEBUG: ::c_int = 5;
-pub const CTL_HW: ::c_int = 6;
-pub const CTL_MACHDEP: ::c_int = 7;
-pub const CTL_USER: ::c_int = 8;
-pub const CTL_MAXID: ::c_int = 9;
-pub const KERN_OSTYPE: ::c_int = 1;
-pub const KERN_OSRELEASE: ::c_int = 2;
-pub const KERN_OSREV: ::c_int = 3;
-pub const KERN_VERSION: ::c_int = 4;
-pub const KERN_MAXVNODES: ::c_int = 5;
-pub const KERN_MAXPROC: ::c_int = 6;
-pub const KERN_MAXFILES: ::c_int = 7;
-pub const KERN_ARGMAX: ::c_int = 8;
-pub const KERN_SECURELVL: ::c_int = 9;
-pub const KERN_HOSTNAME: ::c_int = 10;
-pub const KERN_HOSTID: ::c_int = 11;
-pub const KERN_CLOCKRATE: ::c_int = 12;
-pub const KERN_VNODE: ::c_int = 13;
-pub const KERN_PROC: ::c_int = 14;
-pub const KERN_FILE: ::c_int = 15;
-pub const KERN_PROF: ::c_int = 16;
-pub const KERN_POSIX1: ::c_int = 17;
-pub const KERN_NGROUPS: ::c_int = 18;
-pub const KERN_JOB_CONTROL: ::c_int = 19;
-pub const KERN_SAVED_IDS: ::c_int = 20;
-pub const KERN_BOOTTIME: ::c_int = 21;
-pub const KERN_NISDOMAINNAME: ::c_int = 22;
-pub const KERN_DOMAINNAME: ::c_int = KERN_NISDOMAINNAME;
-pub const KERN_MAXPARTITIONS: ::c_int = 23;
-pub const KERN_KDEBUG: ::c_int = 24;
-pub const KERN_UPDATEINTERVAL: ::c_int = 25;
-pub const KERN_OSRELDATE: ::c_int = 26;
-pub const KERN_NTP_PLL: ::c_int = 27;
-pub const KERN_BOOTFILE: ::c_int = 28;
-pub const KERN_MAXFILESPERPROC: ::c_int = 29;
-pub const KERN_MAXPROCPERUID: ::c_int = 30;
-pub const KERN_DUMPDEV: ::c_int = 31;
-pub const KERN_IPC: ::c_int = 32;
-pub const KERN_DUMMY: ::c_int = 33;
-pub const KERN_PS_STRINGS: ::c_int = 34;
-pub const KERN_USRSTACK32: ::c_int = 35;
-pub const KERN_LOGSIGEXIT: ::c_int = 36;
-pub const KERN_SYMFILE: ::c_int = 37;
-pub const KERN_PROCARGS: ::c_int = 38;
-pub const KERN_NETBOOT: ::c_int = 40;
-pub const KERN_SYSV: ::c_int = 42;
-pub const KERN_AFFINITY: ::c_int = 43;
-pub const KERN_TRANSLATE: ::c_int = 44;
-pub const KERN_CLASSIC: ::c_int = KERN_TRANSLATE;
-pub const KERN_EXEC: ::c_int = 45;
-pub const KERN_CLASSICHANDLER: ::c_int = KERN_EXEC;
-pub const KERN_AIOMAX: ::c_int = 46;
-pub const KERN_AIOPROCMAX: ::c_int = 47;
-pub const KERN_AIOTHREADS: ::c_int = 48;
-pub const KERN_COREFILE: ::c_int = 50;
-pub const KERN_COREDUMP: ::c_int = 51;
-pub const KERN_SUGID_COREDUMP: ::c_int = 52;
-pub const KERN_PROCDELAYTERM: ::c_int = 53;
-pub const KERN_SHREG_PRIVATIZABLE: ::c_int = 54;
-pub const KERN_LOW_PRI_WINDOW: ::c_int = 56;
-pub const KERN_LOW_PRI_DELAY: ::c_int = 57;
-pub const KERN_POSIX: ::c_int = 58;
-pub const KERN_USRSTACK64: ::c_int = 59;
-pub const KERN_NX_PROTECTION: ::c_int = 60;
-pub const KERN_TFP: ::c_int = 61;
-pub const KERN_PROCNAME: ::c_int = 62;
-pub const KERN_THALTSTACK: ::c_int = 63;
-pub const KERN_SPECULATIVE_READS: ::c_int = 64;
-pub const KERN_OSVERSION: ::c_int = 65;
-pub const KERN_SAFEBOOT: ::c_int = 66;
-pub const KERN_RAGEVNODE: ::c_int = 68;
-pub const KERN_TTY: ::c_int = 69;
-pub const KERN_CHECKOPENEVT: ::c_int = 70;
-pub const KERN_THREADNAME: ::c_int = 71;
-pub const KERN_MAXID: ::c_int = 72;
-pub const KERN_RAGE_PROC: ::c_int = 1;
-pub const KERN_RAGE_THREAD: ::c_int = 2;
-pub const KERN_UNRAGE_PROC: ::c_int = 3;
-pub const KERN_UNRAGE_THREAD: ::c_int = 4;
-pub const KERN_OPENEVT_PROC: ::c_int = 1;
-pub const KERN_UNOPENEVT_PROC: ::c_int = 2;
-pub const KERN_TFP_POLICY: ::c_int = 1;
-pub const KERN_TFP_POLICY_DENY: ::c_int = 0;
-pub const KERN_TFP_POLICY_DEFAULT: ::c_int = 2;
-pub const KERN_KDEFLAGS: ::c_int = 1;
-pub const KERN_KDDFLAGS: ::c_int = 2;
-pub const KERN_KDENABLE: ::c_int = 3;
-pub const KERN_KDSETBUF: ::c_int = 4;
-pub const KERN_KDGETBUF: ::c_int = 5;
-pub const KERN_KDSETUP: ::c_int = 6;
-pub const KERN_KDREMOVE: ::c_int = 7;
-pub const KERN_KDSETREG: ::c_int = 8;
-pub const KERN_KDGETREG: ::c_int = 9;
-pub const KERN_KDREADTR: ::c_int = 10;
-pub const KERN_KDPIDTR: ::c_int = 11;
-pub const KERN_KDTHRMAP: ::c_int = 12;
-pub const KERN_KDPIDEX: ::c_int = 14;
-pub const KERN_KDSETRTCDEC: ::c_int = 15;
-pub const KERN_KDGETENTROPY: ::c_int = 16;
-pub const KERN_KDWRITETR: ::c_int = 17;
-pub const KERN_KDWRITEMAP: ::c_int = 18;
-pub const KERN_KDENABLE_BG_TRACE: ::c_int = 19;
-pub const KERN_KDDISABLE_BG_TRACE: ::c_int = 20;
-pub const KERN_KDREADCURTHRMAP: ::c_int = 21;
-pub const KERN_KDSET_TYPEFILTER: ::c_int = 22;
-pub const KERN_KDBUFWAIT: ::c_int = 23;
-pub const KERN_KDCPUMAP: ::c_int = 24;
-pub const KERN_PROC_ALL: ::c_int = 0;
-pub const KERN_PROC_PID: ::c_int = 1;
-pub const KERN_PROC_PGRP: ::c_int = 2;
-pub const KERN_PROC_SESSION: ::c_int = 3;
-pub const KERN_PROC_TTY: ::c_int = 4;
-pub const KERN_PROC_UID: ::c_int = 5;
-pub const KERN_PROC_RUID: ::c_int = 6;
-pub const KERN_PROC_LCID: ::c_int = 7;
-pub const KIPC_MAXSOCKBUF: ::c_int = 1;
-pub const KIPC_SOCKBUF_WASTE: ::c_int = 2;
-pub const KIPC_SOMAXCONN: ::c_int = 3;
-pub const KIPC_MAX_LINKHDR: ::c_int = 4;
-pub const KIPC_MAX_PROTOHDR: ::c_int = 5;
-pub const KIPC_MAX_HDR: ::c_int = 6;
-pub const KIPC_MAX_DATALEN: ::c_int = 7;
-pub const KIPC_MBSTAT: ::c_int = 8;
-pub const KIPC_NMBCLUSTERS: ::c_int = 9;
-pub const KIPC_SOQLIMITCOMPAT: ::c_int = 10;
-pub const VM_METER: ::c_int = 1;
-pub const VM_LOADAVG: ::c_int = 2;
-pub const VM_MACHFACTOR: ::c_int = 4;
-pub const VM_SWAPUSAGE: ::c_int = 5;
-pub const VM_MAXID: ::c_int = 6;
-pub const HW_MACHINE: ::c_int = 1;
-pub const HW_MODEL: ::c_int = 2;
-pub const HW_NCPU: ::c_int = 3;
-pub const HW_BYTEORDER: ::c_int = 4;
-pub const HW_PHYSMEM: ::c_int = 5;
-pub const HW_USERMEM: ::c_int = 6;
-pub const HW_PAGESIZE: ::c_int = 7;
-pub const HW_DISKNAMES: ::c_int = 8;
-pub const HW_DISKSTATS: ::c_int = 9;
-pub const HW_EPOCH: ::c_int = 10;
-pub const HW_FLOATINGPT: ::c_int = 11;
-pub const HW_MACHINE_ARCH: ::c_int = 12;
-pub const HW_VECTORUNIT: ::c_int = 13;
-pub const HW_BUS_FREQ: ::c_int = 14;
-pub const HW_CPU_FREQ: ::c_int = 15;
-pub const HW_CACHELINE: ::c_int = 16;
-pub const HW_L1ICACHESIZE: ::c_int = 17;
-pub const HW_L1DCACHESIZE: ::c_int = 18;
-pub const HW_L2SETTINGS: ::c_int = 19;
-pub const HW_L2CACHESIZE: ::c_int = 20;
-pub const HW_L3SETTINGS: ::c_int = 21;
-pub const HW_L3CACHESIZE: ::c_int = 22;
-pub const HW_TB_FREQ: ::c_int = 23;
-pub const HW_MEMSIZE: ::c_int = 24;
-pub const HW_AVAILCPU: ::c_int = 25;
-pub const HW_MAXID: ::c_int = 26;
-pub const USER_CS_PATH: ::c_int = 1;
-pub const USER_BC_BASE_MAX: ::c_int = 2;
-pub const USER_BC_DIM_MAX: ::c_int = 3;
-pub const USER_BC_SCALE_MAX: ::c_int = 4;
-pub const USER_BC_STRING_MAX: ::c_int = 5;
-pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6;
-pub const USER_EXPR_NEST_MAX: ::c_int = 7;
-pub const USER_LINE_MAX: ::c_int = 8;
-pub const USER_RE_DUP_MAX: ::c_int = 9;
-pub const USER_POSIX2_VERSION: ::c_int = 10;
-pub const USER_POSIX2_C_BIND: ::c_int = 11;
-pub const USER_POSIX2_C_DEV: ::c_int = 12;
-pub const USER_POSIX2_CHAR_TERM: ::c_int = 13;
-pub const USER_POSIX2_FORT_DEV: ::c_int = 14;
-pub const USER_POSIX2_FORT_RUN: ::c_int = 15;
-pub const USER_POSIX2_LOCALEDEF: ::c_int = 16;
-pub const USER_POSIX2_SW_DEV: ::c_int = 17;
-pub const USER_POSIX2_UPE: ::c_int = 18;
-pub const USER_STREAM_MAX: ::c_int = 19;
-pub const USER_TZNAME_MAX: ::c_int = 20;
-pub const USER_MAXID: ::c_int = 21;
-pub const CTL_DEBUG_NAME: ::c_int = 0;
-pub const CTL_DEBUG_VALUE: ::c_int = 1;
-pub const CTL_DEBUG_MAXID: ::c_int = 20;
-
-pub const POLLRDNORM: ::c_short = 0x040;
-pub const POLLWRNORM: ::c_short = 0x004;
-pub const POLLRDBAND: ::c_short = 0x080;
-pub const POLLWRBAND: ::c_short = 0x100;
-
-pub const PRIO_DARWIN_THREAD: ::c_int = 3;
-pub const PRIO_DARWIN_PROCESS: ::c_int = 4;
-pub const PRIO_DARWIN_BG: ::c_int = 0x1000;
-pub const PRIO_DARWIN_NONUI: ::c_int = 0x1001;
-
-pub const SEM_FAILED: *mut sem_t = -1isize as *mut ::sem_t;
-
-pub const SIGEV_NONE: ::c_int = 0;
-pub const SIGEV_SIGNAL: ::c_int = 1;
-pub const SIGEV_THREAD: ::c_int = 3;
-
-pub const AIO_CANCELED: ::c_int = 2;
-pub const AIO_NOTCANCELED: ::c_int = 4;
-pub const AIO_ALLDONE: ::c_int = 1;
-pub const AIO_LISTIO_MAX: ::c_int = 16;
-pub const LIO_NOP: ::c_int = 0;
-pub const LIO_WRITE: ::c_int = 2;
-pub const LIO_READ: ::c_int = 1;
-pub const LIO_WAIT: ::c_int = 2;
-pub const LIO_NOWAIT: ::c_int = 1;
-
-pub const WEXITED: ::c_int = 0x00000004;
-pub const WSTOPPED: ::c_int = 0x00000008;
-pub const WCONTINUED: ::c_int = 0x00000010;
-pub const WNOWAIT: ::c_int = 0x00000020;
-
-pub const P_ALL: idtype_t = 0;
-pub const P_PID: idtype_t = 1;
-pub const P_PGID: idtype_t = 2;
-
-pub const XATTR_NOFOLLOW: ::c_int = 0x0001;
-pub const XATTR_CREATE: ::c_int = 0x0002;
-pub const XATTR_REPLACE: ::c_int = 0x0004;
-pub const XATTR_NOSECURITY: ::c_int = 0x0008;
-pub const XATTR_NODEFAULT: ::c_int = 0x0010;
-pub const XATTR_SHOWCOMPRESSION: ::c_int = 0x0020;
-
-f! {
-    pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
-        status >> 8
-    }
-
-    pub fn _WSTATUS(status: ::c_int) -> ::c_int {
-        status & 0x7f
-    }
-
-    pub fn WIFCONTINUED(status: ::c_int) -> bool {
-        _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) == 0x13
-    }
-
-    pub fn WIFSIGNALED(status: ::c_int) -> bool {
-        _WSTATUS(status) != _WSTOPPED && _WSTATUS(status) != 0
-    }
-
-    pub fn WIFSTOPPED(status: ::c_int) -> bool {
-        _WSTATUS(status) == _WSTOPPED && WSTOPSIG(status) != 0x13
-    }
-}
-
-extern {
-    pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
-    pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "aio_suspend$UNIX2003")]
-    pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int,
-                       timeout: *const ::timespec) -> ::c_int;
-    pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb,
-                      nitems: ::c_int, sevp: *mut sigevent) -> ::c_int;
-
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
-
-    pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
-
-    pub fn getutxent() -> *mut utmpx;
-    pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
-    pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn setutxent();
-    pub fn endutxent();
-    pub fn utmpxname(file: *const ::c_char) -> ::c_int;
-
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::socklen_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::socklen_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn mincore(addr: *const ::c_void, len: ::size_t,
-                   vec: *mut ::c_char) -> ::c_int;
-    pub fn sysctlnametomib(name: *const ::c_char,
-                           mibp: *mut ::c_int,
-                           sizep: *mut ::size_t)
-                           -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "mprotect$UNIX2003")]
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn shm_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::c_int;
-    pub fn sysctl(name: *mut ::c_int,
-                  namelen: ::c_uint,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn sysctlbyname(name: *const ::c_char,
-                        oldp: *mut ::c_void,
-                        oldlenp: *mut ::size_t,
-                        newp: *mut ::c_void,
-                        newlen: ::size_t)
-                        -> ::c_int;
-    pub fn mach_absolute_time() -> u64;
-    pub fn mach_timebase_info(info: *mut ::mach_timebase_info) -> ::c_int;
-    pub fn pthread_setname_np(name: *const ::c_char) -> ::c_int;
-    pub fn pthread_get_stackaddr_np(thread: ::pthread_t) -> *mut ::c_void;
-    pub fn pthread_get_stacksize_np(thread: ::pthread_t) -> ::size_t;
-    pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t,
-                                       pshared: ::c_int) -> ::c_int;
-    pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t,
-                                       pshared: *mut ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t,
-                                        pshared: ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t,
-                                        pshared: *mut ::c_int) -> ::c_int;
-    pub fn __error() -> *mut ::c_int;
-    pub fn backtrace(buf: *mut *mut ::c_void,
-                     sz: ::c_int) -> ::c_int;
-    #[cfg_attr(target_os = "macos", link_name = "statfs$INODE64")]
-    pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int;
-    #[cfg_attr(target_os = "macos", link_name = "fstatfs$INODE64")]
-    pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int;
-    pub fn kevent(kq: ::c_int,
-                  changelist: *const ::kevent,
-                  nchanges: ::c_int,
-                  eventlist: *mut ::kevent,
-                  nevents: ::c_int,
-                  timeout: *const ::timespec) -> ::c_int;
-    pub fn kevent64(kq: ::c_int,
-                    changelist: *const ::kevent64_s,
-                    nchanges: ::c_int,
-                    eventlist: *mut ::kevent64_s,
-                    nevents: ::c_int,
-                    flags: ::c_uint,
-                    timeout: *const ::timespec) -> ::c_int;
-    pub fn mount(src: *const ::c_char,
-                 target: *const ::c_char,
-                 flags: ::c_int,
-                 data: *mut ::c_void) -> ::c_int;
-    pub fn ptrace(requeset: ::c_int,
-                  pid: ::pid_t,
-                  addr: *mut ::c_char,
-                  data: ::c_int) -> ::c_int;
-    pub fn quotactl(special: *const ::c_char,
-                    cmd: ::c_int,
-                    id: ::c_int,
-                    data: *mut ::c_char) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int;
-    pub fn sendfile(fd: ::c_int,
-                    s: ::c_int,
-                    offset: ::off_t,
-                    len: *mut ::off_t,
-                    hdtr: *mut ::sf_hdtr,
-                    flags: ::c_int) -> ::c_int;
-    pub fn openpty(amaster: *mut ::c_int,
-                   aslave: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::c_int;
-    pub fn forkpty(amaster: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::pid_t;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t) -> ::c_int;
-    pub fn localeconv_l(loc: ::locale_t) -> *mut lconv;
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char;
-    pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
-
-    pub fn getxattr(path: *const ::c_char, name: *const ::c_char,
-                    value: *mut ::c_void, size: ::size_t, position: u32,
-                    flags: ::c_int) -> ::ssize_t;
-    pub fn fgetxattr(filedes: ::c_int, name: *const ::c_char,
-                     value: *mut ::c_void, size: ::size_t, position: u32,
-                     flags: ::c_int) -> ::ssize_t;
-    pub fn setxattr(path: *const ::c_char, name: *const ::c_char,
-                    value: *const ::c_void, size: ::size_t, position: u32,
-                    flags: ::c_int) -> ::c_int;
-    pub fn fsetxattr(filedes: ::c_int, name: *const ::c_char,
-                     value: *const ::c_void, size: ::size_t, position: u32,
-                     flags: ::c_int) -> ::c_int;
-    pub fn listxattr(path: *const ::c_char, list: *mut ::c_char,
-                     size: ::size_t, flags: ::c_int) -> ::ssize_t;
-    pub fn flistxattr(filedes: ::c_int, list: *mut ::c_char,
-                      size: ::size_t, flags: ::c_int) -> ::ssize_t;
-    pub fn removexattr(path: *const ::c_char, name: *const ::c_char,
-                       flags: ::c_int) -> ::c_int;
-    pub fn fremovexattr(filedes: ::c_int, name: *const ::c_char,
-                        flags: ::c_int) -> ::c_int;
-
-    pub fn initgroups(user: *const ::c_char, basegroup: ::c_int) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "waitid$UNIX2003")]
-    pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-    pub fn brk(addr: *const ::c_void) -> *mut ::c_void;
-    pub fn sbrk(increment: ::c_int) -> *mut ::c_void;
-    pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(any(target_arch = "arm", target_arch = "x86"))] {
-        mod b32;
-        pub use self::b32::*;
-    } else if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] {
-        mod b64;
-        pub use self::b64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/dragonfly/mod.rs
+++ /dev/null
@@ -1,420 +0,0 @@
-pub type clock_t = u64;
-pub type ino_t = u64;
-pub type nlink_t = u32;
-pub type blksize_t = i64;
-pub type clockid_t = ::c_ulong;
-
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type time_t = i64;
-pub type suseconds_t = i64;
-
-pub type uuid_t = ::uuid;
-
-pub type fsblkcnt_t = u64;
-pub type fsfilcnt_t = u64;
-
-pub type sem_t = *mut sem;
-
-pub enum sem {}
-
-s! {
-
-    pub struct exit_status {
-        pub e_termination: u16,
-        pub e_exit: u16
-    }
-
-    pub struct utmpx {
-        pub ut_name: [::c_char; 32],
-        pub ut_id: [::c_char; 4],
-
-        pub ut_line: [::c_char; 32],
-        pub ut_host: [::c_char; 256],
-
-        pub ut_unused: [u8; 16],
-        pub ut_session: u16,
-        pub ut_type: u16,
-        pub ut_pid: ::pid_t,
-        ut_exit: exit_status,
-        ut_ss: ::sockaddr_storage,
-        pub ut_tv: ::timeval,
-        pub ut_unused2: [u8; 16],
-    }
-
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_offset: ::off_t,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: sigevent,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        _aio_val: ::c_int,
-        _aio_err: ::c_int
-    }
-
-    pub struct dirent {
-        pub d_fileno: ::ino_t,
-        pub d_namlen: u16,
-        pub d_type: u8,
-        __unused1: u8,
-        __unused2: u32,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct uuid {
-        pub time_low: u32,
-        pub time_mid: u16,
-        pub time_hi_and_version: u16,
-        pub clock_seq_hi_and_reserved: u8,
-        pub clock_seq_low: u8,
-        pub node: [u8; 6],
-    }
-
-    pub struct sigevent {
-        pub sigev_notify: ::c_int,
-        // The union is 8-byte in size, so it is aligned at a 8-byte offset.
-        #[cfg(target_pointer_width = "64")]
-        __unused1: ::c_int,
-        pub sigev_signo: ::c_int,       //actually a union
-        // pad the union
-        #[cfg(target_pointer_width = "64")]
-        __unused2: ::c_int,
-        pub sigev_value: ::sigval,
-        __unused3: *mut ::c_void        //actually a function pointer
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        pub f_owner: ::uid_t,
-        pub f_type: ::c_uint,
-        pub f_syncreads: u64,
-        pub f_syncwrites: u64,
-        pub f_asyncreads: u64,
-        pub f_asyncwrites: u64,
-        pub f_fsid_uuid: ::uuid_t,
-        pub f_uid_uuid: ::uuid_t,
-    }
-
-    pub struct stat {
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_dev: ::dev_t,
-        pub st_mode: ::mode_t,
-        pub st_padding1: ::uint16_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::int64_t,
-        pub st_blksize: ::uint32_t,
-        pub st_flags: ::uint32_t,
-        pub st_gen: ::uint32_t,
-        pub st_lspare: ::int32_t,
-        pub st_qspare1: ::int64_t,
-        pub st_qspare2: ::int64_t,
-    }
-}
-
-pub const RAND_MAX: ::c_int = 0x7fff_ffff;
-pub const PTHREAD_STACK_MIN: ::size_t = 1024;
-pub const SIGSTKSZ: ::size_t = 40960;
-pub const MADV_INVAL: ::c_int = 10;
-pub const O_CLOEXEC: ::c_int = 0x00020000;
-pub const F_GETLK: ::c_int = 7;
-pub const F_SETLK: ::c_int = 8;
-pub const F_SETLKW: ::c_int = 9;
-pub const ELAST: ::c_int = 99;
-pub const RLIMIT_POSIXLOCKS: ::c_int = 11;
-pub const RLIM_NLIMITS: ::rlim_t = 12;
-
-pub const Q_GETQUOTA: ::c_int = 0x300;
-pub const Q_SETQUOTA: ::c_int = 0x400;
-
-pub const CLOCK_REALTIME: clockid_t = 0;
-pub const CLOCK_VIRTUAL: clockid_t = 1;
-pub const CLOCK_PROF: clockid_t = 2;
-pub const CLOCK_MONOTONIC: clockid_t = 4;
-pub const CLOCK_UPTIME: clockid_t = 5;
-pub const CLOCK_UPTIME_PRECISE: clockid_t = 7;
-pub const CLOCK_UPTIME_FAST: clockid_t = 8;
-pub const CLOCK_REALTIME_PRECISE: clockid_t = 9;
-pub const CLOCK_REALTIME_FAST: clockid_t = 10;
-pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11;
-pub const CLOCK_MONOTONIC_FAST: clockid_t = 12;
-pub const CLOCK_SECOND: clockid_t = 13;
-pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14;
-pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15;
-
-pub const CTL_UNSPEC: ::c_int = 0;
-pub const CTL_KERN: ::c_int = 1;
-pub const CTL_VM: ::c_int = 2;
-pub const CTL_VFS: ::c_int = 3;
-pub const CTL_NET: ::c_int = 4;
-pub const CTL_DEBUG: ::c_int = 5;
-pub const CTL_HW: ::c_int = 6;
-pub const CTL_MACHDEP: ::c_int = 7;
-pub const CTL_USER: ::c_int = 8;
-pub const CTL_P1003_1B: ::c_int = 9;
-pub const CTL_LWKT: ::c_int = 10;
-pub const CTL_MAXID: ::c_int = 11;
-pub const KERN_OSTYPE: ::c_int = 1;
-pub const KERN_OSRELEASE: ::c_int = 2;
-pub const KERN_OSREV: ::c_int = 3;
-pub const KERN_VERSION: ::c_int = 4;
-pub const KERN_MAXVNODES: ::c_int = 5;
-pub const KERN_MAXPROC: ::c_int = 6;
-pub const KERN_MAXFILES: ::c_int = 7;
-pub const KERN_ARGMAX: ::c_int = 8;
-pub const KERN_SECURELVL: ::c_int = 9;
-pub const KERN_HOSTNAME: ::c_int = 10;
-pub const KERN_HOSTID: ::c_int = 11;
-pub const KERN_CLOCKRATE: ::c_int = 12;
-pub const KERN_VNODE: ::c_int = 13;
-pub const KERN_PROC: ::c_int = 14;
-pub const KERN_FILE: ::c_int = 15;
-pub const KERN_PROF: ::c_int = 16;
-pub const KERN_POSIX1: ::c_int = 17;
-pub const KERN_NGROUPS: ::c_int = 18;
-pub const KERN_JOB_CONTROL: ::c_int = 19;
-pub const KERN_SAVED_IDS: ::c_int = 20;
-pub const KERN_BOOTTIME: ::c_int = 21;
-pub const KERN_NISDOMAINNAME: ::c_int = 22;
-pub const KERN_UPDATEINTERVAL: ::c_int = 23;
-pub const KERN_OSRELDATE: ::c_int = 24;
-pub const KERN_NTP_PLL: ::c_int = 25;
-pub const KERN_BOOTFILE: ::c_int = 26;
-pub const KERN_MAXFILESPERPROC: ::c_int = 27;
-pub const KERN_MAXPROCPERUID: ::c_int = 28;
-pub const KERN_DUMPDEV: ::c_int = 29;
-pub const KERN_IPC: ::c_int = 30;
-pub const KERN_DUMMY: ::c_int = 31;
-pub const KERN_PS_STRINGS: ::c_int = 32;
-pub const KERN_USRSTACK: ::c_int = 33;
-pub const KERN_LOGSIGEXIT: ::c_int = 34;
-pub const KERN_IOV_MAX: ::c_int = 35;
-pub const KERN_MAXPOSIXLOCKSPERUID: ::c_int = 36;
-pub const KERN_MAXID: ::c_int = 37;
-pub const KERN_PROC_ALL: ::c_int = 0;
-pub const KERN_PROC_PID: ::c_int = 1;
-pub const KERN_PROC_PGRP: ::c_int = 2;
-pub const KERN_PROC_SESSION: ::c_int = 3;
-pub const KERN_PROC_TTY: ::c_int = 4;
-pub const KERN_PROC_UID: ::c_int = 5;
-pub const KERN_PROC_RUID: ::c_int = 6;
-pub const KERN_PROC_ARGS: ::c_int = 7;
-pub const KERN_PROC_CWD: ::c_int = 8;
-pub const KERN_PROC_PATHNAME: ::c_int = 9;
-pub const KERN_PROC_FLAGMASK: ::c_int = 0x10;
-pub const KERN_PROC_FLAG_LWP: ::c_int = 0x10;
-pub const KIPC_MAXSOCKBUF: ::c_int = 1;
-pub const KIPC_SOCKBUF_WASTE: ::c_int = 2;
-pub const KIPC_SOMAXCONN: ::c_int = 3;
-pub const KIPC_MAX_LINKHDR: ::c_int = 4;
-pub const KIPC_MAX_PROTOHDR: ::c_int = 5;
-pub const KIPC_MAX_HDR: ::c_int = 6;
-pub const KIPC_MAX_DATALEN: ::c_int = 7;
-pub const KIPC_MBSTAT: ::c_int = 8;
-pub const KIPC_NMBCLUSTERS: ::c_int = 9;
-pub const HW_MACHINE: ::c_int = 1;
-pub const HW_MODEL: ::c_int = 2;
-pub const HW_NCPU: ::c_int = 3;
-pub const HW_BYTEORDER: ::c_int = 4;
-pub const HW_PHYSMEM: ::c_int = 5;
-pub const HW_USERMEM: ::c_int = 6;
-pub const HW_PAGESIZE: ::c_int = 7;
-pub const HW_DISKNAMES: ::c_int = 8;
-pub const HW_DISKSTATS: ::c_int = 9;
-pub const HW_FLOATINGPT: ::c_int = 10;
-pub const HW_MACHINE_ARCH: ::c_int = 11;
-pub const HW_MACHINE_PLATFORM: ::c_int = 12;
-pub const HW_SENSORS: ::c_int = 13;
-pub const HW_MAXID: ::c_int = 14;
-pub const USER_CS_PATH: ::c_int = 1;
-pub const USER_BC_BASE_MAX: ::c_int = 2;
-pub const USER_BC_DIM_MAX: ::c_int = 3;
-pub const USER_BC_SCALE_MAX: ::c_int = 4;
-pub const USER_BC_STRING_MAX: ::c_int = 5;
-pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6;
-pub const USER_EXPR_NEST_MAX: ::c_int = 7;
-pub const USER_LINE_MAX: ::c_int = 8;
-pub const USER_RE_DUP_MAX: ::c_int = 9;
-pub const USER_POSIX2_VERSION: ::c_int = 10;
-pub const USER_POSIX2_C_BIND: ::c_int = 11;
-pub const USER_POSIX2_C_DEV: ::c_int = 12;
-pub const USER_POSIX2_CHAR_TERM: ::c_int = 13;
-pub const USER_POSIX2_FORT_DEV: ::c_int = 14;
-pub const USER_POSIX2_FORT_RUN: ::c_int = 15;
-pub const USER_POSIX2_LOCALEDEF: ::c_int = 16;
-pub const USER_POSIX2_SW_DEV: ::c_int = 17;
-pub const USER_POSIX2_UPE: ::c_int = 18;
-pub const USER_STREAM_MAX: ::c_int = 19;
-pub const USER_TZNAME_MAX: ::c_int = 20;
-pub const USER_MAXID: ::c_int = 21;
-pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1;
-pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2;
-pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3;
-pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4;
-pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5;
-pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6;
-pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7;
-pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8;
-pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9;
-pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10;
-pub const CTL_P1003_1B_FSYNC: ::c_int = 11;
-pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12;
-pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13;
-pub const CTL_P1003_1B_TIMERS: ::c_int = 14;
-pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15;
-pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16;
-pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17;
-pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18;
-pub const CTL_P1003_1B_UNUSED1: ::c_int = 19;
-pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20;
-pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21;
-pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22;
-pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23;
-pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24;
-pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25;
-pub const CTL_P1003_1B_MAXID: ::c_int = 26;
-
-pub const EVFILT_READ: ::int16_t = -1;
-pub const EVFILT_WRITE: ::int16_t = -2;
-pub const EVFILT_AIO: ::int16_t = -3;
-pub const EVFILT_VNODE: ::int16_t = -4;
-pub const EVFILT_PROC: ::int16_t = -5;
-pub const EVFILT_SIGNAL: ::int16_t = -6;
-pub const EVFILT_TIMER: ::int16_t = -7;
-pub const EVFILT_USER: ::int16_t = -9;
-pub const EVFILT_FS: ::int16_t = -10;
-
-pub const EV_ADD: ::uint16_t = 0x1;
-pub const EV_DELETE: ::uint16_t = 0x2;
-pub const EV_ENABLE: ::uint16_t = 0x4;
-pub const EV_DISABLE: ::uint16_t = 0x8;
-pub const EV_ONESHOT: ::uint16_t = 0x10;
-pub const EV_CLEAR: ::uint16_t = 0x20;
-pub const EV_RECEIPT: ::uint16_t = 0x40;
-pub const EV_DISPATCH: ::uint16_t = 0x80;
-pub const EV_NODATA: ::uint16_t = 0x1000;
-pub const EV_FLAG1: ::uint16_t = 0x2000;
-pub const EV_ERROR: ::uint16_t = 0x4000;
-pub const EV_EOF: ::uint16_t = 0x8000;
-pub const EV_SYSFLAGS: ::uint16_t = 0xf000;
-
-pub const NOTE_TRIGGER: ::uint32_t = 0x01000000;
-pub const NOTE_FFNOP: ::uint32_t = 0x00000000;
-pub const NOTE_FFAND: ::uint32_t = 0x40000000;
-pub const NOTE_FFOR: ::uint32_t = 0x80000000;
-pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000;
-pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000;
-pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff;
-pub const NOTE_LOWAT: ::uint32_t = 0x00000001;
-pub const NOTE_OOB: ::uint32_t = 0x00000002;
-pub const NOTE_DELETE: ::uint32_t = 0x00000001;
-pub const NOTE_WRITE: ::uint32_t = 0x00000002;
-pub const NOTE_EXTEND: ::uint32_t = 0x00000004;
-pub const NOTE_ATTRIB: ::uint32_t = 0x00000008;
-pub const NOTE_LINK: ::uint32_t = 0x00000010;
-pub const NOTE_RENAME: ::uint32_t = 0x00000020;
-pub const NOTE_REVOKE: ::uint32_t = 0x00000040;
-pub const NOTE_EXIT: ::uint32_t = 0x80000000;
-pub const NOTE_FORK: ::uint32_t = 0x40000000;
-pub const NOTE_EXEC: ::uint32_t = 0x20000000;
-pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff;
-pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000;
-pub const NOTE_TRACK: ::uint32_t = 0x00000001;
-pub const NOTE_TRACKERR: ::uint32_t = 0x00000002;
-pub const NOTE_CHILD: ::uint32_t = 0x00000004;
-
-pub const SO_SNDSPACE: ::c_int = 0x100a;
-pub const SO_CPUHINT: ::c_int = 0x1030;
-
-pub const AF_BLUETOOTH: ::c_int = 33;
-pub const AF_MPLS: ::c_int = 34;
-pub const AF_IEEE80211: ::c_int = 35;
-pub const AF_MAX: ::c_int = 36;
-
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_MAX: ::c_int = AF_MAX;
-
-pub const NET_RT_DUMP: ::c_int = 1;
-pub const NET_RT_FLAGS: ::c_int = 2;
-pub const NET_RT_IFLIST: ::c_int = 3;
-pub const NET_RT_MAXID: ::c_int = 4;
-
-pub const SOMAXOPT_SIZE: ::c_int = 65536;
-
-#[doc(hidden)]
-pub const NET_MAXID: ::c_int = AF_MAX;
-
-pub const MSG_UNUSED09: ::c_int = 0x00000200;
-pub const MSG_NOSIGNAL: ::c_int = 0x00000400;
-pub const MSG_SYNC: ::c_int = 0x00000800;
-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00001000;
-pub const MSG_FBLOCKING: ::c_int = 0x00010000;
-pub const MSG_FNONBLOCKING: ::c_int = 0x00020000;
-pub const MSG_FMASK: ::c_int = 0xFFFF0000;
-
-pub const EMPTY: ::c_short = 0;
-pub const RUN_LVL: ::c_short = 1;
-pub const BOOT_TIME: ::c_short = 2;
-pub const OLD_TIME: ::c_short = 3;
-pub const NEW_TIME: ::c_short = 4;
-pub const INIT_PROCESS: ::c_short = 5;
-pub const LOGIN_PROCESS: ::c_short = 6;
-pub const USER_PROCESS: ::c_short = 7;
-pub const DEAD_PROCESS: ::c_short = 8;
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << 0);
-pub const LC_CTYPE_MASK: ::c_int = (1 << 1);
-pub const LC_MONETARY_MASK: ::c_int = (1 << 2);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << 3);
-pub const LC_TIME_MASK: ::c_int = (1 << 4);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << 5);
-pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK
-                               | LC_CTYPE_MASK
-                               | LC_MESSAGES_MASK
-                               | LC_MONETARY_MASK
-                               | LC_NUMERIC_MASK
-                               | LC_TIME_MASK;
-
-pub const TIOCSIG: ::c_uint = 0x2000745f;
-pub const BTUARTDISC: ::c_int = 0x7;
-pub const TIOCDCDTIMESTAMP: ::c_uint = 0x40107458;
-pub const TIOCISPTMASTER: ::c_uint = 0x20007455;
-pub const TIOCMODG: ::c_uint = 0x40047403;
-pub const TIOCMODS: ::c_ulong = 0x80047404;
-pub const TIOCREMOTE: ::c_ulong = 0x80047469;
-
-extern {
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-
-    pub fn setutxdb(_type: ::c_uint, file: *mut ::c_char) -> ::c_int;
-
-    pub fn aio_waitcomplete(iocbp: *mut *mut aiocb,
-                            timeout: *mut ::timespec) -> ::c_int;
-
-    pub fn freelocale(loc: ::locale_t);
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type time_t = i64;
-pub type suseconds_t = i64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: ::blksize_t,
-        pub st_flags: ::fflags_t,
-        pub st_gen: ::uint32_t,
-        pub st_lspare: ::int32_t,
-        pub st_birthtime: ::time_t,
-        pub st_birthtime_nsec: ::c_long,
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/mod.rs
+++ /dev/null
@@ -1,577 +0,0 @@
-pub type fflags_t = u32;
-pub type clock_t = i32;
-pub type ino_t = u32;
-pub type lwpid_t = i32;
-pub type nlink_t = u16;
-pub type blksize_t = u32;
-pub type clockid_t = ::c_int;
-pub type sem_t = _sem;
-
-pub type fsblkcnt_t = ::uint64_t;
-pub type fsfilcnt_t = ::uint64_t;
-pub type idtype_t = ::c_uint;
-
-pub type key_t = ::c_long;
-pub type msglen_t = ::c_ulong;
-pub type msgqnum_t = ::c_ulong;
-
-s! {
-    pub struct utmpx {
-        pub ut_type: ::c_short,
-        pub ut_tv: ::timeval,
-        pub ut_id: [::c_char; 8],
-        pub ut_pid: ::pid_t,
-        pub ut_user: [::c_char; 32],
-        pub ut_line: [::c_char; 16],
-        pub ut_host: [::c_char; 128],
-        pub __ut_spare: [::c_char; 64],
-    }
-
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_offset: ::off_t,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        __unused1: [::c_int; 2],
-        __unused2: *mut ::c_void,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        // unused 3 through 5 are the __aiocb_private structure
-        __unused3: ::c_long,
-        __unused4: ::c_long,
-        __unused5: *mut ::c_void,
-        pub aio_sigevent: sigevent
-    }
-
-    pub struct dirent {
-        pub d_fileno: u32,
-        pub d_reclen: u16,
-        pub d_type: u8,
-        pub d_namlen: u8,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct jail {
-        pub version: u32,
-        pub path: *mut ::c_char,
-        pub hostname: *mut ::c_char,
-        pub jailname: *mut ::c_char,
-        pub ip4s: ::c_uint,
-        pub ip6s: ::c_uint,
-        pub ip4: *mut ::in_addr,
-        pub ip6: *mut ::in6_addr,
-    }
-
-    pub struct sigevent {
-        pub sigev_notify: ::c_int,
-        pub sigev_signo: ::c_int,
-        pub sigev_value: ::sigval,
-        //The rest of the structure is actually a union.  We expose only
-        //sigev_notify_thread_id because it's the most useful union member.
-        pub sigev_notify_thread_id: ::lwpid_t,
-        #[cfg(target_pointer_width = "64")]
-        __unused1: ::c_int,
-        __unused2: [::c_long; 7]
-    }
-
-    pub struct statvfs {
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_bsize: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_fsid: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-    }
-
-    // internal structure has changed over time
-    pub struct _sem {
-        data: [u32; 4],
-    }
-
-    pub struct ipc_perm {
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub mode: ::mode_t,
-        pub seq: ::c_ushort,
-        pub key: ::key_t,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        pub msg_cbytes: ::msglen_t,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_nattch: ::c_int,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-    }
-}
-
-pub const SIGEV_THREAD_ID: ::c_int = 4;
-
-pub const RAND_MAX: ::c_int = 0x7fff_fffd;
-pub const PTHREAD_STACK_MIN: ::size_t = 2048;
-pub const PTHREAD_MUTEX_ADAPTIVE_NP: ::c_int = 4;
-pub const SIGSTKSZ: ::size_t = 34816;
-pub const SF_NODISKIO: ::c_int = 0x00000001;
-pub const SF_MNOWAIT: ::c_int = 0x00000002;
-pub const SF_SYNC: ::c_int = 0x00000004;
-pub const O_CLOEXEC: ::c_int = 0x00100000;
-pub const F_GETLK: ::c_int = 11;
-pub const F_SETLK: ::c_int = 12;
-pub const F_SETLKW: ::c_int = 13;
-pub const ELAST: ::c_int = 96;
-pub const RLIMIT_NPTS: ::c_int = 11;
-pub const RLIMIT_SWAP: ::c_int = 12;
-pub const RLIM_NLIMITS: ::rlim_t = 13;
-
-pub const Q_GETQUOTA: ::c_int = 0x700;
-pub const Q_SETQUOTA: ::c_int = 0x800;
-
-pub const POSIX_FADV_NORMAL: ::c_int = 0;
-pub const POSIX_FADV_RANDOM: ::c_int = 1;
-pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_FADV_WILLNEED: ::c_int = 3;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-
-pub const EVFILT_READ: ::int16_t = -1;
-pub const EVFILT_WRITE: ::int16_t = -2;
-pub const EVFILT_AIO: ::int16_t = -3;
-pub const EVFILT_VNODE: ::int16_t = -4;
-pub const EVFILT_PROC: ::int16_t = -5;
-pub const EVFILT_SIGNAL: ::int16_t = -6;
-pub const EVFILT_TIMER: ::int16_t = -7;
-pub const EVFILT_FS: ::int16_t = -9;
-pub const EVFILT_LIO: ::int16_t = -10;
-pub const EVFILT_USER: ::int16_t = -11;
-
-pub const EV_ADD: ::uint16_t = 0x1;
-pub const EV_DELETE: ::uint16_t = 0x2;
-pub const EV_ENABLE: ::uint16_t = 0x4;
-pub const EV_DISABLE: ::uint16_t = 0x8;
-pub const EV_ONESHOT: ::uint16_t = 0x10;
-pub const EV_CLEAR: ::uint16_t = 0x20;
-pub const EV_RECEIPT: ::uint16_t = 0x40;
-pub const EV_DISPATCH: ::uint16_t = 0x80;
-pub const EV_DROP: ::uint16_t = 0x1000;
-pub const EV_FLAG1: ::uint16_t = 0x2000;
-pub const EV_ERROR: ::uint16_t = 0x4000;
-pub const EV_EOF: ::uint16_t = 0x8000;
-pub const EV_SYSFLAGS: ::uint16_t = 0xf000;
-
-pub const NOTE_TRIGGER: ::uint32_t = 0x01000000;
-pub const NOTE_FFNOP: ::uint32_t = 0x00000000;
-pub const NOTE_FFAND: ::uint32_t = 0x40000000;
-pub const NOTE_FFOR: ::uint32_t = 0x80000000;
-pub const NOTE_FFCOPY: ::uint32_t = 0xc0000000;
-pub const NOTE_FFCTRLMASK: ::uint32_t = 0xc0000000;
-pub const NOTE_FFLAGSMASK: ::uint32_t = 0x00ffffff;
-pub const NOTE_LOWAT: ::uint32_t = 0x00000001;
-pub const NOTE_DELETE: ::uint32_t = 0x00000001;
-pub const NOTE_WRITE: ::uint32_t = 0x00000002;
-pub const NOTE_EXTEND: ::uint32_t = 0x00000004;
-pub const NOTE_ATTRIB: ::uint32_t = 0x00000008;
-pub const NOTE_LINK: ::uint32_t = 0x00000010;
-pub const NOTE_RENAME: ::uint32_t = 0x00000020;
-pub const NOTE_REVOKE: ::uint32_t = 0x00000040;
-pub const NOTE_EXIT: ::uint32_t = 0x80000000;
-pub const NOTE_FORK: ::uint32_t = 0x40000000;
-pub const NOTE_EXEC: ::uint32_t = 0x20000000;
-pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff;
-pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000;
-pub const NOTE_TRACK: ::uint32_t = 0x00000001;
-pub const NOTE_TRACKERR: ::uint32_t = 0x00000002;
-pub const NOTE_CHILD: ::uint32_t = 0x00000004;
-pub const NOTE_SECONDS: ::uint32_t = 0x00000001;
-pub const NOTE_MSECONDS: ::uint32_t = 0x00000002;
-pub const NOTE_USECONDS: ::uint32_t = 0x00000004;
-pub const NOTE_NSECONDS: ::uint32_t = 0x00000008;
-
-pub const MADV_PROTECT: ::c_int = 10;
-pub const RUSAGE_THREAD: ::c_int = 1;
-
-pub const CLOCK_REALTIME: clockid_t = 0;
-pub const CLOCK_VIRTUAL: clockid_t = 1;
-pub const CLOCK_PROF: clockid_t = 2;
-pub const CLOCK_MONOTONIC: clockid_t = 4;
-pub const CLOCK_UPTIME: clockid_t = 5;
-pub const CLOCK_UPTIME_PRECISE: clockid_t = 7;
-pub const CLOCK_UPTIME_FAST: clockid_t = 8;
-pub const CLOCK_REALTIME_PRECISE: clockid_t = 9;
-pub const CLOCK_REALTIME_FAST: clockid_t = 10;
-pub const CLOCK_MONOTONIC_PRECISE: clockid_t = 11;
-pub const CLOCK_MONOTONIC_FAST: clockid_t = 12;
-pub const CLOCK_SECOND: clockid_t = 13;
-pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 14;
-pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 15;
-
-pub const CTL_UNSPEC: ::c_int = 0;
-pub const CTL_KERN: ::c_int = 1;
-pub const CTL_VM: ::c_int = 2;
-pub const CTL_VFS: ::c_int = 3;
-pub const CTL_NET: ::c_int = 4;
-pub const CTL_DEBUG: ::c_int = 5;
-pub const CTL_HW: ::c_int = 6;
-pub const CTL_MACHDEP: ::c_int = 7;
-pub const CTL_USER: ::c_int = 8;
-pub const CTL_P1003_1B: ::c_int = 9;
-pub const KERN_OSTYPE: ::c_int = 1;
-pub const KERN_OSRELEASE: ::c_int = 2;
-pub const KERN_OSREV: ::c_int = 3;
-pub const KERN_VERSION: ::c_int = 4;
-pub const KERN_MAXVNODES: ::c_int = 5;
-pub const KERN_MAXPROC: ::c_int = 6;
-pub const KERN_MAXFILES: ::c_int = 7;
-pub const KERN_ARGMAX: ::c_int = 8;
-pub const KERN_SECURELVL: ::c_int = 9;
-pub const KERN_HOSTNAME: ::c_int = 10;
-pub const KERN_HOSTID: ::c_int = 11;
-pub const KERN_CLOCKRATE: ::c_int = 12;
-pub const KERN_VNODE: ::c_int = 13;
-pub const KERN_PROC: ::c_int = 14;
-pub const KERN_FILE: ::c_int = 15;
-pub const KERN_PROF: ::c_int = 16;
-pub const KERN_POSIX1: ::c_int = 17;
-pub const KERN_NGROUPS: ::c_int = 18;
-pub const KERN_JOB_CONTROL: ::c_int = 19;
-pub const KERN_SAVED_IDS: ::c_int = 20;
-pub const KERN_BOOTTIME: ::c_int = 21;
-pub const KERN_NISDOMAINNAME: ::c_int = 22;
-pub const KERN_UPDATEINTERVAL: ::c_int = 23;
-pub const KERN_OSRELDATE: ::c_int = 24;
-pub const KERN_NTP_PLL: ::c_int = 25;
-pub const KERN_BOOTFILE: ::c_int = 26;
-pub const KERN_MAXFILESPERPROC: ::c_int = 27;
-pub const KERN_MAXPROCPERUID: ::c_int = 28;
-pub const KERN_DUMPDEV: ::c_int = 29;
-pub const KERN_IPC: ::c_int = 30;
-pub const KERN_DUMMY: ::c_int = 31;
-pub const KERN_PS_STRINGS: ::c_int = 32;
-pub const KERN_USRSTACK: ::c_int = 33;
-pub const KERN_LOGSIGEXIT: ::c_int = 34;
-pub const KERN_IOV_MAX: ::c_int = 35;
-pub const KERN_HOSTUUID: ::c_int = 36;
-pub const KERN_ARND: ::c_int = 37;
-pub const KERN_PROC_ALL: ::c_int = 0;
-pub const KERN_PROC_PID: ::c_int = 1;
-pub const KERN_PROC_PGRP: ::c_int = 2;
-pub const KERN_PROC_SESSION: ::c_int = 3;
-pub const KERN_PROC_TTY: ::c_int = 4;
-pub const KERN_PROC_UID: ::c_int = 5;
-pub const KERN_PROC_RUID: ::c_int = 6;
-pub const KERN_PROC_ARGS: ::c_int = 7;
-pub const KERN_PROC_PROC: ::c_int = 8;
-pub const KERN_PROC_SV_NAME: ::c_int = 9;
-pub const KERN_PROC_RGID: ::c_int = 10;
-pub const KERN_PROC_GID: ::c_int = 11;
-pub const KERN_PROC_PATHNAME: ::c_int = 12;
-pub const KERN_PROC_OVMMAP: ::c_int = 13;
-pub const KERN_PROC_OFILEDESC: ::c_int = 14;
-pub const KERN_PROC_KSTACK: ::c_int = 15;
-pub const KERN_PROC_INC_THREAD: ::c_int = 0x10;
-pub const KERN_PROC_VMMAP: ::c_int = 32;
-pub const KERN_PROC_FILEDESC: ::c_int = 33;
-pub const KERN_PROC_GROUPS: ::c_int = 34;
-pub const KERN_PROC_ENV: ::c_int = 35;
-pub const KERN_PROC_AUXV: ::c_int = 36;
-pub const KERN_PROC_RLIMIT: ::c_int = 37;
-pub const KERN_PROC_PS_STRINGS: ::c_int = 38;
-pub const KERN_PROC_UMASK: ::c_int = 39;
-pub const KERN_PROC_OSREL: ::c_int = 40;
-pub const KERN_PROC_SIGTRAMP: ::c_int = 41;
-pub const KIPC_MAXSOCKBUF: ::c_int = 1;
-pub const KIPC_SOCKBUF_WASTE: ::c_int = 2;
-pub const KIPC_SOMAXCONN: ::c_int = 3;
-pub const KIPC_MAX_LINKHDR: ::c_int = 4;
-pub const KIPC_MAX_PROTOHDR: ::c_int = 5;
-pub const KIPC_MAX_HDR: ::c_int = 6;
-pub const KIPC_MAX_DATALEN: ::c_int = 7;
-pub const HW_MACHINE: ::c_int = 1;
-pub const HW_MODEL: ::c_int = 2;
-pub const HW_NCPU: ::c_int = 3;
-pub const HW_BYTEORDER: ::c_int = 4;
-pub const HW_PHYSMEM: ::c_int = 5;
-pub const HW_USERMEM: ::c_int = 6;
-pub const HW_PAGESIZE: ::c_int = 7;
-pub const HW_DISKNAMES: ::c_int = 8;
-pub const HW_DISKSTATS: ::c_int = 9;
-pub const HW_FLOATINGPT: ::c_int = 10;
-pub const HW_MACHINE_ARCH: ::c_int = 11;
-pub const HW_REALMEM: ::c_int = 12;
-pub const USER_CS_PATH: ::c_int = 1;
-pub const USER_BC_BASE_MAX: ::c_int = 2;
-pub const USER_BC_DIM_MAX: ::c_int = 3;
-pub const USER_BC_SCALE_MAX: ::c_int = 4;
-pub const USER_BC_STRING_MAX: ::c_int = 5;
-pub const USER_COLL_WEIGHTS_MAX: ::c_int = 6;
-pub const USER_EXPR_NEST_MAX: ::c_int = 7;
-pub const USER_LINE_MAX: ::c_int = 8;
-pub const USER_RE_DUP_MAX: ::c_int = 9;
-pub const USER_POSIX2_VERSION: ::c_int = 10;
-pub const USER_POSIX2_C_BIND: ::c_int = 11;
-pub const USER_POSIX2_C_DEV: ::c_int = 12;
-pub const USER_POSIX2_CHAR_TERM: ::c_int = 13;
-pub const USER_POSIX2_FORT_DEV: ::c_int = 14;
-pub const USER_POSIX2_FORT_RUN: ::c_int = 15;
-pub const USER_POSIX2_LOCALEDEF: ::c_int = 16;
-pub const USER_POSIX2_SW_DEV: ::c_int = 17;
-pub const USER_POSIX2_UPE: ::c_int = 18;
-pub const USER_STREAM_MAX: ::c_int = 19;
-pub const USER_TZNAME_MAX: ::c_int = 20;
-pub const CTL_P1003_1B_ASYNCHRONOUS_IO: ::c_int = 1;
-pub const CTL_P1003_1B_MAPPED_FILES: ::c_int = 2;
-pub const CTL_P1003_1B_MEMLOCK: ::c_int = 3;
-pub const CTL_P1003_1B_MEMLOCK_RANGE: ::c_int = 4;
-pub const CTL_P1003_1B_MEMORY_PROTECTION: ::c_int = 5;
-pub const CTL_P1003_1B_MESSAGE_PASSING: ::c_int = 6;
-pub const CTL_P1003_1B_PRIORITIZED_IO: ::c_int = 7;
-pub const CTL_P1003_1B_PRIORITY_SCHEDULING: ::c_int = 8;
-pub const CTL_P1003_1B_REALTIME_SIGNALS: ::c_int = 9;
-pub const CTL_P1003_1B_SEMAPHORES: ::c_int = 10;
-pub const CTL_P1003_1B_FSYNC: ::c_int = 11;
-pub const CTL_P1003_1B_SHARED_MEMORY_OBJECTS: ::c_int = 12;
-pub const CTL_P1003_1B_SYNCHRONIZED_IO: ::c_int = 13;
-pub const CTL_P1003_1B_TIMERS: ::c_int = 14;
-pub const CTL_P1003_1B_AIO_LISTIO_MAX: ::c_int = 15;
-pub const CTL_P1003_1B_AIO_MAX: ::c_int = 16;
-pub const CTL_P1003_1B_AIO_PRIO_DELTA_MAX: ::c_int = 17;
-pub const CTL_P1003_1B_DELAYTIMER_MAX: ::c_int = 18;
-pub const CTL_P1003_1B_MQ_OPEN_MAX: ::c_int = 19;
-pub const CTL_P1003_1B_PAGESIZE: ::c_int = 20;
-pub const CTL_P1003_1B_RTSIG_MAX: ::c_int = 21;
-pub const CTL_P1003_1B_SEM_NSEMS_MAX: ::c_int = 22;
-pub const CTL_P1003_1B_SEM_VALUE_MAX: ::c_int = 23;
-pub const CTL_P1003_1B_SIGQUEUE_MAX: ::c_int = 24;
-pub const CTL_P1003_1B_TIMER_MAX: ::c_int = 25;
-pub const TIOCGPTN: ::c_uint = 0x4004740f;
-pub const TIOCPTMASTER: ::c_uint = 0x2000741c;
-pub const TIOCSIG: ::c_uint = 0x2004745f;
-pub const TIOCM_DCD: ::c_int = 0x40;
-pub const H4DISC: ::c_int = 0x7;
-
-pub const JAIL_API_VERSION: u32 = 2;
-pub const JAIL_CREATE: ::c_int = 0x01;
-pub const JAIL_UPDATE: ::c_int = 0x02;
-pub const JAIL_ATTACH: ::c_int = 0x04;
-pub const JAIL_DYING: ::c_int = 0x08;
-pub const JAIL_SET_MASK: ::c_int = 0x0f;
-pub const JAIL_GET_MASK: ::c_int = 0x08;
-pub const JAIL_SYS_DISABLE: ::c_int = 0;
-pub const JAIL_SYS_NEW: ::c_int = 1;
-pub const JAIL_SYS_INHERIT: ::c_int = 2;
-
-pub const SO_BINTIME: ::c_int = 0x2000;
-pub const SO_NO_OFFLOAD: ::c_int = 0x4000;
-pub const SO_NO_DDP: ::c_int = 0x8000;
-pub const SO_LABEL: ::c_int = 0x1009;
-pub const SO_PEERLABEL: ::c_int = 0x1010;
-pub const SO_LISTENQLIMIT: ::c_int = 0x1011;
-pub const SO_LISTENQLEN: ::c_int = 0x1012;
-pub const SO_LISTENINCQLEN: ::c_int = 0x1013;
-pub const SO_SETFIB: ::c_int = 0x1014;
-pub const SO_USER_COOKIE: ::c_int = 0x1015;
-pub const SO_PROTOCOL: ::c_int = 0x1016;
-pub const SO_PROTOTYPE: ::c_int = SO_PROTOCOL;
-pub const SO_VENDOR: ::c_int = 0x80000000;
-
-pub const AF_SLOW: ::c_int = 33;
-pub const AF_SCLUSTER: ::c_int = 34;
-pub const AF_ARP: ::c_int = 35;
-pub const AF_BLUETOOTH: ::c_int = 36;
-pub const AF_IEEE80211: ::c_int = 37;
-pub const AF_INET_SDP: ::c_int = 40;
-pub const AF_INET6_SDP: ::c_int = 42;
-#[doc(hidden)]
-pub const AF_MAX: ::c_int = 42;
-
-pub const IPPROTO_DIVERT: ::c_int = 258;
-
-pub const PF_SLOW: ::c_int = AF_SLOW;
-pub const PF_SCLUSTER: ::c_int = AF_SCLUSTER;
-pub const PF_ARP: ::c_int = AF_ARP;
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_IEEE80211: ::c_int = AF_IEEE80211;
-pub const PF_INET_SDP: ::c_int = AF_INET_SDP;
-pub const PF_INET6_SDP: ::c_int = AF_INET6_SDP;
-#[doc(hidden)]
-pub const PF_MAX: ::c_int = AF_MAX;
-
-pub const NET_RT_DUMP: ::c_int = 1;
-pub const NET_RT_FLAGS: ::c_int = 2;
-pub const NET_RT_IFLIST: ::c_int = 3;
-pub const NET_RT_IFMALIST: ::c_int = 4;
-pub const NET_RT_IFLISTL: ::c_int = 5;
-
-// System V IPC
-pub const IPC_PRIVATE: ::key_t = 0;
-pub const IPC_CREAT: ::c_int = 0o1000;
-pub const IPC_EXCL: ::c_int = 0o2000;
-pub const IPC_NOWAIT: ::c_int = 0o4000;
-pub const IPC_RMID: ::c_int = 0;
-pub const IPC_SET: ::c_int = 1;
-pub const IPC_STAT: ::c_int = 2;
-pub const IPC_INFO: ::c_int = 3;
-pub const IPC_R : ::c_int = 0o400;
-pub const IPC_W : ::c_int = 0o200;
-pub const IPC_M : ::c_int = 0o10000;
-pub const MSG_NOERROR: ::c_int = 0o10000;
-pub const SHM_RDONLY: ::c_int = 0o10000;
-pub const SHM_RND: ::c_int = 0o20000;
-pub const SHM_R: ::c_int = 0o400;
-pub const SHM_W: ::c_int = 0o200;
-pub const SHM_LOCK: ::c_int = 11;
-pub const SHM_UNLOCK: ::c_int = 12;
-pub const SHM_STAT: ::c_int = 13;
-pub const SHM_INFO: ::c_int = 14;
-
-// The *_MAXID constants never should've been used outside of the
-// FreeBSD base system.  And with the exception of CTL_P1003_1B_MAXID,
-// they were all removed in svn r262489.  They remain here for backwards
-// compatibility only, and are scheduled to be removed in libc 1.0.0.
-#[doc(hidden)]
-pub const NET_MAXID: ::c_int = AF_MAX;
-#[doc(hidden)]
-pub const CTL_MAXID: ::c_int = 10;
-#[doc(hidden)]
-pub const KERN_MAXID: ::c_int = 38;
-#[doc(hidden)]
-pub const HW_MAXID: ::c_int = 13;
-#[doc(hidden)]
-pub const USER_MAXID: ::c_int = 21;
-#[doc(hidden)]
-pub const CTL_P1003_1B_MAXID: ::c_int = 26;
-
-pub const MSG_NOTIFICATION: ::c_int = 0x00002000;
-pub const MSG_NBIO: ::c_int = 0x00004000;
-pub const MSG_COMPAT: ::c_int = 0x00008000;
-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x00040000;
-pub const MSG_NOSIGNAL: ::c_int = 0x20000;
-
-pub const EMPTY: ::c_short = 0;
-pub const BOOT_TIME: ::c_short = 1;
-pub const OLD_TIME: ::c_short = 2;
-pub const NEW_TIME: ::c_short = 3;
-pub const USER_PROCESS: ::c_short = 4;
-pub const INIT_PROCESS: ::c_short = 5;
-pub const LOGIN_PROCESS: ::c_short = 6;
-pub const DEAD_PROCESS: ::c_short = 7;
-pub const SHUTDOWN_TIME: ::c_short = 8;
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << 0);
-pub const LC_CTYPE_MASK: ::c_int = (1 << 1);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << 2);
-pub const LC_MONETARY_MASK: ::c_int = (1 << 3);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << 4);
-pub const LC_TIME_MASK: ::c_int = (1 << 5);
-pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK
-                               | LC_CTYPE_MASK
-                               | LC_MESSAGES_MASK
-                               | LC_MONETARY_MASK
-                               | LC_NUMERIC_MASK
-                               | LC_TIME_MASK;
-
-pub const WSTOPPED: ::c_int = 2; // same as WUNTRACED
-pub const WCONTINUED: ::c_int = 4;
-pub const WNOWAIT: ::c_int = 8;
-pub const WEXITED: ::c_int = 16;
-pub const WTRAPPED: ::c_int = 32;
-
-// FreeBSD defines a great many more of these, we only expose the
-// standardized ones.
-pub const P_PID: idtype_t = 0;
-pub const P_PGID: idtype_t = 2;
-pub const P_ALL: idtype_t = 7;
-
-pub const B460800: ::speed_t = 460800;
-pub const B921600: ::speed_t = 921600;
-
-extern {
-    pub fn __error() -> *mut ::c_int;
-
-    pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-
-    pub fn jail(jail: *mut ::jail) -> ::c_int;
-    pub fn jail_attach(jid: ::c_int) -> ::c_int;
-    pub fn jail_remove(jid: ::c_int) -> ::c_int;
-    pub fn jail_get(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int)
-                    -> ::c_int;
-    pub fn jail_set(iov: *mut ::iovec, niov: ::c_uint, flags: ::c_int)
-                    -> ::c_int;
-
-    pub fn posix_fallocate(fd: ::c_int, offset: ::off_t,
-                           len: ::off_t) -> ::c_int;
-    pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t,
-                         advise: ::c_int) -> ::c_int;
-    pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int;
-    pub fn mkostemps(template: *mut ::c_char,
-                     suffixlen: ::c_int,
-                     flags: ::c_int) -> ::c_int;
-
-    pub fn getutxuser(user: *const ::c_char) -> *mut utmpx;
-    pub fn setutxdb(_type: ::c_int, file: *const ::c_char) -> ::c_int;
-
-    pub fn aio_waitcomplete(iocbp: *mut *mut aiocb,
-                            timeout: *mut ::timespec) -> ::ssize_t;
-
-    pub fn freelocale(loc: ::locale_t) -> ::c_int;
-    pub fn waitid(idtype: idtype_t, id: ::id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-
-    pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t;
-    pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int;
-    pub fn shmat(shmid: ::c_int, shmaddr: *const ::c_void,
-        shmflg: ::c_int) -> *mut ::c_void;
-    pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int;
-    pub fn shmctl(shmid: ::c_int, cmd: ::c_int,
-        buf: *mut ::shmid_ds) -> ::c_int;
-    pub fn msgctl(msqid: ::c_int, cmd: ::c_int,
-        buf: *mut ::msqid_ds) -> ::c_int;
-    pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int;
-    pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t,
-        msgtyp: ::c_long, msgflg: ::c_int) -> ::c_int;
-    pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t,
-        msgflg: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_arch = "x86")] {
-        mod x86;
-        pub use self::x86::*;
-    } else if #[cfg(target_arch = "x86_64")] {
-        mod x86_64;
-        pub use self::x86_64::*;
-    } else if #[cfg(target_arch = "aarch64")] {
-        mod aarch64;
-        pub use self::aarch64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/x86.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type time_t = i32;
-pub type suseconds_t = i32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: ::blksize_t,
-        pub st_flags: ::fflags_t,
-        pub st_gen: ::uint32_t,
-        pub st_lspare: ::int32_t,
-        pub st_birthtime: ::time_t,
-        pub st_birthtime_nsec: ::c_long,
-        __unused: [u8; 8],
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/freebsd/x86_64.rs
+++ /dev/null
@@ -1,30 +0,0 @@
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type time_t = i64;
-pub type suseconds_t = i64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: ::blksize_t,
-        pub st_flags: ::fflags_t,
-        pub st_gen: ::uint32_t,
-        pub st_lspare: ::int32_t,
-        pub st_birthtime: ::time_t,
-        pub st_birthtime_nsec: ::c_long,
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/freebsdlike/mod.rs
+++ /dev/null
@@ -1,1045 +0,0 @@
-pub type dev_t = u32;
-pub type mode_t = u16;
-pub type pthread_attr_t = *mut ::c_void;
-pub type rlim_t = i64;
-pub type pthread_mutex_t = *mut ::c_void;
-pub type pthread_mutexattr_t = *mut ::c_void;
-pub type pthread_cond_t = *mut ::c_void;
-pub type pthread_condattr_t = *mut ::c_void;
-pub type pthread_rwlock_t = *mut ::c_void;
-pub type pthread_key_t = ::c_int;
-pub type tcflag_t = ::c_uint;
-pub type speed_t = ::c_uint;
-pub type nl_item = ::c_int;
-pub type id_t = i64;
-
-pub enum timezone {}
-
-s! {
-    pub struct glob_t {
-        pub gl_pathc:  ::size_t,
-        pub gl_matchc: ::size_t,
-        pub gl_offs:   ::size_t,
-        pub gl_flags:  ::c_int,
-        pub gl_pathv:  *mut *mut ::c_char,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-        __unused8: *mut ::c_void,
-    }
-
-    pub struct kevent {
-        pub ident: ::uintptr_t,
-        pub filter: ::c_short,
-        pub flags: ::c_ushort,
-        pub fflags: ::c_uint,
-        pub data: ::intptr_t,
-        pub udata: *mut ::c_void,
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_len: u8,
-        pub ss_family: ::sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_align: i64,
-        __ss_pad2: [u8; 112],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: ::socklen_t,
-        pub ai_canonname: *mut ::c_char,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct sigset_t {
-        bits: [u32; 4],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub si_pid: ::pid_t,
-        pub si_uid: ::uid_t,
-        pub si_status: ::c_int,
-        pub si_addr: *mut ::c_void,
-        _pad: [::c_int; 12],
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_flags: ::c_int,
-        pub sa_mask: sigset_t,
-    }
-
-    pub struct stack_t {
-        // In FreeBSD 11 and later, ss_sp is actually a void*
-        pub ss_sp: *mut ::c_char,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sched_param {
-        pub sched_priority: ::c_int,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    pub struct sockaddr_in {
-        pub sin_len: u8,
-        pub sin_family: ::sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [::c_char; 8],
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        pub c_ispeed: ::speed_t,
-        pub c_ospeed: ::speed_t,
-    }
-
-    pub struct flock {
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        #[cfg(not(target_os = "dragonfly"))]
-        pub l_sysid: ::c_int,
-    }
-
-    pub struct sf_hdtr {
-        pub headers: *mut ::iovec,
-        pub hdr_cnt: ::c_int,
-        pub trailers: *mut ::iovec,
-        pub trl_cnt: ::c_int,
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-}
-
-pub const AIO_LISTIO_MAX: ::c_int = 16;
-pub const AIO_CANCELED: ::c_int = 1;
-pub const AIO_NOTCANCELED: ::c_int = 2;
-pub const AIO_ALLDONE: ::c_int = 3;
-pub const LIO_NOP: ::c_int = 0;
-pub const LIO_WRITE: ::c_int = 1;
-pub const LIO_READ: ::c_int = 2;
-pub const LIO_WAIT: ::c_int = 1;
-pub const LIO_NOWAIT: ::c_int = 0;
-
-pub const SIGEV_NONE: ::c_int = 0;
-pub const SIGEV_SIGNAL: ::c_int = 1;
-pub const SIGEV_THREAD: ::c_int = 2;
-pub const SIGEV_KEVENT: ::c_int = 3;
-
-pub const CODESET: ::nl_item = 0;
-pub const D_T_FMT: ::nl_item = 1;
-pub const D_FMT: ::nl_item = 2;
-pub const T_FMT: ::nl_item = 3;
-pub const T_FMT_AMPM: ::nl_item = 4;
-pub const AM_STR: ::nl_item = 5;
-pub const PM_STR: ::nl_item = 6;
-
-pub const DAY_1: ::nl_item = 7;
-pub const DAY_2: ::nl_item = 8;
-pub const DAY_3: ::nl_item = 9;
-pub const DAY_4: ::nl_item = 10;
-pub const DAY_5: ::nl_item = 11;
-pub const DAY_6: ::nl_item = 12;
-pub const DAY_7: ::nl_item = 13;
-
-pub const ABDAY_1: ::nl_item = 14;
-pub const ABDAY_2: ::nl_item = 15;
-pub const ABDAY_3: ::nl_item = 16;
-pub const ABDAY_4: ::nl_item = 17;
-pub const ABDAY_5: ::nl_item = 18;
-pub const ABDAY_6: ::nl_item = 19;
-pub const ABDAY_7: ::nl_item = 20;
-
-pub const MON_1: ::nl_item = 21;
-pub const MON_2: ::nl_item = 22;
-pub const MON_3: ::nl_item = 23;
-pub const MON_4: ::nl_item = 24;
-pub const MON_5: ::nl_item = 25;
-pub const MON_6: ::nl_item = 26;
-pub const MON_7: ::nl_item = 27;
-pub const MON_8: ::nl_item = 28;
-pub const MON_9: ::nl_item = 29;
-pub const MON_10: ::nl_item = 30;
-pub const MON_11: ::nl_item = 31;
-pub const MON_12: ::nl_item = 32;
-
-pub const ABMON_1: ::nl_item = 33;
-pub const ABMON_2: ::nl_item = 34;
-pub const ABMON_3: ::nl_item = 35;
-pub const ABMON_4: ::nl_item = 36;
-pub const ABMON_5: ::nl_item = 37;
-pub const ABMON_6: ::nl_item = 38;
-pub const ABMON_7: ::nl_item = 39;
-pub const ABMON_8: ::nl_item = 40;
-pub const ABMON_9: ::nl_item = 41;
-pub const ABMON_10: ::nl_item = 42;
-pub const ABMON_11: ::nl_item = 43;
-pub const ABMON_12: ::nl_item = 44;
-
-pub const ERA: ::nl_item = 45;
-pub const ERA_D_FMT: ::nl_item = 46;
-pub const ERA_D_T_FMT: ::nl_item = 47;
-pub const ERA_T_FMT: ::nl_item = 48;
-pub const ALT_DIGITS: ::nl_item = 49;
-
-pub const RADIXCHAR: ::nl_item = 50;
-pub const THOUSEP: ::nl_item = 51;
-
-pub const YESEXPR: ::nl_item = 52;
-pub const NOEXPR: ::nl_item = 53;
-
-pub const YESSTR: ::nl_item = 54;
-pub const NOSTR: ::nl_item = 55;
-
-pub const CRNCYSTR: ::nl_item = 56;
-
-pub const D_MD_ORDER: ::nl_item = 57;
-
-pub const ALTMON_1: ::nl_item = 58;
-pub const ALTMON_2: ::nl_item = 59;
-pub const ALTMON_3: ::nl_item = 60;
-pub const ALTMON_4: ::nl_item = 61;
-pub const ALTMON_5: ::nl_item = 62;
-pub const ALTMON_6: ::nl_item = 63;
-pub const ALTMON_7: ::nl_item = 64;
-pub const ALTMON_8: ::nl_item = 65;
-pub const ALTMON_9: ::nl_item = 66;
-pub const ALTMON_10: ::nl_item = 67;
-pub const ALTMON_11: ::nl_item = 68;
-pub const ALTMON_12: ::nl_item = 69;
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 2;
-pub const _IOLBF: ::c_int = 1;
-pub const BUFSIZ: ::c_uint = 1024;
-pub const FOPEN_MAX: ::c_uint = 20;
-pub const FILENAME_MAX: ::c_uint = 1024;
-pub const L_tmpnam: ::c_uint = 1024;
-pub const TMP_MAX: ::c_uint = 308915776;
-
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-pub const O_ACCMODE: ::c_int = 3;
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 512;
-pub const O_EXCL: ::c_int = 2048;
-pub const O_NOCTTY: ::c_int = 32768;
-pub const O_TRUNC: ::c_int = 1024;
-pub const S_IFIFO: mode_t = 4096;
-pub const S_IFCHR: mode_t = 8192;
-pub const S_IFBLK: mode_t = 24576;
-pub const S_IFDIR: mode_t = 16384;
-pub const S_IFREG: mode_t = 32768;
-pub const S_IFLNK: mode_t = 40960;
-pub const S_IFSOCK: mode_t = 49152;
-pub const S_IFMT: mode_t = 61440;
-pub const S_IEXEC: mode_t = 64;
-pub const S_IWRITE: mode_t = 128;
-pub const S_IREAD: mode_t = 256;
-pub const S_IRWXU: mode_t = 448;
-pub const S_IXUSR: mode_t = 64;
-pub const S_IWUSR: mode_t = 128;
-pub const S_IRUSR: mode_t = 256;
-pub const S_IRWXG: mode_t = 56;
-pub const S_IXGRP: mode_t = 8;
-pub const S_IWGRP: mode_t = 16;
-pub const S_IRGRP: mode_t = 32;
-pub const S_IRWXO: mode_t = 7;
-pub const S_IXOTH: mode_t = 1;
-pub const S_IWOTH: mode_t = 2;
-pub const S_IROTH: mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const F_LOCK: ::c_int = 1;
-pub const F_TEST: ::c_int = 3;
-pub const F_TLOCK: ::c_int = 2;
-pub const F_ULOCK: ::c_int = 0;
-pub const F_DUPFD_CLOEXEC: ::c_int = 17;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGEMT: ::c_int = 7;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const MAP_FILE: ::c_int = 0x0000;
-pub const MAP_SHARED: ::c_int = 0x0001;
-pub const MAP_PRIVATE: ::c_int = 0x0002;
-pub const MAP_FIXED: ::c_int = 0x0010;
-pub const MAP_ANON: ::c_int = 0x1000;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const MS_SYNC: ::c_int = 0x0000;
-pub const MS_ASYNC: ::c_int = 0x0001;
-pub const MS_INVALIDATE: ::c_int = 0x0002;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EDEADLK: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const ENOTBLK: ::c_int = 15;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const ETXTBSY: ::c_int = 26;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const EAGAIN: ::c_int = 35;
-pub const EWOULDBLOCK: ::c_int = 35;
-pub const EINPROGRESS: ::c_int = 36;
-pub const EALREADY: ::c_int = 37;
-pub const ENOTSOCK: ::c_int = 38;
-pub const EDESTADDRREQ: ::c_int = 39;
-pub const EMSGSIZE: ::c_int = 40;
-pub const EPROTOTYPE: ::c_int = 41;
-pub const ENOPROTOOPT: ::c_int = 42;
-pub const EPROTONOSUPPORT: ::c_int = 43;
-pub const ESOCKTNOSUPPORT: ::c_int = 44;
-pub const EOPNOTSUPP: ::c_int = 45;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 46;
-pub const EAFNOSUPPORT: ::c_int = 47;
-pub const EADDRINUSE: ::c_int = 48;
-pub const EADDRNOTAVAIL: ::c_int = 49;
-pub const ENETDOWN: ::c_int = 50;
-pub const ENETUNREACH: ::c_int = 51;
-pub const ENETRESET: ::c_int = 52;
-pub const ECONNABORTED: ::c_int = 53;
-pub const ECONNRESET: ::c_int = 54;
-pub const ENOBUFS: ::c_int = 55;
-pub const EISCONN: ::c_int = 56;
-pub const ENOTCONN: ::c_int = 57;
-pub const ESHUTDOWN: ::c_int = 58;
-pub const ETOOMANYREFS: ::c_int = 59;
-pub const ETIMEDOUT: ::c_int = 60;
-pub const ECONNREFUSED: ::c_int = 61;
-pub const ELOOP: ::c_int = 62;
-pub const ENAMETOOLONG: ::c_int = 63;
-pub const EHOSTDOWN: ::c_int = 64;
-pub const EHOSTUNREACH: ::c_int = 65;
-pub const ENOTEMPTY: ::c_int = 66;
-pub const EPROCLIM: ::c_int = 67;
-pub const EUSERS: ::c_int = 68;
-pub const EDQUOT: ::c_int = 69;
-pub const ESTALE: ::c_int = 70;
-pub const EREMOTE: ::c_int = 71;
-pub const EBADRPC: ::c_int = 72;
-pub const ERPCMISMATCH: ::c_int = 73;
-pub const EPROGUNAVAIL: ::c_int = 74;
-pub const EPROGMISMATCH: ::c_int = 75;
-pub const EPROCUNAVAIL: ::c_int = 76;
-pub const ENOLCK: ::c_int = 77;
-pub const ENOSYS: ::c_int = 78;
-pub const EFTYPE: ::c_int = 79;
-pub const EAUTH: ::c_int = 80;
-pub const ENEEDAUTH: ::c_int = 81;
-pub const EIDRM: ::c_int = 82;
-pub const ENOMSG: ::c_int = 83;
-pub const EOVERFLOW: ::c_int = 84;
-pub const ECANCELED: ::c_int = 85;
-pub const EILSEQ: ::c_int = 86;
-pub const ENOATTR: ::c_int = 87;
-pub const EDOOFUS: ::c_int = 88;
-pub const EBADMSG: ::c_int = 89;
-pub const EMULTIHOP: ::c_int = 90;
-pub const ENOLINK: ::c_int = 91;
-pub const EPROTO: ::c_int = 92;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-
-pub const AT_EACCESS: ::c_int = 0x100;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400;
-pub const AT_REMOVEDIR: ::c_int = 0x800;
-
-pub const SIGTRAP: ::c_int = 5;
-
-pub const GLOB_APPEND  : ::c_int = 0x0001;
-pub const GLOB_DOOFFS  : ::c_int = 0x0002;
-pub const GLOB_ERR     : ::c_int = 0x0004;
-pub const GLOB_MARK    : ::c_int = 0x0008;
-pub const GLOB_NOCHECK : ::c_int = 0x0010;
-pub const GLOB_NOSORT  : ::c_int = 0x0020;
-pub const GLOB_NOESCAPE: ::c_int = 0x2000;
-
-pub const GLOB_NOSPACE : ::c_int = -1;
-pub const GLOB_ABORTED : ::c_int = -2;
-pub const GLOB_NOMATCH : ::c_int = -3;
-
-pub const POSIX_MADV_NORMAL: ::c_int = 0;
-pub const POSIX_MADV_RANDOM: ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_MADV_WILLNEED: ::c_int = 3;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-
-pub const _SC_IOV_MAX: ::c_int = 56;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 70;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 71;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 73;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 75;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 58;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 82;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 83;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 85;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 86;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 87;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 88;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 89;
-pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 90;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 91;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 93;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 94;
-pub const _SC_THREADS: ::c_int = 96;
-pub const _SC_TTY_NAME_MAX: ::c_int = 101;
-pub const _SC_ATEXIT_MAX: ::c_int = 107;
-pub const _SC_XOPEN_CRYPT: ::c_int = 108;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 109;
-pub const _SC_XOPEN_LEGACY: ::c_int = 110;
-pub const _SC_XOPEN_REALTIME: ::c_int = 111;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 112;
-pub const _SC_XOPEN_SHM: ::c_int = 113;
-pub const _SC_XOPEN_UNIX: ::c_int = 115;
-pub const _SC_XOPEN_VERSION: ::c_int = 116;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 117;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 1;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_MEMLOCK: ::c_int = 6;
-pub const RLIMIT_NPROC: ::c_int = 7;
-pub const RLIMIT_NOFILE: ::c_int = 8;
-pub const RLIMIT_SBSIZE: ::c_int = 9;
-pub const RLIMIT_VMEM: ::c_int = 10;
-pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM;
-pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const MADV_NORMAL: ::c_int = 0;
-pub const MADV_RANDOM: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_WILLNEED: ::c_int = 3;
-pub const MADV_DONTNEED: ::c_int = 4;
-pub const MADV_FREE: ::c_int = 5;
-pub const MADV_NOSYNC: ::c_int = 6;
-pub const MADV_AUTOSYNC: ::c_int = 7;
-pub const MADV_NOCORE: ::c_int = 8;
-pub const MADV_CORE: ::c_int = 9;
-
-pub const MINCORE_INCORE: ::c_int =  0x1;
-pub const MINCORE_REFERENCED: ::c_int = 0x2;
-pub const MINCORE_MODIFIED: ::c_int = 0x4;
-pub const MINCORE_REFERENCED_OTHER: ::c_int = 0x8;
-pub const MINCORE_MODIFIED_OTHER: ::c_int = 0x10;
-pub const MINCORE_SUPER: ::c_int = 0x20;
-
-pub const AF_UNSPEC: ::c_int = 0;
-pub const AF_LOCAL: ::c_int = 1;
-pub const AF_UNIX: ::c_int = AF_LOCAL;
-pub const AF_INET: ::c_int = 2;
-pub const AF_IMPLINK: ::c_int = 3;
-pub const AF_PUP: ::c_int = 4;
-pub const AF_CHAOS: ::c_int = 5;
-pub const AF_NETBIOS: ::c_int = 6;
-pub const AF_ISO: ::c_int = 7;
-pub const AF_OSI: ::c_int = AF_ISO;
-pub const AF_ECMA: ::c_int = 8;
-pub const AF_DATAKIT: ::c_int = 9;
-pub const AF_CCITT: ::c_int = 10;
-pub const AF_SNA: ::c_int = 11;
-pub const AF_DECnet: ::c_int = 12;
-pub const AF_DLI: ::c_int = 13;
-pub const AF_LAT: ::c_int = 14;
-pub const AF_HYLINK: ::c_int = 15;
-pub const AF_APPLETALK: ::c_int = 16;
-pub const AF_ROUTE: ::c_int = 17;
-pub const AF_LINK: ::c_int = 18;
-pub const pseudo_AF_XTP: ::c_int = 19;
-pub const AF_COIP: ::c_int = 20;
-pub const AF_CNT: ::c_int = 21;
-pub const pseudo_AF_RTIP: ::c_int = 22;
-pub const AF_IPX: ::c_int = 23;
-pub const AF_SIP: ::c_int = 24;
-pub const pseudo_AF_PIP: ::c_int = 25;
-pub const AF_ISDN: ::c_int = 26;
-pub const AF_E164: ::c_int = AF_ISDN;
-pub const pseudo_AF_KEY: ::c_int = 27;
-pub const AF_INET6: ::c_int = 28;
-pub const AF_NATM: ::c_int = 29;
-pub const AF_ATM: ::c_int = 30;
-pub const pseudo_AF_HDRCMPLT: ::c_int = 31;
-pub const AF_NETGRAPH: ::c_int = 32;
-
-pub const PF_UNSPEC: ::c_int = AF_UNSPEC;
-pub const PF_LOCAL: ::c_int = AF_LOCAL;
-pub const PF_UNIX: ::c_int = PF_LOCAL;
-pub const PF_INET: ::c_int = AF_INET;
-pub const PF_IMPLINK: ::c_int = AF_IMPLINK;
-pub const PF_PUP: ::c_int = AF_PUP;
-pub const PF_CHAOS: ::c_int = AF_CHAOS;
-pub const PF_NETBIOS: ::c_int = AF_NETBIOS;
-pub const PF_ISO: ::c_int = AF_ISO;
-pub const PF_OSI: ::c_int = AF_ISO;
-pub const PF_ECMA: ::c_int = AF_ECMA;
-pub const PF_DATAKIT: ::c_int = AF_DATAKIT;
-pub const PF_CCITT: ::c_int = AF_CCITT;
-pub const PF_SNA: ::c_int = AF_SNA;
-pub const PF_DECnet: ::c_int = AF_DECnet;
-pub const PF_DLI: ::c_int = AF_DLI;
-pub const PF_LAT: ::c_int = AF_LAT;
-pub const PF_HYLINK: ::c_int = AF_HYLINK;
-pub const PF_APPLETALK: ::c_int = AF_APPLETALK;
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_LINK: ::c_int = AF_LINK;
-pub const PF_XTP: ::c_int = pseudo_AF_XTP;
-pub const PF_COIP: ::c_int = AF_COIP;
-pub const PF_CNT: ::c_int = AF_CNT;
-pub const PF_SIP: ::c_int = AF_SIP;
-pub const PF_IPX: ::c_int = AF_IPX;
-pub const PF_RTIP: ::c_int = pseudo_AF_RTIP;
-pub const PF_PIP: ::c_int = pseudo_AF_PIP;
-pub const PF_ISDN: ::c_int = AF_ISDN;
-pub const PF_KEY: ::c_int = pseudo_AF_KEY;
-pub const PF_INET6: ::c_int = AF_INET6;
-pub const PF_NATM: ::c_int = AF_NATM;
-pub const PF_ATM: ::c_int = AF_ATM;
-pub const PF_NETGRAPH: ::c_int = AF_NETGRAPH;
-
-pub const SOMAXCONN: ::c_int = 128;
-
-pub const MSG_OOB: ::c_int = 0x00000001;
-pub const MSG_PEEK: ::c_int = 0x00000002;
-pub const MSG_DONTROUTE: ::c_int = 0x00000004;
-pub const MSG_EOR: ::c_int =  0x00000008;
-pub const MSG_TRUNC: ::c_int = 0x00000010;
-pub const MSG_CTRUNC: ::c_int = 0x00000020;
-pub const MSG_WAITALL: ::c_int = 0x00000040;
-pub const MSG_DONTWAIT: ::c_int = 0x00000080;
-pub const MSG_EOF: ::c_int = 0x00000100;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_RAW: ::c_int = 3;
-pub const SOCK_RDM: ::c_int = 4;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-pub const SOCK_CLOEXEC: ::c_int = 0x10000000;
-pub const SOCK_NONBLOCK: ::c_int = 0x20000000;
-pub const SOCK_MAXADDRLEN: ::c_int = 255;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 10;
-pub const IP_MULTICAST_LOOP: ::c_int = 11;
-pub const IP_TTL: ::c_int = 4;
-pub const IP_HDRINCL: ::c_int = 2;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 12;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 13;
-pub const IPV6_JOIN_GROUP: ::c_int = 12;
-pub const IPV6_LEAVE_GROUP: ::c_int = 13;
-
-pub const TCP_NODELAY: ::c_int = 1;
-pub const TCP_KEEPIDLE: ::c_int = 256;
-pub const SOL_SOCKET: ::c_int = 0xffff;
-pub const SO_DEBUG: ::c_int = 0x01;
-pub const SO_ACCEPTCONN: ::c_int = 0x0002;
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_USELOOPBACK: ::c_int = 0x0040;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_TIMESTAMP: ::c_int = 0x0400;
-pub const SO_NOSIGPIPE: ::c_int = 0x0800;
-pub const SO_ACCEPTFILTER: ::c_int = 0x1000;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_TYPE: ::c_int = 0x1008;
-
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const O_SYNC: ::c_int = 128;
-pub const O_NONBLOCK: ::c_int = 4;
-
-pub const MAP_COPY: ::c_int = 0x0002;
-pub const MAP_RENAME: ::c_int = 0x0020;
-pub const MAP_NORESERVE: ::c_int = 0x0040;
-pub const MAP_HASSEMAPHORE: ::c_int = 0x0200;
-pub const MAP_STACK: ::c_int = 0x0400;
-pub const MAP_NOSYNC: ::c_int = 0x0800;
-pub const MAP_NOCORE: ::c_int = 0x020000;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-pub const _SC_ARG_MAX: ::c_int = 1;
-pub const _SC_CHILD_MAX: ::c_int = 2;
-pub const _SC_CLK_TCK: ::c_int = 3;
-pub const _SC_NGROUPS_MAX: ::c_int = 4;
-pub const _SC_OPEN_MAX: ::c_int = 5;
-pub const _SC_JOB_CONTROL: ::c_int = 6;
-pub const _SC_SAVED_IDS: ::c_int = 7;
-pub const _SC_VERSION: ::c_int = 8;
-pub const _SC_BC_BASE_MAX: ::c_int = 9;
-pub const _SC_BC_DIM_MAX: ::c_int = 10;
-pub const _SC_BC_SCALE_MAX: ::c_int = 11;
-pub const _SC_BC_STRING_MAX: ::c_int = 12;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 13;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 14;
-pub const _SC_LINE_MAX: ::c_int = 15;
-pub const _SC_RE_DUP_MAX: ::c_int = 16;
-pub const _SC_2_VERSION: ::c_int = 17;
-pub const _SC_2_C_BIND: ::c_int = 18;
-pub const _SC_2_C_DEV: ::c_int = 19;
-pub const _SC_2_CHAR_TERM: ::c_int = 20;
-pub const _SC_2_FORT_DEV: ::c_int = 21;
-pub const _SC_2_FORT_RUN: ::c_int = 22;
-pub const _SC_2_LOCALEDEF: ::c_int = 23;
-pub const _SC_2_SW_DEV: ::c_int = 24;
-pub const _SC_2_UPE: ::c_int = 25;
-pub const _SC_STREAM_MAX: ::c_int = 26;
-pub const _SC_TZNAME_MAX: ::c_int = 27;
-pub const _SC_ASYNCHRONOUS_IO: ::c_int = 28;
-pub const _SC_MAPPED_FILES: ::c_int = 29;
-pub const _SC_MEMLOCK: ::c_int = 30;
-pub const _SC_MEMLOCK_RANGE: ::c_int = 31;
-pub const _SC_MEMORY_PROTECTION: ::c_int = 32;
-pub const _SC_MESSAGE_PASSING: ::c_int = 33;
-pub const _SC_PRIORITIZED_IO: ::c_int = 34;
-pub const _SC_PRIORITY_SCHEDULING: ::c_int = 35;
-pub const _SC_REALTIME_SIGNALS: ::c_int = 36;
-pub const _SC_SEMAPHORES: ::c_int = 37;
-pub const _SC_FSYNC: ::c_int = 38;
-pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 39;
-pub const _SC_SYNCHRONIZED_IO: ::c_int = 40;
-pub const _SC_TIMERS: ::c_int = 41;
-pub const _SC_AIO_LISTIO_MAX: ::c_int = 42;
-pub const _SC_AIO_MAX: ::c_int = 43;
-pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 44;
-pub const _SC_DELAYTIMER_MAX: ::c_int = 45;
-pub const _SC_MQ_OPEN_MAX: ::c_int = 46;
-pub const _SC_PAGESIZE: ::c_int = 47;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_RTSIG_MAX: ::c_int = 48;
-pub const _SC_SEM_NSEMS_MAX: ::c_int = 49;
-pub const _SC_SEM_VALUE_MAX: ::c_int = 50;
-pub const _SC_SIGQUEUE_MAX: ::c_int = 51;
-pub const _SC_TIMER_MAX: ::c_int = 52;
-pub const _SC_HOST_NAME_MAX: ::c_int = 72;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _;
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _;
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2;
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_ERRORCHECK;
-
-pub const SCHED_FIFO: ::c_int = 1;
-pub const SCHED_OTHER: ::c_int = 2;
-pub const SCHED_RR: ::c_int = 3;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const ST_NOSUID: ::c_ulong = 2;
-
-pub const NI_MAXHOST: ::size_t = 1025;
-
-pub const RTLD_LOCAL: ::c_int = 0;
-pub const RTLD_NODELETE: ::c_int = 0x1000;
-pub const RTLD_NOLOAD: ::c_int = 0x2000;
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-
-pub const LOG_NTP: ::c_int = 12 << 3;
-pub const LOG_SECURITY: ::c_int = 13 << 3;
-pub const LOG_CONSOLE: ::c_int = 14 << 3;
-pub const LOG_NFACILITIES: ::c_int = 24;
-
-pub const TIOCEXCL: ::c_uint = 0x2000740d;
-pub const TIOCNXCL: ::c_uint = 0x2000740e;
-pub const TIOCFLUSH: ::c_ulong = 0x80047410;
-pub const TIOCGETA: ::c_uint = 0x402c7413;
-pub const TIOCSETA: ::c_ulong = 0x802c7414;
-pub const TIOCSETAW: ::c_ulong = 0x802c7415;
-pub const TIOCSETAF: ::c_ulong = 0x802c7416;
-pub const TIOCGETD: ::c_uint = 0x4004741a;
-pub const TIOCSETD: ::c_ulong = 0x8004741b;
-pub const TIOCGDRAINWAIT: ::c_uint = 0x40047456;
-pub const TIOCSDRAINWAIT: ::c_ulong = 0x80047457;
-pub const TIOCTIMESTAMP: ::c_uint = 0x40107459;
-pub const TIOCMGDTRWAIT: ::c_uint = 0x4004745a;
-pub const TIOCMSDTRWAIT: ::c_ulong = 0x8004745b;
-pub const TIOCDRAIN: ::c_uint = 0x2000745e;
-pub const TIOCEXT: ::c_ulong = 0x80047460;
-pub const TIOCSCTTY: ::c_uint = 0x20007461;
-pub const TIOCCONS: ::c_ulong = 0x80047462;
-pub const TIOCGSID: ::c_uint = 0x40047463;
-pub const TIOCSTAT: ::c_uint = 0x20007465;
-pub const TIOCUCNTL: ::c_ulong = 0x80047466;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const TIOCGWINSZ: ::c_uint = 0x40087468;
-pub const TIOCMGET: ::c_uint = 0x4004746a;
-pub const TIOCM_LE: ::c_int = 0x1;
-pub const TIOCM_DTR: ::c_int = 0x2;
-pub const TIOCM_RTS: ::c_int = 0x4;
-pub const TIOCM_ST: ::c_int = 0x8;
-pub const TIOCM_SR: ::c_int = 0x10;
-pub const TIOCM_CTS: ::c_int = 0x20;
-pub const TIOCM_RI: ::c_int = 0x80;
-pub const TIOCM_DSR: ::c_int = 0x100;
-pub const TIOCM_CD: ::c_int = 0x40;
-pub const TIOCM_CAR: ::c_int = 0x40;
-pub const TIOCM_RNG: ::c_int = 0x80;
-pub const TIOCMBIC: ::c_ulong = 0x8004746b;
-pub const TIOCMBIS: ::c_ulong = 0x8004746c;
-pub const TIOCMSET: ::c_ulong = 0x8004746d;
-pub const TIOCSTART: ::c_uint = 0x2000746e;
-pub const TIOCSTOP: ::c_uint = 0x2000746f;
-pub const TIOCPKT: ::c_ulong = 0x80047470;
-pub const TIOCPKT_DATA: ::c_int = 0x0;
-pub const TIOCPKT_FLUSHREAD: ::c_int = 0x1;
-pub const TIOCPKT_FLUSHWRITE: ::c_int = 0x2;
-pub const TIOCPKT_STOP: ::c_int = 0x4;
-pub const TIOCPKT_START: ::c_int = 0x8;
-pub const TIOCPKT_NOSTOP: ::c_int = 0x10;
-pub const TIOCPKT_DOSTOP: ::c_int = 0x20;
-pub const TIOCPKT_IOCTL: ::c_int = 0x40;
-pub const TIOCNOTTY: ::c_uint = 0x20007471;
-pub const TIOCSTI: ::c_ulong = 0x80017472;
-pub const TIOCOUTQ: ::c_uint = 0x40047473;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCGPGRP: ::c_uint = 0x40047477;
-pub const TIOCCDTR: ::c_uint = 0x20007478;
-pub const TIOCSDTR: ::c_uint = 0x20007479;
-pub const TIOCCBRK: ::c_uint = 0x2000747a;
-pub const TIOCSBRK: ::c_uint = 0x2000747b;
-pub const TTYDISC: ::c_int = 0x0;
-pub const SLIPDISC: ::c_int = 0x4;
-pub const PPPDISC: ::c_int = 0x5;
-pub const NETGRAPHDISC: ::c_int = 0x6;
-
-pub const B0: speed_t = 0;
-pub const B50: speed_t = 50;
-pub const B75: speed_t = 75;
-pub const B110: speed_t = 110;
-pub const B134: speed_t = 134;
-pub const B150: speed_t = 150;
-pub const B200: speed_t = 200;
-pub const B300: speed_t = 300;
-pub const B600: speed_t = 600;
-pub const B1200: speed_t = 1200;
-pub const B1800: speed_t = 1800;
-pub const B2400: speed_t = 2400;
-pub const B4800: speed_t = 4800;
-pub const B9600: speed_t = 9600;
-pub const B19200: speed_t = 19200;
-pub const B38400: speed_t = 38400;
-pub const B7200: speed_t = 7200;
-pub const B14400: speed_t = 14400;
-pub const B28800: speed_t = 28800;
-pub const B57600: speed_t = 57600;
-pub const B76800: speed_t = 76800;
-pub const B115200: speed_t = 115200;
-pub const B230400: speed_t = 230400;
-pub const EXTA: speed_t = 19200;
-pub const EXTB: speed_t = 38400;
-
-pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t;
-
-pub const CRTSCTS: ::tcflag_t = 0x00030000;
-
-pub const AT_FDCWD: ::c_int = -100;
-
-f! {
-    pub fn WIFCONTINUED(status: ::c_int) -> bool {
-        status == 0x13
-    }
-
-    pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
-        status >> 8
-    }
-
-    pub fn WIFSIGNALED(status: ::c_int) -> bool {
-        (status & 0o177) != 0o177 && (status & 0o177) != 0
-    }
-
-    pub fn WIFSTOPPED(status: ::c_int) -> bool {
-        (status & 0o177) == 0o177
-    }
-}
-
-extern {
-    pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
-    pub fn endutxent();
-    pub fn getutxent() -> *mut utmpx;
-    pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
-    pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn setutxent();
-}
-
-#[link(name = "util")]
-extern {
-    pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
-    pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
-    pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int,
-                       timeout: *const ::timespec) -> ::c_int;
-    pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb,
-                      nitems: ::c_int, sevp: *mut sigevent) -> ::c_int;
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::size_t,
-                       serv: *mut ::c_char,
-                       servlen: ::size_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn kevent(kq: ::c_int,
-                  changelist: *const ::kevent,
-                  nchanges: ::c_int,
-                  eventlist: *mut ::kevent,
-                  nevents: ::c_int,
-                  timeout: *const ::timespec) -> ::c_int;
-    pub fn mincore(addr: *const ::c_void, len: ::size_t,
-                   vec: *mut ::c_char) -> ::c_int;
-    pub fn sysctlnametomib(name: *const ::c_char,
-                           mibp: *mut ::c_int,
-                           sizep: *mut ::size_t)
-                           -> ::c_int;
-    pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t)
-                    -> ::c_int;
-    pub fn sysctl(name: *const ::c_int,
-                  namelen: ::c_uint,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *const ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn sysctlbyname(name: *const ::c_char,
-                        oldp: *mut ::c_void,
-                        oldlenp: *mut ::size_t,
-                        newp: *const ::c_void,
-                        newlen: ::size_t)
-                        -> ::c_int;
-    pub fn sched_setscheduler(pid: ::pid_t,
-                              policy: ::c_int,
-                              param: *const sched_param) -> ::c_int;
-    pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int;
-    pub fn memrchr(cx: *const ::c_void,
-                   c: ::c_int,
-                   n: ::size_t) -> *mut ::c_void;
-    pub fn sendfile(fd: ::c_int,
-                    s: ::c_int,
-                    offset: ::off_t,
-                    nbytes: ::size_t,
-                    hdtr: *mut ::sf_hdtr,
-                    sbytes: *mut ::off_t,
-                    flags: ::c_int) -> ::c_int;
-    pub fn sigtimedwait(set: *const sigset_t,
-                        info: *mut siginfo_t,
-                        timeout: *const ::timespec) -> ::c_int;
-    pub fn sigwaitinfo(set: *const sigset_t,
-                       info: *mut siginfo_t) -> ::c_int;
-    pub fn openpty(amaster: *mut ::c_int,
-                   aslave: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::c_int;
-    pub fn forkpty(amaster: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::pid_t;
-    pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char;
-    pub fn accept4(s: ::c_int, addr: *mut ::sockaddr,
-                   addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int;
-    pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char);
-    pub fn pthread_attr_get_np(tid: ::pthread_t,
-                               attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
-                                     guardsize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
-                                 stackaddr: *mut *mut ::c_void,
-                                 stacksize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t,
-                                       pshared: ::c_int) -> ::c_int;
-    pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t,
-                                       pshared: *mut ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t,
-                                        pshared: ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t,
-                                        pshared: *mut ::c_int) -> ::c_int;
-    pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-
-    pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
-                  mode: ::mode_t, dev: dev_t) -> ::c_int;
-    pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t) -> ::c_int;
-    pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t,
-                                     clock_id: *mut clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::c_int) -> ::c_int;
-    pub fn sem_timedwait(sem: *mut sem_t,
-                         abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int;
-    pub fn ppoll(fds: *mut ::pollfd,
-                 nfds: ::nfds_t,
-                 timeout: *const ::timespec,
-                 sigmask: *const sigset_t) -> ::c_int;
-    pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_os = "freebsd")] {
-        mod freebsd;
-        pub use self::freebsd::*;
-    } else if #[cfg(target_os = "dragonfly")] {
-        mod dragonfly;
-        pub use self::dragonfly::*;
-    } else {
-        // ...
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/mod.rs
+++ /dev/null
@@ -1,453 +0,0 @@
-use dox::{mem, Option};
-
-pub type c_char = i8;
-pub type wchar_t = i32;
-pub type off_t = i64;
-pub type useconds_t = u32;
-pub type blkcnt_t = i64;
-pub type socklen_t = u32;
-pub type sa_family_t = u8;
-pub type pthread_t = ::uintptr_t;
-pub type nfds_t = ::c_uint;
-
-s! {
-    pub struct sockaddr {
-        pub sa_len: u8,
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_len: u8,
-        pub sin6_family: sa_family_t,
-        pub sin6_port: ::in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-
-    pub struct sockaddr_un {
-        pub sun_len: u8,
-        pub sun_family: sa_family_t,
-        pub sun_path: [c_char; 104]
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_change: ::time_t,
-        pub pw_class: *mut ::c_char,
-        pub pw_gecos: *mut ::c_char,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-        pub pw_expire: ::time_t,
-
-        #[cfg(not(any(target_os = "macos",
-                      target_os = "ios",
-                      target_os = "netbsd",
-                      target_os = "openbsd")))]
-        pub pw_fields: ::c_int,
-    }
-
-    pub struct ifaddrs {
-        pub ifa_next: *mut ifaddrs,
-        pub ifa_name: *mut ::c_char,
-        pub ifa_flags: ::c_uint,
-        pub ifa_addr: *mut ::sockaddr,
-        pub ifa_netmask: *mut ::sockaddr,
-        pub ifa_dstaddr: *mut ::sockaddr,
-        pub ifa_data: *mut ::c_void
-    }
-
-    pub struct fd_set {
-        #[cfg(all(target_pointer_width = "64",
-                  any(target_os = "freebsd", target_os = "dragonfly")))]
-        fds_bits: [i64; FD_SETSIZE / 64],
-        #[cfg(not(all(target_pointer_width = "64",
-                      any(target_os = "freebsd", target_os = "dragonfly"))))]
-        fds_bits: [i32; FD_SETSIZE / 32],
-    }
-
-    pub struct tm {
-        pub tm_sec: ::c_int,
-        pub tm_min: ::c_int,
-        pub tm_hour: ::c_int,
-        pub tm_mday: ::c_int,
-        pub tm_mon: ::c_int,
-        pub tm_year: ::c_int,
-        pub tm_wday: ::c_int,
-        pub tm_yday: ::c_int,
-        pub tm_isdst: ::c_int,
-        pub tm_gmtoff: ::c_long,
-        pub tm_zone: *mut ::c_char,
-    }
-
-    pub struct utsname {
-        #[cfg(not(target_os = "dragonfly"))]
-        pub sysname: [::c_char; 256],
-        #[cfg(target_os = "dragonfly")]
-        pub sysname: [::c_char; 32],
-        #[cfg(not(target_os = "dragonfly"))]
-        pub nodename: [::c_char; 256],
-        #[cfg(target_os = "dragonfly")]
-        pub nodename: [::c_char; 32],
-        #[cfg(not(target_os = "dragonfly"))]
-        pub release: [::c_char; 256],
-        #[cfg(target_os = "dragonfly")]
-        pub release: [::c_char; 32],
-        #[cfg(not(target_os = "dragonfly"))]
-        pub version: [::c_char; 256],
-        #[cfg(target_os = "dragonfly")]
-        pub version: [::c_char; 32],
-        #[cfg(not(target_os = "dragonfly"))]
-        pub machine: [::c_char; 256],
-        #[cfg(target_os = "dragonfly")]
-        pub machine: [::c_char; 32],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::socklen_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::socklen_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct fsid_t {
-        __fsid_val: [::int32_t; 2],
-    }
-
-    pub struct if_nameindex {
-        pub if_index: ::c_uint,
-        pub if_name: *mut ::c_char,
-    }
-}
-
-pub const LC_ALL: ::c_int = 0;
-pub const LC_COLLATE: ::c_int = 1;
-pub const LC_CTYPE: ::c_int = 2;
-pub const LC_MONETARY: ::c_int = 3;
-pub const LC_NUMERIC: ::c_int = 4;
-pub const LC_TIME: ::c_int = 5;
-pub const LC_MESSAGES: ::c_int = 6;
-
-pub const FIOCLEX: ::c_ulong = 0x20006601;
-pub const FIONBIO: ::c_ulong = 0x8004667e;
-
-pub const PATH_MAX: ::c_int = 1024;
-
-pub const SA_ONSTACK: ::c_int = 0x0001;
-pub const SA_SIGINFO: ::c_int = 0x0040;
-pub const SA_RESTART: ::c_int = 0x0002;
-pub const SA_RESETHAND: ::c_int = 0x0004;
-pub const SA_NOCLDSTOP: ::c_int = 0x0008;
-pub const SA_NODEFER: ::c_int = 0x0010;
-pub const SA_NOCLDWAIT: ::c_int = 0x0020;
-
-pub const SS_ONSTACK: ::c_int = 1;
-pub const SS_DISABLE: ::c_int = 4;
-
-pub const SIGCHLD: ::c_int = 20;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGUSR1: ::c_int = 30;
-pub const SIGUSR2: ::c_int = 31;
-pub const SIGCONT: ::c_int = 19;
-pub const SIGSTOP: ::c_int = 17;
-pub const SIGTSTP: ::c_int = 18;
-pub const SIGURG: ::c_int = 16;
-pub const SIGIO: ::c_int = 23;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGINFO: ::c_int = 29;
-
-pub const SIG_SETMASK: ::c_int = 3;
-pub const SIG_BLOCK: ::c_int = 0x1;
-pub const SIG_UNBLOCK: ::c_int = 0x2;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 11;
-pub const IPV6_V6ONLY: ::c_int = 27;
-
-pub const ST_RDONLY: ::c_ulong = 1;
-
-pub const NCCS: usize = 20;
-
-pub const O_ASYNC: ::c_int = 0x40;
-pub const O_FSYNC: ::c_int = 0x80;
-pub const O_NDELAY: ::c_int = 0x4;
-pub const O_NOFOLLOW: ::c_int = 0x100;
-
-pub const F_GETOWN: ::c_int = 5;
-pub const F_SETOWN: ::c_int = 6;
-
-pub const MNT_FORCE: ::c_int = 0x80000;
-
-pub const Q_SYNC: ::c_int = 0x600;
-pub const Q_QUOTAON: ::c_int = 0x100;
-pub const Q_QUOTAOFF: ::c_int = 0x200;
-
-pub const TCIOFF: ::c_int = 3;
-pub const TCION: ::c_int = 4;
-pub const TCOOFF: ::c_int = 1;
-pub const TCOON: ::c_int = 2;
-pub const TCIFLUSH: ::c_int = 1;
-pub const TCOFLUSH: ::c_int = 2;
-pub const TCIOFLUSH: ::c_int = 3;
-pub const TCSANOW: ::c_int = 0;
-pub const TCSADRAIN: ::c_int = 1;
-pub const TCSAFLUSH: ::c_int = 2;
-pub const VEOF: usize = 0;
-pub const VEOL: usize = 1;
-pub const VEOL2: usize = 2;
-pub const VERASE: usize = 3;
-pub const VWERASE: usize = 4;
-pub const VKILL: usize = 5;
-pub const VREPRINT: usize = 6;
-pub const VINTR: usize = 8;
-pub const VQUIT: usize = 9;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 12;
-pub const VSTOP: usize = 13;
-pub const VLNEXT: usize = 14;
-pub const VDISCARD: usize = 15;
-pub const VMIN: usize = 16;
-pub const VTIME: usize = 17;
-pub const IGNBRK: ::tcflag_t = 0x00000001;
-pub const BRKINT: ::tcflag_t = 0x00000002;
-pub const IGNPAR: ::tcflag_t = 0x00000004;
-pub const PARMRK: ::tcflag_t = 0x00000008;
-pub const INPCK: ::tcflag_t = 0x00000010;
-pub const ISTRIP: ::tcflag_t = 0x00000020;
-pub const INLCR: ::tcflag_t = 0x00000040;
-pub const IGNCR: ::tcflag_t = 0x00000080;
-pub const ICRNL: ::tcflag_t = 0x00000100;
-pub const IXON: ::tcflag_t = 0x00000200;
-pub const IXOFF: ::tcflag_t = 0x00000400;
-pub const IXANY: ::tcflag_t = 0x00000800;
-pub const IMAXBEL: ::tcflag_t = 0x00002000;
-pub const OPOST: ::tcflag_t = 0x1;
-pub const ONLCR: ::tcflag_t = 0x2;
-pub const OXTABS: ::tcflag_t = 0x4;
-pub const ONOEOT: ::tcflag_t = 0x8;
-pub const CSIZE: ::tcflag_t = 0x00000300;
-pub const CS5: ::tcflag_t = 0x00000000;
-pub const CS6: ::tcflag_t = 0x00000100;
-pub const CS7: ::tcflag_t = 0x00000200;
-pub const CS8: ::tcflag_t = 0x00000300;
-pub const CSTOPB: ::tcflag_t = 0x00000400;
-pub const CREAD: ::tcflag_t = 0x00000800;
-pub const PARENB: ::tcflag_t = 0x00001000;
-pub const PARODD: ::tcflag_t = 0x00002000;
-pub const HUPCL: ::tcflag_t = 0x00004000;
-pub const CLOCAL: ::tcflag_t = 0x00008000;
-pub const ECHOKE: ::tcflag_t = 0x00000001;
-pub const ECHOE: ::tcflag_t = 0x00000002;
-pub const ECHOK: ::tcflag_t = 0x00000004;
-pub const ECHO: ::tcflag_t = 0x00000008;
-pub const ECHONL: ::tcflag_t = 0x00000010;
-pub const ECHOPRT: ::tcflag_t = 0x00000020;
-pub const ECHOCTL: ::tcflag_t = 0x00000040;
-pub const ISIG: ::tcflag_t = 0x00000080;
-pub const ICANON: ::tcflag_t = 0x00000100;
-pub const IEXTEN: ::tcflag_t = 0x00000400;
-pub const EXTPROC: ::tcflag_t = 0x00000800;
-pub const TOSTOP: ::tcflag_t = 0x00400000;
-pub const FLUSHO: ::tcflag_t = 0x00800000;
-pub const PENDIN: ::tcflag_t = 0x20000000;
-pub const NOFLSH: ::tcflag_t = 0x80000000;
-
-pub const WNOHANG: ::c_int = 0x00000001;
-pub const WUNTRACED: ::c_int = 0x00000002;
-
-pub const RTLD_NOW: ::c_int = 0x2;
-pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void;
-pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void;
-pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void;
-
-pub const LOG_CRON: ::c_int = 9 << 3;
-pub const LOG_AUTHPRIV: ::c_int = 10 << 3;
-pub const LOG_FTP: ::c_int = 11 << 3;
-pub const LOG_PERROR: ::c_int = 0x20;
-
-pub const PIPE_BUF: usize = 512;
-
-f! {
-    pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        (*set).fds_bits[fd / bits] &= !(1 << (fd % bits));
-        return
-    }
-
-    pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0
-    }
-
-    pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        (*set).fds_bits[fd / bits] |= 1 << (fd % bits);
-        return
-    }
-
-    pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn WTERMSIG(status: ::c_int) -> ::c_int {
-        status & 0o177
-    }
-
-    pub fn WIFEXITED(status: ::c_int) -> bool {
-        (status & 0o177) == 0
-    }
-
-    pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
-        status >> 8
-    }
-
-    pub fn WCOREDUMP(status: ::c_int) -> bool {
-        (status & 0o200) != 0
-    }
-}
-
-extern {
-    pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int;
-    pub fn freeifaddrs(ifa: *mut ::ifaddrs);
-    pub fn setgroups(ngroups: ::c_int,
-                     ptr: *const ::gid_t) -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-    pub fn kqueue() -> ::c_int;
-    pub fn unmount(target: *const ::c_char, arg: ::c_int) -> ::c_int;
-    pub fn syscall(num: ::c_int, ...) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam_r50")]
-    pub fn getpwnam_r(name: *const ::c_char,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid_r50")]
-    pub fn getpwuid_r(uid: ::uid_t,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__getpwent50")]
-    pub fn getpwent() -> *mut passwd;
-    pub fn setpwent();
-    pub fn getprogname() -> *const ::c_char;
-    pub fn setprogname(name: *const ::c_char);
-    pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int;
-    pub fn if_nameindex() -> *mut if_nameindex;
-    pub fn if_freenameindex(ptr: *mut if_nameindex);
-
-    pub fn getpeereid(socket: ::c_int,
-                      euid: *mut ::uid_t,
-                      egid: *mut ::gid_t) -> ::c_int;
-
-    #[cfg_attr(target_os = "macos", link_name = "glob$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__glob30")]
-    pub fn glob(pattern: *const ::c_char,
-                flags: ::c_int,
-                errfunc: Option<extern fn(epath: *const ::c_char,
-                                          errno: ::c_int) -> ::c_int>,
-                pglob: *mut ::glob_t) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__globfree30")]
-    pub fn globfree(pglob: *mut ::glob_t);
-
-    pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                         -> ::c_int;
-
-    pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "seekdir$INODE64")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "seekdir$INODE64$UNIX2003")]
-    pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long);
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "telldir$INODE64")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "telldir$INODE64$UNIX2003")]
-    pub fn telldir(dirp: *mut ::DIR) -> ::c_long;
-    pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                  -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "msync$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__msync13")]
-    pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "recvfrom$UNIX2003")]
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *mut ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int;
-    pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int;
-    pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "bind$UNIX2003")]
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::socklen_t) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "writev$UNIX2003")]
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "readv$UNIX2003")]
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "sendmsg$UNIX2003")]
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "recvmsg$UNIX2003")]
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-
-    pub fn sync();
-}
-
-cfg_if! {
-    if #[cfg(any(target_os = "macos", target_os = "ios"))] {
-        mod apple;
-        pub use self::apple::*;
-    } else if #[cfg(any(target_os = "openbsd", target_os = "netbsd",
-                        target_os = "bitrig"))] {
-        mod netbsdlike;
-        pub use self::netbsdlike::*;
-    } else if #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))] {
-        mod freebsdlike;
-        pub use self::freebsdlike::*;
-    } else {
-        // Unknown target_os
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/mod.rs
+++ /dev/null
@@ -1,626 +0,0 @@
-pub type time_t = i64;
-pub type mode_t = u32;
-pub type nlink_t = ::uint32_t;
-pub type ino_t = ::uint64_t;
-pub type pthread_key_t = ::c_int;
-pub type rlim_t = u64;
-pub type speed_t = ::c_uint;
-pub type tcflag_t = ::c_uint;
-pub type nl_item = c_long;
-pub type clockid_t = ::c_int;
-pub type id_t = ::uint32_t;
-pub type sem_t = *mut sem;
-
-pub enum timezone {}
-pub enum sem {}
-
-s! {
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        pub sa_flags: ::c_int,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sockaddr_in {
-        pub sin_len: u8,
-        pub sin_family: ::sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [::int8_t; 8],
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        pub c_ispeed: ::c_int,
-        pub c_ospeed: ::c_int,
-    }
-
-    pub struct flock {
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-    }
-}
-
-pub const D_T_FMT: ::nl_item = 0;
-pub const D_FMT: ::nl_item = 1;
-pub const T_FMT: ::nl_item = 2;
-pub const T_FMT_AMPM: ::nl_item = 3;
-pub const AM_STR: ::nl_item = 4;
-pub const PM_STR: ::nl_item = 5;
-
-pub const DAY_1: ::nl_item = 6;
-pub const DAY_2: ::nl_item = 7;
-pub const DAY_3: ::nl_item = 8;
-pub const DAY_4: ::nl_item = 9;
-pub const DAY_5: ::nl_item = 10;
-pub const DAY_6: ::nl_item = 11;
-pub const DAY_7: ::nl_item = 12;
-
-pub const ABDAY_1: ::nl_item = 13;
-pub const ABDAY_2: ::nl_item = 14;
-pub const ABDAY_3: ::nl_item = 15;
-pub const ABDAY_4: ::nl_item = 16;
-pub const ABDAY_5: ::nl_item = 17;
-pub const ABDAY_6: ::nl_item = 18;
-pub const ABDAY_7: ::nl_item = 19;
-
-pub const MON_1: ::nl_item = 20;
-pub const MON_2: ::nl_item = 21;
-pub const MON_3: ::nl_item = 22;
-pub const MON_4: ::nl_item = 23;
-pub const MON_5: ::nl_item = 24;
-pub const MON_6: ::nl_item = 25;
-pub const MON_7: ::nl_item = 26;
-pub const MON_8: ::nl_item = 27;
-pub const MON_9: ::nl_item = 28;
-pub const MON_10: ::nl_item = 29;
-pub const MON_11: ::nl_item = 30;
-pub const MON_12: ::nl_item = 31;
-
-pub const ABMON_1: ::nl_item = 32;
-pub const ABMON_2: ::nl_item = 33;
-pub const ABMON_3: ::nl_item = 34;
-pub const ABMON_4: ::nl_item = 35;
-pub const ABMON_5: ::nl_item = 36;
-pub const ABMON_6: ::nl_item = 37;
-pub const ABMON_7: ::nl_item = 38;
-pub const ABMON_8: ::nl_item = 39;
-pub const ABMON_9: ::nl_item = 40;
-pub const ABMON_10: ::nl_item = 41;
-pub const ABMON_11: ::nl_item = 42;
-pub const ABMON_12: ::nl_item = 43;
-
-pub const RADIXCHAR: ::nl_item = 44;
-pub const THOUSEP: ::nl_item = 45;
-pub const YESSTR: ::nl_item = 46;
-pub const YESEXPR: ::nl_item = 47;
-pub const NOSTR: ::nl_item = 48;
-pub const NOEXPR: ::nl_item = 49;
-pub const CRNCYSTR: ::nl_item = 50;
-
-pub const CODESET: ::nl_item = 51;
-
-pub const EXIT_FAILURE : ::c_int = 1;
-pub const EXIT_SUCCESS : ::c_int = 0;
-pub const RAND_MAX : ::c_int = 2147483647;
-pub const EOF : ::c_int = -1;
-pub const SEEK_SET : ::c_int = 0;
-pub const SEEK_CUR : ::c_int = 1;
-pub const SEEK_END : ::c_int = 2;
-pub const _IOFBF : ::c_int = 0;
-pub const _IONBF : ::c_int = 2;
-pub const _IOLBF : ::c_int = 1;
-pub const BUFSIZ : ::c_uint = 1024;
-pub const FOPEN_MAX : ::c_uint = 20;
-pub const FILENAME_MAX : ::c_uint = 1024;
-pub const L_tmpnam : ::c_uint = 1024;
-pub const O_RDONLY : ::c_int = 0;
-pub const O_WRONLY : ::c_int = 1;
-pub const O_RDWR : ::c_int = 2;
-pub const O_ACCMODE : ::c_int = 3;
-pub const O_APPEND : ::c_int = 8;
-pub const O_CREAT : ::c_int = 512;
-pub const O_EXCL : ::c_int = 2048;
-pub const O_NOCTTY : ::c_int = 32768;
-pub const O_TRUNC : ::c_int = 1024;
-pub const O_SYNC : ::c_int = 128;
-pub const S_IFIFO : mode_t = 4096;
-pub const S_IFCHR : mode_t = 8192;
-pub const S_IFBLK : mode_t = 24576;
-pub const S_IFDIR : mode_t = 16384;
-pub const S_IFREG : mode_t = 32768;
-pub const S_IFLNK : mode_t = 40960;
-pub const S_IFSOCK : mode_t = 49152;
-pub const S_IFMT : mode_t = 61440;
-pub const S_IEXEC : mode_t = 64;
-pub const S_IWRITE : mode_t = 128;
-pub const S_IREAD : mode_t = 256;
-pub const S_IRWXU : mode_t = 448;
-pub const S_IXUSR : mode_t = 64;
-pub const S_IWUSR : mode_t = 128;
-pub const S_IRUSR : mode_t = 256;
-pub const S_IRWXG : mode_t = 56;
-pub const S_IXGRP : mode_t = 8;
-pub const S_IWGRP : mode_t = 16;
-pub const S_IRGRP : mode_t = 32;
-pub const S_IRWXO : mode_t = 7;
-pub const S_IXOTH : mode_t = 1;
-pub const S_IWOTH : mode_t = 2;
-pub const S_IROTH : mode_t = 4;
-pub const F_OK : ::c_int = 0;
-pub const R_OK : ::c_int = 4;
-pub const W_OK : ::c_int = 2;
-pub const X_OK : ::c_int = 1;
-pub const STDIN_FILENO : ::c_int = 0;
-pub const STDOUT_FILENO : ::c_int = 1;
-pub const STDERR_FILENO : ::c_int = 2;
-pub const F_LOCK : ::c_int = 1;
-pub const F_TEST : ::c_int = 3;
-pub const F_TLOCK : ::c_int = 2;
-pub const F_ULOCK : ::c_int = 0;
-pub const F_GETLK: ::c_int = 7;
-pub const F_SETLK: ::c_int = 8;
-pub const F_SETLKW: ::c_int = 9;
-pub const SIGHUP : ::c_int = 1;
-pub const SIGINT : ::c_int = 2;
-pub const SIGQUIT : ::c_int = 3;
-pub const SIGILL : ::c_int = 4;
-pub const SIGABRT : ::c_int = 6;
-pub const SIGEMT: ::c_int = 7;
-pub const SIGFPE : ::c_int = 8;
-pub const SIGKILL : ::c_int = 9;
-pub const SIGSEGV : ::c_int = 11;
-pub const SIGPIPE : ::c_int = 13;
-pub const SIGALRM : ::c_int = 14;
-pub const SIGTERM : ::c_int = 15;
-pub const SIGSTKSZ : ::size_t = 40960;
-
-pub const PROT_NONE : ::c_int = 0;
-pub const PROT_READ : ::c_int = 1;
-pub const PROT_WRITE : ::c_int = 2;
-pub const PROT_EXEC : ::c_int = 4;
-
-pub const MAP_FILE : ::c_int = 0x0000;
-pub const MAP_SHARED : ::c_int = 0x0001;
-pub const MAP_PRIVATE : ::c_int = 0x0002;
-pub const MAP_FIXED : ::c_int = 0x0010;
-pub const MAP_ANON : ::c_int = 0x1000;
-
-pub const MAP_FAILED : *mut ::c_void = !0 as *mut ::c_void;
-
-pub const MCL_CURRENT : ::c_int = 0x0001;
-pub const MCL_FUTURE : ::c_int = 0x0002;
-
-pub const MS_ASYNC : ::c_int = 0x0001;
-
-pub const EPERM : ::c_int = 1;
-pub const ENOENT : ::c_int = 2;
-pub const ESRCH : ::c_int = 3;
-pub const EINTR : ::c_int = 4;
-pub const EIO : ::c_int = 5;
-pub const ENXIO : ::c_int = 6;
-pub const E2BIG : ::c_int = 7;
-pub const ENOEXEC : ::c_int = 8;
-pub const EBADF : ::c_int = 9;
-pub const ECHILD : ::c_int = 10;
-pub const EDEADLK : ::c_int = 11;
-pub const ENOMEM : ::c_int = 12;
-pub const EACCES : ::c_int = 13;
-pub const EFAULT : ::c_int = 14;
-pub const ENOTBLK : ::c_int = 15;
-pub const EBUSY : ::c_int = 16;
-pub const EEXIST : ::c_int = 17;
-pub const EXDEV : ::c_int = 18;
-pub const ENODEV : ::c_int = 19;
-pub const ENOTDIR : ::c_int = 20;
-pub const EISDIR : ::c_int = 21;
-pub const EINVAL : ::c_int = 22;
-pub const ENFILE : ::c_int = 23;
-pub const EMFILE : ::c_int = 24;
-pub const ENOTTY : ::c_int = 25;
-pub const ETXTBSY : ::c_int = 26;
-pub const EFBIG : ::c_int = 27;
-pub const ENOSPC : ::c_int = 28;
-pub const ESPIPE : ::c_int = 29;
-pub const EROFS : ::c_int = 30;
-pub const EMLINK : ::c_int = 31;
-pub const EPIPE : ::c_int = 32;
-pub const EDOM : ::c_int = 33;
-pub const ERANGE : ::c_int = 34;
-pub const EAGAIN : ::c_int = 35;
-pub const EWOULDBLOCK : ::c_int = 35;
-pub const EINPROGRESS : ::c_int = 36;
-pub const EALREADY : ::c_int = 37;
-pub const ENOTSOCK : ::c_int = 38;
-pub const EDESTADDRREQ : ::c_int = 39;
-pub const EMSGSIZE : ::c_int = 40;
-pub const EPROTOTYPE : ::c_int = 41;
-pub const ENOPROTOOPT : ::c_int = 42;
-pub const EPROTONOSUPPORT : ::c_int = 43;
-pub const ESOCKTNOSUPPORT : ::c_int = 44;
-pub const EOPNOTSUPP : ::c_int = 45;
-pub const EPFNOSUPPORT : ::c_int = 46;
-pub const EAFNOSUPPORT : ::c_int = 47;
-pub const EADDRINUSE : ::c_int = 48;
-pub const EADDRNOTAVAIL : ::c_int = 49;
-pub const ENETDOWN : ::c_int = 50;
-pub const ENETUNREACH : ::c_int = 51;
-pub const ENETRESET : ::c_int = 52;
-pub const ECONNABORTED : ::c_int = 53;
-pub const ECONNRESET : ::c_int = 54;
-pub const ENOBUFS : ::c_int = 55;
-pub const EISCONN : ::c_int = 56;
-pub const ENOTCONN : ::c_int = 57;
-pub const ESHUTDOWN : ::c_int = 58;
-pub const ETOOMANYREFS : ::c_int = 59;
-pub const ETIMEDOUT : ::c_int = 60;
-pub const ECONNREFUSED : ::c_int = 61;
-pub const ELOOP : ::c_int = 62;
-pub const ENAMETOOLONG : ::c_int = 63;
-pub const EHOSTDOWN : ::c_int = 64;
-pub const EHOSTUNREACH : ::c_int = 65;
-pub const ENOTEMPTY : ::c_int = 66;
-pub const EPROCLIM : ::c_int = 67;
-pub const EUSERS : ::c_int = 68;
-pub const EDQUOT : ::c_int = 69;
-pub const ESTALE : ::c_int = 70;
-pub const EREMOTE : ::c_int = 71;
-pub const EBADRPC : ::c_int = 72;
-pub const ERPCMISMATCH : ::c_int = 73;
-pub const EPROGUNAVAIL : ::c_int = 74;
-pub const EPROGMISMATCH : ::c_int = 75;
-pub const EPROCUNAVAIL : ::c_int = 76;
-pub const ENOLCK : ::c_int = 77;
-pub const ENOSYS : ::c_int = 78;
-pub const EFTYPE : ::c_int = 79;
-pub const EAUTH : ::c_int = 80;
-pub const ENEEDAUTH : ::c_int = 81;
-
-pub const F_DUPFD : ::c_int = 0;
-pub const F_GETFD : ::c_int = 1;
-pub const F_SETFD : ::c_int = 2;
-pub const F_GETFL : ::c_int = 3;
-pub const F_SETFL : ::c_int = 4;
-
-pub const SIGTRAP : ::c_int = 5;
-
-pub const GLOB_APPEND   : ::c_int = 0x0001;
-pub const GLOB_DOOFFS   : ::c_int = 0x0002;
-pub const GLOB_ERR      : ::c_int = 0x0004;
-pub const GLOB_MARK     : ::c_int = 0x0008;
-pub const GLOB_NOCHECK  : ::c_int = 0x0010;
-pub const GLOB_NOSORT   : ::c_int = 0x0020;
-pub const GLOB_NOESCAPE : ::c_int = 0x1000;
-
-pub const GLOB_NOSPACE  : ::c_int = -1;
-pub const GLOB_ABORTED  : ::c_int = -2;
-pub const GLOB_NOMATCH  : ::c_int = -3;
-pub const GLOB_NOSYS : ::c_int = -4;
-
-pub const POSIX_MADV_NORMAL : ::c_int = 0;
-pub const POSIX_MADV_RANDOM : ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL : ::c_int = 2;
-pub const POSIX_MADV_WILLNEED : ::c_int = 3;
-pub const POSIX_MADV_DONTNEED : ::c_int = 4;
-
-pub const _SC_XOPEN_SHM : ::c_int = 30;
-
-pub const PTHREAD_CREATE_JOINABLE : ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED : ::c_int = 1;
-
-// http://man.openbsd.org/OpenBSD-current/man2/clock_getres.2
-// The man page says clock_gettime(3) can accept various values as clockid_t but
-// http://fxr.watson.org/fxr/source/kern/kern_time.c?v=OPENBSD;im=excerpts#L161
-// the implementation rejects anything other than the below two
-//
-// http://netbsd.gw.com/cgi-bin/man-cgi?clock_gettime
-// https://github.com/jsonn/src/blob/HEAD/sys/kern/subr_time.c#L222
-// Basically the same goes for NetBSD
-pub const CLOCK_REALTIME: clockid_t = 0;
-pub const CLOCK_MONOTONIC: clockid_t = 3;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_MEMLOCK: ::c_int = 6;
-pub const RLIMIT_NPROC: ::c_int = 7;
-pub const RLIMIT_NOFILE: ::c_int = 8;
-
-pub const RLIM_INFINITY: rlim_t = 0x7fff_ffff_ffff_ffff;
-pub const RLIM_SAVED_MAX: rlim_t = RLIM_INFINITY;
-pub const RLIM_SAVED_CUR: rlim_t = RLIM_INFINITY;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const MADV_NORMAL : ::c_int = 0;
-pub const MADV_RANDOM : ::c_int = 1;
-pub const MADV_SEQUENTIAL : ::c_int = 2;
-pub const MADV_WILLNEED : ::c_int = 3;
-pub const MADV_DONTNEED : ::c_int = 4;
-pub const MADV_FREE : ::c_int = 6;
-
-pub const AF_UNSPEC: ::c_int = 0;
-pub const AF_LOCAL: ::c_int = 1;
-pub const AF_UNIX: ::c_int = AF_LOCAL;
-pub const AF_INET: ::c_int = 2;
-pub const AF_IMPLINK: ::c_int = 3;
-pub const AF_PUP: ::c_int = 4;
-pub const AF_CHAOS: ::c_int = 5;
-pub const AF_NS: ::c_int = 6;
-pub const AF_ISO: ::c_int = 7;
-pub const AF_OSI: ::c_int = AF_ISO;
-pub const AF_DATAKIT: ::c_int = 9;
-pub const AF_CCITT: ::c_int = 10;
-pub const AF_SNA: ::c_int = 11;
-pub const AF_DECnet: ::c_int = 12;
-pub const AF_DLI: ::c_int = 13;
-pub const AF_LAT: ::c_int = 14;
-pub const AF_HYLINK: ::c_int = 15;
-pub const AF_APPLETALK: ::c_int = 16;
-pub const AF_LINK: ::c_int = 18;
-pub const pseudo_AF_XTP: ::c_int = 19;
-pub const AF_COIP: ::c_int = 20;
-pub const AF_CNT: ::c_int = 21;
-pub const pseudo_AF_RTIP: ::c_int = 22;
-pub const AF_IPX: ::c_int = 23;
-pub const AF_INET6: ::c_int = 24;
-pub const pseudo_AF_PIP: ::c_int = 25;
-pub const AF_ISDN: ::c_int = 26;
-pub const AF_E164: ::c_int = AF_ISDN;
-pub const AF_NATM: ::c_int = 27;
-
-pub const PF_UNSPEC: ::c_int = AF_UNSPEC;
-pub const PF_LOCAL: ::c_int = AF_LOCAL;
-pub const PF_UNIX: ::c_int = PF_LOCAL;
-pub const PF_INET: ::c_int = AF_INET;
-pub const PF_IMPLINK: ::c_int = AF_IMPLINK;
-pub const PF_PUP: ::c_int = AF_PUP;
-pub const PF_CHAOS: ::c_int = AF_CHAOS;
-pub const PF_NS: ::c_int = AF_NS;
-pub const PF_ISO: ::c_int = AF_ISO;
-pub const PF_OSI: ::c_int = AF_ISO;
-pub const PF_DATAKIT: ::c_int = AF_DATAKIT;
-pub const PF_CCITT: ::c_int = AF_CCITT;
-pub const PF_SNA: ::c_int = AF_SNA;
-pub const PF_DECnet: ::c_int = AF_DECnet;
-pub const PF_DLI: ::c_int = AF_DLI;
-pub const PF_LAT: ::c_int = AF_LAT;
-pub const PF_HYLINK: ::c_int = AF_HYLINK;
-pub const PF_APPLETALK: ::c_int = AF_APPLETALK;
-pub const PF_LINK: ::c_int = AF_LINK;
-pub const PF_XTP: ::c_int = pseudo_AF_XTP;
-pub const PF_COIP: ::c_int = AF_COIP;
-pub const PF_CNT: ::c_int = AF_CNT;
-pub const PF_IPX: ::c_int = AF_IPX;
-pub const PF_INET6: ::c_int = AF_INET6;
-pub const PF_RTIP: ::c_int = pseudo_AF_RTIP;
-pub const PF_PIP: ::c_int = pseudo_AF_PIP;
-pub const PF_ISDN: ::c_int = AF_ISDN;
-pub const PF_NATM: ::c_int = AF_NATM;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_RAW: ::c_int = 3;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 10;
-pub const IP_MULTICAST_LOOP: ::c_int = 11;
-pub const IP_TTL: ::c_int = 4;
-pub const IP_HDRINCL: ::c_int = 2;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 12;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 13;
-
-pub const TCP_NODELAY: ::c_int = 0x01;
-pub const SOL_SOCKET: ::c_int = 0xffff;
-pub const SO_DEBUG: ::c_int = 0x01;
-pub const SO_ACCEPTCONN: ::c_int = 0x0002;
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_USELOOPBACK: ::c_int = 0x0040;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_TYPE: ::c_int = 0x1008;
-
-pub const SOMAXCONN: ::c_int = 128;
-
-pub const MSG_OOB: ::c_int = 0x1;
-pub const MSG_PEEK: ::c_int = 0x2;
-pub const MSG_DONTROUTE: ::c_int = 0x4;
-pub const MSG_EOR: ::c_int = 0x8;
-pub const MSG_TRUNC: ::c_int = 0x10;
-pub const MSG_CTRUNC: ::c_int = 0x20;
-pub const MSG_WAITALL: ::c_int = 0x40;
-pub const MSG_DONTWAIT: ::c_int = 0x80;
-pub const MSG_BCAST: ::c_int = 0x100;
-pub const MSG_MCAST: ::c_int = 0x200;
-pub const MSG_NOSIGNAL: ::c_int = 0x400;
-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x800;
-
-pub const SCM_RIGHTS: ::c_int = 0x01;
-
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const O_NONBLOCK : ::c_int = 4;
-
-pub const IPPROTO_RAW : ::c_int = 255;
-
-pub const _SC_ARG_MAX : ::c_int = 1;
-pub const _SC_CHILD_MAX : ::c_int = 2;
-pub const _SC_NGROUPS_MAX : ::c_int = 4;
-pub const _SC_OPEN_MAX : ::c_int = 5;
-pub const _SC_JOB_CONTROL : ::c_int = 6;
-pub const _SC_SAVED_IDS : ::c_int = 7;
-pub const _SC_VERSION : ::c_int = 8;
-pub const _SC_BC_BASE_MAX : ::c_int = 9;
-pub const _SC_BC_DIM_MAX : ::c_int = 10;
-pub const _SC_BC_SCALE_MAX : ::c_int = 11;
-pub const _SC_BC_STRING_MAX : ::c_int = 12;
-pub const _SC_COLL_WEIGHTS_MAX : ::c_int = 13;
-pub const _SC_EXPR_NEST_MAX : ::c_int = 14;
-pub const _SC_LINE_MAX : ::c_int = 15;
-pub const _SC_RE_DUP_MAX : ::c_int = 16;
-pub const _SC_2_VERSION : ::c_int = 17;
-pub const _SC_2_C_BIND : ::c_int = 18;
-pub const _SC_2_C_DEV : ::c_int = 19;
-pub const _SC_2_CHAR_TERM : ::c_int = 20;
-pub const _SC_2_FORT_DEV : ::c_int = 21;
-pub const _SC_2_FORT_RUN : ::c_int = 22;
-pub const _SC_2_LOCALEDEF : ::c_int = 23;
-pub const _SC_2_SW_DEV : ::c_int = 24;
-pub const _SC_2_UPE : ::c_int = 25;
-pub const _SC_STREAM_MAX : ::c_int = 26;
-pub const _SC_TZNAME_MAX : ::c_int = 27;
-pub const _SC_PAGESIZE : ::c_int = 28;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_FSYNC : ::c_int = 29;
-
-pub const Q_GETQUOTA: ::c_int = 0x300;
-pub const Q_SETQUOTA: ::c_int = 0x400;
-
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-
-pub const LOG_NFACILITIES: ::c_int = 24;
-
-pub const HW_NCPU: ::c_int = 3;
-
-pub const B0: speed_t = 0;
-pub const B50: speed_t = 50;
-pub const B75: speed_t = 75;
-pub const B110: speed_t = 110;
-pub const B134: speed_t = 134;
-pub const B150: speed_t = 150;
-pub const B200: speed_t = 200;
-pub const B300: speed_t = 300;
-pub const B600: speed_t = 600;
-pub const B1200: speed_t = 1200;
-pub const B1800: speed_t = 1800;
-pub const B2400: speed_t = 2400;
-pub const B4800: speed_t = 4800;
-pub const B9600: speed_t = 9600;
-pub const B19200: speed_t = 19200;
-pub const B38400: speed_t = 38400;
-pub const B7200: speed_t = 7200;
-pub const B14400: speed_t = 14400;
-pub const B28800: speed_t = 28800;
-pub const B57600: speed_t = 57600;
-pub const B76800: speed_t = 76800;
-pub const B115200: speed_t = 115200;
-pub const B230400: speed_t = 230400;
-pub const EXTA: speed_t = 19200;
-pub const EXTB: speed_t = 38400;
-
-pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t;
-
-f! {
-    pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
-        status >> 8
-    }
-
-    pub fn WIFSIGNALED(status: ::c_int) -> bool {
-        (status & 0o177) != 0o177 && (status & 0o177) != 0
-    }
-
-    pub fn WIFSTOPPED(status: ::c_int) -> bool {
-        (status & 0o177) == 0o177
-    }
-}
-
-#[link(name = "util")]
-extern {
-    pub fn mincore(addr: *mut ::c_void, len: ::size_t,
-                   vec: *mut ::c_char) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__clock_getres50")]
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__clock_gettime50")]
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")]
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-    pub fn __errno() -> *mut ::c_int;
-    pub fn shm_open(name: *const ::c_char, oflag: ::c_int, mode: ::mode_t)
-                    -> ::c_int;
-    pub fn memrchr(cx: *const ::c_void,
-                   c: ::c_int,
-                   n: ::size_t) -> *mut ::c_void;
-    pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int;
-    pub fn mkostemps(template: *mut ::c_char,
-                     suffixlen: ::c_int,
-                     flags: ::c_int) -> ::c_int;
-    pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int;
-    pub fn fdatasync(fd: ::c_int) -> ::c_int;
-    pub fn openpty(amaster: *mut ::c_int,
-                   aslave: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::c_int;
-    pub fn forkpty(amaster: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *mut termios,
-                   winp: *mut ::winsize) -> ::pid_t;
-    pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-
-    pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
-                   mode: ::mode_t, dev: dev_t) -> ::c_int;
-    pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t) -> ::c_int;
-    pub fn sem_timedwait(sem: *mut sem_t,
-                         abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_os = "netbsd")] {
-        mod netbsd;
-        pub use self::netbsd::*;
-    } else if #[cfg(any(target_os = "openbsd", target_os = "bitrig"))] {
-        mod openbsdlike;
-        pub use self::openbsdlike::*;
-    } else {
-        // Unknown target_os
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/mod.rs
+++ /dev/null
@@ -1,736 +0,0 @@
-pub type clock_t = ::c_uint;
-pub type suseconds_t = ::c_int;
-pub type dev_t = u64;
-pub type blksize_t = ::int32_t;
-pub type fsblkcnt_t = ::uint64_t;
-pub type fsfilcnt_t = ::uint64_t;
-pub type idtype_t = ::c_int;
-
-s! {
-    pub struct aiocb {
-        pub aio_offset: ::off_t,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_sigevent: ::sigevent,
-        _state: ::c_int,
-        _errno: ::c_int,
-        _retval: ::ssize_t
-    }
-
-    pub struct dirent {
-        pub d_fileno: ::ino_t,
-        pub d_reclen: u16,
-        pub d_namlen: u16,
-        pub d_type: u8,
-        pub d_name: [::c_char; 512],
-    }
-
-    pub struct glob_t {
-        pub gl_pathc:   ::size_t,
-        pub gl_matchc:  ::size_t,
-        pub gl_offs:    ::size_t,
-        pub gl_flags:   ::c_int,
-        pub gl_pathv:   *mut *mut ::c_char,
-
-        __unused3: *mut ::c_void,
-
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-        __unused8: *mut ::c_void,
-    }
-
-    pub struct sigevent {
-        pub sigev_notify: ::c_int,
-        pub sigev_signo: ::c_int,
-        pub sigev_value: ::sigval,
-        __unused1: *mut ::c_void,       //actually a function pointer
-        pub sigev_notify_attributes: *mut ::c_void
-    }
-
-    pub struct sigset_t {
-        __bits: [u32; 4],
-    }
-
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_mode: ::mode_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atimensec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtimensec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctimensec: ::c_long,
-        pub st_birthtime: ::time_t,
-        pub st_birthtimensec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: ::blksize_t,
-        pub st_flags: ::uint32_t,
-        pub st_gen: ::uint32_t,
-        pub st_spare: [::uint32_t; 2],
-    }
-
-    pub struct statvfs {
-        pub f_flag: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_iosize: ::c_ulong,
-
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_bresvd: ::fsblkcnt_t,
-
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fresvd: ::fsfilcnt_t,
-
-        pub f_syncreads: ::uint64_t,
-        pub f_syncwrites: ::uint64_t,
-
-        pub f_asyncreads: ::uint64_t,
-        pub f_asyncwrites: ::uint64_t,
-
-        pub f_fsidx: ::fsid_t,
-        pub f_fsid: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        pub f_owner: ::uid_t,
-
-        pub f_spare: [::uint32_t; 4],
-
-        pub f_fstypename: [::c_char; 32],
-        pub f_mntonname: [::c_char; 1024],
-        pub f_mntfromname: [::c_char; 1024],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: ::socklen_t,
-        pub ai_canonname: *mut ::c_char,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_next: *mut ::addrinfo,
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_len: u8,
-        pub ss_family: ::sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_pad2: i64,
-        __ss_pad3: [u8; 112],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        __pad1: ::c_int,
-        pub si_addr: *mut ::c_void,
-        __pad2: [u64; 13],
-    }
-
-    pub struct pthread_attr_t {
-        pta_magic: ::c_uint,
-        pta_flags: ::c_int,
-        pta_private: *mut ::c_void,
-    }
-
-    pub struct pthread_mutex_t {
-        ptm_magic: ::c_uint,
-        ptm_errorcheck: ::c_uchar,
-        ptm_pad1: [u8; 3],
-        ptm_interlock: ::c_uchar,
-        ptm_pad2: [u8; 3],
-        ptm_owner: ::pthread_t,
-        ptm_waiters: *mut u8,
-        ptm_recursed: ::c_uint,
-        ptm_spare2: *mut ::c_void,
-    }
-
-    pub struct pthread_mutexattr_t {
-        ptma_magic: ::c_uint,
-        ptma_private: *mut ::c_void,
-    }
-
-    pub struct pthread_cond_t {
-        ptc_magic: ::c_uint,
-        ptc_lock: ::c_uchar,
-        ptc_waiters_first: *mut u8,
-        ptc_waiters_last: *mut u8,
-        ptc_mutex: *mut ::pthread_mutex_t,
-        ptc_private: *mut ::c_void,
-    }
-
-    pub struct pthread_condattr_t {
-        ptca_magic: ::c_uint,
-        ptca_private: *mut ::c_void,
-    }
-
-    pub struct pthread_rwlock_t {
-        ptr_magic: ::c_uint,
-        ptr_interlock: ::c_uchar,
-        ptr_rblocked_first: *mut u8,
-        ptr_rblocked_last: *mut u8,
-        ptr_wblocked_first: *mut u8,
-        ptr_wblocked_last: *mut u8,
-        ptr_nreaders: ::c_uint,
-        ptr_owner: ::pthread_t,
-        ptr_private: *mut ::c_void,
-    }
-
-    pub struct kevent {
-        pub ident: ::uintptr_t,
-        pub filter: ::uint32_t,
-        pub flags: ::uint32_t,
-        pub fflags: ::uint32_t,
-        pub data: ::int64_t,
-        pub udata: ::intptr_t,
-    }
-
-    pub struct dqblk {
-        pub dqb_bhardlimit: ::uint32_t,
-        pub dqb_bsoftlimit: ::uint32_t,
-        pub dqb_curblocks: ::uint32_t,
-        pub dqb_ihardlimit: ::uint32_t,
-        pub dqb_isoftlimit: ::uint32_t,
-        pub dqb_curinodes: ::uint32_t,
-        pub dqb_btime: ::int32_t,
-        pub dqb_itime: ::int32_t,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *const ::c_void,
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-}
-
-pub const AT_FDCWD: ::c_int = -100;
-pub const AT_EACCESS: ::c_int = 0x100;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x200;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400;
-pub const AT_REMOVEDIR: ::c_int = 0x800;
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << ::LC_COLLATE);
-pub const LC_CTYPE_MASK: ::c_int = (1 << ::LC_CTYPE);
-pub const LC_MONETARY_MASK: ::c_int = (1 << ::LC_MONETARY);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << ::LC_NUMERIC);
-pub const LC_TIME_MASK: ::c_int = (1 << ::LC_TIME);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << ::LC_MESSAGES);
-pub const LC_ALL_MASK: ::c_int = !0;
-
-pub const ERA: ::nl_item = 52;
-pub const ERA_D_FMT: ::nl_item = 53;
-pub const ERA_D_T_FMT: ::nl_item = 54;
-pub const ERA_T_FMT: ::nl_item = 55;
-pub const ALT_DIGITS: ::nl_item = 56;
-
-pub const O_CLOEXEC: ::c_int = 0x400000;
-pub const O_ALT_IO: ::c_int = 0x40000;
-pub const O_NOSIGPIPE: ::c_int = 0x1000000;
-pub const O_SEARCH: ::c_int = 0x800000;
-pub const O_EXLOCK: ::c_int = 0x20;
-pub const O_SHLOCK: ::c_int = 0x10;
-pub const O_DIRECTORY: ::c_int = 0x200000;
-
-pub const MS_SYNC : ::c_int = 0x4;
-pub const MS_INVALIDATE : ::c_int = 0x2;
-
-pub const RLIM_NLIMITS: ::c_int = 12;
-
-pub const ENOATTR : ::c_int = 93;
-pub const EILSEQ : ::c_int = 85;
-pub const EOVERFLOW : ::c_int = 84;
-pub const ECANCELED : ::c_int = 87;
-pub const EIDRM : ::c_int = 82;
-pub const ENOMSG : ::c_int = 83;
-pub const ENOTSUP : ::c_int = 86;
-pub const ELAST : ::c_int = 96;
-
-pub const F_DUPFD_CLOEXEC : ::c_int = 12;
-pub const F_CLOSEM: ::c_int = 10;
-pub const F_GETNOSIGPIPE: ::c_int = 13;
-pub const F_SETNOSIGPIPE: ::c_int = 14;
-pub const F_MAXFD: ::c_int = 11;
-
-pub const IPV6_JOIN_GROUP: ::c_int = 12;
-pub const IPV6_LEAVE_GROUP: ::c_int = 13;
-
-pub const SOCK_CONN_DGRAM: ::c_int = 6;
-pub const SOCK_DCCP: ::c_int = SOCK_CONN_DGRAM;
-pub const SOCK_NOSIGPIPE: ::c_int = 0x40000000;
-pub const SOCK_FLAGS_MASK: ::c_int = 0xf0000000;
-
-pub const SO_SNDTIMEO: ::c_int = 0x100b;
-pub const SO_RCVTIMEO: ::c_int = 0x100c;
-pub const SO_ACCEPTFILTER: ::c_int = 0x1000;
-pub const SO_TIMESTAMP: ::c_int = 0x2000;
-pub const SO_OVERFLOWED: ::c_int = 0x1009;
-pub const SO_NOHEADER: ::c_int = 0x100a;
-
-pub const AF_OROUTE: ::c_int = 17;
-pub const AF_ARP: ::c_int = 28;
-pub const pseudo_AF_KEY: ::c_int = 29;
-pub const pseudo_AF_HDRCMPLT: ::c_int = 30;
-pub const AF_BLUETOOTH: ::c_int = 31;
-pub const AF_IEEE80211: ::c_int = 32;
-pub const AF_MPLS: ::c_int = 33;
-pub const AF_ROUTE: ::c_int = 34;
-pub const AF_MAX: ::c_int = 35;
-
-pub const NET_MAXID: ::c_int = AF_MAX;
-pub const NET_RT_DUMP: ::c_int = 1;
-pub const NET_RT_FLAGS: ::c_int = 2;
-pub const NET_RT_OOIFLIST: ::c_int = 3;
-pub const NET_RT_OIFLIST: ::c_int = 4;
-pub const NET_RT_IFLIST: ::c_int = 5;
-pub const NET_RT_MAXID: ::c_int = 6;
-
-pub const PF_OROUTE: ::c_int = AF_OROUTE;
-pub const PF_ARP: ::c_int = AF_ARP;
-pub const PF_KEY: ::c_int = pseudo_AF_KEY;
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_MPLS: ::c_int = AF_MPLS;
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_MAX: ::c_int = AF_MAX;
-
-pub const MSG_NBIO: ::c_int = 0x1000;
-pub const MSG_WAITFORONE: ::c_int = 0x2000;
-pub const MSG_NOTIFICATION: ::c_int = 0x4000;
-
-pub const SCM_TIMESTAMP: ::c_int = 0x08;
-pub const SCM_CREDS: ::c_int = 0x10;
-
-pub const O_DSYNC : ::c_int = 0x10000;
-
-pub const MAP_RENAME : ::c_int = 0x20;
-pub const MAP_NORESERVE : ::c_int = 0x40;
-pub const MAP_HASSEMAPHORE : ::c_int = 0x200;
-pub const MAP_WIRED: ::c_int = 0x800;
-
-pub const _SC_IOV_MAX : ::c_int = 32;
-pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 47;
-pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 48;
-pub const _SC_LOGIN_NAME_MAX : ::c_int = 37;
-pub const _SC_MQ_PRIO_MAX : ::c_int = 55;
-pub const _SC_NPROCESSORS_ONLN : ::c_int = 1002;
-pub const _SC_THREADS : ::c_int = 41;
-pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 61;
-pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 62;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 57;
-pub const _SC_THREAD_KEYS_MAX : ::c_int = 58;
-pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 64;
-pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 65;
-pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 63;
-pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 66;
-pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 67;
-pub const _SC_THREAD_STACK_MIN : ::c_int = 59;
-pub const _SC_THREAD_THREADS_MAX : ::c_int = 60;
-pub const _SC_TTY_NAME_MAX : ::c_int = 68;
-pub const _SC_ATEXIT_MAX : ::c_int = 40;
-pub const _SC_CLK_TCK : ::c_int = 39;
-pub const _SC_AIO_LISTIO_MAX : ::c_int = 51;
-pub const _SC_AIO_MAX : ::c_int = 52;
-pub const _SC_ASYNCHRONOUS_IO : ::c_int = 50;
-pub const _SC_MAPPED_FILES : ::c_int = 33;
-pub const _SC_MEMLOCK : ::c_int = 34;
-pub const _SC_MEMLOCK_RANGE : ::c_int = 35;
-pub const _SC_MEMORY_PROTECTION : ::c_int = 36;
-pub const _SC_MESSAGE_PASSING : ::c_int = 53;
-pub const _SC_MQ_OPEN_MAX : ::c_int = 54;
-pub const _SC_PRIORITY_SCHEDULING : ::c_int = 56;
-pub const _SC_SEMAPHORES : ::c_int = 42;
-pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 87;
-pub const _SC_SYNCHRONIZED_IO : ::c_int = 31;
-pub const _SC_TIMERS : ::c_int = 44;
-pub const _SC_HOST_NAME_MAX : ::c_int = 69;
-
-pub const FD_SETSIZE: usize = 0x100;
-
-pub const ST_NOSUID: ::c_ulong = 8;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    ptm_magic: 0x33330003,
-    ptm_errorcheck: 0,
-    ptm_interlock: 0,
-    ptm_waiters: 0 as *mut _,
-    ptm_owner: 0,
-    ptm_pad1: [0; 3],
-    ptm_pad2: [0; 3],
-    ptm_recursed: 0,
-    ptm_spare2: 0 as *mut _,
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    ptc_magic: 0x55550005,
-    ptc_lock: 0,
-    ptc_waiters_first: 0 as *mut _,
-    ptc_waiters_last: 0 as *mut _,
-    ptc_mutex: 0 as *mut _,
-    ptc_private: 0 as *mut _,
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    ptr_magic: 0x99990009,
-    ptr_interlock: 0,
-    ptr_rblocked_first: 0 as *mut _,
-    ptr_rblocked_last: 0 as *mut _,
-    ptr_wblocked_first: 0 as *mut _,
-    ptr_wblocked_last: 0 as *mut _,
-    ptr_nreaders: 0,
-    ptr_owner: 0,
-    ptr_private: 0 as *mut _,
-};
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-
-pub const EVFILT_AIO: ::int32_t = 2;
-pub const EVFILT_PROC: ::int32_t = 4;
-pub const EVFILT_READ: ::int32_t = 0;
-pub const EVFILT_SIGNAL: ::int32_t = 5;
-pub const EVFILT_TIMER: ::int32_t = 6;
-pub const EVFILT_VNODE: ::int32_t = 3;
-pub const EVFILT_WRITE: ::int32_t = 1;
-
-pub const EV_ADD: ::uint32_t = 0x1;
-pub const EV_DELETE: ::uint32_t = 0x2;
-pub const EV_ENABLE: ::uint32_t = 0x4;
-pub const EV_DISABLE: ::uint32_t = 0x8;
-pub const EV_ONESHOT: ::uint32_t = 0x10;
-pub const EV_CLEAR: ::uint32_t = 0x20;
-pub const EV_RECEIPT: ::uint32_t = 0x40;
-pub const EV_DISPATCH: ::uint32_t = 0x80;
-pub const EV_FLAG1: ::uint32_t = 0x2000;
-pub const EV_ERROR: ::uint32_t = 0x4000;
-pub const EV_EOF: ::uint32_t = 0x8000;
-pub const EV_SYSFLAGS: ::uint32_t = 0xf000;
-
-pub const NOTE_LOWAT: ::uint32_t = 0x00000001;
-pub const NOTE_DELETE: ::uint32_t = 0x00000001;
-pub const NOTE_WRITE: ::uint32_t = 0x00000002;
-pub const NOTE_EXTEND: ::uint32_t = 0x00000004;
-pub const NOTE_ATTRIB: ::uint32_t = 0x00000008;
-pub const NOTE_LINK: ::uint32_t = 0x00000010;
-pub const NOTE_RENAME: ::uint32_t = 0x00000020;
-pub const NOTE_REVOKE: ::uint32_t = 0x00000040;
-pub const NOTE_EXIT: ::uint32_t = 0x80000000;
-pub const NOTE_FORK: ::uint32_t = 0x40000000;
-pub const NOTE_EXEC: ::uint32_t = 0x20000000;
-pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff;
-pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000;
-pub const NOTE_TRACK: ::uint32_t = 0x00000001;
-pub const NOTE_TRACKERR: ::uint32_t = 0x00000002;
-pub const NOTE_CHILD: ::uint32_t = 0x00000004;
-
-pub const CRTSCTS: ::tcflag_t = 0x00010000;
-
-pub const TMP_MAX : ::c_uint = 308915776;
-
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const RTLD_NOLOAD: ::c_int = 0x2000;
-pub const RTLD_LOCAL: ::c_int = 0x200;
-
-pub const CTL_MAXNAME: ::c_int = 12;
-pub const SYSCTL_NAMELEN: ::c_int = 32;
-pub const SYSCTL_DEFSIZE: ::c_int = 8;
-pub const CTLTYPE_NODE: ::c_int = 1;
-pub const CTLTYPE_INT: ::c_int = 2;
-pub const CTLTYPE_STRING: ::c_int = 3;
-pub const CTLTYPE_QUAD: ::c_int = 4;
-pub const CTLTYPE_STRUCT: ::c_int = 5;
-pub const CTLTYPE_BOOL: ::c_int = 6;
-pub const CTLFLAG_READONLY: ::c_int = 0x00000000;
-pub const CTLFLAG_READWRITE: ::c_int = 0x00000070;
-pub const CTLFLAG_ANYWRITE: ::c_int = 0x00000080;
-pub const CTLFLAG_PRIVATE: ::c_int = 0x00000100;
-pub const CTLFLAG_PERMANENT: ::c_int = 0x00000200;
-pub const CTLFLAG_OWNDATA: ::c_int = 0x00000400;
-pub const CTLFLAG_IMMEDIATE: ::c_int = 0x00000800;
-pub const CTLFLAG_HEX: ::c_int = 0x00001000;
-pub const CTLFLAG_ROOT: ::c_int = 0x00002000;
-pub const CTLFLAG_ANYNUMBER: ::c_int = 0x00004000;
-pub const CTLFLAG_HIDDEN: ::c_int = 0x00008000;
-pub const CTLFLAG_ALIAS: ::c_int = 0x00010000;
-pub const CTLFLAG_MMAP: ::c_int = 0x00020000;
-pub const CTLFLAG_OWNDESC: ::c_int = 0x00040000;
-pub const CTLFLAG_UNSIGNED: ::c_int = 0x00080000;
-pub const SYSCTL_VERS_MASK: ::c_int = 0xff000000;
-pub const SYSCTL_VERS_0: ::c_int = 0x00000000;
-pub const SYSCTL_VERS_1: ::c_int = 0x01000000;
-pub const SYSCTL_VERSION: ::c_int = SYSCTL_VERS_1;
-pub const CTL_EOL: ::c_int = -1;
-pub const CTL_QUERY: ::c_int = -2;
-pub const CTL_CREATE: ::c_int = -3;
-pub const CTL_CREATESYM: ::c_int = -4;
-pub const CTL_DESTROY: ::c_int = -5;
-pub const CTL_MMAP: ::c_int = -6;
-pub const CTL_DESCRIBE: ::c_int = -7;
-pub const CTL_UNSPEC: ::c_int = 0;
-pub const CTL_KERN: ::c_int = 1;
-pub const CTL_VM: ::c_int = 2;
-pub const CTL_VFS: ::c_int = 3;
-pub const CTL_NET: ::c_int = 4;
-pub const CTL_DEBUG: ::c_int = 5;
-pub const CTL_HW: ::c_int = 6;
-pub const CTL_MACHDEP: ::c_int = 7;
-pub const CTL_USER: ::c_int = 8;
-pub const CTL_DDB: ::c_int = 9;
-pub const CTL_PROC: ::c_int = 10;
-pub const CTL_VENDOR: ::c_int = 11;
-pub const CTL_EMUL: ::c_int = 12;
-pub const CTL_SECURITY: ::c_int = 13;
-pub const CTL_MAXID: ::c_int = 14;
-pub const KERN_OSTYPE: ::c_int = 1;
-pub const KERN_OSRELEASE: ::c_int = 2;
-pub const KERN_OSREV: ::c_int = 3;
-pub const KERN_VERSION: ::c_int = 4;
-pub const KERN_MAXVNODES: ::c_int = 5;
-pub const KERN_MAXPROC: ::c_int = 6;
-pub const KERN_MAXFILES: ::c_int = 7;
-pub const KERN_ARGMAX: ::c_int = 8;
-pub const KERN_SECURELVL: ::c_int = 9;
-pub const KERN_HOSTNAME: ::c_int = 10;
-pub const KERN_HOSTID: ::c_int = 11;
-pub const KERN_CLOCKRATE: ::c_int = 12;
-pub const KERN_VNODE: ::c_int = 13;
-pub const KERN_PROC: ::c_int = 14;
-pub const KERN_FILE: ::c_int = 15;
-pub const KERN_PROF: ::c_int = 16;
-pub const KERN_POSIX1: ::c_int = 17;
-pub const KERN_NGROUPS: ::c_int = 18;
-pub const KERN_JOB_CONTROL: ::c_int = 19;
-pub const KERN_SAVED_IDS: ::c_int = 20;
-pub const KERN_OBOOTTIME: ::c_int = 21;
-pub const KERN_DOMAINNAME: ::c_int = 22;
-pub const KERN_MAXPARTITIONS: ::c_int = 23;
-pub const KERN_RAWPARTITION: ::c_int = 24;
-pub const KERN_NTPTIME: ::c_int = 25;
-pub const KERN_TIMEX: ::c_int = 26;
-pub const KERN_AUTONICETIME: ::c_int = 27;
-pub const KERN_AUTONICEVAL: ::c_int = 28;
-pub const KERN_RTC_OFFSET: ::c_int = 29;
-pub const KERN_ROOT_DEVICE: ::c_int = 30;
-pub const KERN_MSGBUFSIZE: ::c_int = 31;
-pub const KERN_FSYNC: ::c_int = 32;
-pub const KERN_OLDSYSVMSG: ::c_int = 33;
-pub const KERN_OLDSYSVSEM: ::c_int = 34;
-pub const KERN_OLDSYSVSHM: ::c_int = 35;
-pub const KERN_OLDSHORTCORENAME: ::c_int = 36;
-pub const KERN_SYNCHRONIZED_IO: ::c_int = 37;
-pub const KERN_IOV_MAX: ::c_int = 38;
-pub const KERN_MBUF: ::c_int = 39;
-pub const KERN_MAPPED_FILES: ::c_int = 40;
-pub const KERN_MEMLOCK: ::c_int = 41;
-pub const KERN_MEMLOCK_RANGE: ::c_int = 42;
-pub const KERN_MEMORY_PROTECTION: ::c_int = 43;
-pub const KERN_LOGIN_NAME_MAX: ::c_int = 44;
-pub const KERN_DEFCORENAME: ::c_int = 45;
-pub const KERN_LOGSIGEXIT: ::c_int = 46;
-pub const KERN_PROC2: ::c_int = 47;
-pub const KERN_PROC_ARGS: ::c_int = 48;
-pub const KERN_FSCALE: ::c_int = 49;
-pub const KERN_CCPU: ::c_int = 50;
-pub const KERN_CP_TIME: ::c_int = 51;
-pub const KERN_OLDSYSVIPC_INFO: ::c_int = 52;
-pub const KERN_MSGBUF: ::c_int = 53;
-pub const KERN_CONSDEV: ::c_int = 54;
-pub const KERN_MAXPTYS: ::c_int = 55;
-pub const KERN_PIPE: ::c_int = 56;
-pub const KERN_MAXPHYS: ::c_int = 57;
-pub const KERN_SBMAX: ::c_int = 58;
-pub const KERN_TKSTAT: ::c_int = 59;
-pub const KERN_MONOTONIC_CLOCK: ::c_int = 60;
-pub const KERN_URND: ::c_int = 61;
-pub const KERN_LABELSECTOR: ::c_int = 62;
-pub const KERN_LABELOFFSET: ::c_int = 63;
-pub const KERN_LWP: ::c_int = 64;
-pub const KERN_FORKFSLEEP: ::c_int = 65;
-pub const KERN_POSIX_THREADS: ::c_int = 66;
-pub const KERN_POSIX_SEMAPHORES: ::c_int = 67;
-pub const KERN_POSIX_BARRIERS: ::c_int = 68;
-pub const KERN_POSIX_TIMERS: ::c_int = 69;
-pub const KERN_POSIX_SPIN_LOCKS: ::c_int = 70;
-pub const KERN_POSIX_READER_WRITER_LOCKS: ::c_int = 71;
-pub const KERN_DUMP_ON_PANIC: ::c_int = 72;
-pub const KERN_SOMAXKVA: ::c_int = 73;
-pub const KERN_ROOT_PARTITION: ::c_int = 74;
-pub const KERN_DRIVERS: ::c_int = 75;
-pub const KERN_BUF: ::c_int = 76;
-pub const KERN_FILE2: ::c_int = 77;
-pub const KERN_VERIEXEC: ::c_int = 78;
-pub const KERN_CP_ID: ::c_int = 79;
-pub const KERN_HARDCLOCK_TICKS: ::c_int = 80;
-pub const KERN_ARND: ::c_int = 81;
-pub const KERN_SYSVIPC: ::c_int = 82;
-pub const KERN_BOOTTIME: ::c_int = 83;
-pub const KERN_EVCNT: ::c_int = 84;
-pub const KERN_MAXID: ::c_int = 85;
-pub const KERN_PROC_ALL: ::c_int = 0;
-pub const KERN_PROC_PID: ::c_int = 1;
-pub const KERN_PROC_PGRP: ::c_int = 2;
-pub const KERN_PROC_SESSION: ::c_int = 3;
-pub const KERN_PROC_TTY: ::c_int = 4;
-pub const KERN_PROC_UID: ::c_int = 5;
-pub const KERN_PROC_RUID: ::c_int = 6;
-pub const KERN_PROC_GID: ::c_int = 7;
-pub const KERN_PROC_RGID: ::c_int = 8;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const AIO_CANCELED: ::c_int = 1;
-pub const AIO_NOTCANCELED: ::c_int = 2;
-pub const AIO_ALLDONE: ::c_int = 3;
-pub const LIO_NOP: ::c_int = 0;
-pub const LIO_WRITE: ::c_int = 1;
-pub const LIO_READ: ::c_int = 2;
-pub const LIO_WAIT: ::c_int = 1;
-pub const LIO_NOWAIT: ::c_int = 0;
-
-pub const SIGEV_NONE: ::c_int = 0;
-pub const SIGEV_SIGNAL: ::c_int = 1;
-pub const SIGEV_THREAD: ::c_int = 2;
-
-pub const WSTOPPED: ::c_int = 0x00000002; // same as WUNTRACED
-pub const WCONTINUED: ::c_int = 0x00000010;
-pub const WEXITED: ::c_int = 0x000000020;
-pub const WNOWAIT: ::c_int = 0x00010000;
-
-pub const P_ALL: idtype_t = 0;
-pub const P_PID: idtype_t = 1;
-pub const P_PGID: idtype_t = 4;
-
-pub const B460800: ::speed_t = 460800;
-pub const B921600: ::speed_t = 921600;
-
-// dirfd() is a macro on netbsd to access
-// the first field of the struct where dirp points to:
-// http://cvsweb.netbsd.org/bsdweb.cgi/src/include/dirent.h?rev=1.36
-f! {
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int {
-        unsafe { *(dirp as *const ::c_int) }
-    }
-}
-
-extern {
-    pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
-    pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
-    #[link_name = "__aio_suspend50"]
-    pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int,
-                       timeout: *const ::timespec) -> ::c_int;
-    pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb,
-                      nitems: ::c_int, sevp: *mut sigevent) -> ::c_int;
-
-    pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::socklen_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::socklen_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn sysctl(name: *const ::c_int,
-                  namelen: ::c_uint,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *const ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn sysctlbyname(name: *const ::c_char,
-                        oldp: *mut ::c_void,
-                        oldlenp: *mut ::size_t,
-                        newp: *const ::c_void,
-                        newlen: ::size_t)
-                        -> ::c_int;
-    #[link_name = "__kevent50"]
-    pub fn kevent(kq: ::c_int,
-                  changelist: *const ::kevent,
-                  nchanges: ::size_t,
-                  eventlist: *mut ::kevent,
-                  nevents: ::size_t,
-                  timeout: *const ::timespec) -> ::c_int;
-    #[link_name = "__mount50"]
-    pub fn mount(src: *const ::c_char,
-                 target: *const ::c_char,
-                 flags: ::c_int,
-                 data: *mut ::c_void,
-                 size: ::size_t) -> ::c_int;
-    pub fn ptrace(requeset: ::c_int,
-                  pid: ::pid_t,
-                  addr: *mut ::c_void,
-                  data: ::c_int) -> ::c_int;
-    pub fn pthread_setname_np(t: ::pthread_t,
-                              name: *const ::c_char,
-                              arg: *mut ::c_void) -> ::c_int;
-    pub fn pthread_getattr_np(native: ::pthread_t,
-                              attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
-                                     guardsize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
-                                 stackaddr: *mut *mut ::c_void,
-                                 stacksize: *mut ::size_t) -> ::c_int;
-    #[link_name = "__sigtimedwait50"]
-    pub fn sigtimedwait(set: *const sigset_t,
-                        info: *mut siginfo_t,
-                        timeout: *const ::timespec) -> ::c_int;
-    pub fn sigwaitinfo(set: *const sigset_t,
-                       info: *mut siginfo_t) -> ::c_int;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t);
-    pub fn localeconv_l(loc: ::locale_t) -> *mut lconv;
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    #[link_name = "__settimeofday50"]
-    pub fn settimeofday(tv: *const ::timeval, tz: *const ::c_void) -> ::c_int;
-}
-
-mod other;
-pub use self::other::*;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/b32/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/b64/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i64;
-pub type c_ulong = u64;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/netbsd/other/mod.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-cfg_if! {
-    if #[cfg(any(target_arch = "sparc64",
-                 target_arch = "x86_64"))] {
-        mod b64;
-        pub use self::b64::*;
-    } else if #[cfg(any(target_arch = "arm",
-                        target_arch = "powerpc",
-                        target_arch = "x86"))] {
-        mod b32;
-        pub use self::b32::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/bitrig.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-s! {
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-}
-
-pub const LC_COLLATE_MASK: ::c_int = (1 << 0);
-pub const LC_CTYPE_MASK: ::c_int = (1 << 1);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << 2);
-pub const LC_MONETARY_MASK: ::c_int = (1 << 3);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << 4);
-pub const LC_TIME_MASK: ::c_int = (1 << 5);
-pub const LC_ALL_MASK: ::c_int = LC_COLLATE_MASK
-                               | LC_CTYPE_MASK
-                               | LC_MESSAGES_MASK
-                               | LC_MONETARY_MASK
-                               | LC_NUMERIC_MASK
-                               | LC_TIME_MASK;
-
-pub const ERA: ::nl_item = 52;
-pub const ERA_D_FMT: ::nl_item = 53;
-pub const ERA_D_T_FMT: ::nl_item = 54;
-pub const ERA_T_FMT: ::nl_item = 55;
-pub const ALT_DIGITS: ::nl_item = 56;
-
-pub const D_MD_ORDER: ::nl_item = 57;
-
-pub const ALTMON_1: ::nl_item = 58;
-pub const ALTMON_2: ::nl_item = 59;
-pub const ALTMON_3: ::nl_item = 60;
-pub const ALTMON_4: ::nl_item = 61;
-pub const ALTMON_5: ::nl_item = 62;
-pub const ALTMON_6: ::nl_item = 63;
-pub const ALTMON_7: ::nl_item = 64;
-pub const ALTMON_8: ::nl_item = 65;
-pub const ALTMON_9: ::nl_item = 66;
-pub const ALTMON_10: ::nl_item = 67;
-pub const ALTMON_11: ::nl_item = 68;
-pub const ALTMON_12: ::nl_item = 69;
-
-pub const KERN_RND: ::c_int = 31;
-
-extern {
-    pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t) -> ::c_int;
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn querylocale(mask: ::c_int, loc: ::locale_t) -> *const ::c_char;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/mod.rs
+++ /dev/null
@@ -1,505 +0,0 @@
-pub type clock_t = i64;
-pub type suseconds_t = ::c_long;
-pub type dev_t = i32;
-pub type sigset_t = ::c_uint;
-pub type blksize_t = ::int32_t;
-pub type fsblkcnt_t = ::uint64_t;
-pub type fsfilcnt_t = ::uint64_t;
-pub type pthread_attr_t = *mut ::c_void;
-pub type pthread_mutex_t = *mut ::c_void;
-pub type pthread_mutexattr_t = *mut ::c_void;
-pub type pthread_cond_t = *mut ::c_void;
-pub type pthread_condattr_t = *mut ::c_void;
-pub type pthread_rwlock_t = *mut ::c_void;
-
-s! {
-    pub struct dirent {
-        pub d_fileno: ::ino_t,
-        pub d_off: ::off_t,
-        pub d_reclen: u16,
-        pub d_type: u8,
-        pub d_namlen: u8,
-        __d_padding: [u8; 4],
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct glob_t {
-        pub gl_pathc:   ::c_int,
-        pub gl_matchc:  ::c_int,
-        pub gl_offs:    ::c_int,
-        pub gl_flags:   ::c_int,
-        pub gl_pathv:   *mut *mut ::c_char,
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-    }
-
-    pub struct kevent {
-        pub ident: ::uintptr_t,
-        pub filter: ::c_short,
-        pub flags: ::c_ushort,
-        pub fflags: ::c_uint,
-        pub data: ::int64_t,
-        pub udata: *mut ::c_void,
-    }
-
-    pub struct stat {
-        pub st_mode: ::mode_t,
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_size: ::off_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_blksize: ::blksize_t,
-        pub st_flags: ::uint32_t,
-        pub st_gen: ::uint32_t,
-        pub st_birthtime: ::time_t,
-        pub st_birthtime_nsec: ::c_long,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: ::socklen_t,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_canonname: *mut ::c_char,
-        pub ai_next: *mut ::addrinfo,
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_len: u8,
-        pub ss_family: ::sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_pad2: i64,
-        __ss_pad3: [u8; 240],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_addr: *mut ::c_char,
-        #[cfg(target_pointer_width = "32")]
-        __pad: [u8; 112],
-        #[cfg(target_pointer_width = "64")]
-        __pad: [u8; 108],
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    pub struct lastlog {
-        ll_time: ::time_t,
-        ll_line: [::c_char; UT_LINESIZE],
-        ll_host: [::c_char; UT_HOSTSIZE],
-    }
-
-    pub struct utmp {
-        pub ut_line: [::c_char; UT_LINESIZE],
-        pub ut_name: [::c_char; UT_NAMESIZE],
-        pub ut_host: [::c_char; UT_HOSTSIZE],
-        pub ut_time: ::time_t,
-    }
-}
-
-pub const UT_NAMESIZE: usize = 32;
-pub const UT_LINESIZE: usize = 8;
-pub const UT_HOSTSIZE: usize = 256;
-
-pub const O_CLOEXEC: ::c_int = 0x10000;
-
-pub const MS_SYNC : ::c_int = 0x0002;
-pub const MS_INVALIDATE : ::c_int = 0x0004;
-
-pub const PTHREAD_STACK_MIN : ::size_t = 2048;
-
-pub const ENOATTR : ::c_int = 83;
-pub const EILSEQ : ::c_int = 84;
-pub const EOVERFLOW : ::c_int = 87;
-pub const ECANCELED : ::c_int = 88;
-pub const EIDRM : ::c_int = 89;
-pub const ENOMSG : ::c_int = 90;
-pub const ENOTSUP : ::c_int = 91;
-pub const ELAST : ::c_int = 91;
-
-pub const F_DUPFD_CLOEXEC : ::c_int = 10;
-
-pub const AT_FDCWD: ::c_int = -100;
-pub const AT_EACCESS: ::c_int = 0x01;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x02;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x04;
-pub const AT_REMOVEDIR: ::c_int = 0x08;
-
-pub const RLIM_NLIMITS: ::c_int = 9;
-
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_BINDANY: ::c_int = 0x1000;
-pub const SO_NETPROC: ::c_int = 0x1020;
-pub const SO_RTABLE: ::c_int = 0x1021;
-pub const SO_PEERCRED: ::c_int = 0x1022;
-pub const SO_SPLICE: ::c_int = 0x1023;
-
-pub const AF_ECMA: ::c_int = 8;
-pub const AF_ROUTE: ::c_int = 17;
-pub const AF_ENCAP: ::c_int = 28;
-pub const AF_SIP: ::c_int = 29;
-pub const AF_KEY: ::c_int = 30;
-pub const pseudo_AF_HDRCMPLT: ::c_int = 31;
-pub const AF_BLUETOOTH: ::c_int = 32;
-pub const AF_MPLS: ::c_int = 33;
-pub const pseudo_AF_PFLOW: ::c_int = 34;
-pub const pseudo_AF_PIPEX: ::c_int = 35;
-#[doc(hidden)]
-pub const AF_MAX: ::c_int = 36;
-
-#[doc(hidden)]
-pub const NET_MAXID: ::c_int = AF_MAX;
-pub const NET_RT_DUMP: ::c_int = 1;
-pub const NET_RT_FLAGS: ::c_int = 2;
-pub const NET_RT_IFLIST: ::c_int = 3;
-pub const NET_RT_STATS: ::c_int = 4;
-pub const NET_RT_TABLE: ::c_int = 5;
-pub const NET_RT_IFNAMES: ::c_int = 6;
-#[doc(hidden)]
-pub const NET_RT_MAXID: ::c_int = 7;
-
-pub const IPV6_JOIN_GROUP: ::c_int = 12;
-pub const IPV6_LEAVE_GROUP: ::c_int = 13;
-
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_ECMA: ::c_int = AF_ECMA;
-pub const PF_ENCAP: ::c_int = AF_ENCAP;
-pub const PF_SIP: ::c_int = AF_SIP;
-pub const PF_KEY: ::c_int = AF_KEY;
-pub const PF_BPF: ::c_int = pseudo_AF_HDRCMPLT;
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_MPLS: ::c_int = AF_MPLS;
-pub const PF_PFLOW: ::c_int = pseudo_AF_PFLOW;
-pub const PF_PIPEX: ::c_int = pseudo_AF_PIPEX;
-#[doc(hidden)]
-pub const PF_MAX: ::c_int = AF_MAX;
-
-pub const SCM_TIMESTAMP: ::c_int = 0x04;
-
-pub const O_DSYNC : ::c_int = 128;
-
-pub const MAP_RENAME : ::c_int = 0x0000;
-pub const MAP_NORESERVE : ::c_int = 0x0000;
-pub const MAP_HASSEMAPHORE : ::c_int = 0x0000;
-
-pub const EIPSEC : ::c_int = 82;
-pub const ENOMEDIUM : ::c_int = 85;
-pub const EMEDIUMTYPE : ::c_int = 86;
-
-pub const EAI_SYSTEM: ::c_int = -11;
-
-pub const RUSAGE_THREAD: ::c_int = 1;
-
-pub const MAP_COPY : ::c_int = 0x0002;
-pub const MAP_NOEXTEND : ::c_int = 0x0000;
-
-pub const _SC_CLK_TCK : ::c_int = 3;
-pub const _SC_IOV_MAX : ::c_int = 51;
-pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 100;
-pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 101;
-pub const _SC_LOGIN_NAME_MAX : ::c_int = 102;
-pub const _SC_MQ_PRIO_MAX : ::c_int = 59;
-pub const _SC_NPROCESSORS_ONLN : ::c_int = 503;
-pub const _SC_THREADS : ::c_int = 91;
-pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 77;
-pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 78;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS : ::c_int = 80;
-pub const _SC_THREAD_KEYS_MAX : ::c_int = 81;
-pub const _SC_THREAD_PRIO_INHERIT : ::c_int = 82;
-pub const _SC_THREAD_PRIO_PROTECT : ::c_int = 83;
-pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 84;
-pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 85;
-pub const _SC_THREAD_SAFE_FUNCTIONS : ::c_int = 103;
-pub const _SC_THREAD_STACK_MIN : ::c_int = 89;
-pub const _SC_THREAD_THREADS_MAX : ::c_int = 90;
-pub const _SC_TTY_NAME_MAX : ::c_int = 107;
-pub const _SC_ATEXIT_MAX : ::c_int = 46;
-pub const _SC_AIO_LISTIO_MAX : ::c_int = 42;
-pub const _SC_AIO_MAX : ::c_int = 43;
-pub const _SC_ASYNCHRONOUS_IO : ::c_int = 45;
-pub const _SC_MAPPED_FILES : ::c_int = 53;
-pub const _SC_MEMLOCK : ::c_int = 54;
-pub const _SC_MEMLOCK_RANGE : ::c_int = 55;
-pub const _SC_MEMORY_PROTECTION : ::c_int = 56;
-pub const _SC_MESSAGE_PASSING : ::c_int = 57;
-pub const _SC_MQ_OPEN_MAX : ::c_int = 58;
-pub const _SC_PRIORITY_SCHEDULING : ::c_int = 61;
-pub const _SC_SEMAPHORES : ::c_int = 67;
-pub const _SC_SHARED_MEMORY_OBJECTS : ::c_int = 68;
-pub const _SC_SYNCHRONIZED_IO : ::c_int = 75;
-pub const _SC_TIMERS : ::c_int = 94;
-pub const _SC_XOPEN_CRYPT : ::c_int = 117;
-pub const _SC_XOPEN_ENH_I18N : ::c_int = 118;
-pub const _SC_XOPEN_LEGACY : ::c_int = 119;
-pub const _SC_XOPEN_REALTIME : ::c_int = 120;
-pub const _SC_XOPEN_REALTIME_THREADS : ::c_int = 121;
-pub const _SC_XOPEN_UNIX : ::c_int = 123;
-pub const _SC_XOPEN_VERSION : ::c_int = 125;
-pub const _SC_SEM_NSEMS_MAX : ::c_int = 31;
-pub const _SC_SEM_VALUE_MAX : ::c_int = 32;
-pub const _SC_AIO_PRIO_DELTA_MAX : ::c_int = 44;
-pub const _SC_DELAYTIMER_MAX : ::c_int = 50;
-pub const _SC_PRIORITIZED_IO : ::c_int = 60;
-pub const _SC_REALTIME_SIGNALS : ::c_int = 64;
-pub const _SC_RTSIG_MAX : ::c_int = 66;
-pub const _SC_SIGQUEUE_MAX : ::c_int = 70;
-pub const _SC_TIMER_MAX : ::c_int = 93;
-pub const _SC_HOST_NAME_MAX : ::c_int = 33;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const ST_NOSUID: ::c_ulong = 2;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = 0 as *mut _;
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = 0 as *mut _;
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = 0 as *mut _;
-
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 1;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 2;
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 3;
-pub const PTHREAD_MUTEX_STRICT_NP: ::c_int = 4;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_STRICT_NP;
-
-pub const EVFILT_AIO: ::int16_t = -3;
-pub const EVFILT_PROC: ::int16_t = -5;
-pub const EVFILT_READ: ::int16_t = -1;
-pub const EVFILT_SIGNAL: ::int16_t = -6;
-pub const EVFILT_TIMER: ::int16_t = -7;
-pub const EVFILT_VNODE: ::int16_t = -4;
-pub const EVFILT_WRITE: ::int16_t = -2;
-
-pub const EV_ADD: ::uint16_t = 0x1;
-pub const EV_DELETE: ::uint16_t = 0x2;
-pub const EV_ENABLE: ::uint16_t = 0x4;
-pub const EV_DISABLE: ::uint16_t = 0x8;
-pub const EV_ONESHOT: ::uint16_t = 0x10;
-pub const EV_CLEAR: ::uint16_t = 0x20;
-pub const EV_FLAG1: ::uint16_t = 0x2000;
-pub const EV_ERROR: ::uint16_t = 0x4000;
-pub const EV_EOF: ::uint16_t = 0x8000;
-pub const EV_SYSFLAGS: ::uint16_t = 0xf000;
-
-pub const NOTE_LOWAT: ::uint32_t = 0x00000001;
-pub const NOTE_EOF: ::uint32_t = 0x00000002;
-pub const NOTE_DELETE: ::uint32_t = 0x00000001;
-pub const NOTE_WRITE: ::uint32_t = 0x00000002;
-pub const NOTE_EXTEND: ::uint32_t = 0x00000004;
-pub const NOTE_ATTRIB: ::uint32_t = 0x00000008;
-pub const NOTE_LINK: ::uint32_t = 0x00000010;
-pub const NOTE_RENAME: ::uint32_t = 0x00000020;
-pub const NOTE_REVOKE: ::uint32_t = 0x00000040;
-pub const NOTE_TRUNCATE: ::uint32_t = 0x00000080;
-pub const NOTE_EXIT: ::uint32_t = 0x80000000;
-pub const NOTE_FORK: ::uint32_t = 0x40000000;
-pub const NOTE_EXEC: ::uint32_t = 0x20000000;
-pub const NOTE_PDATAMASK: ::uint32_t = 0x000fffff;
-pub const NOTE_PCTRLMASK: ::uint32_t = 0xf0000000;
-pub const NOTE_TRACK: ::uint32_t = 0x00000001;
-pub const NOTE_TRACKERR: ::uint32_t = 0x00000002;
-pub const NOTE_CHILD: ::uint32_t = 0x00000004;
-
-pub const TMP_MAX : ::c_uint = 0x7fffffff;
-
-pub const NI_MAXHOST: ::size_t = 256;
-
-pub const RTLD_LOCAL: ::c_int = 0;
-pub const CTL_MAXNAME: ::c_int = 12;
-pub const CTLTYPE_NODE: ::c_int = 1;
-pub const CTLTYPE_INT: ::c_int = 2;
-pub const CTLTYPE_STRING: ::c_int = 3;
-pub const CTLTYPE_QUAD: ::c_int = 4;
-pub const CTLTYPE_STRUCT: ::c_int = 5;
-pub const CTL_UNSPEC: ::c_int = 0;
-pub const CTL_KERN: ::c_int = 1;
-pub const CTL_VM: ::c_int = 2;
-pub const CTL_FS: ::c_int = 3;
-pub const CTL_NET: ::c_int = 4;
-pub const CTL_DEBUG: ::c_int = 5;
-pub const CTL_HW: ::c_int = 6;
-pub const CTL_MACHDEP: ::c_int = 7;
-pub const CTL_DDB: ::c_int = 9;
-pub const CTL_VFS: ::c_int = 10;
-pub const CTL_MAXID: ::c_int = 11;
-pub const KERN_OSTYPE: ::c_int = 1;
-pub const KERN_OSRELEASE: ::c_int = 2;
-pub const KERN_OSREV: ::c_int = 3;
-pub const KERN_VERSION: ::c_int = 4;
-pub const KERN_MAXVNODES: ::c_int = 5;
-pub const KERN_MAXPROC: ::c_int = 6;
-pub const KERN_MAXFILES: ::c_int = 7;
-pub const KERN_ARGMAX: ::c_int = 8;
-pub const KERN_SECURELVL: ::c_int = 9;
-pub const KERN_HOSTNAME: ::c_int = 10;
-pub const KERN_HOSTID: ::c_int = 11;
-pub const KERN_CLOCKRATE: ::c_int = 12;
-pub const KERN_PROF: ::c_int = 16;
-pub const KERN_POSIX1: ::c_int = 17;
-pub const KERN_NGROUPS: ::c_int = 18;
-pub const KERN_JOB_CONTROL: ::c_int = 19;
-pub const KERN_SAVED_IDS: ::c_int = 20;
-pub const KERN_BOOTTIME: ::c_int = 21;
-pub const KERN_DOMAINNAME: ::c_int = 22;
-pub const KERN_MAXPARTITIONS: ::c_int = 23;
-pub const KERN_RAWPARTITION: ::c_int = 24;
-pub const KERN_MAXTHREAD: ::c_int = 25;
-pub const KERN_NTHREADS: ::c_int = 26;
-pub const KERN_OSVERSION: ::c_int = 27;
-pub const KERN_SOMAXCONN: ::c_int = 28;
-pub const KERN_SOMINCONN: ::c_int = 29;
-pub const KERN_USERMOUNT: ::c_int = 30;
-pub const KERN_NOSUIDCOREDUMP: ::c_int = 32;
-pub const KERN_FSYNC: ::c_int = 33;
-pub const KERN_SYSVMSG: ::c_int = 34;
-pub const KERN_SYSVSEM: ::c_int = 35;
-pub const KERN_SYSVSHM: ::c_int = 36;
-pub const KERN_ARND: ::c_int = 37;
-pub const KERN_MSGBUFSIZE: ::c_int = 38;
-pub const KERN_MALLOCSTATS: ::c_int = 39;
-pub const KERN_CPTIME: ::c_int = 40;
-pub const KERN_NCHSTATS: ::c_int = 41;
-pub const KERN_FORKSTAT: ::c_int = 42;
-pub const KERN_NSELCOLL: ::c_int = 43;
-pub const KERN_TTY: ::c_int = 44;
-pub const KERN_CCPU: ::c_int = 45;
-pub const KERN_FSCALE: ::c_int = 46;
-pub const KERN_NPROCS: ::c_int = 47;
-pub const KERN_MSGBUF: ::c_int = 48;
-pub const KERN_POOL: ::c_int = 49;
-pub const KERN_STACKGAPRANDOM: ::c_int = 50;
-pub const KERN_SYSVIPC_INFO: ::c_int = 51;
-pub const KERN_SPLASSERT: ::c_int = 54;
-pub const KERN_PROC_ARGS: ::c_int = 55;
-pub const KERN_NFILES: ::c_int = 56;
-pub const KERN_TTYCOUNT: ::c_int = 57;
-pub const KERN_NUMVNODES: ::c_int = 58;
-pub const KERN_MBSTAT: ::c_int = 59;
-pub const KERN_SEMINFO: ::c_int = 61;
-pub const KERN_SHMINFO: ::c_int = 62;
-pub const KERN_INTRCNT: ::c_int = 63;
-pub const KERN_WATCHDOG: ::c_int = 64;
-pub const KERN_PROC: ::c_int = 66;
-pub const KERN_MAXCLUSTERS: ::c_int = 67;
-pub const KERN_EVCOUNT: ::c_int = 68;
-pub const KERN_TIMECOUNTER: ::c_int = 69;
-pub const KERN_MAXLOCKSPERUID: ::c_int = 70;
-pub const KERN_CPTIME2: ::c_int = 71;
-pub const KERN_CACHEPCT: ::c_int = 72;
-pub const KERN_FILE: ::c_int = 73;
-pub const KERN_CONSDEV: ::c_int = 75;
-pub const KERN_NETLIVELOCKS: ::c_int = 76;
-pub const KERN_POOL_DEBUG: ::c_int = 77;
-pub const KERN_PROC_CWD: ::c_int = 78;
-pub const KERN_PROC_NOBROADCASTKILL: ::c_int = 79;
-pub const KERN_PROC_VMMAP: ::c_int = 80;
-pub const KERN_GLOBAL_PTRACE: ::c_int = 81;
-pub const KERN_CONSBUFSIZE: ::c_int = 82;
-pub const KERN_CONSBUF: ::c_int = 83;
-pub const KERN_MAXID: ::c_int = 84;
-pub const KERN_PROC_ALL: ::c_int = 0;
-pub const KERN_PROC_PID: ::c_int = 1;
-pub const KERN_PROC_PGRP: ::c_int = 2;
-pub const KERN_PROC_SESSION: ::c_int = 3;
-pub const KERN_PROC_TTY: ::c_int = 4;
-pub const KERN_PROC_UID: ::c_int = 5;
-pub const KERN_PROC_RUID: ::c_int = 6;
-pub const KERN_PROC_KTHREAD: ::c_int = 7;
-pub const KERN_PROC_SHOW_THREADS: ::c_int = 0x40000000;
-pub const KERN_SYSVIPC_MSG_INFO: ::c_int = 1;
-pub const KERN_SYSVIPC_SEM_INFO: ::c_int = 2;
-pub const KERN_SYSVIPC_SHM_INFO: ::c_int = 3;
-pub const KERN_PROC_ARGV: ::c_int = 1;
-pub const KERN_PROC_NARGV: ::c_int = 2;
-pub const KERN_PROC_ENV: ::c_int = 3;
-pub const KERN_PROC_NENV: ::c_int = 4;
-pub const KI_NGROUPS: ::c_int = 16;
-pub const KI_MAXCOMLEN: ::c_int = 24;
-pub const KI_WMESGLEN: ::c_int = 8;
-pub const KI_MAXLOGNAME: ::c_int = 32;
-pub const KI_EMULNAMELEN: ::c_int = 8;
-
-extern {
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::size_t,
-                       serv: *mut ::c_char,
-                       servlen: ::size_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn kevent(kq: ::c_int,
-                  changelist: *const ::kevent,
-                  nchanges: ::c_int,
-                  eventlist: *mut ::kevent,
-                  nevents: ::c_int,
-                  timeout: *const ::timespec) -> ::c_int;
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn pthread_main_np() -> ::c_int;
-    pub fn pthread_set_name_np(tid: ::pthread_t, name: *const ::c_char);
-    pub fn pthread_stackseg_np(thread: ::pthread_t,
-                               sinfo: *mut ::stack_t) -> ::c_int;
-    pub fn sysctl(name: *const ::c_int,
-                  namelen: ::c_uint,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn getentropy(buf: *mut ::c_void, buflen: ::size_t) -> ::c_int;
-    pub fn pledge(promises: *const ::c_char,
-                  paths: *mut *const ::c_char) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_os = "openbsd")] {
-        mod openbsd;
-        pub use self::openbsd::*;
-    } else if #[cfg(target_os = "bitrig")] {
-        mod bitrig;
-        pub use self::bitrig::*;
-    } else {
-        // Unknown target_os
-    }
-}
-
-mod other;
-pub use self::other::*;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/openbsd.rs
+++ /dev/null
@@ -1,33 +0,0 @@
-s! {
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-}
-
-extern {
-    pub fn accept4(s: ::c_int, addr: *mut ::sockaddr,
-                   addrlen: *mut ::socklen_t, flags: ::c_int) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/b32/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/b64/mod.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i64;
-pub type c_ulong = u64;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/bsd/netbsdlike/openbsdlike/other/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-cfg_if! {
-    if #[cfg(target_arch = "x86_64")] {
-        mod b64;
-        pub use self::b64::*;
-    } else if #[cfg(target_arch = "x86")] {
-        mod b32;
-        pub use self::b32::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/haiku/b32.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/haiku/b64.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-pub type c_ulong = u64;
-pub type c_long = i64;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/haiku/mod.rs
+++ /dev/null
@@ -1,818 +0,0 @@
-use dox::{mem, Option};
-
-pub type rlim_t = ::uintptr_t;
-pub type sa_family_t = u8;
-pub type pthread_key_t = ::c_int;
-pub type nfds_t = ::c_long;
-pub type tcflag_t = ::c_uint;
-pub type speed_t = ::c_uint;
-pub type c_char = i8;
-pub type clock_t = i32;
-pub type clockid_t = i32;
-pub type time_t = i32;
-pub type suseconds_t = i32;
-pub type wchar_t = i32;
-pub type off_t = i64;
-pub type ino_t = i64;
-pub type blkcnt_t = i64;
-pub type blksize_t = i32;
-pub type dev_t = i32;
-pub type mode_t = u32;
-pub type nlink_t = i32;
-pub type useconds_t = u32;
-pub type socklen_t = u32;
-pub type pthread_t = ::uintptr_t;
-pub type pthread_mutexattr_t = ::uintptr_t;
-pub type sigset_t = u64;
-pub type fsblkcnt_t = i64;
-pub type fsfilcnt_t = i64;
-pub type pthread_attr_t = *mut ::c_void;
-pub type nl_item = ::c_int;
-pub type id_t = i32;
-pub type idtype_t = ::c_uint;
-
-pub enum timezone {}
-
-s! {
-    pub struct sockaddr {
-        pub sa_len: u8,
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 30],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_len: u8,
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [u8; 24],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_len: u8,
-        pub sin6_family: sa_family_t,
-        pub sin6_port: ::in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-
-    pub struct sockaddr_un {
-        pub sun_len: u8,
-        pub sun_family: sa_family_t,
-        pub sun_path: [::c_char; 126]
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_len: u8,
-        pub ss_family: sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_pad2: u64,
-        __ss_pad3: [u8; 112],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: socklen_t,
-        pub ai_canonname: *mut c_char,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct fd_set {
-        fds_bits: [c_ulong; FD_SETSIZE / ULONG_SIZE],
-    }
-
-    pub struct tm {
-        pub tm_sec: ::c_int,
-        pub tm_min: ::c_int,
-        pub tm_hour: ::c_int,
-        pub tm_mday: ::c_int,
-        pub tm_mon: ::c_int,
-        pub tm_year: ::c_int,
-        pub tm_wday: ::c_int,
-        pub tm_yday: ::c_int,
-        pub tm_isdst: ::c_int,
-        pub tm_gmtoff: ::c_long,
-        pub tm_zone: *const ::c_char,
-    }
-
-    pub struct utsname {
-        pub sysname: [::c_char; 32],
-        pub nodename: [::c_char; 32],
-        pub release: [::c_char; 32],
-        pub version: [::c_char; 32],
-        pub machine: [::c_char; 32],
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::socklen_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line:  ::c_char,
-        pub c_ispeed: ::speed_t,
-        pub c_ospeed: ::speed_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct stat {
-        pub st_dev: dev_t,
-        pub st_ino: ino_t,
-        pub st_mode: mode_t,
-        pub st_nlink: nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_size: off_t,
-        pub st_rdev: dev_t,
-        pub st_blksize: blksize_t,
-        pub st_atime: time_t,
-        pub st_atime_nsec: c_long,
-        pub st_mtime: time_t,
-        pub st_mtime_nsec: c_long,
-        pub st_ctime: time_t,
-        pub st_ctime_nsec: c_long,
-        pub st_crtime: time_t,
-        pub st_crtime_nsec: c_long,
-        pub st_type: u32,
-        pub st_blocks: blkcnt_t,
-    }
-
-    pub struct dirent {
-        pub d_dev: dev_t,
-        pub d_pdev: dev_t,
-        pub d_ino: ino_t,
-        pub d_pino: i64,
-        pub d_reclen: ::c_ushort,
-        pub d_name: [::c_char; 1024], // Max length is _POSIX_PATH_MAX
-    }
-
-    pub struct glob_t {
-        pub gl_pathc: ::size_t,
-        __unused1: ::size_t,
-        pub gl_offs: ::size_t,
-        __unused2: ::size_t,
-        pub gl_pathv: *mut *mut c_char,
-
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-        __unused8: *mut ::c_void,
-    }
-
-    pub struct pthread_mutex_t {
-        flags: u32,
-        lock: i32,
-        unused: i32,
-        owner: i32,
-        owner_count: i32,
-    }
-
-    pub struct pthread_cond_t {
-        flags: u32,
-        unused: i32,
-        mutex: *mut ::c_void,
-        waiter_count: i32,
-        lock: i32,
-    }
-
-    pub struct pthread_rwlock_t {
-        flags: u32,
-        owner: i32,
-        lock_sem: i32,      // this is actually a union
-        lock_count: i32,
-        reader_count: i32,
-        writer_count: i32,
-        waiters: [*mut ::c_void; 2],
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-        pub pw_gecos: *mut ::c_char,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_pid: ::pid_t,
-        pub si_uid: ::uid_t,
-        pub si_addr: *mut ::c_void,
-        pub si_status: ::c_int,
-        pub si_band: c_long,
-        pub sigval: *mut ::c_void,
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        pub sa_flags: ::c_int,
-        sa_userdata: *mut ::c_void,
-    }
-
-    pub struct sem_t {
-        pub se_type: i32,
-        pub se_named_id: i32, // this is actually a union
-        pub se_unnamed: i32,
-        pub se_padding: [i32; 4],
-    }
-
-    pub struct pthread_condattr_t {
-        pub process_shared: bool,
-        pub clock_id: i32,
-    }
-}
-
-// intentionally not public, only used for fd_set
-cfg_if! {
-    if #[cfg(target_pointer_width = "32")] {
-        const ULONG_SIZE: usize = 32;
-    } else if #[cfg(target_pointer_width = "64")] {
-        const ULONG_SIZE: usize = 64;
-    } else {
-        // Unknown target_pointer_width
-    }
-}
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 2147483647;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 2;
-pub const _IOLBF: ::c_int = 1;
-
-pub const F_DUPFD: ::c_int = 0x0001;
-pub const F_GETFD: ::c_int = 0x0002;
-pub const F_SETFD: ::c_int = 0x0004;
-pub const F_GETFL: ::c_int = 0x0008;
-pub const F_SETFL: ::c_int = 0x0010;
-
-pub const SIGTRAP: ::c_int = 22;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 1;
-
-pub const CLOCK_REALTIME: ::c_int = -1;
-pub const CLOCK_MONOTONIC: ::c_int = 0;
-
-pub const RLIMIT_CORE: ::c_int = 0;
-pub const RLIMIT_CPU: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_FSIZE: ::c_int = 3;
-pub const RLIMIT_NOFILE: ::c_int = 4;
-pub const RLIMIT_AS: ::c_int = 6;
-// Haiku specific
-pub const RLIMIT_NOVMON: ::c_int = 7;
-pub const RLIMIT_NLIMITS: ::c_int = 8;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-
-pub const NCCS: usize = 11;
-
-pub const O_RDONLY: ::c_int = 0x0000;
-pub const O_WRONLY: ::c_int = 0x0001;
-pub const O_RDWR: ::c_int = 0x0002;
-pub const O_ACCMODE: ::c_int = 0x0003;
-
-pub const O_EXCL: ::c_int = 0x0100;
-pub const O_CREAT: ::c_int = 0x0200;
-pub const O_TRUNC: ::c_int = 0x0400;
-pub const O_NOCTTY: ::c_int = 0x1000;
-pub const O_NOTRAVERSE: ::c_int = 0x2000;
-
-pub const O_CLOEXEC: ::c_int = 0x00000040;
-pub const O_NONBLOCK: ::c_int = 0x00000080;
-pub const O_APPEND: ::c_int = 0x00000800;
-pub const O_SYNC: ::c_int = 0x00010000;
-pub const O_RSYNC: ::c_int = 0x00020000;
-pub const O_DSYNC: ::c_int = 0x00040000;
-pub const O_NOFOLLOW: ::c_int = 0x00080000;
-pub const O_NOCACHE: ::c_int = 0x00100000;
-pub const O_DIRECTORY: ::c_int = 0x00200000;
-
-pub const S_IFIFO: ::mode_t = 61440;
-pub const S_IFCHR: ::mode_t = 49152;
-pub const S_IFBLK: ::mode_t = 24576;
-pub const S_IFDIR: ::mode_t = 16384;
-pub const S_IFREG: ::mode_t = 32768;
-pub const S_IFLNK: ::mode_t = 40960;
-pub const S_IFSOCK: ::mode_t = 49152;
-pub const S_IFMT: ::mode_t = 61440;
-pub const S_IRWXU: ::mode_t = 448;
-pub const S_IXUSR: ::mode_t = 64;
-pub const S_IWUSR: ::mode_t = 128;
-pub const S_IRUSR: ::mode_t = 256;
-pub const S_IRWXG: ::mode_t = 70;
-pub const S_IXGRP: ::mode_t = 10;
-pub const S_IWGRP: ::mode_t = 20;
-pub const S_IRGRP: ::mode_t = 40;
-pub const S_IRWXO: ::mode_t = 7;
-pub const S_IXOTH: ::mode_t = 1;
-pub const S_IWOTH: ::mode_t = 2;
-pub const S_IROTH: ::mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGPIPE: ::c_int = 7;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const LC_ALL: ::c_int = 0;
-pub const LC_COLLATE: ::c_int = 1;
-pub const LC_CTYPE: ::c_int = 2;
-pub const LC_MONETARY: ::c_int = 3;
-pub const LC_NUMERIC: ::c_int = 4;
-pub const LC_TIME: ::c_int = 5;
-pub const LC_MESSAGES: ::c_int = 6;
-
-// TODO: Haiku does not have MAP_FILE, but libstd/os.rs requires it
-pub const MAP_FILE: ::c_int = 0x00;
-pub const MAP_SHARED: ::c_int = 0x01;
-pub const MAP_PRIVATE: ::c_int = 0x02;
-pub const MAP_FIXED: ::c_int = 0x004;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-pub const MS_ASYNC: ::c_int = 0x01;
-pub const MS_INVALIDATE: ::c_int = 0x04;
-pub const MS_SYNC: ::c_int = 0x02;
-
-pub const EPERM : ::c_int = -2147483633;
-pub const ENOENT : ::c_int = -2147459069;
-pub const ESRCH : ::c_int = -2147454963;
-pub const EINTR : ::c_int = -2147483638;
-pub const EIO : ::c_int = -2147483647;
-pub const ENXIO : ::c_int = -2147454965;
-pub const E2BIG : ::c_int = -2147454975;
-pub const ENOEXEC : ::c_int = -2147478782;
-pub const EBADF : ::c_int = -2147459072;
-pub const ECHILD : ::c_int = -2147454974;
-pub const EDEADLK : ::c_int = -2147454973;
-pub const ENOMEM : ::c_int = -2147454976;
-pub const EACCES : ::c_int = -2147483646;
-pub const EFAULT : ::c_int = -2147478783;
-// pub const ENOTBLK : ::c_int = 15;
-pub const EBUSY : ::c_int = -2147483634;
-pub const EEXIST : ::c_int = -2147459070;
-pub const EXDEV : ::c_int = -2147459061;
-pub const ENODEV : ::c_int = -2147454969;
-pub const ENOTDIR : ::c_int = -2147459067;
-pub const EISDIR : ::c_int = -2147459063;
-pub const EINVAL : ::c_int = -2147483643;
-pub const ENFILE : ::c_int = -2147454970;
-pub const EMFILE : ::c_int = -2147459062;
-pub const ENOTTY : ::c_int = -2147454966;
-pub const ETXTBSY : ::c_int = -2147454917;
-pub const EFBIG : ::c_int = -2147454972;
-pub const ENOSPC : ::c_int = -2147459065;
-pub const ESPIPE : ::c_int = -2147454964;
-pub const EROFS : ::c_int = -2147459064;
-pub const EMLINK : ::c_int = -2147454971;
-pub const EPIPE : ::c_int = -2147459059;
-pub const EDOM : ::c_int = -2147454960;
-pub const ERANGE : ::c_int = -2147454959;
-pub const EAGAIN : ::c_int = -2147483637;
-pub const EWOULDBLOCK : ::c_int = -2147483637;
-
-pub const EINPROGRESS : ::c_int = -2147454940;
-pub const EALREADY : ::c_int = -2147454939;
-pub const ENOTSOCK : ::c_int = -2147454932;
-pub const EDESTADDRREQ : ::c_int = -2147454928;
-pub const EMSGSIZE : ::c_int = -2147454934;
-pub const EPROTOTYPE : ::c_int = -2147454958;
-pub const ENOPROTOOPT : ::c_int = -2147454942;
-pub const EPROTONOSUPPORT : ::c_int = -2147454957;
-pub const EOPNOTSUPP : ::c_int = -2147454933;
-pub const EPFNOSUPPORT : ::c_int = -2147454956;
-pub const EAFNOSUPPORT : ::c_int = -2147454955;
-pub const EADDRINUSE : ::c_int = -2147454954;
-pub const EADDRNOTAVAIL : ::c_int = -2147454953;
-pub const ENETDOWN : ::c_int = -2147454953;
-pub const ENETUNREACH : ::c_int = -2147454951;
-pub const ENETRESET : ::c_int = -2147454950;
-pub const ECONNABORTED : ::c_int = -2147454949;
-pub const ECONNRESET : ::c_int = -2147454948;
-pub const ENOBUFS : ::c_int = -2147454941;
-pub const EISCONN : ::c_int = -2147454947;
-pub const ENOTCONN : ::c_int = -2147454946;
-pub const ESHUTDOWN : ::c_int = -2147454945;
-pub const ETIMEDOUT : ::c_int = -2147483639;
-pub const ECONNREFUSED : ::c_int = -2147454944;
-pub const ELOOP : ::c_int = -2147459060;
-pub const ENAMETOOLONG : ::c_int = -2147459068;
-pub const EHOSTDOWN : ::c_int = -2147454931;
-pub const EHOSTUNREACH : ::c_int = -2147454943;
-pub const ENOTEMPTY : ::c_int = -2147459066;
-pub const EDQUOT : ::c_int = -2147454927;
-pub const ESTALE : ::c_int = -2147454936;
-pub const ENOLCK : ::c_int = -2147454968;
-pub const ENOSYS : ::c_int = -2147454967;
-pub const EIDRM : ::c_int = -2147454926;
-pub const ENOMSG : ::c_int = -2147454937;
-pub const EOVERFLOW : ::c_int = -2147454935;
-pub const ECANCELED : ::c_int = -2147454929;
-pub const EILSEQ : ::c_int = -2147454938;
-pub const ENOATTR : ::c_int = -2147454916;
-pub const EBADMSG : ::c_int = -2147454930;
-pub const EMULTIHOP : ::c_int = -2147454925;
-pub const ENOLINK : ::c_int = -2147454923;
-pub const EPROTO : ::c_int = -2147454919;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-// These are prefixed with POSIX_ on Haiku
-pub const MADV_NORMAL: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_RANDOM: ::c_int = 3;
-pub const MADV_WILLNEED: ::c_int = 4;
-pub const MADV_DONTNEED: ::c_int = 5;
-
-pub const IFF_LOOPBACK: ::c_int = 0x0008;
-
-pub const AF_UNIX: ::c_int = 9;
-pub const AF_INET: ::c_int = 1;
-pub const AF_INET6: ::c_int = 6;
-pub const SOCK_RAW: ::c_int = 3;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 10;
-pub const IP_MULTICAST_LOOP: ::c_int = 11;
-pub const IP_TTL: ::c_int = 4;
-pub const IP_HDRINCL: ::c_int = 2;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 12;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 13;
-
-pub const TCP_NODELAY: ::c_int = 0x01;
-pub const TCP_MAXSEG: ::c_int = 0x02;
-pub const TCP_NOPUSH: ::c_int = 0x04;
-pub const TCP_NOOPT: ::c_int = 0x08;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 26;
-pub const IPV6_JOIN_GROUP: ::c_int = 28;
-pub const IPV6_LEAVE_GROUP: ::c_int = 29;
-pub const IPV6_V6ONLY: ::c_int = 30;
-
-pub const SO_DEBUG: ::c_int = 0x00000004;
-
-pub const MSG_PEEK: ::c_int = 0x2;
-pub const MSG_NOSIGNAL: ::c_int = 0x0800;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 0x01;
-pub const LOCK_EX: ::c_int = 0x02;
-pub const LOCK_NB: ::c_int = 0x04;
-pub const LOCK_UN: ::c_int = 0x08;
-
-pub const SIGSTKSZ: ::size_t = 16384;
-
-pub const SA_NODEFER: ::c_int = 0x08;
-pub const SA_RESETHAND: ::c_int = 0x04;
-pub const SA_RESTART: ::c_int = 0x10;
-pub const SA_NOCLDSTOP: ::c_int = 0x01;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const RTLD_NOW: ::c_int = 0x1;
-pub const RTLD_DEFAULT: *mut ::c_void = 0isize as *mut ::c_void;
-
-pub const BUFSIZ: ::c_uint = 8192;
-pub const FILENAME_MAX: ::c_uint = 256;
-pub const FOPEN_MAX: ::c_uint = 128;
-pub const L_tmpnam: ::c_uint = 512;
-pub const TMP_MAX: ::c_uint = 32768;
-pub const _PC_NAME_MAX: ::c_int = 4;
-
-pub const FIONBIO: ::c_int = 0xbe000000;
-
-pub const _SC_IOV_MAX : ::c_int = 32;
-pub const _SC_GETGR_R_SIZE_MAX : ::c_int = 25;
-pub const _SC_GETPW_R_SIZE_MAX : ::c_int = 26;
-pub const _SC_PAGESIZE : ::c_int = 27;
-pub const _SC_THREAD_ATTR_STACKADDR : ::c_int = 48;
-pub const _SC_THREAD_ATTR_STACKSIZE : ::c_int = 49;
-pub const _SC_THREAD_PRIORITY_SCHEDULING : ::c_int = 50;
-pub const _SC_THREAD_PROCESS_SHARED : ::c_int = 46;
-pub const _SC_THREAD_STACK_MIN : ::c_int = 47;
-pub const _SC_THREADS : ::c_int = 31;
-pub const _SC_ATEXIT_MAX : ::c_int = 37;
-
-pub const PTHREAD_STACK_MIN: ::size_t = 8192;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    flags: 0,
-    lock: 0,
-    unused: -42,
-    owner: -1,
-    owner_count: 0,
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    flags: 0,
-    unused: -42,
-    mutex: 0 as *mut _,
-    waiter_count: 0,
-    lock: 0,
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    flags: 0,
-    owner: 0,
-    lock_sem: 0,
-    lock_count: 0,
-    reader_count: 0,
-    writer_count: 0,
-    waiters: [0 as *mut _; 2],
-};
-
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = 0;
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 1;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 3;
-
-pub const FIOCLEX: c_ulong = 0; // TODO: does not exist on Haiku!
-
-pub const SA_ONSTACK: c_ulong = 0x20;
-pub const SA_SIGINFO: c_ulong = 0x40;
-pub const SA_NOCLDWAIT: c_ulong = 0x02;
-
-pub const SIGCHLD: ::c_int = 5;
-pub const SIGBUS: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 3;
-
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-
-pub const SOL_SOCKET: ::c_int = -1;
-pub const SO_ACCEPTCONN: ::c_int = 0x00000001;
-pub const SO_BROADCAST: ::c_int = 0x00000002;
-pub const SO_DONTROUTE: ::c_int = 0x00000008;
-pub const SO_KEEPALIVE: ::c_int = 0x00000010;
-pub const SO_OOBINLINE: ::c_int = 0x00000020;
-pub const SO_REUSEADDR: ::c_int = 0x00000040;
-pub const SO_REUSEPORT: ::c_int = 0x00000080;
-pub const SO_USELOOPBACK: ::c_int = 0x00000100;
-pub const SO_LINGER: ::c_int = 0x00000200;
-pub const SO_SNDBUF: ::c_int = 0x40000001;
-pub const SO_SNDLOWAT: ::c_int = 0x40000002;
-pub const SO_SNDTIMEO: ::c_int = 0x40000003;
-pub const SO_RCVBUF: ::c_int = 0x40000004;
-pub const SO_RCVLOWAT: ::c_int = 0x40000005;
-pub const SO_RCVTIMEO: ::c_int = 0x40000006;
-pub const SO_ERROR: ::c_int = 0x40000007;
-pub const SO_TYPE: ::c_int = 0x40000008;
-pub const SO_NONBLOCK: ::c_int = 0x40000009;
-pub const SO_BINDTODEVICE: ::c_int = 0x4000000a;
-pub const SO_PEERCRED: ::c_int = 0x4000000b;
-
-pub const NI_MAXHOST: ::size_t = 1025;
-
-pub const WNOHANG: ::c_int = 0x01;
-pub const WUNTRACED: ::c_int = 0x02;
-pub const WCONTINUED: ::c_int = 0x04;
-pub const WEXITED: ::c_int = 0x08;
-pub const WSTOPPED: ::c_int = 0x10;
-pub const WNOWAIT: ::c_int = 0x20;
-
-pub const P_ALL: idtype_t = 0;
-pub const P_PID: idtype_t = 1;
-pub const P_PGID: idtype_t = 2;
-
-f! {
-    pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] &= !(1 << (fd % size));
-        return
-    }
-
-    pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0
-    }
-
-    pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] |= 1 << (fd % size);
-        return
-    }
-
-    pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn WIFEXITED(status: ::c_int) -> bool {
-        (status >> 8) == 0
-    }
-
-    pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
-        (status & 0xff)
-    }
-
-    pub fn WTERMSIG(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xff
-    }
-}
-
-extern {
-    pub fn clock_gettime(clk_id: ::c_int, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: ::c_int, tp: *const ::timespec) -> ::c_int;
-    pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
-                                     guardsize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
-                                 stackaddr: *mut *mut ::c_void,
-                                 stacksize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t,
-                                     clock_id: *mut clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
-    pub fn setgroups(ngroups: ::size_t,
-                     ptr: *const ::gid_t) -> ::c_int;
-    pub fn getpwuid_r(uid: ::uid_t,
-                      pwd: *mut passwd,
-                      buffer: *mut ::c_char,
-                      bufferSize: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int;
-    pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::size_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::size_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-    pub fn glob(pattern: *const ::c_char,
-                flags: ::c_int,
-                errfunc: Option<extern fn(epath: *const ::c_char,
-                                          errno: ::c_int) -> ::c_int>,
-                pglob: *mut ::glob_t) -> ::c_int;
-    pub fn globfree(pglob: *mut ::glob_t);
-
-    pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                         -> ::c_int;
-
-    pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
-
-    pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long);
-
-    pub fn telldir(dirp: *mut ::DIR) -> ::c_long;
-    pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                  -> ::c_int;
-
-    pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
-
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *mut ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int;
-    pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int;
-    pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char;
-
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::socklen_t) -> ::c_int;
-
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-}
-
-cfg_if! {
-    if #[cfg(target_pointer_width = "64")] {
-        mod b64;
-        pub use self::b64::*;
-    } else {
-        mod b32;
-        pub use self::b32::*;
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/mod.rs
+++ /dev/null
@@ -1,907 +0,0 @@
-//! Definitions found commonly among almost all Unix derivatives
-//!
-//! More functions and definitions can be found in the more specific modules
-//! according to the platform in question.
-
-use dox::Option;
-
-pub type pid_t = i32;
-pub type uid_t = u32;
-pub type gid_t = u32;
-pub type in_addr_t = u32;
-pub type in_port_t = u16;
-pub type sighandler_t = ::size_t;
-pub type cc_t = ::c_uchar;
-
-pub enum DIR {}
-pub enum locale_t {}
-
-s! {
-    pub struct group {
-        pub gr_name: *mut ::c_char,
-        pub gr_passwd: *mut ::c_char,
-        pub gr_gid: ::gid_t,
-        pub gr_mem: *mut *mut ::c_char,
-    }
-
-    pub struct utimbuf {
-        pub actime: time_t,
-        pub modtime: time_t,
-    }
-
-    pub struct timeval {
-        pub tv_sec: time_t,
-        pub tv_usec: suseconds_t,
-    }
-
-    pub struct timespec {
-        pub tv_sec: time_t,
-        pub tv_nsec: c_long,
-    }
-
-    pub struct rlimit {
-        pub rlim_cur: rlim_t,
-        pub rlim_max: rlim_t,
-    }
-
-    pub struct rusage {
-        pub ru_utime: timeval,
-        pub ru_stime: timeval,
-        pub ru_maxrss: c_long,
-        pub ru_ixrss: c_long,
-        pub ru_idrss: c_long,
-        pub ru_isrss: c_long,
-        pub ru_minflt: c_long,
-        pub ru_majflt: c_long,
-        pub ru_nswap: c_long,
-        pub ru_inblock: c_long,
-        pub ru_oublock: c_long,
-        pub ru_msgsnd: c_long,
-        pub ru_msgrcv: c_long,
-        pub ru_nsignals: c_long,
-        pub ru_nvcsw: c_long,
-        pub ru_nivcsw: c_long,
-
-        #[cfg(any(target_env = "musl"))]
-        __reserved: [c_long; 16],
-    }
-
-    #[cfg_attr(target_os = "netbsd", repr(packed))]
-    pub struct in_addr {
-        pub s_addr: in_addr_t,
-    }
-
-    pub struct in6_addr {
-        pub s6_addr: [u8; 16],
-        __align: [u32; 0],
-    }
-
-    pub struct ip_mreq {
-        pub imr_multiaddr: in_addr,
-        pub imr_interface: in_addr,
-    }
-
-    pub struct ipv6_mreq {
-        pub ipv6mr_multiaddr: in6_addr,
-        #[cfg(target_os = "android")]
-        pub ipv6mr_interface: ::c_int,
-        #[cfg(not(target_os = "android"))]
-        pub ipv6mr_interface: ::c_uint,
-    }
-
-    pub struct hostent {
-        pub h_name: *mut ::c_char,
-        pub h_aliases: *mut *mut ::c_char,
-        pub h_addrtype: ::c_int,
-        pub h_length: ::c_int,
-        pub h_addr_list: *mut *mut ::c_char,
-    }
-
-    pub struct iovec {
-        pub iov_base: *mut ::c_void,
-        pub iov_len: ::size_t,
-    }
-
-    pub struct pollfd {
-        pub fd: ::c_int,
-        pub events: ::c_short,
-        pub revents: ::c_short,
-    }
-
-    pub struct winsize {
-        pub ws_row: ::c_ushort,
-        pub ws_col: ::c_ushort,
-        pub ws_xpixel: ::c_ushort,
-        pub ws_ypixel: ::c_ushort,
-    }
-
-    pub struct linger {
-        pub l_onoff: ::c_int,
-        pub l_linger: ::c_int,
-    }
-
-    pub struct sigval {
-        // Actually a union of an int and a void*
-        pub sival_ptr: *mut ::c_void
-    }
-
-    // <sys/time.h>
-    pub struct itimerval {
-        pub it_interval: ::timeval,
-        pub it_value: ::timeval,
-    }
-
-    // <sys/times.h>
-    pub struct tms {
-        pub tms_utime: ::clock_t,
-        pub tms_stime: ::clock_t,
-        pub tms_cutime: ::clock_t,
-        pub tms_cstime: ::clock_t,
-    }
-}
-
-pub const SIG_DFL: sighandler_t = 0 as sighandler_t;
-pub const SIG_IGN: sighandler_t = 1 as sighandler_t;
-pub const SIG_ERR: sighandler_t = !0 as sighandler_t;
-
-pub const DT_FIFO: u8 = 1;
-pub const DT_CHR: u8 = 2;
-pub const DT_DIR: u8 = 4;
-pub const DT_BLK: u8 = 6;
-pub const DT_REG: u8 = 8;
-pub const DT_LNK: u8 = 10;
-pub const DT_SOCK: u8 = 12;
-
-pub const FD_CLOEXEC: ::c_int = 0x1;
-
-pub const USRQUOTA: ::c_int = 0;
-pub const GRPQUOTA: ::c_int = 1;
-
-pub const SIGIOT: ::c_int = 6;
-
-pub const S_ISUID: ::c_int = 0x800;
-pub const S_ISGID: ::c_int = 0x400;
-pub const S_ISVTX: ::c_int = 0x200;
-
-pub const POLLIN: ::c_short = 0x1;
-pub const POLLPRI: ::c_short = 0x2;
-pub const POLLOUT: ::c_short = 0x4;
-pub const POLLERR: ::c_short = 0x8;
-pub const POLLHUP: ::c_short = 0x10;
-pub const POLLNVAL: ::c_short = 0x20;
-
-pub const IF_NAMESIZE: ::size_t = 16;
-
-pub const RTLD_LAZY: ::c_int = 0x1;
-
-pub const LOG_EMERG: ::c_int = 0;
-pub const LOG_ALERT: ::c_int = 1;
-pub const LOG_CRIT: ::c_int = 2;
-pub const LOG_ERR: ::c_int = 3;
-pub const LOG_WARNING: ::c_int = 4;
-pub const LOG_NOTICE: ::c_int = 5;
-pub const LOG_INFO: ::c_int = 6;
-pub const LOG_DEBUG: ::c_int = 7;
-
-pub const LOG_KERN: ::c_int = 0;
-pub const LOG_USER: ::c_int = 1 << 3;
-pub const LOG_MAIL: ::c_int = 2 << 3;
-pub const LOG_DAEMON: ::c_int = 3 << 3;
-pub const LOG_AUTH: ::c_int = 4 << 3;
-pub const LOG_SYSLOG: ::c_int = 5 << 3;
-pub const LOG_LPR: ::c_int = 6 << 3;
-pub const LOG_NEWS: ::c_int = 7 << 3;
-pub const LOG_UUCP: ::c_int = 8 << 3;
-pub const LOG_LOCAL0: ::c_int = 16 << 3;
-pub const LOG_LOCAL1: ::c_int = 17 << 3;
-pub const LOG_LOCAL2: ::c_int = 18 << 3;
-pub const LOG_LOCAL3: ::c_int = 19 << 3;
-pub const LOG_LOCAL4: ::c_int = 20 << 3;
-pub const LOG_LOCAL5: ::c_int = 21 << 3;
-pub const LOG_LOCAL6: ::c_int = 22 << 3;
-pub const LOG_LOCAL7: ::c_int = 23 << 3;
-
-pub const LOG_PID: ::c_int = 0x01;
-pub const LOG_CONS: ::c_int = 0x02;
-pub const LOG_ODELAY: ::c_int = 0x04;
-pub const LOG_NDELAY: ::c_int = 0x08;
-pub const LOG_NOWAIT: ::c_int = 0x10;
-
-pub const LOG_PRIMASK: ::c_int = 7;
-pub const LOG_FACMASK: ::c_int = 0x3f8;
-
-pub const PRIO_PROCESS: ::c_int = 0;
-pub const PRIO_PGRP: ::c_int = 1;
-pub const PRIO_USER: ::c_int = 2;
-
-pub const PRIO_MIN: ::c_int = -20;
-pub const PRIO_MAX: ::c_int = 20;
-
-cfg_if! {
-    if #[cfg(dox)] {
-        // on dox builds don't pull in anything
-    } else if #[cfg(all(not(stdbuild), feature = "use_std"))] {
-        // cargo build, don't pull in anything extra as the libstd  dep
-        // already pulls in all libs.
-    } else if #[cfg(any(all(target_env = "musl", not(target_arch = "mips"))))] {
-        #[link(name = "c", kind = "static", cfg(target_feature = "crt-static"))]
-        #[link(name = "c", cfg(not(target_feature = "crt-static")))]
-        extern {}
-    } else if #[cfg(target_os = "emscripten")] {
-        #[link(name = "c")]
-        extern {}
-    } else if #[cfg(all(target_os = "netbsd", target_vendor = "rumprun"))] {
-        // Since we don't use -nodefaultlibs on Rumprun, libc is always pulled
-        // in automatically by the linker. We avoid passing it explicitly, as it
-        // causes some versions of binutils to crash with an assertion failure.
-        #[link(name = "m")]
-        extern {}
-    } else if #[cfg(any(target_os = "macos",
-                        target_os = "ios",
-                        target_os = "android",
-                        target_os = "openbsd",
-                        target_os = "bitrig"))] {
-        #[link(name = "c")]
-        #[link(name = "m")]
-        extern {}
-    } else if #[cfg(target_os = "haiku")] {
-        #[link(name = "root")]
-        #[link(name = "network")]
-        extern {}
-    } else if #[cfg(target_os = "fuchsia")] {
-        #[link(name = "c")]
-        #[link(name = "mxio")]
-        extern {}
-    } else {
-        #[link(name = "c")]
-        #[link(name = "m")]
-        #[link(name = "rt")]
-        #[link(name = "pthread")]
-        extern {}
-    }
-}
-
-extern {
-    pub fn getgrnam(name: *const ::c_char) -> *mut group;
-    pub fn getgrgid(gid: ::gid_t) -> *mut group;
-
-    pub fn endpwent();
-    #[cfg_attr(target_os = "netbsd", link_name = "__getpwnam50")]
-    pub fn getpwnam(name: *const ::c_char) -> *mut passwd;
-    #[cfg_attr(target_os = "netbsd", link_name = "__getpwuid50")]
-    pub fn getpwuid(uid: ::uid_t) -> *mut passwd;
-
-    pub fn fprintf(stream: *mut ::FILE,
-                   format: *const ::c_char, ...) -> ::c_int;
-    pub fn printf(format: *const ::c_char, ...) -> ::c_int;
-    pub fn snprintf(s: *mut ::c_char, n: ::size_t,
-                    format: *const ::c_char, ...) -> ::c_int;
-    pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int;
-    pub fn fscanf(stream: *mut ::FILE, format: *const ::c_char, ...) -> ::c_int;
-    pub fn scanf(format: *const ::c_char, ...) -> ::c_int;
-    pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int;
-    pub fn getchar_unlocked() -> ::c_int;
-    pub fn putchar_unlocked(c: ::c_int) -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__socket30")]
-    pub fn socket(domain: ::c_int, ty: ::c_int, protocol: ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "connect$UNIX2003")]
-    pub fn connect(socket: ::c_int, address: *const sockaddr,
-                   len: socklen_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "listen$UNIX2003")]
-    pub fn listen(socket: ::c_int, backlog: ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "accept$UNIX2003")]
-    pub fn accept(socket: ::c_int, address: *mut sockaddr,
-                  address_len: *mut socklen_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "getpeername$UNIX2003")]
-    pub fn getpeername(socket: ::c_int, address: *mut sockaddr,
-                       address_len: *mut socklen_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "getsockname$UNIX2003")]
-    pub fn getsockname(socket: ::c_int, address: *mut sockaddr,
-                       address_len: *mut socklen_t) -> ::c_int;
-    pub fn setsockopt(socket: ::c_int, level: ::c_int, name: ::c_int,
-                      value: *const ::c_void,
-                      option_len: socklen_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "socketpair$UNIX2003")]
-    pub fn socketpair(domain: ::c_int, type_: ::c_int, protocol: ::c_int,
-                      socket_vector: *mut ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "sendto$UNIX2003")]
-    pub fn sendto(socket: ::c_int, buf: *const ::c_void, len: ::size_t,
-                  flags: ::c_int, addr: *const sockaddr,
-                  addrlen: socklen_t) -> ::ssize_t;
-    pub fn shutdown(socket: ::c_int, how: ::c_int) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "chmod$UNIX2003")]
-    pub fn chmod(path: *const c_char, mode: mode_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fchmod$UNIX2003")]
-    pub fn fchmod(fd: ::c_int, mode: mode_t) -> ::c_int;
-
-    #[cfg_attr(target_os = "macos", link_name = "fstat$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__fstat50")]
-    pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int;
-
-    pub fn mkdir(path: *const c_char, mode: mode_t) -> ::c_int;
-
-    #[cfg_attr(target_os = "macos", link_name = "stat$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__stat50")]
-    pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "popen$UNIX2003")]
-    pub fn popen(command: *const c_char,
-                 mode: *const c_char) -> *mut ::FILE;
-    pub fn pclose(stream: *mut ::FILE) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fdopen$UNIX2003")]
-    pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE;
-    pub fn fileno(stream: *mut ::FILE) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "open$UNIX2003")]
-    pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "creat$UNIX2003")]
-    pub fn creat(path: *const c_char, mode: mode_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fcntl$UNIX2003")]
-    pub fn fcntl(fd: ::c_int, cmd: ::c_int, ...) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "opendir$INODE64")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "opendir$INODE64$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__opendir30")]
-    pub fn opendir(dirname: *const c_char) -> *mut ::DIR;
-    #[cfg_attr(target_os = "macos", link_name = "readdir$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__readdir30")]
-    pub fn readdir(dirp: *mut ::DIR) -> *mut ::dirent;
-    #[cfg_attr(target_os = "macos", link_name = "readdir_r$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__readdir_r30")]
-    #[cfg_attr(target_os = "solaris", link_name = "__posix_readdir_r")]
-    pub fn readdir_r(dirp: *mut ::DIR, entry: *mut ::dirent,
-                     result: *mut *mut ::dirent) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "closedir$UNIX2003")]
-    pub fn closedir(dirp: *mut ::DIR) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "rewinddir$INODE64")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "rewinddir$INODE64$UNIX2003")]
-    pub fn rewinddir(dirp: *mut ::DIR);
-
-    pub fn openat(dirfd: ::c_int, pathname: *const ::c_char,
-                  flags: ::c_int, ...) -> ::c_int;
-    pub fn faccessat(dirfd: ::c_int, pathname: *const ::c_char,
-                     mode: ::c_int, flags: ::c_int) -> ::c_int;
-    pub fn fchmodat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t, flags: ::c_int) -> ::c_int;
-    pub fn fchown(fd: ::c_int,
-                  owner: ::uid_t,
-                  group: ::gid_t) -> ::c_int;
-    pub fn fchownat(dirfd: ::c_int, pathname: *const ::c_char,
-                    owner: ::uid_t, group: ::gid_t,
-                    flags: ::c_int) -> ::c_int;
-    #[cfg_attr(target_os = "macos", link_name = "fstatat$INODE64")]
-    pub fn fstatat(dirfd: ::c_int, pathname: *const ::c_char,
-                   buf: *mut stat, flags: ::c_int) -> ::c_int;
-    pub fn linkat(olddirfd: ::c_int, oldpath: *const ::c_char,
-                  newdirfd: ::c_int, newpath: *const ::c_char,
-                  flags: ::c_int) -> ::c_int;
-    pub fn mkdirat(dirfd: ::c_int, pathname: *const ::c_char,
-                   mode: ::mode_t) -> ::c_int;
-    pub fn readlinkat(dirfd: ::c_int, pathname: *const ::c_char,
-                      buf: *mut ::c_char, bufsiz: ::size_t) -> ::ssize_t;
-    pub fn renameat(olddirfd: ::c_int, oldpath: *const ::c_char,
-                    newdirfd: ::c_int, newpath: *const ::c_char)
-                    -> ::c_int;
-    pub fn symlinkat(target: *const ::c_char, newdirfd: ::c_int,
-                     linkpath: *const ::c_char) -> ::c_int;
-    pub fn unlinkat(dirfd: ::c_int, pathname: *const ::c_char,
-                    flags: ::c_int) -> ::c_int;
-
-    pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int;
-    pub fn alarm(seconds: ::c_uint) -> ::c_uint;
-    pub fn chdir(dir: *const c_char) -> ::c_int;
-    pub fn fchdir(dirfd: ::c_int) -> ::c_int;
-    pub fn chown(path: *const c_char, uid: uid_t,
-                 gid: gid_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "lchown$UNIX2003")]
-    pub fn lchown(path: *const c_char, uid: uid_t,
-                  gid: gid_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "close$NOCANCEL$UNIX2003")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "close$NOCANCEL")]
-    pub fn close(fd: ::c_int) -> ::c_int;
-    pub fn dup(fd: ::c_int) -> ::c_int;
-    pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int;
-    pub fn execl(path: *const c_char,
-                 arg0: *const c_char, ...) -> ::c_int;
-    pub fn execle(path: *const ::c_char,
-                  arg0: *const ::c_char, ...) -> ::c_int;
-    pub fn execlp(file: *const ::c_char,
-                  arg0: *const ::c_char, ...) -> ::c_int;
-    pub fn execv(prog: *const c_char,
-                 argv: *const *const c_char) -> ::c_int;
-    pub fn execve(prog: *const c_char, argv: *const *const c_char,
-                  envp: *const *const c_char)
-                  -> ::c_int;
-    pub fn execvp(c: *const c_char,
-                  argv: *const *const c_char) -> ::c_int;
-    pub fn fork() -> pid_t;
-    pub fn fpathconf(filedes: ::c_int, name: ::c_int) -> c_long;
-    pub fn getcwd(buf: *mut c_char, size: ::size_t) -> *mut c_char;
-    pub fn getegid() -> gid_t;
-    pub fn geteuid() -> uid_t;
-    pub fn getgid() -> gid_t;
-    pub fn getgroups(ngroups_max: ::c_int, groups: *mut gid_t)
-                     -> ::c_int;
-    pub fn getlogin() -> *mut c_char;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "getopt$UNIX2003")]
-    pub fn getopt(argc: ::c_int, argv: *const *mut c_char,
-                  optstr: *const c_char) -> ::c_int;
-    pub fn getpgid(pid: pid_t) -> pid_t;
-    pub fn getpgrp() -> pid_t;
-    pub fn getpid() -> pid_t;
-    pub fn getppid() -> pid_t;
-    pub fn getuid() -> uid_t;
-    pub fn isatty(fd: ::c_int) -> ::c_int;
-    pub fn link(src: *const c_char, dst: *const c_char) -> ::c_int;
-    pub fn lseek(fd: ::c_int, offset: off_t, whence: ::c_int) -> off_t;
-    pub fn pathconf(path: *const c_char, name: ::c_int) -> c_long;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pause$UNIX2003")]
-    pub fn pause() -> ::c_int;
-    pub fn pipe(fds: *mut ::c_int) -> ::c_int;
-    pub fn posix_memalign(memptr: *mut *mut ::c_void,
-                      align: ::size_t,
-                      size: ::size_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "read$UNIX2003")]
-    pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::size_t)
-                -> ::ssize_t;
-    pub fn rmdir(path: *const c_char) -> ::c_int;
-    pub fn seteuid(uid: uid_t) -> ::c_int;
-    pub fn setgid(gid: gid_t) -> ::c_int;
-    pub fn setpgid(pid: pid_t, pgid: pid_t) -> ::c_int;
-    pub fn setsid() -> pid_t;
-    pub fn setuid(uid: uid_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "sleep$UNIX2003")]
-    pub fn sleep(secs: ::c_uint) -> ::c_uint;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "nanosleep$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")]
-    pub fn nanosleep(rqtp: *const timespec,
-                     rmtp: *mut timespec) -> ::c_int;
-    pub fn tcgetpgrp(fd: ::c_int) -> pid_t;
-    pub fn tcsetpgrp(fd: ::c_int, pgrp: ::pid_t) -> ::c_int;
-    pub fn ttyname(fd: ::c_int) -> *mut c_char;
-    pub fn unlink(c: *const c_char) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "wait$UNIX2003")]
-    pub fn wait(status: *mut ::c_int) -> pid_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "waitpid$UNIX2003")]
-    pub fn waitpid(pid: pid_t, status: *mut ::c_int, options: ::c_int)
-                   -> pid_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "write$UNIX2003")]
-    pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::size_t)
-                 -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pread$UNIX2003")]
-    pub fn pread(fd: ::c_int, buf: *mut ::c_void, count: ::size_t,
-                 offset: off_t) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pwrite$UNIX2003")]
-    pub fn pwrite(fd: ::c_int, buf: *const ::c_void, count: ::size_t,
-                  offset: off_t) -> ::ssize_t;
-    pub fn umask(mask: mode_t) -> mode_t;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__utime50")]
-    pub fn utime(file: *const c_char, buf: *const utimbuf) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-                   link_name = "kill$UNIX2003")]
-    pub fn kill(pid: pid_t, sig: ::c_int) -> ::c_int;
-
-    pub fn mlock(addr: *const ::c_void, len: ::size_t) -> ::c_int;
-    pub fn munlock(addr: *const ::c_void, len: ::size_t) -> ::c_int;
-    pub fn mlockall(flags: ::c_int) -> ::c_int;
-    pub fn munlockall() -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "mmap$UNIX2003")]
-    pub fn mmap(addr: *mut ::c_void,
-                len: ::size_t,
-                prot: ::c_int,
-                flags: ::c_int,
-                fd: ::c_int,
-                offset: off_t)
-                -> *mut ::c_void;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "munmap$UNIX2003")]
-    pub fn munmap(addr: *mut ::c_void, len: ::size_t) -> ::c_int;
-
-    pub fn if_nametoindex(ifname: *const c_char) -> ::c_uint;
-    pub fn if_indextoname(ifindex: ::c_uint,
-                          ifname: *mut ::c_char) -> *mut ::c_char;
-
-    #[cfg_attr(target_os = "macos", link_name = "lstat$INODE64")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__lstat50")]
-    pub fn lstat(path: *const c_char, buf: *mut stat) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "fsync$UNIX2003")]
-    pub fn fsync(fd: ::c_int) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "setenv$UNIX2003")]
-    pub fn setenv(name: *const c_char, val: *const c_char,
-                  overwrite: ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "unsetenv$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__unsetenv13")]
-    pub fn unsetenv(name: *const c_char) -> ::c_int;
-
-    pub fn symlink(path1: *const c_char,
-                   path2: *const c_char) -> ::c_int;
-
-    pub fn ftruncate(fd: ::c_int, length: off_t) -> ::c_int;
-
-    pub fn signal(signum: ::c_int, handler: sighandler_t) -> sighandler_t;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "getrlimit$UNIX2003")]
-    pub fn getrlimit(resource: ::c_int, rlim: *mut rlimit) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "setrlimit$UNIX2003")]
-    pub fn setrlimit(resource: ::c_int, rlim: *const rlimit) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")]
-    pub fn getrusage(resource: ::c_int, usage: *mut rusage) -> ::c_int;
-
-    pub fn getdtablesize() -> ::c_int;
-    #[cfg_attr(any(target_os = "macos", target_os = "ios"),
-               link_name = "realpath$DARWIN_EXTSN")]
-    pub fn realpath(pathname: *const ::c_char, resolved: *mut ::c_char)
-                    -> *mut ::c_char;
-
-    pub fn flock(fd: ::c_int, operation: ::c_int) -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__gettimeofday50")]
-    pub fn gettimeofday(tp: *mut ::timeval,
-                        tz: *mut ::c_void) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__times13")]
-    pub fn times(buf: *mut ::tms) -> ::clock_t;
-
-    pub fn pthread_self() -> ::pthread_t;
-    pub fn pthread_create(native: *mut ::pthread_t,
-                          attr: *const ::pthread_attr_t,
-                          f: extern fn(*mut ::c_void) -> *mut ::c_void,
-                          value: *mut ::c_void) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_join$UNIX2003")]
-    pub fn pthread_join(native: ::pthread_t,
-                        value: *mut *mut ::c_void) -> ::c_int;
-    pub fn pthread_atfork(prepare: Option<unsafe extern fn()>,
-                          parent: Option<unsafe extern fn()>,
-                          child: Option<unsafe extern fn()>) -> ::c_int;
-    pub fn pthread_exit(value: *mut ::c_void);
-    pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_setstacksize(attr: *mut ::pthread_attr_t,
-                                     stack_size: ::size_t) -> ::c_int;
-    pub fn pthread_attr_setdetachstate(attr: *mut ::pthread_attr_t,
-                                       state: ::c_int) -> ::c_int;
-    pub fn pthread_detach(thread: ::pthread_t) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__libc_thr_yield")]
-    pub fn sched_yield() -> ::c_int;
-    pub fn pthread_key_create(key: *mut pthread_key_t,
-                              dtor: Option<unsafe extern fn(*mut ::c_void)>)
-                              -> ::c_int;
-    pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int;
-    pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void;
-    pub fn pthread_setspecific(key: pthread_key_t, value: *const ::c_void)
-                               -> ::c_int;
-    pub fn pthread_mutex_init(lock: *mut pthread_mutex_t,
-                              attr: *const pthread_mutexattr_t) -> ::c_int;
-    pub fn pthread_mutex_destroy(lock: *mut pthread_mutex_t) -> ::c_int;
-    pub fn pthread_mutex_lock(lock: *mut pthread_mutex_t) -> ::c_int;
-    pub fn pthread_mutex_trylock(lock: *mut pthread_mutex_t) -> ::c_int;
-    pub fn pthread_mutex_unlock(lock: *mut pthread_mutex_t) -> ::c_int;
-
-    pub fn pthread_mutexattr_init(attr: *mut pthread_mutexattr_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_mutexattr_destroy$UNIX2003")]
-    pub fn pthread_mutexattr_destroy(attr: *mut pthread_mutexattr_t) -> ::c_int;
-    pub fn pthread_mutexattr_settype(attr: *mut pthread_mutexattr_t,
-                                     _type: ::c_int) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_cond_init$UNIX2003")]
-    pub fn pthread_cond_init(cond: *mut pthread_cond_t,
-                             attr: *const pthread_condattr_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_cond_wait$UNIX2003")]
-    pub fn pthread_cond_wait(cond: *mut pthread_cond_t,
-                             lock: *mut pthread_mutex_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_cond_timedwait$UNIX2003")]
-    pub fn pthread_cond_timedwait(cond: *mut pthread_cond_t,
-                              lock: *mut pthread_mutex_t,
-                              abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_cond_signal(cond: *mut pthread_cond_t) -> ::c_int;
-    pub fn pthread_cond_broadcast(cond: *mut pthread_cond_t) -> ::c_int;
-    pub fn pthread_cond_destroy(cond: *mut pthread_cond_t) -> ::c_int;
-    pub fn pthread_condattr_init(attr: *mut pthread_condattr_t) -> ::c_int;
-    pub fn pthread_condattr_destroy(attr: *mut pthread_condattr_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_destroy$UNIX2003")]
-    pub fn pthread_rwlock_destroy(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_rdlock$UNIX2003")]
-    pub fn pthread_rwlock_rdlock(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_tryrdlock$UNIX2003")]
-    pub fn pthread_rwlock_tryrdlock(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_wrlock$UNIX2003")]
-    pub fn pthread_rwlock_wrlock(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_trywrlock$UNIX2003")]
-    pub fn pthread_rwlock_trywrlock(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_rwlock_unlock$UNIX2003")]
-    pub fn pthread_rwlock_unlock(lock: *mut pthread_rwlock_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pthread_sigmask$UNIX2003")]
-    pub fn pthread_sigmask(how: ::c_int, set: *const sigset_t,
-                           oldset: *mut sigset_t) -> ::c_int;
-    pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "linux", not(target_env = "musl")),
-               link_name = "__xpg_strerror_r")]
-    pub fn strerror_r(errnum: ::c_int, buf: *mut c_char,
-                      buflen: ::size_t) -> ::c_int;
-
-    pub fn getsockopt(sockfd: ::c_int,
-                      level: ::c_int,
-                      optname: ::c_int,
-                      optval: *mut ::c_void,
-                      optlen: *mut ::socklen_t) -> ::c_int;
-    pub fn raise(signum: ::c_int) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigaction14")]
-    pub fn sigaction(signum: ::c_int,
-                     act: *const sigaction,
-                     oldact: *mut sigaction) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "sigaltstack$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigaltstack14")]
-    pub fn sigaltstack(ss: *const stack_t,
-                       oss: *mut stack_t) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch ="x86"),
-               link_name = "sigwait$UNIX2003")]
-    #[cfg_attr(target_os = "solaris", link_name = "__posix_sigwait")]
-    pub fn sigwait(set: *const sigset_t,
-                   sig: *mut ::c_int) -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")]
-    pub fn utimes(filename: *const ::c_char,
-                  times: *const ::timeval) -> ::c_int;
-    pub fn dlopen(filename: *const ::c_char,
-                  flag: ::c_int) -> *mut ::c_void;
-    pub fn dlerror() -> *mut ::c_char;
-    pub fn dlsym(handle: *mut ::c_void,
-                 symbol: *const ::c_char) -> *mut ::c_void;
-    pub fn dlclose(handle: *mut ::c_void) -> ::c_int;
-    pub fn dladdr(addr: *const ::c_void, info: *mut Dl_info) -> ::c_int;
-
-    pub fn getaddrinfo(node: *const c_char,
-                       service: *const c_char,
-                       hints: *const addrinfo,
-                       res: *mut *mut addrinfo) -> ::c_int;
-    pub fn freeaddrinfo(res: *mut addrinfo);
-    pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char;
-    #[cfg_attr(any(
-                   all(target_os = "linux", not(target_env = "musl")),
-                   target_os = "freebsd",
-                   target_os = "dragonfly"),
-               link_name = "__res_init")]
-    #[cfg_attr(any(target_os = "macos", target_os = "ios"),
-               link_name = "res_9_init")]
-    pub fn res_init() -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")]
-    pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
-    #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")]
-    pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "mktime$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")]
-    pub fn mktime(tm: *mut tm) -> time_t;
-    #[cfg_attr(target_os = "netbsd", link_name = "__time50")]
-    pub fn time(time: *mut time_t) -> time_t;
-    #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")]
-    pub fn gmtime(time_p: *const time_t) -> *mut tm;
-    #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")]
-    pub fn localtime(time_p: *const time_t) -> *mut tm;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")]
-    pub fn mknod(pathname: *const ::c_char, mode: ::mode_t,
-                 dev: ::dev_t) -> ::c_int;
-    pub fn uname(buf: *mut ::utsname) -> ::c_int;
-    pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int;
-    pub fn gethostname(name: *mut ::c_char, len: ::size_t) -> ::c_int;
-    pub fn chroot(name: *const ::c_char) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "usleep$UNIX2003")]
-    pub fn usleep(secs: ::c_uint) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "send$UNIX2003")]
-    pub fn send(socket: ::c_int, buf: *const ::c_void, len: ::size_t,
-                flags: ::c_int) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "recv$UNIX2003")]
-    pub fn recv(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                flags: ::c_int) -> ::ssize_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "putenv$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__putenv50")]
-    pub fn putenv(string: *mut c_char) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "poll$UNIX2003")]
-    pub fn poll(fds: *mut pollfd, nfds: nfds_t, timeout: ::c_int) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "select$1050")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "select$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__select50")]
-    pub fn select(nfds: ::c_int,
-                  readfs: *mut fd_set,
-                  writefds: *mut fd_set,
-                  errorfds: *mut fd_set,
-                  timeout: *mut timeval) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__setlocale50")]
-    pub fn setlocale(category: ::c_int,
-                     locale: *const ::c_char) -> *mut ::c_char;
-    pub fn localeconv() -> *mut lconv;
-
-    pub fn sem_destroy(sem: *mut sem_t) -> ::c_int;
-    pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t;
-    pub fn sem_close(sem: *mut sem_t) -> ::c_int;
-    pub fn sem_unlink(name: *const ::c_char) -> ::c_int;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "sem_wait$UNIX2003")]
-    pub fn sem_wait(sem: *mut sem_t) -> ::c_int;
-    pub fn sem_trywait(sem: *mut sem_t) -> ::c_int;
-    pub fn sem_post(sem: *mut sem_t) -> ::c_int;
-    pub fn sem_init(sem: *mut sem_t,
-                    pshared: ::c_int,
-                    value: ::c_uint)
-                    -> ::c_int;
-    pub fn statvfs(path: *const c_char, buf: *mut statvfs) -> ::c_int;
-    pub fn fstatvfs(fd: ::c_int, buf: *mut statvfs) -> ::c_int;
-
-    pub fn readlink(path: *const c_char,
-                    buf: *mut c_char,
-                    bufsz: ::size_t)
-                    -> ::ssize_t;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigemptyset14")]
-    pub fn sigemptyset(set: *mut sigset_t) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigaddset14")]
-    pub fn sigaddset(set: *mut sigset_t, signum: ::c_int) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigfillset14")]
-    pub fn sigfillset(set: *mut sigset_t) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigdelset14")]
-    pub fn sigdelset(set: *mut sigset_t, signum: ::c_int) -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigismember14")]
-    pub fn sigismember(set: *const sigset_t, signum: ::c_int) -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigprocmask14")]
-    pub fn sigprocmask(how: ::c_int,
-                       set: *const sigset_t,
-                       oldset: *mut sigset_t)
-                       -> ::c_int;
-    #[cfg_attr(target_os = "netbsd", link_name = "__sigpending14")]
-    pub fn sigpending(set: *mut sigset_t) -> ::c_int;
-
-    #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")]
-    pub fn timegm(tm: *mut ::tm) -> time_t;
-
-    pub fn getsid(pid: pid_t) -> pid_t;
-
-    pub fn sysconf(name: ::c_int) -> ::c_long;
-
-    pub fn mkfifo(path: *const c_char, mode: mode_t) -> ::c_int;
-
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86_64"),
-               link_name = "pselect$1050")]
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "pselect$UNIX2003")]
-    #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")]
-    pub fn pselect(nfds: ::c_int,
-                   readfs: *mut fd_set,
-                   writefds: *mut fd_set,
-                   errorfds: *mut fd_set,
-                   timeout: *const timespec,
-                   sigmask: *const sigset_t) -> ::c_int;
-    pub fn fseeko(stream: *mut ::FILE,
-                  offset: ::off_t,
-                  whence: ::c_int) -> ::c_int;
-    pub fn ftello(stream: *mut ::FILE) -> ::off_t;
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "tcdrain$UNIX2003")]
-    pub fn tcdrain(fd: ::c_int) -> ::c_int;
-    pub fn cfgetispeed(termios: *const ::termios) -> ::speed_t;
-    pub fn cfgetospeed(termios: *const ::termios) -> ::speed_t;
-    pub fn cfmakeraw(termios: *mut ::termios);
-    pub fn cfsetispeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
-    pub fn cfsetospeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
-    pub fn cfsetspeed(termios: *mut ::termios, speed: ::speed_t) -> ::c_int;
-    pub fn tcgetattr(fd: ::c_int, termios: *mut ::termios) -> ::c_int;
-    pub fn tcsetattr(fd: ::c_int,
-                     optional_actions: ::c_int,
-                     termios: *const ::termios) -> ::c_int;
-    pub fn tcflow(fd: ::c_int, action: ::c_int) -> ::c_int;
-    pub fn tcflush(fd: ::c_int, action: ::c_int) -> ::c_int;
-    pub fn tcsendbreak(fd: ::c_int, duration: ::c_int) -> ::c_int;
-    pub fn mkstemp(template: *mut ::c_char) -> ::c_int;
-    pub fn mkdtemp(template: *mut ::c_char) -> *mut ::c_char;
-
-    pub fn tmpnam(ptr: *mut ::c_char) -> *mut ::c_char;
-
-    pub fn openlog(ident: *const ::c_char, logopt: ::c_int, facility: ::c_int);
-    pub fn closelog();
-    pub fn setlogmask(maskpri: ::c_int) -> ::c_int;
-    pub fn syslog(priority: ::c_int, message: *const ::c_char, ...);
-    #[cfg_attr(all(target_os = "macos", target_arch = "x86"),
-               link_name = "nice$UNIX2003")]
-    pub fn nice(incr: ::c_int) -> ::c_int;
-
-    pub fn grantpt(fd: ::c_int) -> ::c_int;
-    pub fn posix_openpt(flags: ::c_int) -> ::c_int;
-    pub fn ptsname(fd: ::c_int) -> *mut ::c_char;
-    pub fn unlockpt(fd: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_env = "uclibc")] {
-        mod uclibc;
-        pub use self::uclibc::*;
-    } else if #[cfg(any(target_os = "linux",
-                        target_os = "android",
-                        target_os = "emscripten",
-                        target_os = "fuchsia"))] {
-        mod notbsd;
-        pub use self::notbsd::*;
-    } else if #[cfg(any(target_os = "macos",
-                        target_os = "ios",
-                        target_os = "freebsd",
-                        target_os = "dragonfly",
-                        target_os = "openbsd",
-                        target_os = "netbsd",
-                        target_os = "bitrig"))] {
-        mod bsd;
-        pub use self::bsd::*;
-    } else if #[cfg(target_os = "solaris")] {
-        mod solaris;
-        pub use self::solaris::*;
-    } else if #[cfg(target_os = "haiku")] {
-        mod haiku;
-        pub use self::haiku::*;
-    } else {
-        // Unknown target_os
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/arm.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = u32;
-
-pub const O_DIRECT: ::c_int = 0x10000;
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/mod.rs
+++ /dev/null
@@ -1,199 +0,0 @@
-// The following definitions are correct for arm and i686,
-// but may be wrong for mips
-
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type mode_t = u16;
-pub type off64_t = ::c_longlong;
-pub type sigset_t = ::c_ulong;
-pub type socklen_t = i32;
-pub type time64_t = i64;
-
-s! {
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        pub sa_flags: ::c_ulong,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-    }
-
-    pub struct rlimit64 {
-        pub rlim_cur: u64,
-        pub rlim_max: u64,
-    }
-
-    pub struct stat {
-        pub st_dev: ::c_ulonglong,
-        __pad0: [::c_uchar; 4],
-        __st_ino: ::ino_t,
-        pub st_mode: ::c_uint,
-        pub st_nlink: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulonglong,
-        __pad3: [::c_uchar; 4],
-        pub st_size: ::c_longlong,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::c_ulonglong,
-        pub st_atime: ::c_ulong,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::c_ulong,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::c_ulong,
-        pub st_ctime_nsec: ::c_ulong,
-        pub st_ino: ::c_ulonglong,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::c_ulonglong,
-        __pad0: [::c_uchar; 4],
-        __st_ino: ::ino_t,
-        pub st_mode: ::c_uint,
-        pub st_nlink: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulonglong,
-        __pad3: [::c_uchar; 4],
-        pub st_size: ::c_longlong,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::c_ulonglong,
-        pub st_atime: ::c_ulong,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::c_ulong,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::c_ulong,
-        pub st_ctime_nsec: ::c_ulong,
-        pub st_ino: ::c_ulonglong,
-    }
-
-    pub struct pthread_attr_t {
-        pub flags: ::uint32_t,
-        pub stack_base: *mut ::c_void,
-        pub stack_size: ::size_t,
-        pub guard_size: ::size_t,
-        pub sched_policy: ::int32_t,
-        pub sched_priority: ::int32_t,
-    }
-
-    pub struct pthread_mutex_t { value: ::c_int }
-
-    pub struct pthread_cond_t { value: ::c_int }
-
-    pub struct pthread_rwlock_t {
-        lock: pthread_mutex_t,
-        cond: pthread_cond_t,
-        numLocks: ::c_int,
-        writerThreadId: ::c_int,
-        pendingReaders: ::c_int,
-        pendingWriters: ::c_int,
-        attr: i32,
-        __reserved: [::c_char; 12],
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-    }
-
-    pub struct statfs {
-        pub f_type: ::uint32_t,
-        pub f_bsize: ::uint32_t,
-        pub f_blocks: ::uint64_t,
-        pub f_bfree: ::uint64_t,
-        pub f_bavail: ::uint64_t,
-        pub f_files: ::uint64_t,
-        pub f_ffree: ::uint64_t,
-        pub f_fsid: ::__fsid_t,
-        pub f_namelen: ::uint32_t,
-        pub f_frsize: ::uint32_t,
-        pub f_flags: ::uint32_t,
-        pub f_spare: [::uint32_t; 4],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 8],
-    }
-}
-
-pub const RTLD_GLOBAL: ::c_int = 2;
-pub const RTLD_NOW: ::c_int = 0;
-pub const RTLD_DEFAULT: *mut ::c_void = -1isize as *mut ::c_void;
-
-pub const PTRACE_GETFPREGS: ::c_int = 14;
-pub const PTRACE_SETFPREGS: ::c_int = 15;
-pub const PTRACE_GETREGS: ::c_int = 12;
-pub const PTRACE_SETREGS: ::c_int = 13;
-
-pub const SYS_gettid: ::c_long = 224;
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    value: 0,
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    value: 0,
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    lock: PTHREAD_MUTEX_INITIALIZER,
-    cond: PTHREAD_COND_INITIALIZER,
-    numLocks: 0,
-    writerThreadId: 0,
-    pendingReaders: 0,
-    pendingWriters: 0,
-    attr: 0,
-    __reserved: [0; 12],
-};
-pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 2;
-pub const CPU_SETSIZE: ::size_t = 32;
-pub const __CPU_BITS: ::size_t = 32;
-
-pub const UT_LINESIZE: usize = 8;
-pub const UT_NAMESIZE: usize = 8;
-pub const UT_HOSTSIZE: usize = 16;
-
-extern {
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: socklen_t) -> ::c_int;
-
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-
-    pub fn timegm64(tm: *const ::tm) -> ::time64_t;
-}
-
-cfg_if! {
-    if #[cfg(target_arch = "x86")] {
-        mod x86;
-        pub use self::x86::*;
-    } else if #[cfg(target_arch = "arm")] {
-        mod arm;
-        pub use self::arm::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b32/x86.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-pub type c_char = i8;
-pub type wchar_t = i32;
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/aarch64.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = u32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::c_uint,
-        pub st_nlink: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad1: ::c_ulong,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::c_int,
-        __pad2: ::c_int,
-        pub st_blocks: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_ulong,
-        __unused4: ::c_uint,
-        __unused5: ::c_uint,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::c_uint,
-        pub st_nlink: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad1: ::c_ulong,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::c_int,
-        __pad2: ::c_int,
-        pub st_blocks: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_ulong,
-        __unused4: ::c_uint,
-        __unused5: ::c_uint,
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x10000;
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
-
-pub const SYS_gettid: ::c_long = 178;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/mod.rs
+++ /dev/null
@@ -1,162 +0,0 @@
-// The following definitions are correct for aarch64 and x86_64,
-// but may be wrong for mips64
-
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type mode_t = u32;
-pub type off64_t = i64;
-pub type socklen_t = u32;
-
-s! {
-    pub struct sigset_t {
-        __val: [::c_ulong; 1],
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_uint,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-    }
-
-    pub struct rlimit64 {
-        pub rlim_cur: ::c_ulonglong,
-        pub rlim_max: ::c_ulonglong,
-    }
-
-    pub struct pthread_attr_t {
-        pub flags: ::uint32_t,
-        pub stack_base: *mut ::c_void,
-        pub stack_size: ::size_t,
-        pub guard_size: ::size_t,
-        pub sched_policy: ::int32_t,
-        pub sched_priority: ::int32_t,
-        __reserved: [::c_char; 16],
-    }
-
-    pub struct pthread_mutex_t {
-        value: ::c_int,
-        __reserved: [::c_char; 36],
-    }
-
-    pub struct pthread_cond_t {
-        value: ::c_int,
-        __reserved: [::c_char; 44],
-    }
-
-    pub struct pthread_rwlock_t {
-        numLocks: ::c_int,
-        writerThreadId: ::c_int,
-        pendingReaders: ::c_int,
-        pendingWriters: ::c_int,
-        attr: i32,
-        __reserved: [::c_char; 36],
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_gecos: *mut ::c_char,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-    }
-
-    pub struct statfs {
-        pub f_type: ::uint64_t,
-        pub f_bsize: ::uint64_t,
-        pub f_blocks: ::uint64_t,
-        pub f_bfree: ::uint64_t,
-        pub f_bavail: ::uint64_t,
-        pub f_files: ::uint64_t,
-        pub f_ffree: ::uint64_t,
-        pub f_fsid: ::__fsid_t,
-        pub f_namelen: ::uint64_t,
-        pub f_frsize: ::uint64_t,
-        pub f_flags: ::uint64_t,
-        pub f_spare: [::uint64_t; 4],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-}
-
-pub const RTLD_GLOBAL: ::c_int = 0x00100;
-pub const RTLD_NOW: ::c_int = 2;
-pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    value: 0,
-    __reserved: [0; 36],
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    value: 0,
-    __reserved: [0; 44],
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    numLocks: 0,
-    writerThreadId: 0,
-    pendingReaders: 0,
-    pendingWriters: 0,
-    attr: 0,
-    __reserved: [0; 36],
-};
-pub const PTHREAD_STACK_MIN: ::size_t = 4096 * 4;
-pub const CPU_SETSIZE: ::size_t = 1024;
-pub const __CPU_BITS: ::size_t = 64;
-
-pub const UT_LINESIZE: usize = 32;
-pub const UT_NAMESIZE: usize = 32;
-pub const UT_HOSTSIZE: usize = 256;
-
-// Some weirdness in Android
-extern {
-    // address_len should be socklen_t, but it is c_int!
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::c_int) -> ::c_int;
-
-    // the return type should be ::ssize_t, but it is c_int!
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::c_int;
-
-    // the return type should be ::ssize_t, but it is c_int!
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::c_int;
-
-    // the return type should be ::ssize_t, but it is c_int!
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::c_int;
-
-    // the return type should be ::ssize_t, but it is c_int!
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_arch = "x86_64")] {
-        mod x86_64;
-        pub use self::x86_64::*;
-    } else if #[cfg(target_arch = "aarch64")] {
-        mod aarch64;
-        pub use self::aarch64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/b64/x86_64.rs
+++ /dev/null
@@ -1,50 +0,0 @@
-pub type c_char = i8;
-pub type wchar_t = i32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::c_ulong,
-        pub st_mode: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::c_long,
-        pub st_blocks: ::c_long,
-        pub st_atime: ::c_ulong,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::c_ulong,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::c_ulong,
-        pub st_ctime_nsec: ::c_ulong,
-        __unused: [::c_long; 3],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::c_ulong,
-        pub st_mode: ::c_uint,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::c_long,
-        pub st_blocks: ::c_long,
-        pub st_atime: ::c_ulong,
-        pub st_atime_nsec: ::c_ulong,
-        pub st_mtime: ::c_ulong,
-        pub st_mtime_nsec: ::c_ulong,
-        pub st_ctime: ::c_ulong,
-        pub st_ctime_nsec: ::c_ulong,
-        __unused: [::c_long; 3],
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-
-pub const SYS_gettid: ::c_long = 186;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/android/mod.rs
+++ /dev/null
@@ -1,818 +0,0 @@
-//! Android-specific definitions for linux-like values
-
-use dox::mem;
-
-pub type clock_t = ::c_long;
-pub type time_t = ::c_long;
-pub type suseconds_t = ::c_long;
-pub type off_t = ::c_long;
-pub type blkcnt_t = ::c_ulong;
-pub type blksize_t = ::c_ulong;
-pub type nlink_t = u32;
-pub type useconds_t = u32;
-pub type pthread_t = ::c_long;
-pub type pthread_mutexattr_t = ::c_long;
-pub type pthread_condattr_t = ::c_long;
-pub type fsfilcnt_t = ::c_ulong;
-pub type fsblkcnt_t = ::c_ulong;
-pub type nfds_t = ::c_uint;
-pub type rlim_t = ::c_ulong;
-pub type dev_t = ::c_ulong;
-pub type ino_t = ::c_ulong;
-pub type __CPU_BITTYPE = ::c_ulong;
-pub type idtype_t = ::c_int;
-
-s! {
-    pub struct dirent {
-        pub d_ino: u64,
-        pub d_off: i64,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct dirent64 {
-        pub d_ino: u64,
-        pub d_off: i64,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-
-    pub struct __fsid_t {
-        __val: [::c_int; 2],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-    }
-
-    pub struct cpu_set_t {
-        #[cfg(target_pointer_width = "64")]
-        __bits: [__CPU_BITTYPE; 16],
-        #[cfg(target_pointer_width = "32")]
-        __bits: [__CPU_BITTYPE; 1],
-    }
-
-    pub struct sem_t {
-        count: ::c_uint,
-        #[cfg(target_pointer_width = "64")]
-        __reserved: [::c_int; 3],
-    }
-
-    pub struct lastlog {
-        ll_time: ::time_t,
-        ll_line: [::c_char; UT_LINESIZE],
-        ll_host: [::c_char; UT_HOSTSIZE],
-    }
-
-    pub struct exit_status {
-        pub e_termination: ::c_short,
-        pub e_exit: ::c_short,
-    }
-
-    pub struct utmp {
-        pub ut_type: ::c_short,
-        pub ut_pid: ::pid_t,
-        pub ut_line: [::c_char; UT_LINESIZE],
-        pub ut_id: [::c_char; 4],
-
-        pub ut_user: [::c_char; UT_NAMESIZE],
-        pub ut_host: [::c_char; UT_HOSTSIZE],
-        pub ut_exit: exit_status,
-        pub ut_session: ::c_long,
-        pub ut_tv: ::timeval,
-
-        pub ut_addr_v6: [::int32_t; 4],
-        unused: [::c_char; 20],
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        #[cfg(target_pointer_width = "64")]
-        __f_reserved: [u32; 6],
-    }
-}
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-pub const EPOLLONESHOT: ::c_int = 0x40000000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const USER_PROCESS: ::c_short = 7;
-
-pub const BUFSIZ: ::c_uint = 1024;
-pub const FILENAME_MAX: ::c_uint = 1024;
-pub const FOPEN_MAX: ::c_uint = 20;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-pub const L_tmpnam: ::c_uint = 1024;
-pub const TMP_MAX: ::c_uint = 308915776;
-pub const _PC_LINK_MAX: ::c_int = 1;
-pub const _PC_MAX_CANON: ::c_int = 2;
-pub const _PC_MAX_INPUT: ::c_int = 3;
-pub const _PC_NAME_MAX: ::c_int = 4;
-pub const _PC_PATH_MAX: ::c_int = 5;
-pub const _PC_PIPE_BUF: ::c_int = 6;
-pub const _PC_CHOWN_RESTRICTED: ::c_int = 14;
-pub const _PC_NO_TRUNC: ::c_int = 15;
-pub const _PC_VDISABLE: ::c_int = 16;
-
-pub const FIONBIO: ::c_int = 0x5421;
-
-pub const _SC_ARG_MAX: ::c_int = 0;
-pub const _SC_BC_BASE_MAX: ::c_int = 1;
-pub const _SC_BC_DIM_MAX: ::c_int = 2;
-pub const _SC_BC_SCALE_MAX: ::c_int = 3;
-pub const _SC_BC_STRING_MAX: ::c_int = 4;
-pub const _SC_CHILD_MAX: ::c_int = 5;
-pub const _SC_CLK_TCK: ::c_int = 6;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 7;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 8;
-pub const _SC_LINE_MAX: ::c_int = 9;
-pub const _SC_NGROUPS_MAX: ::c_int = 10;
-pub const _SC_OPEN_MAX: ::c_int = 11;
-pub const _SC_2_C_BIND: ::c_int = 13;
-pub const _SC_2_C_DEV: ::c_int = 14;
-pub const _SC_2_C_VERSION: ::c_int = 15;
-pub const _SC_2_CHAR_TERM: ::c_int = 16;
-pub const _SC_2_FORT_DEV: ::c_int = 17;
-pub const _SC_2_FORT_RUN: ::c_int = 18;
-pub const _SC_2_LOCALEDEF: ::c_int = 19;
-pub const _SC_2_SW_DEV: ::c_int = 20;
-pub const _SC_2_UPE: ::c_int = 21;
-pub const _SC_2_VERSION: ::c_int = 22;
-pub const _SC_JOB_CONTROL: ::c_int = 23;
-pub const _SC_SAVED_IDS: ::c_int = 24;
-pub const _SC_VERSION: ::c_int = 25;
-pub const _SC_RE_DUP_MAX: ::c_int = 26;
-pub const _SC_STREAM_MAX: ::c_int = 27;
-pub const _SC_TZNAME_MAX: ::c_int = 28;
-pub const _SC_XOPEN_CRYPT: ::c_int = 29;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 30;
-pub const _SC_XOPEN_SHM: ::c_int = 31;
-pub const _SC_XOPEN_VERSION: ::c_int = 32;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 33;
-pub const _SC_XOPEN_REALTIME: ::c_int = 34;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 35;
-pub const _SC_XOPEN_LEGACY: ::c_int = 36;
-pub const _SC_ATEXIT_MAX: ::c_int = 37;
-pub const _SC_IOV_MAX: ::c_int = 38;
-pub const _SC_PAGESIZE: ::c_int = 39;
-pub const _SC_PAGE_SIZE: ::c_int = 40;
-pub const _SC_XOPEN_UNIX: ::c_int = 41;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 51;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 71;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 72;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 73;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 74;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 75;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 76;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 77;
-pub const _SC_TTY_NAME_MAX: ::c_int = 78;
-pub const _SC_THREADS: ::c_int = 79;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 80;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 81;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 82;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 83;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 84;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 85;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 97;
-
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-
-pub const FIOCLEX: ::c_int = 0x5451;
-
-pub const SA_ONSTACK: ::c_ulong = 0x08000000;
-pub const SA_SIGINFO: ::c_ulong = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_ulong = 0x00000002;
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const LC_PAPER: ::c_int = 7;
-pub const LC_NAME: ::c_int = 8;
-pub const LC_ADDRESS: ::c_int = 9;
-pub const LC_TELEPHONE: ::c_int = 10;
-pub const LC_MEASUREMENT: ::c_int = 11;
-pub const LC_IDENTIFICATION: ::c_int = 12;
-pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER);
-pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME);
-pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS);
-pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE);
-pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT);
-pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION);
-pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK
-                               | ::LC_NUMERIC_MASK
-                               | ::LC_TIME_MASK
-                               | ::LC_COLLATE_MASK
-                               | ::LC_MONETARY_MASK
-                               | ::LC_MESSAGES_MASK
-                               | LC_PAPER_MASK
-                               | LC_NAME_MASK
-                               | LC_ADDRESS_MASK
-                               | LC_TELEPHONE_MASK
-                               | LC_MEASUREMENT_MASK
-                               | LC_IDENTIFICATION_MASK;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_ANONYMOUS: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-
-pub const EMULTIHOP: ::c_int = 72;
-pub const EBADMSG: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 1;
-pub const SOL_UDP: ::c_int = 17;
-pub const SOL_SCTP: ::c_int = 132;
-pub const SOL_IPX: ::c_int = 256;
-pub const SOL_AX25: ::c_int = 257;
-pub const SOL_ATALK: ::c_int = 258;
-pub const SOL_NETROM: ::c_int = 259;
-pub const SOL_ROSE: ::c_int = 260;
-
-#[doc(hidden)]
-pub const AF_MAX: ::c_int = 39;
-#[doc(hidden)]
-pub const PF_MAX: ::c_int = AF_MAX;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-
-pub const O_ACCMODE: ::c_int = 3;
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 0x101000;
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-
-pub const NI_MAXHOST: ::size_t = 1025;
-
-pub const NCCS: usize = 19;
-pub const TCSBRKP: ::c_int = 0x5425;
-pub const TCSANOW: ::c_int = 0;
-pub const TCSADRAIN: ::c_int = 0x1;
-pub const TCSAFLUSH: ::c_int = 0x2;
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5;
-pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff;
-pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245;
-pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45;
-pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53;
-pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849;
-pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6;
-pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660;
-pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6;
-pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f;
-pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f;
-pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468;
-pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478;
-pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44;
-pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c;
-pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969;
-pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1;
-pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0;
-pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f;
-pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973;
-pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b;
-pub const TMPFS_MAGIC: ::c_long = 0x01021994;
-pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2;
-
-pub const MADV_HUGEPAGE: ::c_int = 14;
-pub const MADV_NOHUGEPAGE: ::c_int = 15;
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const PTRACE_TRACEME: ::c_int = 0;
-pub const PTRACE_PEEKTEXT: ::c_int = 1;
-pub const PTRACE_PEEKDATA: ::c_int = 2;
-pub const PTRACE_PEEKUSER: ::c_int = 3;
-pub const PTRACE_POKETEXT: ::c_int = 4;
-pub const PTRACE_POKEDATA: ::c_int = 5;
-pub const PTRACE_POKEUSER: ::c_int = 6;
-pub const PTRACE_CONT: ::c_int = 7;
-pub const PTRACE_KILL: ::c_int = 8;
-pub const PTRACE_SINGLESTEP: ::c_int = 9;
-pub const PTRACE_ATTACH: ::c_int = 16;
-pub const PTRACE_DETACH: ::c_int = 17;
-pub const PTRACE_SYSCALL: ::c_int = 24;
-pub const PTRACE_SETOPTIONS: ::c_int = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_int = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_int = 0x4203;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const TCGETS: ::c_int = 0x5401;
-pub const TCSETS: ::c_int = 0x5402;
-pub const TCSETSW: ::c_int = 0x5403;
-pub const TCSETSF: ::c_int = 0x5404;
-pub const TCGETA: ::c_int = 0x5405;
-pub const TCSETA: ::c_int = 0x5406;
-pub const TCSETAW: ::c_int = 0x5407;
-pub const TCSETAF: ::c_int = 0x5408;
-pub const TCSBRK: ::c_int = 0x5409;
-pub const TCXONC: ::c_int = 0x540A;
-pub const TCFLSH: ::c_int = 0x540B;
-pub const TIOCGSOFTCAR: ::c_int = 0x5419;
-pub const TIOCSSOFTCAR: ::c_int = 0x541A;
-pub const TIOCINQ: ::c_int = 0x541B;
-pub const TIOCLINUX: ::c_int = 0x541C;
-pub const TIOCGSERIAL: ::c_int = 0x541E;
-pub const TIOCEXCL: ::c_int = 0x540C;
-pub const TIOCNXCL: ::c_int = 0x540D;
-pub const TIOCSCTTY: ::c_int = 0x540E;
-pub const TIOCGPGRP: ::c_int = 0x540F;
-pub const TIOCSPGRP: ::c_int = 0x5410;
-pub const TIOCOUTQ: ::c_int = 0x5411;
-pub const TIOCSTI: ::c_int = 0x5412;
-pub const TIOCGWINSZ: ::c_int = 0x5413;
-pub const TIOCSWINSZ: ::c_int = 0x5414;
-pub const TIOCMGET: ::c_int = 0x5415;
-pub const TIOCMBIS: ::c_int = 0x5416;
-pub const TIOCMBIC: ::c_int = 0x5417;
-pub const TIOCMSET: ::c_int = 0x5418;
-pub const FIONREAD: ::c_int = 0x541B;
-pub const TIOCCONS: ::c_int = 0x541D;
-
-pub const RTLD_NOLOAD: ::c_int = 0x4;
-
-pub const SEM_FAILED: *mut sem_t = 0 as *mut sem_t;
-
-pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead;
-pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793;
-pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278;
-pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448;
-pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216;
-
-pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567;
-pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123;
-pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF;
-pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000;
-pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC;
-pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
-pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
-pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const NETLINK_ROUTE: ::c_int = 0;
-pub const NETLINK_UNUSED: ::c_int = 1;
-pub const NETLINK_USERSOCK: ::c_int = 2;
-pub const NETLINK_FIREWALL: ::c_int = 3;
-pub const NETLINK_SOCK_DIAG: ::c_int = 4;
-pub const NETLINK_NFLOG: ::c_int = 5;
-pub const NETLINK_XFRM: ::c_int = 6;
-pub const NETLINK_SELINUX: ::c_int = 7;
-pub const NETLINK_ISCSI: ::c_int = 8;
-pub const NETLINK_AUDIT: ::c_int = 9;
-pub const NETLINK_FIB_LOOKUP: ::c_int = 10;
-pub const NETLINK_CONNECTOR: ::c_int = 11;
-pub const NETLINK_NETFILTER: ::c_int = 12;
-pub const NETLINK_IP6_FW: ::c_int = 13;
-pub const NETLINK_DNRTMSG: ::c_int = 14;
-pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15;
-pub const NETLINK_GENERIC: ::c_int = 16;
-pub const NETLINK_SCSITRANSPORT: ::c_int = 18;
-pub const NETLINK_ECRYPTFS: ::c_int = 19;
-pub const NETLINK_RDMA: ::c_int = 20;
-pub const NETLINK_CRYPTO: ::c_int = 21;
-pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG;
-
-pub const MAX_LINKS: ::c_int = 32;
-
-pub const NLM_F_REQUEST: ::c_int = 1;
-pub const NLM_F_MULTI: ::c_int = 2;
-pub const NLM_F_ACK: ::c_int = 4;
-pub const NLM_F_ECHO: ::c_int = 8;
-pub const NLM_F_DUMP_INTR: ::c_int = 16;
-
-pub const NLM_F_ROOT: ::c_int = 0x100;
-pub const NLM_F_MATCH: ::c_int = 0x200;
-pub const NLM_F_ATOMIC: ::c_int = 0x400;
-pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH;
-
-pub const NLM_F_REPLACE: ::c_int = 0x100;
-pub const NLM_F_EXCL: ::c_int = 0x200;
-pub const NLM_F_CREATE: ::c_int = 0x400;
-pub const NLM_F_APPEND: ::c_int = 0x800;
-
-pub const NLMSG_NOOP: ::c_int = 0x1;
-pub const NLMSG_ERROR: ::c_int = 0x2;
-pub const NLMSG_DONE: ::c_int = 0x3;
-pub const NLMSG_OVERRUN: ::c_int = 0x4;
-pub const NLMSG_MIN_TYPE: ::c_int = 0x10;
-
-pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1;
-pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2;
-pub const NETLINK_PKTINFO: ::c_int = 3;
-pub const NETLINK_BROADCAST_ERROR: ::c_int = 4;
-pub const NETLINK_NO_ENOBUFS: ::c_int = 5;
-pub const NETLINK_RX_RING: ::c_int = 6;
-pub const NETLINK_TX_RING: ::c_int = 7;
-
-pub const NLA_F_NESTED: ::c_int = 1 << 15;
-pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14;
-pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER);
-
-pub const SIGEV_THREAD_ID: ::c_int = 4;
-
-f! {
-    pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
-        for slot in cpuset.__bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]);
-        let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
-        cpuset.__bits[idx] |= 1 << offset;
-        ()
-    }
-
-    pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]);
-        let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
-        cpuset.__bits[idx] &= !(1 << offset);
-        ()
-    }
-
-    pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
-        let size_in___bits = 8 * mem::size_of_val(&cpuset.__bits[0]);
-        let (idx, offset) = (cpu / size_in___bits, cpu % size_in___bits);
-        0 != (cpuset.__bits[idx] & (1 << offset))
-    }
-
-    pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool {
-        set1.__bits == set2.__bits
-    }
-    pub fn major(dev: ::dev_t) -> ::c_int {
-        ((dev >> 8) & 0xfff) as ::c_int
-    }
-    pub fn minor(dev: ::dev_t) -> ::c_int {
-        ((dev & 0xff) | ((dev >> 12) & 0xfff00)) as ::c_int
-    }
-    pub fn makedev(ma: ::c_int, mi: ::c_int) -> ::dev_t {
-        let ma = ma as ::dev_t;
-        let mi = mi as ::dev_t;
-        ((ma & 0xfff) << 8) | (mi & 0xff) | ((mi & 0xfff00) << 12)
-    }
-}
-
-extern {
-    static mut __progname: *mut ::c_char;
-}
-
-extern {
-    pub fn madvise(addr: *const ::c_void, len: ::size_t, advice: ::c_int)
-                   -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int;
-    pub fn msync(addr: *const ::c_void, len: ::size_t,
-                 flags: ::c_int) -> ::c_int;
-    pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *const ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::size_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::size_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn ptrace(request: ::c_int, ...) -> ::c_long;
-    pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
-    pub fn __sched_cpualloc(count: ::size_t) -> *mut ::cpu_set_t;
-    pub fn __sched_cpufree(set: *mut ::cpu_set_t);
-    pub fn __sched_cpucount(setsize: ::size_t, set: *mut cpu_set_t) -> ::c_int;
-    pub fn sched_getcpu() -> ::c_int;
-
-    pub fn utmpname(name: *const ::c_char) -> ::c_int;
-    pub fn setutent();
-    pub fn getutent() -> *mut utmp;
-
-    pub fn posix_fallocate(fd: ::c_int, offset: ::off_t,
-                           len: ::off_t) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_pointer_width = "32")] {
-        mod b32;
-        pub use self::b32::*;
-    } else if #[cfg(target_pointer_width = "64")] {
-        mod b64;
-        pub use self::b64::*;
-    } else {
-        // Unknown target_pointer_width
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mips32.rs
+++ /dev/null
@@ -1,234 +0,0 @@
-pub type c_char = i8;
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type clock_t = i32;
-pub type time_t = i32;
-pub type suseconds_t = i32;
-pub type wchar_t = i32;
-pub type off_t = i32;
-pub type ino_t = u32;
-pub type blkcnt_t = i32;
-pub type blksize_t = i32;
-pub type nlink_t = u32;
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: ::sigevent,
-        __next_prio: *mut aiocb,
-        __abs_prio: ::c_int,
-        __policy: ::c_int,
-        __error_code: ::c_int,
-        __return_value: ::ssize_t,
-        pub aio_offset: off_t,
-        __unused1: [::c_char; 4],
-        __glibc_reserved: [::c_char; 32]
-    }
-
-    pub struct stat {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 3],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        pub st_pad2: [::c_long; 2],
-        pub st_size: ::off_t,
-        st_pad3: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        st_pad5: [::c_long; 14],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 3],
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        st_pad2: [::c_long; 2],
-        pub st_size: ::off64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad3: ::c_long,
-        pub st_blocks: ::blkcnt64_t,
-        st_pad5: [::c_long; 14],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u32; 9]
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_int,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-        _resv: [::c_int; 1],
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sigset_t {
-        __val: [::c_ulong; 32],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub _pad: [::c_int; 29],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_uint,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved1: ::c_ulong,
-        pub msg_stime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved1: ::c_ulong,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved2: ::c_ulong,
-        pub msg_rtime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved2: ::c_ulong,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved3: ::c_ulong,
-        pub msg_ctime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved3: ::c_ulong,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_long,
-        pub f_bsize: ::c_long,
-        pub f_frsize: ::c_long,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_files: ::fsblkcnt_t,
-        pub f_ffree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_fsid: ::fsid_t,
-
-        pub f_namelen: ::c_long,
-        f_spare: [::c_long; 6],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_sysid: ::c_long,
-        pub l_pid: ::pid_t,
-        pad: [::c_long; 4],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 8],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff;
-
-pub const SYS_gettid: ::c_long = 4222;   // Valid for O32
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mips64.rs
+++ /dev/null
@@ -1,220 +0,0 @@
-pub type blkcnt_t = i64;
-pub type blksize_t = i64;
-pub type c_char = i8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type ino_t = u64;
-pub type nlink_t = u64;
-pub type off_t = i64;
-pub type suseconds_t = i64;
-pub type time_t = i64;
-pub type wchar_t = i32;
-pub type clock_t = i64;
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: ::sigevent,
-        __next_prio: *mut aiocb,
-        __abs_prio: ::c_int,
-        __policy: ::c_int,
-        __error_code: ::c_int,
-        __return_value: ::ssize_t,
-        pub aio_offset: off_t,
-        __glibc_reserved: [::c_char; 32]
-    }
-
-    pub struct stat {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        st_pad2: [::c_ulong; 1],
-        pub st_size: ::off_t,
-        st_pad3: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad4: ::c_long,
-        pub st_blocks: ::blkcnt_t,
-        st_pad5: [::c_long; 7],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        st_pad2: [::c_long; 2],
-        pub st_size: ::off64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad3: ::c_long,
-        pub st_blocks: ::blkcnt64_t,
-        st_pad5: [::c_long; 7],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [::c_ulong; 7]
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_int,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sigset_t {
-        __size: [::c_ulong; 16],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        _pad: ::c_int,
-        _pad2: [::c_long; 14],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_uint,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_long,
-        pub f_bsize: ::c_long,
-        pub f_frsize: ::c_long,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_files: ::fsblkcnt_t,
-        pub f_ffree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_fsid: ::fsid_t,
-
-        pub f_namelen: ::c_long,
-        f_spare: [::c_long; 6],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-
-pub const RLIM_INFINITY: ::rlim_t = 0xffff_ffff_ffff_ffff;
-
-pub const SYS_gettid: ::c_long = 5178;   // Valid for n64
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mips/mod.rs
+++ /dev/null
@@ -1,576 +0,0 @@
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type rlim_t = c_ulong;
-pub type __priority_which_t = ::c_uint;
-
-s! {
-    pub struct glob64_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut ::c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    // FIXME this is actually a union
-    pub struct sem_t {
-        #[cfg(target_pointer_width = "32")]
-        __size: [::c_char; 16],
-        #[cfg(target_pointer_width = "64")]
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-}
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const BUFSIZ: ::c_uint = 8192;
-pub const TMP_MAX: ::c_uint = 238328;
-pub const FOPEN_MAX: ::c_uint = 16;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-pub const _SC_2_C_VERSION: ::c_int = 96;
-pub const O_ACCMODE: ::c_int = 3;
-pub const O_DIRECT: ::c_int = 0x8000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const ST_RELATIME: ::c_ulong = 4096;
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const RLIMIT_NOFILE: ::c_int = 5;
-pub const RLIMIT_AS: ::c_int = 6;
-pub const RLIMIT_RSS: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 8;
-pub const RLIMIT_MEMLOCK: ::c_int = 9;
-pub const RLIMIT_NLIMITS: ::c_int = 16;
-
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 256;
-pub const O_EXCL: ::c_int = 1024;
-pub const O_NOCTTY: ::c_int = 2048;
-pub const O_NONBLOCK: ::c_int = 128;
-pub const O_SYNC: ::c_int = 0x4010;
-pub const O_RSYNC: ::c_int = 0x4010;
-pub const O_DSYNC: ::c_int = 0x10;
-pub const O_FSYNC: ::c_int = 0x4010;
-pub const O_ASYNC: ::c_int = 0x1000;
-pub const O_NDELAY: ::c_int = 0x80;
-
-pub const SOCK_NONBLOCK: ::c_int = 128;
-
-pub const EDEADLK: ::c_int = 45;
-pub const ENAMETOOLONG: ::c_int = 78;
-pub const ENOLCK: ::c_int = 46;
-pub const ENOSYS: ::c_int = 89;
-pub const ENOTEMPTY: ::c_int = 93;
-pub const ELOOP: ::c_int = 90;
-pub const ENOMSG: ::c_int = 35;
-pub const EIDRM: ::c_int = 36;
-pub const ECHRNG: ::c_int = 37;
-pub const EL2NSYNC: ::c_int = 38;
-pub const EL3HLT: ::c_int = 39;
-pub const EL3RST: ::c_int = 40;
-pub const ELNRNG: ::c_int = 41;
-pub const EUNATCH: ::c_int = 42;
-pub const ENOCSI: ::c_int = 43;
-pub const EL2HLT: ::c_int = 44;
-pub const EBADE: ::c_int = 50;
-pub const EBADR: ::c_int = 51;
-pub const EXFULL: ::c_int = 52;
-pub const ENOANO: ::c_int = 53;
-pub const EBADRQC: ::c_int = 54;
-pub const EBADSLT: ::c_int = 55;
-pub const EDEADLOCK: ::c_int = 56;
-pub const EMULTIHOP: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 79;
-pub const ENOTUNIQ: ::c_int = 80;
-pub const EBADFD: ::c_int = 81;
-pub const EBADMSG: ::c_int = 77;
-pub const EREMCHG: ::c_int = 82;
-pub const ELIBACC: ::c_int = 83;
-pub const ELIBBAD: ::c_int = 84;
-pub const ELIBSCN: ::c_int = 85;
-pub const ELIBMAX: ::c_int = 86;
-pub const ELIBEXEC: ::c_int = 87;
-pub const EILSEQ: ::c_int = 88;
-pub const ERESTART: ::c_int = 91;
-pub const ESTRPIPE: ::c_int = 92;
-pub const EUSERS: ::c_int = 94;
-pub const ENOTSOCK: ::c_int = 95;
-pub const EDESTADDRREQ: ::c_int = 96;
-pub const EMSGSIZE: ::c_int = 97;
-pub const EPROTOTYPE: ::c_int = 98;
-pub const ENOPROTOOPT: ::c_int = 99;
-pub const EPROTONOSUPPORT: ::c_int = 120;
-pub const ESOCKTNOSUPPORT: ::c_int = 121;
-pub const EOPNOTSUPP: ::c_int = 122;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 123;
-pub const EAFNOSUPPORT: ::c_int = 124;
-pub const EADDRINUSE: ::c_int = 125;
-pub const EADDRNOTAVAIL: ::c_int = 126;
-pub const ENETDOWN: ::c_int = 127;
-pub const ENETUNREACH: ::c_int = 128;
-pub const ENETRESET: ::c_int = 129;
-pub const ECONNABORTED: ::c_int = 130;
-pub const ECONNRESET: ::c_int = 131;
-pub const ENOBUFS: ::c_int = 132;
-pub const EISCONN: ::c_int = 133;
-pub const ENOTCONN: ::c_int = 134;
-pub const ESHUTDOWN: ::c_int = 143;
-pub const ETOOMANYREFS: ::c_int = 144;
-pub const ETIMEDOUT: ::c_int = 145;
-pub const ECONNREFUSED: ::c_int = 146;
-pub const EHOSTDOWN: ::c_int = 147;
-pub const EHOSTUNREACH: ::c_int = 148;
-pub const EALREADY: ::c_int = 149;
-pub const EINPROGRESS: ::c_int = 150;
-pub const ESTALE: ::c_int = 151;
-pub const EUCLEAN: ::c_int = 135;
-pub const ENOTNAM: ::c_int = 137;
-pub const ENAVAIL: ::c_int = 138;
-pub const EISNAM: ::c_int = 139;
-pub const EREMOTEIO: ::c_int = 140;
-pub const EDQUOT: ::c_int = 1133;
-pub const ENOMEDIUM: ::c_int = 159;
-pub const EMEDIUMTYPE: ::c_int = 160;
-pub const ECANCELED: ::c_int = 158;
-pub const ENOKEY: ::c_int = 161;
-pub const EKEYEXPIRED: ::c_int = 162;
-pub const EKEYREVOKED: ::c_int = 163;
-pub const EKEYREJECTED: ::c_int = 164;
-pub const EOWNERDEAD: ::c_int = 165;
-pub const ENOTRECOVERABLE: ::c_int = 166;
-pub const ERFKILL: ::c_int = 167;
-
-pub const LC_PAPER: ::c_int = 7;
-pub const LC_NAME: ::c_int = 8;
-pub const LC_ADDRESS: ::c_int = 9;
-pub const LC_TELEPHONE: ::c_int = 10;
-pub const LC_MEASUREMENT: ::c_int = 11;
-pub const LC_IDENTIFICATION: ::c_int = 12;
-pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER);
-pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME);
-pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS);
-pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE);
-pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT);
-pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION);
-pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK
-                               | ::LC_NUMERIC_MASK
-                               | ::LC_TIME_MASK
-                               | ::LC_COLLATE_MASK
-                               | ::LC_MONETARY_MASK
-                               | ::LC_MESSAGES_MASK
-                               | LC_PAPER_MASK
-                               | LC_NAME_MASK
-                               | LC_ADDRESS_MASK
-                               | LC_TELEPHONE_MASK
-                               | LC_MEASUREMENT_MASK
-                               | LC_IDENTIFICATION_MASK;
-
-pub const MAP_NORESERVE: ::c_int = 0x400;
-pub const MAP_ANON: ::c_int = 0x800;
-pub const MAP_ANONYMOUS: ::c_int = 0x800;
-pub const MAP_GROWSDOWN: ::c_int = 0x1000;
-pub const MAP_DENYWRITE: ::c_int = 0x2000;
-pub const MAP_EXECUTABLE: ::c_int = 0x4000;
-pub const MAP_LOCKED: ::c_int = 0x8000;
-pub const MAP_POPULATE: ::c_int = 0x10000;
-pub const MAP_NONBLOCK: ::c_int = 0x20000;
-pub const MAP_STACK: ::c_int = 0x40000;
-
-pub const SOCK_STREAM: ::c_int = 2;
-pub const SOCK_DGRAM: ::c_int = 1;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 0xffff;
-
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_TYPE: ::c_int = 0x1008;
-pub const SO_STYLE: ::c_int = SO_TYPE;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_ACCEPTCONN: ::c_int = 0x1009;
-pub const SO_PROTOCOL: ::c_int = 0x1028;
-pub const SO_DOMAIN: ::c_int = 0x1029;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_PASSCRED: ::c_int = 17;
-pub const SO_PEERCRED: ::c_int = 18;
-pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22;
-pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23;
-pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24;
-pub const SO_BINDTODEVICE: ::c_int = 25;
-pub const SO_ATTACH_FILTER: ::c_int = 26;
-pub const SO_DETACH_FILTER: ::c_int = 27;
-pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER;
-pub const SO_PEERNAME: ::c_int = 28;
-pub const SO_TIMESTAMP: ::c_int = 29;
-pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP;
-pub const SO_PEERSEC: ::c_int = 30;
-pub const SO_SNDBUFFORCE: ::c_int = 31;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_PASSSEC: ::c_int = 34;
-pub const SO_TIMESTAMPNS: ::c_int = 35;
-pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS;
-pub const SO_MARK: ::c_int = 36;
-pub const SO_TIMESTAMPING: ::c_int = 37;
-pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING;
-pub const SO_RXQ_OVFL: ::c_int = 40;
-pub const SO_WIFI_STATUS: ::c_int = 41;
-pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS;
-pub const SO_PEEK_OFF: ::c_int = 42;
-pub const SO_NOFCS: ::c_int = 43;
-pub const SO_LOCK_FILTER: ::c_int = 44;
-pub const SO_SELECT_ERR_QUEUE: ::c_int = 45;
-pub const SO_BUSY_POLL: ::c_int = 46;
-pub const SO_MAX_PACING_RATE: ::c_int = 47;
-pub const SO_BPF_EXTENSIONS: ::c_int = 48;
-pub const SO_INCOMING_CPU: ::c_int = 49;
-pub const SO_ATTACH_BPF: ::c_int = 50;
-pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER;
-
-pub const FIOCLEX: ::c_ulong = 0x6601;
-pub const FIONBIO: ::c_ulong = 0x667e;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000008;
-pub const SA_NOCLDWAIT: ::c_int = 0x00010000;
-
-pub const SIGCHLD: ::c_int = 18;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGTTIN: ::c_int = 26;
-pub const SIGTTOU: ::c_int = 27;
-pub const SIGXCPU: ::c_int = 30;
-pub const SIGXFSZ: ::c_int = 31;
-pub const SIGVTALRM: ::c_int = 28;
-pub const SIGPROF: ::c_int = 29;
-pub const SIGWINCH: ::c_int = 20;
-pub const SIGUSR1: ::c_int = 16;
-pub const SIGUSR2: ::c_int = 17;
-pub const SIGCONT: ::c_int = 25;
-pub const SIGSTOP: ::c_int = 23;
-pub const SIGTSTP: ::c_int = 24;
-pub const SIGURG: ::c_int = 21;
-pub const SIGIO: ::c_int = 22;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGPOLL: ::c_int = 22;
-pub const SIGPWR: ::c_int = 19;
-pub const SIG_SETMASK: ::c_int = 3;
-pub const SIG_BLOCK: ::c_int = 0x1;
-pub const SIG_UNBLOCK: ::c_int = 0x2;
-
-pub const POLLRDNORM: ::c_short = 0x040;
-pub const POLLWRNORM: ::c_short = 0x004;
-pub const POLLRDBAND: ::c_short = 0x080;
-pub const POLLWRBAND: ::c_short = 0x100;
-
-pub const PTHREAD_STACK_MIN: ::size_t = 131072;
-
-pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5;
-pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff;
-pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245;
-pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45;
-pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53;
-pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849;
-pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6;
-pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660;
-pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6;
-pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f;
-pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f;
-pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468;
-pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478;
-pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44;
-pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c;
-pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969;
-pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1;
-pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0;
-pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f;
-pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973;
-pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b;
-pub const TMPFS_MAGIC: ::c_long = 0x01021994;
-pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2;
-
-pub const VEOF: usize = 16;
-pub const VEOL: usize = 17;
-pub const VEOL2: usize = 6;
-pub const VMIN: usize = 4;
-pub const IEXTEN: ::tcflag_t = 0x00000100;
-pub const TOSTOP: ::tcflag_t = 0x00008000;
-pub const FLUSHO: ::tcflag_t = 0x00002000;
-pub const EXTPROC: ::tcflag_t = 0o200000;
-pub const TCSANOW: ::c_int = 0x540e;
-pub const TCSADRAIN: ::c_int = 0x540f;
-pub const TCSAFLUSH: ::c_int = 0x5410;
-
-pub const CPU_SETSIZE: ::c_int = 0x400;
-
-pub const PTRACE_TRACEME: ::c_uint = 0;
-pub const PTRACE_PEEKTEXT: ::c_uint = 1;
-pub const PTRACE_PEEKDATA: ::c_uint = 2;
-pub const PTRACE_PEEKUSER: ::c_uint = 3;
-pub const PTRACE_POKETEXT: ::c_uint = 4;
-pub const PTRACE_POKEDATA: ::c_uint = 5;
-pub const PTRACE_POKEUSER: ::c_uint = 6;
-pub const PTRACE_CONT: ::c_uint = 7;
-pub const PTRACE_KILL: ::c_uint = 8;
-pub const PTRACE_SINGLESTEP: ::c_uint = 9;
-pub const PTRACE_ATTACH: ::c_uint = 16;
-pub const PTRACE_DETACH: ::c_uint = 17;
-pub const PTRACE_SYSCALL: ::c_uint = 24;
-pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203;
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-
-pub const MAP_HUGETLB: ::c_int = 0x080000;
-
-pub const EFD_NONBLOCK: ::c_int = 0x80;
-
-pub const F_GETLK: ::c_int = 14;
-pub const F_GETOWN: ::c_int = 23;
-pub const F_SETOWN: ::c_int = 24;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x80;
-
-pub const TCGETS: ::c_ulong = 0x540d;
-pub const TCSETS: ::c_ulong = 0x540e;
-pub const TCSETSW: ::c_ulong = 0x540f;
-pub const TCSETSF: ::c_ulong = 0x5410;
-pub const TCGETA: ::c_ulong = 0x5401;
-pub const TCSETA: ::c_ulong = 0x5402;
-pub const TCSETAW: ::c_ulong = 0x5403;
-pub const TCSETAF: ::c_ulong = 0x5404;
-pub const TCSBRK: ::c_ulong = 0x5405;
-pub const TCXONC: ::c_ulong = 0x5406;
-pub const TCFLSH: ::c_ulong = 0x5407;
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5481;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x5482;
-pub const TIOCINQ: ::c_ulong = 0x467f;
-pub const TIOCLINUX: ::c_ulong = 0x5483;
-pub const TIOCGSERIAL: ::c_ulong = 0x5484;
-pub const TIOCEXCL: ::c_ulong = 0x740d;
-pub const TIOCNXCL: ::c_ulong = 0x740e;
-pub const TIOCSCTTY: ::c_ulong = 0x5480;
-pub const TIOCGPGRP: ::c_ulong = 0x40047477;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCOUTQ: ::c_ulong = 0x7472;
-pub const TIOCSTI: ::c_ulong = 0x5472;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const TIOCMGET: ::c_ulong = 0x741d;
-pub const TIOCMBIS: ::c_ulong = 0x741b;
-pub const TIOCMBIC: ::c_ulong = 0x741c;
-pub const TIOCMSET: ::c_ulong = 0x741a;
-pub const FIONREAD: ::c_ulong = 0x467f;
-pub const TIOCCONS: ::c_ulong = 0x80047478;
-
-pub const RTLD_DEEPBIND: ::c_int = 0x10;
-pub const RTLD_GLOBAL: ::c_int = 0x4;
-pub const RTLD_NOLOAD: ::c_int = 0x8;
-
-pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead;
-pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793;
-pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278;
-pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448;
-pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216;
-
-pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567;
-pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123;
-pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF;
-pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000;
-pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC;
-pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
-pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
-pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-#[link(name = "util")]
-extern {
-    pub fn sysctl(name: *mut ::c_int,
-                  namelen: ::c_int,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-    pub fn backtrace(buf: *mut *mut ::c_void,
-                     sz: ::c_int) -> ::c_int;
-    pub fn glob64(pattern: *const ::c_char,
-                  flags: ::c_int,
-                  errfunc: ::dox::Option<extern fn(epath: *const ::c_char,
-                                                   errno: ::c_int)
-                                                   -> ::c_int>,
-                  pglob: *mut glob64_t) -> ::c_int;
-    pub fn globfree64(pglob: *mut glob64_t);
-    pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
-    pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::__priority_which_t, who: ::id_t,
-                                       prio: ::c_int) -> ::c_int;
-    pub fn pthread_getaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_setaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn sched_getcpu() -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(target_arch = "mips")] {
-        mod mips32;
-        pub use self::mips32::*;
-    } else if #[cfg(target_arch = "mips64")] {
-        mod mips64;
-        pub use self::mips64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/mod.rs
+++ /dev/null
@@ -1,1045 +0,0 @@
-//! Linux-specific definitions for linux-like values
-
-use dox::{mem, Option};
-
-pub type useconds_t = u32;
-pub type dev_t = u64;
-pub type socklen_t = u32;
-pub type pthread_t = c_ulong;
-pub type mode_t = u32;
-pub type ino64_t = u64;
-pub type off64_t = i64;
-pub type blkcnt64_t = i64;
-pub type rlim64_t = u64;
-pub type shmatt_t = ::c_ulong;
-pub type mqd_t = ::c_int;
-pub type msgqnum_t = ::c_ulong;
-pub type msglen_t = ::c_ulong;
-pub type nfds_t = ::c_ulong;
-pub type nl_item = ::c_int;
-pub type idtype_t = ::c_uint;
-
-pub enum fpos64_t {} // TODO: fill this out with a struct
-
-s! {
-    pub struct dirent {
-        pub d_ino: ::ino_t,
-        pub d_off: ::off_t,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct dirent64 {
-        pub d_ino: ::ino64_t,
-        pub d_off: ::off64_t,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct rlimit64 {
-        pub rlim_cur: rlim64_t,
-        pub rlim_max: rlim64_t,
-    }
-
-    pub struct glob_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct ifaddrs {
-        pub ifa_next: *mut ifaddrs,
-        pub ifa_name: *mut c_char,
-        pub ifa_flags: ::c_uint,
-        pub ifa_addr: *mut ::sockaddr,
-        pub ifa_netmask: *mut ::sockaddr,
-        pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union
-        pub ifa_data: *mut ::c_void
-    }
-
-    pub struct pthread_mutex_t {
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEX_T],
-    }
-
-    pub struct pthread_rwlock_t {
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_RWLOCK_T],
-    }
-
-    pub struct pthread_mutexattr_t {
-        #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64",
-                  target_arch = "mips64", target_arch = "s390x",
-                  target_arch = "sparc64"))]
-        __align: [::c_int; 0],
-        #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64",
-                      target_arch = "mips64", target_arch = "s390x",
-                      target_arch = "sparc64")))]
-        __align: [::c_long; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T],
-    }
-
-    pub struct pthread_cond_t {
-        #[cfg(any(target_env = "musl"))]
-        __align: [*const ::c_void; 0],
-        #[cfg(not(any(target_env = "musl")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_COND_T],
-    }
-
-    pub struct pthread_condattr_t {
-        __align: [::c_int; 0],
-        size: [u8; __SIZEOF_PTHREAD_CONDATTR_T],
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_gecos: *mut ::c_char,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-    }
-
-    pub struct spwd {
-        pub sp_namp: *mut ::c_char,
-        pub sp_pwdp: *mut ::c_char,
-        pub sp_lstchg: ::c_long,
-        pub sp_min: ::c_long,
-        pub sp_max: ::c_long,
-        pub sp_warn: ::c_long,
-        pub sp_inact: ::c_long,
-        pub sp_expire: ::c_long,
-        pub sp_flag: ::c_ulong,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        #[cfg(target_endian = "little")]
-        pub f_fsid: ::c_ulong,
-        #[cfg(target_pointer_width = "32")]
-        __f_unused: ::c_int,
-        #[cfg(target_endian = "big")]
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        __f_spare: [::c_int; 6],
-    }
-
-    pub struct dqblk {
-        pub dqb_bhardlimit: ::uint64_t,
-        pub dqb_bsoftlimit: ::uint64_t,
-        pub dqb_curspace: ::uint64_t,
-        pub dqb_ihardlimit: ::uint64_t,
-        pub dqb_isoftlimit: ::uint64_t,
-        pub dqb_curinodes: ::uint64_t,
-        pub dqb_btime: ::uint64_t,
-        pub dqb_itime: ::uint64_t,
-        pub dqb_valid: ::uint32_t,
-    }
-
-    pub struct signalfd_siginfo {
-        pub ssi_signo: ::uint32_t,
-        pub ssi_errno: ::int32_t,
-        pub ssi_code: ::int32_t,
-        pub ssi_pid: ::uint32_t,
-        pub ssi_uid: ::uint32_t,
-        pub ssi_fd: ::int32_t,
-        pub ssi_tid: ::uint32_t,
-        pub ssi_band: ::uint32_t,
-        pub ssi_overrun: ::uint32_t,
-        pub ssi_trapno: ::uint32_t,
-        pub ssi_status: ::int32_t,
-        pub ssi_int: ::int32_t,
-        pub ssi_ptr: ::uint64_t,
-        pub ssi_utime: ::uint64_t,
-        pub ssi_stime: ::uint64_t,
-        pub ssi_addr: ::uint64_t,
-        _pad: [::uint8_t; 48],
-    }
-
-    pub struct fsid_t {
-        __val: [::c_int; 2],
-    }
-
-    pub struct mq_attr {
-        pub mq_flags: ::c_long,
-        pub mq_maxmsg: ::c_long,
-        pub mq_msgsize: ::c_long,
-        pub mq_curmsgs: ::c_long,
-        pad: [::c_long; 4]
-    }
-
-    pub struct cpu_set_t {
-        #[cfg(target_pointer_width = "32")]
-        bits: [u32; 32],
-        #[cfg(target_pointer_width = "64")]
-        bits: [u64; 16],
-    }
-
-    pub struct if_nameindex {
-        pub if_index: ::c_uint,
-        pub if_name: *mut ::c_char,
-    }
-
-    // System V IPC
-    pub struct msginfo {
-        pub msgpool: ::c_int,
-        pub msgmap: ::c_int,
-        pub msgmax: ::c_int,
-        pub msgmnb: ::c_int,
-        pub msgmni: ::c_int,
-        pub msgssz: ::c_int,
-        pub msgtql: ::c_int,
-        pub msgseg: ::c_ushort,
-    }
-
-    pub struct mmsghdr {
-        pub msg_hdr: ::msghdr,
-        pub msg_len: ::c_uint,
-    }
-
-    pub struct sembuf {
-        pub sem_num: ::c_ushort,
-        pub sem_op: ::c_short,
-        pub sem_flg: ::c_short,
-    }
-}
-
-pub const ABDAY_1: ::nl_item = 0x20000;
-pub const ABDAY_2: ::nl_item = 0x20001;
-pub const ABDAY_3: ::nl_item = 0x20002;
-pub const ABDAY_4: ::nl_item = 0x20003;
-pub const ABDAY_5: ::nl_item = 0x20004;
-pub const ABDAY_6: ::nl_item = 0x20005;
-pub const ABDAY_7: ::nl_item = 0x20006;
-
-pub const DAY_1: ::nl_item = 0x20007;
-pub const DAY_2: ::nl_item = 0x20008;
-pub const DAY_3: ::nl_item = 0x20009;
-pub const DAY_4: ::nl_item = 0x2000A;
-pub const DAY_5: ::nl_item = 0x2000B;
-pub const DAY_6: ::nl_item = 0x2000C;
-pub const DAY_7: ::nl_item = 0x2000D;
-
-pub const ABMON_1: ::nl_item = 0x2000E;
-pub const ABMON_2: ::nl_item = 0x2000F;
-pub const ABMON_3: ::nl_item = 0x20010;
-pub const ABMON_4: ::nl_item = 0x20011;
-pub const ABMON_5: ::nl_item = 0x20012;
-pub const ABMON_6: ::nl_item = 0x20013;
-pub const ABMON_7: ::nl_item = 0x20014;
-pub const ABMON_8: ::nl_item = 0x20015;
-pub const ABMON_9: ::nl_item = 0x20016;
-pub const ABMON_10: ::nl_item = 0x20017;
-pub const ABMON_11: ::nl_item = 0x20018;
-pub const ABMON_12: ::nl_item = 0x20019;
-
-pub const MON_1: ::nl_item = 0x2001A;
-pub const MON_2: ::nl_item = 0x2001B;
-pub const MON_3: ::nl_item = 0x2001C;
-pub const MON_4: ::nl_item = 0x2001D;
-pub const MON_5: ::nl_item = 0x2001E;
-pub const MON_6: ::nl_item = 0x2001F;
-pub const MON_7: ::nl_item = 0x20020;
-pub const MON_8: ::nl_item = 0x20021;
-pub const MON_9: ::nl_item = 0x20022;
-pub const MON_10: ::nl_item = 0x20023;
-pub const MON_11: ::nl_item = 0x20024;
-pub const MON_12: ::nl_item = 0x20025;
-
-pub const AM_STR: ::nl_item = 0x20026;
-pub const PM_STR: ::nl_item = 0x20027;
-
-pub const D_T_FMT: ::nl_item = 0x20028;
-pub const D_FMT: ::nl_item = 0x20029;
-pub const T_FMT: ::nl_item = 0x2002A;
-pub const T_FMT_AMPM: ::nl_item = 0x2002B;
-
-pub const ERA: ::nl_item = 0x2002C;
-pub const ERA_D_FMT: ::nl_item = 0x2002E;
-pub const ALT_DIGITS: ::nl_item = 0x2002F;
-pub const ERA_D_T_FMT: ::nl_item = 0x20030;
-pub const ERA_T_FMT: ::nl_item = 0x20031;
-
-pub const CODESET: ::nl_item = 14;
-
-pub const CRNCYSTR: ::nl_item = 0x4000F;
-
-pub const RUSAGE_THREAD: ::c_int = 1;
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const RADIXCHAR: ::nl_item = 0x10000;
-pub const THOUSEP: ::nl_item = 0x10001;
-
-pub const YESEXPR: ::nl_item = 0x50000;
-pub const NOEXPR: ::nl_item = 0x50001;
-pub const YESSTR: ::nl_item = 0x50002;
-pub const NOSTR: ::nl_item = 0x50003;
-
-pub const FILENAME_MAX: ::c_uint = 4096;
-pub const L_tmpnam: ::c_uint = 20;
-pub const _PC_LINK_MAX: ::c_int = 0;
-pub const _PC_MAX_CANON: ::c_int = 1;
-pub const _PC_MAX_INPUT: ::c_int = 2;
-pub const _PC_NAME_MAX: ::c_int = 3;
-pub const _PC_PATH_MAX: ::c_int = 4;
-pub const _PC_PIPE_BUF: ::c_int = 5;
-pub const _PC_CHOWN_RESTRICTED: ::c_int = 6;
-pub const _PC_NO_TRUNC: ::c_int = 7;
-pub const _PC_VDISABLE: ::c_int = 8;
-
-pub const _SC_ARG_MAX: ::c_int = 0;
-pub const _SC_CHILD_MAX: ::c_int = 1;
-pub const _SC_CLK_TCK: ::c_int = 2;
-pub const _SC_NGROUPS_MAX: ::c_int = 3;
-pub const _SC_OPEN_MAX: ::c_int = 4;
-pub const _SC_STREAM_MAX: ::c_int = 5;
-pub const _SC_TZNAME_MAX: ::c_int = 6;
-pub const _SC_JOB_CONTROL: ::c_int = 7;
-pub const _SC_SAVED_IDS: ::c_int = 8;
-pub const _SC_REALTIME_SIGNALS: ::c_int = 9;
-pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10;
-pub const _SC_TIMERS: ::c_int = 11;
-pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12;
-pub const _SC_PRIORITIZED_IO: ::c_int = 13;
-pub const _SC_SYNCHRONIZED_IO: ::c_int = 14;
-pub const _SC_FSYNC: ::c_int = 15;
-pub const _SC_MAPPED_FILES: ::c_int = 16;
-pub const _SC_MEMLOCK: ::c_int = 17;
-pub const _SC_MEMLOCK_RANGE: ::c_int = 18;
-pub const _SC_MEMORY_PROTECTION: ::c_int = 19;
-pub const _SC_MESSAGE_PASSING: ::c_int = 20;
-pub const _SC_SEMAPHORES: ::c_int = 21;
-pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22;
-pub const _SC_AIO_LISTIO_MAX: ::c_int = 23;
-pub const _SC_AIO_MAX: ::c_int = 24;
-pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25;
-pub const _SC_DELAYTIMER_MAX: ::c_int = 26;
-pub const _SC_MQ_OPEN_MAX: ::c_int = 27;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 28;
-pub const _SC_VERSION: ::c_int = 29;
-pub const _SC_PAGESIZE: ::c_int = 30;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_RTSIG_MAX: ::c_int = 31;
-pub const _SC_SEM_NSEMS_MAX: ::c_int = 32;
-pub const _SC_SEM_VALUE_MAX: ::c_int = 33;
-pub const _SC_SIGQUEUE_MAX: ::c_int = 34;
-pub const _SC_TIMER_MAX: ::c_int = 35;
-pub const _SC_BC_BASE_MAX: ::c_int = 36;
-pub const _SC_BC_DIM_MAX: ::c_int = 37;
-pub const _SC_BC_SCALE_MAX: ::c_int = 38;
-pub const _SC_BC_STRING_MAX: ::c_int = 39;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 42;
-pub const _SC_LINE_MAX: ::c_int = 43;
-pub const _SC_RE_DUP_MAX: ::c_int = 44;
-pub const _SC_2_VERSION: ::c_int = 46;
-pub const _SC_2_C_BIND: ::c_int = 47;
-pub const _SC_2_C_DEV: ::c_int = 48;
-pub const _SC_2_FORT_DEV: ::c_int = 49;
-pub const _SC_2_FORT_RUN: ::c_int = 50;
-pub const _SC_2_SW_DEV: ::c_int = 51;
-pub const _SC_2_LOCALEDEF: ::c_int = 52;
-pub const _SC_IOV_MAX: ::c_int = 60;
-pub const _SC_THREADS: ::c_int = 67;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 71;
-pub const _SC_TTY_NAME_MAX: ::c_int = 72;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 74;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 75;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 76;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81;
-pub const _SC_NPROCESSORS_CONF: ::c_int = 83;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 84;
-pub const _SC_ATEXIT_MAX: ::c_int = 87;
-pub const _SC_XOPEN_VERSION: ::c_int = 89;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90;
-pub const _SC_XOPEN_UNIX: ::c_int = 91;
-pub const _SC_XOPEN_CRYPT: ::c_int = 92;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 93;
-pub const _SC_XOPEN_SHM: ::c_int = 94;
-pub const _SC_2_CHAR_TERM: ::c_int = 95;
-pub const _SC_2_UPE: ::c_int = 97;
-pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125;
-pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126;
-pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128;
-pub const _SC_XOPEN_LEGACY: ::c_int = 129;
-pub const _SC_XOPEN_REALTIME: ::c_int = 130;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131;
-pub const _SC_HOST_NAME_MAX: ::c_int = 180;
-
-pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY;
-pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY;
-
-pub const GLOB_ERR: ::c_int = 1 << 0;
-pub const GLOB_MARK: ::c_int = 1 << 1;
-pub const GLOB_NOSORT: ::c_int = 1 << 2;
-pub const GLOB_DOOFFS: ::c_int = 1 << 3;
-pub const GLOB_NOCHECK: ::c_int = 1 << 4;
-pub const GLOB_APPEND: ::c_int = 1 << 5;
-pub const GLOB_NOESCAPE: ::c_int = 1 << 6;
-
-pub const GLOB_NOSPACE: ::c_int = 1;
-pub const GLOB_ABORTED: ::c_int = 2;
-pub const GLOB_NOMATCH: ::c_int = 3;
-
-pub const POSIX_MADV_NORMAL: ::c_int = 0;
-pub const POSIX_MADV_RANDOM: ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_MADV_WILLNEED: ::c_int = 3;
-
-pub const S_IEXEC: mode_t = 64;
-pub const S_IWRITE: mode_t = 128;
-pub const S_IREAD: mode_t = 256;
-
-pub const F_LOCK: ::c_int = 1;
-pub const F_TEST: ::c_int = 3;
-pub const F_TLOCK: ::c_int = 2;
-pub const F_ULOCK: ::c_int = 0;
-
-pub const ST_RDONLY: ::c_ulong = 1;
-pub const ST_NOSUID: ::c_ulong = 2;
-pub const ST_NODEV: ::c_ulong = 4;
-pub const ST_NOEXEC: ::c_ulong = 8;
-pub const ST_SYNCHRONOUS: ::c_ulong = 16;
-pub const ST_MANDLOCK: ::c_ulong = 64;
-pub const ST_WRITE: ::c_ulong = 128;
-pub const ST_APPEND: ::c_ulong = 256;
-pub const ST_IMMUTABLE: ::c_ulong = 512;
-pub const ST_NOATIME: ::c_ulong = 1024;
-pub const ST_NODIRATIME: ::c_ulong = 2048;
-
-pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void;
-pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
-pub const RTLD_NODELETE: ::c_int = 0x1000;
-pub const RTLD_NOW: ::c_int = 0x2;
-
-pub const TCP_MD5SIG: ::c_int = 14;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_MUTEX_T],
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_COND_T],
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_RWLOCK_T],
-};
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-pub const __SIZEOF_PTHREAD_COND_T: usize = 48;
-
-pub const SCHED_OTHER: ::c_int = 0;
-pub const SCHED_FIFO: ::c_int = 1;
-pub const SCHED_RR: ::c_int = 2;
-pub const SCHED_BATCH: ::c_int = 3;
-pub const SCHED_IDLE: ::c_int = 5;
-
-pub const AF_IB: ::c_int = 27;
-pub const AF_MPLS: ::c_int = 28;
-pub const AF_NFC: ::c_int = 39;
-pub const AF_VSOCK: ::c_int = 40;
-#[doc(hidden)]
-pub const AF_MAX: ::c_int = 42;
-pub const PF_IB: ::c_int = AF_IB;
-pub const PF_MPLS: ::c_int = AF_MPLS;
-pub const PF_NFC: ::c_int = AF_NFC;
-pub const PF_VSOCK: ::c_int = AF_VSOCK;
-#[doc(hidden)]
-pub const PF_MAX: ::c_int = AF_MAX;
-
-// System V IPC
-pub const IPC_PRIVATE: ::key_t = 0;
-
-pub const IPC_CREAT: ::c_int = 0o1000;
-pub const IPC_EXCL: ::c_int = 0o2000;
-pub const IPC_NOWAIT: ::c_int = 0o4000;
-
-pub const IPC_RMID: ::c_int = 0;
-pub const IPC_SET: ::c_int = 1;
-pub const IPC_STAT: ::c_int = 2;
-pub const IPC_INFO: ::c_int = 3;
-pub const MSG_STAT: ::c_int = 11;
-pub const MSG_INFO: ::c_int = 12;
-
-pub const MSG_NOERROR: ::c_int = 0o10000;
-pub const MSG_EXCEPT: ::c_int = 0o20000;
-pub const MSG_COPY: ::c_int = 0o40000;
-
-pub const SHM_R: ::c_int = 0o400;
-pub const SHM_W: ::c_int = 0o200;
-
-pub const SHM_RDONLY: ::c_int = 0o10000;
-pub const SHM_RND: ::c_int = 0o20000;
-pub const SHM_REMAP: ::c_int = 0o40000;
-pub const SHM_EXEC: ::c_int = 0o100000;
-
-pub const SHM_LOCK: ::c_int = 11;
-pub const SHM_UNLOCK: ::c_int = 12;
-
-pub const SHM_HUGETLB: ::c_int = 0o4000;
-pub const SHM_NORESERVE: ::c_int = 0o10000;
-
-pub const EPOLLRDHUP: ::c_int = 0x2000;
-pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000;
-pub const EPOLLONESHOT: ::c_int = 0x40000000;
-
-pub const QFMT_VFS_OLD: ::c_int = 1;
-pub const QFMT_VFS_V0: ::c_int = 2;
-
-pub const EFD_SEMAPHORE: ::c_int = 0x1;
-
-pub const LOG_NFACILITIES: ::c_int = 24;
-
-pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t;
-
-pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32;
-pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32;
-pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32;
-pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32;
-pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32;
-pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32;
-pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32;
-
-pub const AI_PASSIVE: ::c_int = 0x0001;
-pub const AI_CANONNAME: ::c_int = 0x0002;
-pub const AI_NUMERICHOST: ::c_int = 0x0004;
-pub const AI_V4MAPPED: ::c_int = 0x0008;
-pub const AI_ALL: ::c_int = 0x0010;
-pub const AI_ADDRCONFIG: ::c_int = 0x0020;
-
-pub const AI_NUMERICSERV: ::c_int = 0x0400;
-
-pub const EAI_BADFLAGS: ::c_int = -1;
-pub const EAI_NONAME: ::c_int = -2;
-pub const EAI_AGAIN: ::c_int = -3;
-pub const EAI_FAIL: ::c_int = -4;
-pub const EAI_FAMILY: ::c_int = -6;
-pub const EAI_SOCKTYPE: ::c_int = -7;
-pub const EAI_SERVICE: ::c_int = -8;
-pub const EAI_MEMORY: ::c_int = -10;
-pub const EAI_OVERFLOW: ::c_int = -12;
-
-pub const NI_NUMERICHOST: ::c_int = 1;
-pub const NI_NUMERICSERV: ::c_int = 2;
-pub const NI_NOFQDN: ::c_int = 4;
-pub const NI_NAMEREQD: ::c_int = 8;
-pub const NI_DGRAM: ::c_int = 16;
-
-pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1;
-pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2;
-pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4;
-
-pub const EAI_SYSTEM: ::c_int = -11;
-
-pub const AIO_CANCELED: ::c_int = 0;
-pub const AIO_NOTCANCELED: ::c_int = 1;
-pub const AIO_ALLDONE: ::c_int = 2;
-pub const LIO_READ: ::c_int = 0;
-pub const LIO_WRITE: ::c_int = 1;
-pub const LIO_NOP: ::c_int = 2;
-pub const LIO_WAIT: ::c_int = 0;
-pub const LIO_NOWAIT: ::c_int = 1;
-
-pub const MREMAP_MAYMOVE: ::c_int = 1;
-pub const MREMAP_FIXED: ::c_int = 2;
-
-pub const PR_SET_PDEATHSIG: ::c_int = 1;
-pub const PR_GET_PDEATHSIG: ::c_int = 2;
-
-pub const PR_GET_DUMPABLE: ::c_int = 3;
-pub const PR_SET_DUMPABLE: ::c_int = 4;
-
-pub const PR_GET_UNALIGN: ::c_int = 5;
-pub const PR_SET_UNALIGN: ::c_int = 6;
-pub const PR_UNALIGN_NOPRINT: ::c_int = 1;
-pub const PR_UNALIGN_SIGBUS: ::c_int = 2;
-
-pub const PR_GET_KEEPCAPS: ::c_int = 7;
-pub const PR_SET_KEEPCAPS: ::c_int = 8;
-
-pub const PR_GET_FPEMU: ::c_int = 9;
-pub const PR_SET_FPEMU: ::c_int = 10;
-pub const PR_FPEMU_NOPRINT: ::c_int = 1;
-pub const PR_FPEMU_SIGFPE: ::c_int = 2;
-
-pub const PR_GET_FPEXC: ::c_int = 11;
-pub const PR_SET_FPEXC: ::c_int = 12;
-pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80;
-pub const PR_FP_EXC_DIV: ::c_int = 0x010000;
-pub const PR_FP_EXC_OVF: ::c_int = 0x020000;
-pub const PR_FP_EXC_UND: ::c_int = 0x040000;
-pub const PR_FP_EXC_RES: ::c_int = 0x080000;
-pub const PR_FP_EXC_INV: ::c_int = 0x100000;
-pub const PR_FP_EXC_DISABLED: ::c_int = 0;
-pub const PR_FP_EXC_NONRECOV: ::c_int = 1;
-pub const PR_FP_EXC_ASYNC: ::c_int = 2;
-pub const PR_FP_EXC_PRECISE: ::c_int = 3;
-
-pub const PR_GET_TIMING: ::c_int = 13;
-pub const PR_SET_TIMING: ::c_int = 14;
-pub const PR_TIMING_STATISTICAL: ::c_int = 0;
-pub const PR_TIMING_TIMESTAMP: ::c_int = 1;
-
-pub const PR_SET_NAME: ::c_int = 15;
-pub const PR_GET_NAME: ::c_int = 16;
-
-pub const PR_GET_ENDIAN: ::c_int = 19;
-pub const PR_SET_ENDIAN: ::c_int = 20;
-pub const PR_ENDIAN_BIG: ::c_int = 0;
-pub const PR_ENDIAN_LITTLE: ::c_int = 1;
-pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2;
-
-pub const PR_GET_SECCOMP: ::c_int = 21;
-pub const PR_SET_SECCOMP: ::c_int = 22;
-
-pub const PR_CAPBSET_READ: ::c_int = 23;
-pub const PR_CAPBSET_DROP: ::c_int = 24;
-
-pub const PR_GET_TSC: ::c_int = 25;
-pub const PR_SET_TSC: ::c_int = 26;
-pub const PR_TSC_ENABLE: ::c_int = 1;
-pub const PR_TSC_SIGSEGV: ::c_int = 2;
-
-pub const PR_GET_SECUREBITS: ::c_int = 27;
-pub const PR_SET_SECUREBITS: ::c_int = 28;
-
-pub const PR_SET_TIMERSLACK: ::c_int = 29;
-pub const PR_GET_TIMERSLACK: ::c_int = 30;
-
-pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31;
-pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32;
-
-pub const PR_MCE_KILL: ::c_int = 33;
-pub const PR_MCE_KILL_CLEAR: ::c_int = 0;
-pub const PR_MCE_KILL_SET: ::c_int = 1;
-
-pub const PR_MCE_KILL_LATE: ::c_int = 0;
-pub const PR_MCE_KILL_EARLY: ::c_int = 1;
-pub const PR_MCE_KILL_DEFAULT: ::c_int = 2;
-
-pub const PR_MCE_KILL_GET: ::c_int = 34;
-
-pub const PR_SET_MM: ::c_int = 35;
-pub const PR_SET_MM_START_CODE: ::c_int = 1;
-pub const PR_SET_MM_END_CODE: ::c_int = 2;
-pub const PR_SET_MM_START_DATA: ::c_int = 3;
-pub const PR_SET_MM_END_DATA: ::c_int = 4;
-pub const PR_SET_MM_START_STACK: ::c_int = 5;
-pub const PR_SET_MM_START_BRK: ::c_int = 6;
-pub const PR_SET_MM_BRK: ::c_int = 7;
-pub const PR_SET_MM_ARG_START: ::c_int = 8;
-pub const PR_SET_MM_ARG_END: ::c_int = 9;
-pub const PR_SET_MM_ENV_START: ::c_int = 10;
-pub const PR_SET_MM_ENV_END: ::c_int = 11;
-pub const PR_SET_MM_AUXV: ::c_int = 12;
-pub const PR_SET_MM_EXE_FILE: ::c_int = 13;
-pub const PR_SET_MM_MAP: ::c_int = 14;
-pub const PR_SET_MM_MAP_SIZE: ::c_int = 15;
-
-pub const PR_SET_PTRACER: ::c_int = 0x59616d61;
-
-pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36;
-pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37;
-
-pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38;
-pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39;
-
-pub const PR_GET_TID_ADDRESS: ::c_int = 40;
-
-pub const PR_SET_THP_DISABLE: ::c_int = 41;
-pub const PR_GET_THP_DISABLE: ::c_int = 42;
-
-pub const PR_MPX_ENABLE_MANAGEMENT: ::c_int = 43;
-pub const PR_MPX_DISABLE_MANAGEMENT: ::c_int = 44;
-
-pub const PR_SET_FP_MODE: ::c_int = 45;
-pub const PR_GET_FP_MODE: ::c_int = 46;
-pub const PR_FP_MODE_FR: ::c_int = 1 << 0;
-pub const PR_FP_MODE_FRE: ::c_int = 1 << 1;
-
-pub const PR_CAP_AMBIENT: ::c_int = 47;
-pub const PR_CAP_AMBIENT_IS_SET: ::c_int = 1;
-pub const PR_CAP_AMBIENT_RAISE: ::c_int = 2;
-pub const PR_CAP_AMBIENT_LOWER: ::c_int = 3;
-pub const PR_CAP_AMBIENT_CLEAR_ALL: ::c_int = 4;
-
-pub const ITIMER_REAL: ::c_int = 0;
-pub const ITIMER_VIRTUAL: ::c_int = 1;
-pub const ITIMER_PROF: ::c_int = 2;
-
-pub const XATTR_CREATE: ::c_int = 0x1;
-pub const XATTR_REPLACE: ::c_int = 0x2;
-
-// On Linux, libc doesn't define this constant, libattr does instead.
-// We still define it for Linux as it's defined by libc on other platforms,
-// and it's mentioned in the man pages for getxattr and setxattr.
-pub const ENOATTR: ::c_int = ::ENODATA;
-
-f! {
-    pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
-        for slot in cpuset.bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        cpuset.bits[idx] |= 1 << offset;
-        ()
-    }
-
-    pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        cpuset.bits[idx] &= !(1 << offset);
-        ()
-    }
-
-    pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]);
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        0 != (cpuset.bits[idx] & (1 << offset))
-    }
-
-    pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool {
-        set1.bits == set2.bits
-    }
-
-    pub fn major(dev: ::dev_t) -> ::c_uint {
-        let mut major = 0;
-        major |= (dev & 0x00000000000fff00) >> 8;
-        major |= (dev & 0xfffff00000000000) >> 32;
-        major as ::c_uint
-    }
-
-    pub fn minor(dev: ::dev_t) -> ::c_uint {
-        let mut minor = 0;
-        minor |= (dev & 0xfffff00000000000) >> 0;
-        minor |= (dev & 0x00000ffffff00000) >> 12;
-        minor as ::c_uint
-    }
-
-    pub fn makedev(major: ::c_uint, minor: ::c_uint) -> ::dev_t {
-        let major = major as ::dev_t;
-        let minor = minor as ::dev_t;
-        let mut dev = 0;
-        dev |= (major & 0x00000fff) << 8;
-        dev |= (major & 0xfffff000) << 32;
-        dev |= (minor & 0x000000ff) << 0;
-        dev |= (minor & 0xffffff00) << 12;
-        dev
-    }
-}
-
-extern {
-    pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn aio_error(aiocbp: *const aiocb) -> ::c_int;
-    pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t;
-    pub fn aio_suspend(aiocb_list: *const *const aiocb, nitems: ::c_int,
-                       timeout: *const ::timespec) -> ::c_int;
-    pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int;
-    pub fn lio_listio(mode: ::c_int, aiocb_list: *const *mut aiocb,
-                      nitems: ::c_int, sevp: *mut ::sigevent) -> ::c_int;
-
-    pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
-
-    pub fn setpwent();
-    pub fn getpwent() -> *mut passwd;
-    pub fn setspent();
-    pub fn endspent();
-    pub fn getspent() -> *mut spwd;
-    pub fn getspnam(__name: *const ::c_char) -> *mut spwd;
-
-    pub fn shm_open(name: *const c_char, oflag: ::c_int,
-                    mode: mode_t) -> ::c_int;
-
-    // System V IPC
-    pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int;
-    pub fn shmat(shmid: ::c_int,
-                 shmaddr: *const ::c_void,
-                 shmflg: ::c_int) -> *mut ::c_void;
-    pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int;
-    pub fn shmctl(shmid: ::c_int,
-                  cmd: ::c_int,
-                  buf: *mut ::shmid_ds) -> ::c_int;
-    pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t;
-    pub fn semget(key: ::key_t, nsems: ::c_int, semflag: ::c_int) -> ::c_int;
-    pub fn semop(semid: ::c_int,
-                 sops: *mut ::sembuf, nsops: ::size_t) -> ::c_int;
-    pub fn semctl(semid: ::c_int,
-                  semnum: ::c_int, cmd: ::c_int, ...) -> ::c_int;
-    pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int;
-    pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int;
-    pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t,
-                  msgtyp: ::c_long, msgflg: ::c_int) -> ::ssize_t;
-    pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t,
-                  msgflg: ::c_int) -> ::c_int;
-
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn __errno_location() -> *mut ::c_int;
-
-    pub fn fopen64(filename: *const c_char,
-                   mode: *const c_char) -> *mut ::FILE;
-    pub fn freopen64(filename: *const c_char, mode: *const c_char,
-                     file: *mut ::FILE) -> *mut ::FILE;
-    pub fn tmpfile64() -> *mut ::FILE;
-    pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int;
-    pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int;
-    pub fn fseeko64(stream: *mut ::FILE,
-                    offset: ::off64_t,
-                    whence: ::c_int) -> ::c_int;
-    pub fn ftello64(stream: *mut ::FILE) -> ::off64_t;
-    pub fn fallocate(fd: ::c_int, mode: ::c_int,
-                     offset: ::off_t, len: ::off_t) -> ::c_int;
-    pub fn posix_fallocate(fd: ::c_int, offset: ::off_t,
-                           len: ::off_t) -> ::c_int;
-    pub fn readahead(fd: ::c_int, offset: ::off64_t,
-                     count: ::size_t) -> ::ssize_t;
-    pub fn getxattr(path: *const c_char, name: *const c_char,
-                    value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn lgetxattr(path: *const c_char, name: *const c_char,
-                     value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn fgetxattr(filedes: ::c_int, name: *const c_char,
-                     value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn setxattr(path: *const c_char, name: *const c_char,
-                    value: *const ::c_void, size: ::size_t,
-                    flags: ::c_int) -> ::c_int;
-    pub fn lsetxattr(path: *const c_char, name: *const c_char,
-                     value: *const ::c_void, size: ::size_t,
-                     flags: ::c_int) -> ::c_int;
-    pub fn fsetxattr(filedes: ::c_int, name: *const c_char,
-                     value: *const ::c_void, size: ::size_t,
-                     flags: ::c_int) -> ::c_int;
-    pub fn listxattr(path: *const c_char, list: *mut c_char,
-                     size: ::size_t) -> ::ssize_t;
-    pub fn llistxattr(path: *const c_char, list: *mut c_char,
-                      size: ::size_t) -> ::ssize_t;
-    pub fn flistxattr(filedes: ::c_int, list: *mut c_char,
-                      size: ::size_t) -> ::ssize_t;
-    pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int;
-    pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int;
-    pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int;
-    pub fn signalfd(fd: ::c_int,
-                    mask: *const ::sigset_t,
-                    flags: ::c_int) -> ::c_int;
-    pub fn pwritev(fd: ::c_int,
-                   iov: *const ::iovec,
-                   iovcnt: ::c_int,
-                   offset: ::off_t) -> ::ssize_t;
-    pub fn preadv(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int,
-                  offset: ::off_t) -> ::ssize_t;
-    pub fn quotactl(cmd: ::c_int,
-                    special: *const ::c_char,
-                    id: ::c_int,
-                    data: *mut ::c_char) -> ::c_int;
-    pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t;
-    pub fn mq_close(mqd: ::mqd_t) -> ::c_int;
-    pub fn mq_unlink(name: *const ::c_char) -> ::c_int;
-    pub fn mq_receive(mqd: ::mqd_t,
-                      msg_ptr: *mut ::c_char,
-                      msg_len: ::size_t,
-                      msq_prio: *mut ::c_uint) -> ::ssize_t;
-    pub fn mq_send(mqd: ::mqd_t,
-                   msg_ptr: *const ::c_char,
-                   msg_len: ::size_t,
-                   msq_prio: ::c_uint) -> ::c_int;
-    pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int;
-    pub fn mq_setattr(mqd: ::mqd_t,
-                      newattr: *const ::mq_attr,
-                      oldattr: *mut ::mq_attr) -> ::c_int;
-    pub fn epoll_pwait(epfd: ::c_int,
-                       events: *mut ::epoll_event,
-                       maxevents: ::c_int,
-                       timeout: ::c_int,
-                       sigmask: *const ::sigset_t) -> ::c_int;
-    pub fn dup3(oldfd: ::c_int, newfd: ::c_int, flags: ::c_int) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int;
-    pub fn mkostemp(template: *mut ::c_char, flags: ::c_int) -> ::c_int;
-    pub fn mkostemps(template: *mut ::c_char,
-                     suffixlen: ::c_int,
-                     flags: ::c_int) -> ::c_int;
-    pub fn sigtimedwait(set: *const sigset_t,
-                        info: *mut siginfo_t,
-                        timeout: *const ::timespec) -> ::c_int;
-    pub fn sigwaitinfo(set: *const sigset_t,
-                       info: *mut siginfo_t) -> ::c_int;
-    pub fn openpty(amaster: *mut ::c_int,
-                   aslave: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *const termios,
-                   winp: *const ::winsize) -> ::c_int;
-    pub fn forkpty(amaster: *mut ::c_int,
-                   name: *mut ::c_char,
-                   termp: *const termios,
-                   winp: *const ::winsize) -> ::pid_t;
-    pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::socklen_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::socklen_t,
-                       flags: ::c_int) -> ::c_int;
-    pub fn pthread_setschedprio(native: ::pthread_t,
-                                priority: ::c_int) -> ::c_int;
-    pub fn prlimit(pid: ::pid_t, resource: ::c_int, new_limit: *const ::rlimit,
-                   old_limit: *mut ::rlimit) -> ::c_int;
-    pub fn prlimit64(pid: ::pid_t,
-                     resource: ::c_int,
-                     new_limit: *const ::rlimit64,
-                     old_limit: *mut ::rlimit64) -> ::c_int;
-    pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int;
-    pub fn process_vm_readv(pid: ::pid_t,
-                            local_iov: *const ::iovec,
-                            liovcnt: ::c_ulong,
-                            remote_iov: *const ::iovec,
-                            riovcnt: ::c_ulong,
-                            flags: ::c_ulong) -> isize;
-    pub fn process_vm_writev(pid: ::pid_t,
-                             local_iov: *const ::iovec,
-                             liovcnt: ::c_ulong,
-                             remote_iov: *const ::iovec,
-                             riovcnt: ::c_ulong,
-                             flags: ::c_ulong) -> isize;
-    pub fn reboot(how_to: ::c_int) -> ::c_int;
-    pub fn setfsgid(gid: ::gid_t) -> ::c_int;
-    pub fn setfsuid(uid: ::uid_t) -> ::c_int;
-    pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int;
-    pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int;
-
-    // Not available now on Android
-    pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t) -> ::c_int;
-    pub fn if_nameindex() -> *mut if_nameindex;
-    pub fn if_freenameindex(ptr: *mut if_nameindex);
-    pub fn sync_file_range(fd: ::c_int, offset: ::off64_t,
-                           nbytes: ::off64_t, flags: ::c_uint) -> ::c_int;
-    pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int;
-    pub fn freeifaddrs(ifa: *mut ::ifaddrs);
-
-    pub fn mremap(addr: *mut ::c_void,
-                  len: ::size_t,
-                  new_len: ::size_t,
-                  flags: ::c_int,
-                  ...) -> *mut ::c_void;
-
-    pub fn glob(pattern: *const c_char,
-                flags: ::c_int,
-                errfunc: Option<extern fn(epath: *const c_char,
-                                          errno: ::c_int) -> ::c_int>,
-                pglob: *mut ::glob_t) -> ::c_int;
-    pub fn globfree(pglob: *mut ::glob_t);
-
-    pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                         -> ::c_int;
-
-    pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
-
-    pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long);
-
-    pub fn telldir(dirp: *mut ::DIR) -> ::c_long;
-    pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                  -> ::c_int;
-
-    pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
-
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *mut ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int;
-    pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int;
-    pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char;
-
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::socklen_t) -> ::c_int;
-
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-    pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int;
-    pub fn setdomainname(name: *const ::c_char, len: ::size_t) -> ::c_int;
-    pub fn vhangup() -> ::c_int;
-}
-
-extern {
-    pub fn sendmmsg(sockfd: ::c_int, msgvec: *mut mmsghdr, vlen: ::c_uint,
-                    flags: ::c_int) -> ::c_int;
-    pub fn recvmmsg(sockfd: ::c_int, msgvec: *mut mmsghdr, vlen: ::c_uint,
-                    flags: ::c_int, timeout: *mut ::timespec) -> ::c_int;
-    pub fn sync();
-}
-
-cfg_if! {
-    if #[cfg(any(target_env = "musl",
-                 target_os = "fuchsia",
-                 target_os = "emscripten"))] {
-        mod musl;
-        pub use self::musl::*;
-    } else if #[cfg(any(target_arch = "mips",
-                        target_arch = "mips64"))] {
-        mod mips;
-        pub use self::mips::*;
-    } else if #[cfg(any(target_arch = "s390x"))] {
-        mod s390x;
-        pub use self::s390x::*;
-    } else {
-        mod other;
-        pub use self::other::*;
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/arm.rs
+++ /dev/null
@@ -1,346 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = u32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        __unused1: ::c_int,
-        pub shm_dtime: ::time_t,
-        __unused2: ::c_int,
-        pub shm_ctime: ::time_t,
-        __unused3: ::c_int,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::c_ulong,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        __unused1: ::c_int,
-        pub msg_rtime: ::time_t,
-        __unused2: ::c_int,
-        pub msg_ctime: ::time_t,
-        __unused3: ::c_int,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_flags: ::c_ulong,
-        pub f_spare: [::c_ulong; 4],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const O_ASYNC: ::c_int = 0x2000;
-
-pub const FIOCLEX: ::c_int = 0x5451;
-pub const FIONBIO: ::c_int = 0x5421;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_NPROC: ::c_int = 6;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-
-pub const SOCK_NONBLOCK: ::c_int = 2048;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EDEADLOCK: ::c_int = EDEADLK;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EBADMSG: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const ERFKILL: ::c_int = 132;
-pub const EHWPOISON: ::c_int = 133;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const F_GETLK: ::c_int = 12;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETLK: ::c_int = 13;
-pub const F_SETLKW: ::c_int = 14;
-pub const F_SETOWN: ::c_int = 8;
-
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const TCGETS: ::c_int = 0x5401;
-pub const TCSETS: ::c_int = 0x5402;
-pub const TCSETSW: ::c_int = 0x5403;
-pub const TCSETSF: ::c_int = 0x5404;
-pub const TCGETA: ::c_int = 0x5405;
-pub const TCSETA: ::c_int = 0x5406;
-pub const TCSETAW: ::c_int = 0x5407;
-pub const TCSETAF: ::c_int = 0x5408;
-pub const TCSBRK: ::c_int = 0x5409;
-pub const TCXONC: ::c_int = 0x540A;
-pub const TCFLSH: ::c_int = 0x540B;
-pub const TIOCGSOFTCAR: ::c_int = 0x5419;
-pub const TIOCSSOFTCAR: ::c_int = 0x541A;
-pub const TIOCLINUX: ::c_int = 0x541C;
-pub const TIOCGSERIAL: ::c_int = 0x541E;
-pub const TIOCEXCL: ::c_int = 0x540C;
-pub const TIOCNXCL: ::c_int = 0x540D;
-pub const TIOCSCTTY: ::c_int = 0x540E;
-pub const TIOCGPGRP: ::c_int = 0x540F;
-pub const TIOCSPGRP: ::c_int = 0x5410;
-pub const TIOCOUTQ: ::c_int = 0x5411;
-pub const TIOCSTI: ::c_int = 0x5412;
-pub const TIOCGWINSZ: ::c_int = 0x5413;
-pub const TIOCSWINSZ: ::c_int = 0x5414;
-pub const TIOCMGET: ::c_int = 0x5415;
-pub const TIOCMBIS: ::c_int = 0x5416;
-pub const TIOCMBIC: ::c_int = 0x5417;
-pub const TIOCMSET: ::c_int = 0x5418;
-pub const FIONREAD: ::c_int = 0x541B;
-pub const TIOCCONS: ::c_int = 0x541D;
-
-pub const SYS_gettid: ::c_long = 224;
-pub const SYS_perf_event_open: ::c_long = 364;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/asmjs.rs
+++ /dev/null
@@ -1,336 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = u32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        __unused1: ::c_int,
-        pub shm_dtime: ::time_t,
-        __unused2: ::c_int,
-        pub shm_ctime: ::time_t,
-        __unused3: ::c_int,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::c_ulong,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        __unused1: ::c_int,
-        pub msg_rtime: ::time_t,
-        __unused2: ::c_int,
-        pub msg_ctime: ::time_t,
-        __unused3: ::c_int,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_flags: ::c_ulong,
-        pub f_spare: [::c_ulong; 4],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const O_ASYNC: ::c_int = 0x2000;
-
-pub const FIOCLEX: ::c_int = 0x5451;
-pub const FIONBIO: ::c_int = 0x5421;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_NPROC: ::c_int = 6;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-
-pub const SOCK_NONBLOCK: ::c_int = 2048;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EDEADLOCK: ::c_int = EDEADLK;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EBADMSG: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const ERFKILL: ::c_int = 132;
-pub const EHWPOISON: ::c_int = 133;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const F_GETLK: ::c_int = 12;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETLK: ::c_int = 13;
-pub const F_SETLKW: ::c_int = 14;
-pub const F_SETOWN: ::c_int = 8;
-
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const TCGETS: ::c_int = 0x5401;
-pub const TCSETS: ::c_int = 0x5402;
-pub const TCSETSW: ::c_int = 0x5403;
-pub const TCSETSF: ::c_int = 0x5404;
-pub const TCGETA: ::c_int = 0x5405;
-pub const TCSETA: ::c_int = 0x5406;
-pub const TCSETAW: ::c_int = 0x5407;
-pub const TCSETAF: ::c_int = 0x5408;
-pub const TCSBRK: ::c_int = 0x5409;
-pub const TCXONC: ::c_int = 0x540A;
-pub const TCFLSH: ::c_int = 0x540B;
-pub const TIOCGSOFTCAR: ::c_int = 0x5419;
-pub const TIOCSSOFTCAR: ::c_int = 0x541A;
-pub const TIOCLINUX: ::c_int = 0x541C;
-pub const TIOCGSERIAL: ::c_int = 0x541E;
-pub const TIOCEXCL: ::c_int = 0x540C;
-pub const TIOCNXCL: ::c_int = 0x540D;
-pub const TIOCSCTTY: ::c_int = 0x540E;
-pub const TIOCGPGRP: ::c_int = 0x540F;
-pub const TIOCSPGRP: ::c_int = 0x5410;
-pub const TIOCOUTQ: ::c_int = 0x5411;
-pub const TIOCSTI: ::c_int = 0x5412;
-pub const TIOCGWINSZ: ::c_int = 0x5413;
-pub const TIOCSWINSZ: ::c_int = 0x5414;
-pub const TIOCMGET: ::c_int = 0x5415;
-pub const TIOCMBIS: ::c_int = 0x5416;
-pub const TIOCMBIC: ::c_int = 0x5417;
-pub const TIOCMSET: ::c_int = 0x5418;
-pub const FIONREAD: ::c_int = 0x541B;
-pub const TIOCCONS: ::c_int = 0x541D;
-
-pub const SYS_gettid: ::c_long = 224; // Valid for arm (32-bit) and x86 (32-bit)
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/mips.rs
+++ /dev/null
@@ -1,354 +0,0 @@
-pub type c_char = i8;
-pub type wchar_t = ::c_int;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __st_padding1: [::c_long; 2],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_padding2: [::c_long; 2],
-        pub st_size: ::off_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        __st_padding3: ::c_long,
-        pub st_blocks: ::blkcnt_t,
-        __st_padding4: [::c_long; 14],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __st_padding1: [::c_long; 2],
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_padding2: [::c_long; 2],
-        pub st_size: ::off_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        __st_padding3: ::c_long,
-        pub st_blocks: ::blkcnt64_t,
-        __st_padding4: [::c_long; 14],
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::c_ulong,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        #[cfg(target_endian = "big")]
-        __unused1: ::c_int,
-        pub msg_stime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __unused1: ::c_int,
-        #[cfg(target_endian = "big")]
-        __unused2: ::c_int,
-        pub msg_rtime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __unused2: ::c_int,
-        #[cfg(target_endian = "big")]
-        __unused3: ::c_int,
-        pub msg_ctime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __unused3: ::c_int,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_ulong,
-        pub f_flags: ::c_ulong,
-        pub f_spare: [::c_ulong; 5],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0o100000;
-pub const O_DIRECTORY: ::c_int = 0o200000;
-pub const O_NOFOLLOW: ::c_int = 0o400000;
-pub const O_ASYNC: ::c_int = 0o10000;
-
-pub const FIOCLEX: ::c_int = 0x6601;
-pub const FIONBIO: ::c_int = 0x667E;
-
-pub const RLIMIT_RSS: ::c_int = 7;
-pub const RLIMIT_NOFILE: ::c_int = 5;
-pub const RLIMIT_AS: ::c_int = 6;
-pub const RLIMIT_NPROC: ::c_int = 8;
-pub const RLIMIT_MEMLOCK: ::c_int = 9;
-
-pub const O_APPEND: ::c_int = 0o010;
-pub const O_CREAT: ::c_int = 0o400;
-pub const O_EXCL: ::c_int = 0o2000;
-pub const O_NOCTTY: ::c_int = 0o4000;
-pub const O_NONBLOCK: ::c_int = 0o200;
-pub const O_SYNC: ::c_int = 0o40020;
-pub const O_RSYNC: ::c_int = 0o40020;
-pub const O_DSYNC: ::c_int = 0o020;
-
-pub const SOCK_NONBLOCK: ::c_int = 0o200;
-
-pub const MAP_ANON: ::c_int = 0x800;
-pub const MAP_GROWSDOWN: ::c_int = 0x1000;
-pub const MAP_DENYWRITE: ::c_int = 0x2000;
-pub const MAP_EXECUTABLE: ::c_int = 0x4000;
-pub const MAP_LOCKED: ::c_int = 0x8000;
-pub const MAP_NORESERVE: ::c_int = 0x0400;
-pub const MAP_POPULATE: ::c_int = 0x10000;
-pub const MAP_NONBLOCK: ::c_int = 0x20000;
-pub const MAP_STACK: ::c_int = 0x40000;
-
-pub const EDEADLK: ::c_int = 45;
-pub const ENAMETOOLONG: ::c_int = 78;
-pub const ENOLCK: ::c_int = 46;
-pub const ENOSYS: ::c_int = 89;
-pub const ENOTEMPTY: ::c_int = 93;
-pub const ELOOP: ::c_int = 90;
-pub const ENOMSG: ::c_int = 35;
-pub const EIDRM: ::c_int = 36;
-pub const ECHRNG: ::c_int = 37;
-pub const EL2NSYNC: ::c_int = 38;
-pub const EL3HLT: ::c_int = 39;
-pub const EL3RST: ::c_int = 40;
-pub const ELNRNG: ::c_int = 41;
-pub const EUNATCH: ::c_int = 42;
-pub const ENOCSI: ::c_int = 43;
-pub const EL2HLT: ::c_int = 44;
-pub const EBADE: ::c_int = 50;
-pub const EBADR: ::c_int = 51;
-pub const EXFULL: ::c_int = 52;
-pub const ENOANO: ::c_int = 53;
-pub const EBADRQC: ::c_int = 54;
-pub const EBADSLT: ::c_int = 55;
-pub const EDEADLOCK: ::c_int = 56;
-pub const EMULTIHOP: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 79;
-pub const ENOTUNIQ: ::c_int = 80;
-pub const EBADFD: ::c_int = 81;
-pub const EBADMSG: ::c_int = 77;
-pub const EREMCHG: ::c_int = 82;
-pub const ELIBACC: ::c_int = 83;
-pub const ELIBBAD: ::c_int = 84;
-pub const ELIBSCN: ::c_int = 85;
-pub const ELIBMAX: ::c_int = 86;
-pub const ELIBEXEC: ::c_int = 87;
-pub const EILSEQ: ::c_int = 88;
-pub const ERESTART: ::c_int = 91;
-pub const ESTRPIPE: ::c_int = 92;
-pub const EUSERS: ::c_int = 94;
-pub const ENOTSOCK: ::c_int = 95;
-pub const EDESTADDRREQ: ::c_int = 96;
-pub const EMSGSIZE: ::c_int = 97;
-pub const EPROTOTYPE: ::c_int = 98;
-pub const ENOPROTOOPT: ::c_int = 99;
-pub const EPROTONOSUPPORT: ::c_int = 120;
-pub const ESOCKTNOSUPPORT: ::c_int = 121;
-pub const EOPNOTSUPP: ::c_int = 122;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 123;
-pub const EAFNOSUPPORT: ::c_int = 124;
-pub const EADDRINUSE: ::c_int = 125;
-pub const EADDRNOTAVAIL: ::c_int = 126;
-pub const ENETDOWN: ::c_int = 127;
-pub const ENETUNREACH: ::c_int = 128;
-pub const ENETRESET: ::c_int = 129;
-pub const ECONNABORTED: ::c_int = 130;
-pub const ECONNRESET: ::c_int = 131;
-pub const ENOBUFS: ::c_int = 132;
-pub const EISCONN: ::c_int = 133;
-pub const ENOTCONN: ::c_int = 134;
-pub const ESHUTDOWN: ::c_int = 143;
-pub const ETOOMANYREFS: ::c_int = 144;
-pub const ETIMEDOUT: ::c_int = 145;
-pub const ECONNREFUSED: ::c_int = 146;
-pub const EHOSTDOWN: ::c_int = 147;
-pub const EHOSTUNREACH: ::c_int = 148;
-pub const EALREADY: ::c_int = 149;
-pub const EINPROGRESS: ::c_int = 150;
-pub const ESTALE: ::c_int = 151;
-pub const EUCLEAN: ::c_int = 135;
-pub const ENOTNAM: ::c_int = 137;
-pub const ENAVAIL: ::c_int = 138;
-pub const EISNAM: ::c_int = 139;
-pub const EREMOTEIO: ::c_int = 140;
-pub const EDQUOT: ::c_int = 1133;
-pub const ENOMEDIUM: ::c_int = 159;
-pub const EMEDIUMTYPE: ::c_int = 160;
-pub const ECANCELED: ::c_int = 158;
-pub const ENOKEY: ::c_int = 161;
-pub const EKEYEXPIRED: ::c_int = 162;
-pub const EKEYREVOKED: ::c_int = 163;
-pub const EKEYREJECTED: ::c_int = 164;
-pub const EOWNERDEAD: ::c_int = 165;
-pub const ENOTRECOVERABLE: ::c_int = 166;
-pub const EHWPOISON: ::c_int = 168;
-pub const ERFKILL: ::c_int = 167;
-
-pub const SOCK_STREAM: ::c_int = 2;
-pub const SOCK_DGRAM: ::c_int = 1;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 65535;
-
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_TYPE: ::c_int = 0x1008;
-pub const SO_ACCEPTCONN: ::c_int = 0x1009;
-pub const SO_PROTOCOL: ::c_int = 0x1028;
-pub const SO_DOMAIN: ::c_int = 0x1029;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_PASSCRED: ::c_int = 17;
-pub const SO_PEERCRED: ::c_int = 18;
-pub const SO_SNDBUFFORCE: ::c_int = 31;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 8;
-pub const SA_NOCLDWAIT: ::c_int = 0x10000;
-
-pub const SIGCHLD: ::c_int = 18;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGTTIN: ::c_int = 26;
-pub const SIGTTOU: ::c_int = 27;
-pub const SIGXCPU: ::c_int = 30;
-pub const SIGXFSZ: ::c_int = 31;
-pub const SIGVTALRM: ::c_int = 28;
-pub const SIGPROF: ::c_int = 29;
-pub const SIGWINCH: ::c_int = 20;
-pub const SIGUSR1: ::c_int = 16;
-pub const SIGUSR2: ::c_int = 17;
-pub const SIGCONT: ::c_int = 25;
-pub const SIGSTOP: ::c_int = 23;
-pub const SIGTSTP: ::c_int = 24;
-pub const SIGURG: ::c_int = 21;
-pub const SIGIO: ::c_int = 22;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGSTKFLT: ::c_int = 7;
-pub const SIGPOLL: ::c_int = ::SIGIO;
-pub const SIGPWR: ::c_int = 19;
-pub const SIG_SETMASK: ::c_int = 3;
-pub const SIG_BLOCK: ::c_int = 1;
-pub const SIG_UNBLOCK: ::c_int = 2;
-
-pub const EXTPROC: ::tcflag_t = 0o200000;
-
-pub const MAP_HUGETLB: ::c_int = 0x80000;
-
-pub const F_GETLK: ::c_int = 33;
-pub const F_GETOWN: ::c_int = 23;
-pub const F_SETLK: ::c_int = 34;
-pub const F_SETLKW: ::c_int = 35;
-pub const F_SETOWN: ::c_int = 24;
-
-pub const VEOF: usize = 16;
-pub const VEOL: usize = 17;
-pub const VEOL2: usize = 6;
-pub const VMIN: usize = 4;
-pub const IEXTEN: ::tcflag_t = 0o000400;
-pub const TOSTOP: ::tcflag_t = 0o100000;
-pub const FLUSHO: ::tcflag_t = 0o020000;
-
-pub const TCGETS: ::c_int = 0x540D;
-pub const TCSETS: ::c_int = 0x540E;
-pub const TCSETSW: ::c_int = 0x540F;
-pub const TCSETSF: ::c_int = 0x5410;
-pub const TCGETA: ::c_int = 0x5401;
-pub const TCSETA: ::c_int = 0x5402;
-pub const TCSETAW: ::c_int = 0x5403;
-pub const TCSETAF: ::c_int = 0x5404;
-pub const TCSBRK: ::c_int = 0x5405;
-pub const TCXONC: ::c_int = 0x5406;
-pub const TCFLSH: ::c_int = 0x5407;
-pub const TIOCGSOFTCAR: ::c_int = 0x5481;
-pub const TIOCSSOFTCAR: ::c_int = 0x5482;
-pub const TIOCLINUX: ::c_int = 0x5483;
-pub const TIOCGSERIAL: ::c_int = 0x5484;
-pub const TIOCEXCL: ::c_int = 0x740D;
-pub const TIOCNXCL: ::c_int = 0x740E;
-pub const TIOCSCTTY: ::c_int = 0x5480;
-pub const TIOCGPGRP: ::c_int = 0x40047477;
-pub const TIOCSPGRP: ::c_int = 0x80047476;
-pub const TIOCOUTQ: ::c_int = 0x7472;
-pub const TIOCSTI: ::c_int = 0x5472;
-pub const TIOCGWINSZ: ::c_int = 0x40087468;
-pub const TIOCSWINSZ: ::c_int = 0x80087467;
-pub const TIOCMGET: ::c_int = 0x741D;
-pub const TIOCMBIS: ::c_int = 0x741B;
-pub const TIOCMBIC: ::c_int = 0x741C;
-pub const TIOCMSET: ::c_int = 0x741A;
-pub const FIONREAD: ::c_int = 0x467F;
-pub const TIOCCONS: ::c_int = 0x80047478;
-
-pub const SYS_gettid: ::c_long = 4222;   // Valid for O32
-pub const SYS_perf_event_open: ::c_long = 4333;  // Valid for O32
-
-pub const POLLWRNORM: ::c_short = 0x4;
-pub const POLLWRBAND: ::c_short = 0x100;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/mod.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type nlink_t = u32;
-
-s! {
-    pub struct pthread_attr_t {
-        __size: [u32; 9]
-    }
-
-    pub struct sigset_t {
-        __val: [::c_ulong; 32],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::socklen_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::socklen_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct sem_t {
-        __val: [::c_int; 4],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
-
-cfg_if! {
-    if #[cfg(any(target_arch = "x86"))] {
-        mod x86;
-        pub use self::x86::*;
-    } else if #[cfg(any(target_arch = "mips"))] {
-        mod mips;
-        pub use self::mips::*;
-    } else if #[cfg(any(target_arch = "arm"))] {
-        mod arm;
-        pub use self::arm::*;
-    } else if #[cfg(any(target_arch = "asmjs", target_arch = "wasm32"))] {
-        // For the time being asmjs and wasm32 are the same, and both
-        // backed by identical emscripten runtimes
-        mod asmjs;
-        pub use self::asmjs::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b32/x86.rs
+++ /dev/null
@@ -1,360 +0,0 @@
-pub type c_char = i8;
-pub type wchar_t = i32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __st_dev_padding: ::c_int,
-        __st_ino_truncated: ::c_long,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __st_rdev_padding: ::c_int,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino_t,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        __unused1: ::c_int,
-        pub shm_dtime: ::time_t,
-        __unused2: ::c_int,
-        pub shm_ctime: ::time_t,
-        __unused3: ::c_int,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::c_ulong,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        __unused1: ::c_int,
-        pub msg_rtime: ::time_t,
-        __unused2: ::c_int,
-        pub msg_ctime: ::time_t,
-        __unused3: ::c_int,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_flags: ::c_ulong,
-        pub f_spare: [::c_ulong; 4],
-    }
-
-    pub struct mcontext_t {
-        __private: [u32; 22]
-    }
-
-    pub struct ucontext_t {
-        pub uc_flags: ::c_ulong,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: ::stack_t,
-        pub uc_mcontext: mcontext_t,
-        pub uc_sigmask: ::sigset_t,
-        __private: [u8; 112],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const O_ASYNC: ::c_int = 0x2000;
-
-pub const FIOCLEX: ::c_int = 0x5451;
-pub const FIONBIO: ::c_int = 0x5421;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_NPROC: ::c_int = 6;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-
-pub const SOCK_NONBLOCK: ::c_int = 2048;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EDEADLOCK: ::c_int = EDEADLK;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EBADMSG: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const ERFKILL: ::c_int = 132;
-pub const EHWPOISON: ::c_int = 133;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-pub const MAP_32BIT: ::c_int = 0x0040;
-
-pub const F_GETLK: ::c_int = 12;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETLK: ::c_int = 13;
-pub const F_SETLKW: ::c_int = 14;
-pub const F_SETOWN: ::c_int = 8;
-
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const TCGETS: ::c_int = 0x5401;
-pub const TCSETS: ::c_int = 0x5402;
-pub const TCSETSW: ::c_int = 0x5403;
-pub const TCSETSF: ::c_int = 0x5404;
-pub const TCGETA: ::c_int = 0x5405;
-pub const TCSETA: ::c_int = 0x5406;
-pub const TCSETAW: ::c_int = 0x5407;
-pub const TCSETAF: ::c_int = 0x5408;
-pub const TCSBRK: ::c_int = 0x5409;
-pub const TCXONC: ::c_int = 0x540A;
-pub const TCFLSH: ::c_int = 0x540B;
-pub const TIOCGSOFTCAR: ::c_int = 0x5419;
-pub const TIOCSSOFTCAR: ::c_int = 0x541A;
-pub const TIOCLINUX: ::c_int = 0x541C;
-pub const TIOCGSERIAL: ::c_int = 0x541E;
-pub const TIOCEXCL: ::c_int = 0x540C;
-pub const TIOCNXCL: ::c_int = 0x540D;
-pub const TIOCSCTTY: ::c_int = 0x540E;
-pub const TIOCGPGRP: ::c_int = 0x540F;
-pub const TIOCSPGRP: ::c_int = 0x5410;
-pub const TIOCOUTQ: ::c_int = 0x5411;
-pub const TIOCSTI: ::c_int = 0x5412;
-pub const TIOCGWINSZ: ::c_int = 0x5413;
-pub const TIOCSWINSZ: ::c_int = 0x5414;
-pub const TIOCMGET: ::c_int = 0x5415;
-pub const TIOCMBIS: ::c_int = 0x5416;
-pub const TIOCMBIC: ::c_int = 0x5417;
-pub const TIOCMSET: ::c_int = 0x5418;
-pub const FIONREAD: ::c_int = 0x541B;
-pub const TIOCCONS: ::c_int = 0x541D;
-
-pub const SYS_gettid: ::c_long = 224;
-pub const SYS_perf_event_open: ::c_long = 336;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/aarch64.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub type c_char = u8;
-
-pub const SYS_perf_event_open: ::c_long = 241;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/mod.rs
+++ /dev/null
@@ -1,387 +0,0 @@
-pub type wchar_t = i32;
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type nlink_t = u64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_long; 3],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __reserved: [::c_long; 3],
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u64; 7]
-    }
-
-    pub struct sigset_t {
-        __val: [::c_ulong; 16],
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::c_ulong,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __pad1: ::c_ulong,
-        __pad2: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_ulong,
-        pub f_bsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_flags: ::c_ulong,
-        pub f_spare: [::c_ulong; 4],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        __pad1: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::socklen_t,
-        __pad2: ::socklen_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::socklen_t,
-        pub __pad1: ::c_int,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct sem_t {
-        __val: [::c_int; 8],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const O_ASYNC: ::c_int = 0x2000;
-
-pub const FIOCLEX: ::c_int = 0x5451;
-pub const FIONBIO: ::c_int = 0x5421;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_NPROC: ::c_int = 6;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-
-pub const SOCK_NONBLOCK: ::c_int = 2048;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-pub const MAP_32BIT: ::c_int = 0x0040;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EDEADLOCK: ::c_int = EDEADLK;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EBADMSG: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const ERFKILL: ::c_int = 132;
-pub const EHWPOISON: ::c_int = 133;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-pub const F_SETOWN: ::c_int = 8;
-
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const TCGETS: ::c_int = 0x5401;
-pub const TCSETS: ::c_int = 0x5402;
-pub const TCSETSW: ::c_int = 0x5403;
-pub const TCSETSF: ::c_int = 0x5404;
-pub const TCGETA: ::c_int = 0x5405;
-pub const TCSETA: ::c_int = 0x5406;
-pub const TCSETAW: ::c_int = 0x5407;
-pub const TCSETAF: ::c_int = 0x5408;
-pub const TCSBRK: ::c_int = 0x5409;
-pub const TCXONC: ::c_int = 0x540A;
-pub const TCFLSH: ::c_int = 0x540B;
-pub const TIOCGSOFTCAR: ::c_int = 0x5419;
-pub const TIOCSSOFTCAR: ::c_int = 0x541A;
-pub const TIOCLINUX: ::c_int = 0x541C;
-pub const TIOCGSERIAL: ::c_int = 0x541E;
-pub const TIOCEXCL: ::c_int = 0x540C;
-pub const TIOCNXCL: ::c_int = 0x540D;
-pub const TIOCSCTTY: ::c_int = 0x540E;
-pub const TIOCGPGRP: ::c_int = 0x540F;
-pub const TIOCSPGRP: ::c_int = 0x5410;
-pub const TIOCOUTQ: ::c_int = 0x5411;
-pub const TIOCSTI: ::c_int = 0x5412;
-pub const TIOCGWINSZ: ::c_int = 0x5413;
-pub const TIOCSWINSZ: ::c_int = 0x5414;
-pub const TIOCMGET: ::c_int = 0x5415;
-pub const TIOCMBIS: ::c_int = 0x5416;
-pub const TIOCMBIC: ::c_int = 0x5417;
-pub const TIOCMSET: ::c_int = 0x5418;
-pub const FIONREAD: ::c_int = 0x541B;
-pub const TIOCCONS: ::c_int = 0x541D;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
-
-cfg_if! {
-    if #[cfg(target_arch = "aarch64")] {
-        mod aarch64;
-        pub use self::aarch64::*;
-    } else if #[cfg(any(target_arch = "powerpc64"))] {
-        mod powerpc64;
-        pub use self::powerpc64::*;
-    } else if #[cfg(any(target_arch = "x86_64"))] {
-        mod x86_64;
-        pub use self::x86_64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/powerpc64.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub type c_char = u8;
-
-pub const SYS_perf_event_open: ::c_long = 319;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/b64/x86_64.rs
+++ /dev/null
@@ -1,20 +0,0 @@
-pub type c_char = i8;
-
-s! {
-    pub struct mcontext_t {
-        __private: [u64; 32],
-    }
-
-    pub struct ucontext_t {
-        pub uc_flags: ::c_ulong,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: ::stack_t,
-        pub uc_mcontext: mcontext_t,
-        pub uc_sigmask: ::sigset_t,
-        __private: [u8; 512],
-    }
-}
-
-pub const SYS_gettid: ::c_long = 186;
-
-pub const SYS_perf_event_open: ::c_long = 298;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/musl/mod.rs
+++ /dev/null
@@ -1,337 +0,0 @@
-pub type clock_t = c_long;
-pub type time_t = c_long;
-pub type suseconds_t = c_long;
-pub type ino_t = u64;
-pub type off_t = i64;
-pub type blkcnt_t = i64;
-
-pub type blksize_t = c_long;
-pub type fsblkcnt_t = ::c_ulonglong;
-pub type fsfilcnt_t = ::c_ulonglong;
-pub type rlim_t = ::c_ulonglong;
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: ::sigevent,
-        __td: *mut ::c_void,
-        __lock: [::c_int; 2],
-        __err: ::c_int,
-        __ret: ::ssize_t,
-        pub aio_offset: off_t,
-        __next: *mut ::c_void,
-        __prev: *mut ::c_void,
-        #[cfg(target_pointer_width = "32")]
-        __dummy4: [::c_char; 24],
-        #[cfg(target_pointer_width = "64")]
-        __dummy4: [::c_char; 16],
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        pub sa_flags: ::c_int,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-    }
-
-    pub struct ipc_perm {
-        pub __ipc_perm_key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::mode_t,
-        pub __seq: ::c_int,
-        __unused1: ::c_long,
-        __unused2: ::c_long
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        pub __c_ispeed: ::speed_t,
-        pub __c_ospeed: ::speed_t,
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_ulong,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub __reserved: [::c_char; 256],
-    }
-}
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const BUFSIZ: ::c_uint = 1024;
-pub const TMP_MAX: ::c_uint = 10000;
-pub const FOPEN_MAX: ::c_uint = 1000;
-pub const O_PATH: ::c_int = 0o10000000;
-pub const O_EXEC: ::c_int = 0o10000000;
-pub const O_SEARCH: ::c_int = 0o10000000;
-pub const O_ACCMODE: ::c_int = 0o10000003;
-pub const O_NDELAY: ::c_int = O_NONBLOCK;
-pub const NI_MAXHOST: ::socklen_t = 255;
-pub const PTHREAD_STACK_MIN: ::size_t = 2048;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-
-pub const RLIM_INFINITY: ::rlim_t = !0;
-pub const RLIMIT_RTTIME: ::c_int = 15;
-pub const RLIMIT_NLIMITS: ::c_int = 16;
-
-pub const MAP_ANONYMOUS: ::c_int = MAP_ANON;
-
-pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15;
-pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16;
-pub const TCP_THIN_DUPACK: ::c_int = 17;
-pub const TCP_USER_TIMEOUT: ::c_int = 18;
-pub const TCP_REPAIR: ::c_int = 19;
-pub const TCP_REPAIR_QUEUE: ::c_int = 20;
-pub const TCP_QUEUE_SEQ: ::c_int = 21;
-pub const TCP_REPAIR_OPTIONS: ::c_int = 22;
-pub const TCP_FASTOPEN: ::c_int = 23;
-pub const TCP_TIMESTAMP: ::c_int = 24;
-
-pub const SIGUNUSED: ::c_int = ::SIGSYS;
-
-pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01;
-pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const CPU_SETSIZE: ::c_int = 128;
-
-pub const QFMT_VFS_V1: ::c_int = 4;
-
-pub const PTRACE_TRACEME: ::c_int = 0;
-pub const PTRACE_PEEKTEXT: ::c_int = 1;
-pub const PTRACE_PEEKDATA: ::c_int = 2;
-pub const PTRACE_PEEKUSER: ::c_int = 3;
-pub const PTRACE_POKETEXT: ::c_int = 4;
-pub const PTRACE_POKEDATA: ::c_int = 5;
-pub const PTRACE_POKEUSER: ::c_int = 6;
-pub const PTRACE_CONT: ::c_int = 7;
-pub const PTRACE_KILL: ::c_int = 8;
-pub const PTRACE_SINGLESTEP: ::c_int = 9;
-pub const PTRACE_ATTACH: ::c_int = 16;
-pub const PTRACE_DETACH: ::c_int = 17;
-pub const PTRACE_SYSCALL: ::c_int = 24;
-pub const PTRACE_SETOPTIONS: ::c_int = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_int = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_int = 0x4203;
-pub const PTRACE_GETREGSET: ::c_int = 0x4204;
-pub const PTRACE_SETREGSET: ::c_int = 0x4205;
-pub const PTRACE_SEIZE: ::c_int = 0x4206;
-pub const PTRACE_INTERRUPT: ::c_int = 0x4207;
-pub const PTRACE_LISTEN: ::c_int = 0x4208;
-pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209;
-
-pub const PTRACE_O_EXITKILL: ::c_int = 1048576;
-pub const PTRACE_O_TRACECLONE: ::c_int = 8;
-pub const PTRACE_O_TRACEEXEC: ::c_int = 16;
-pub const PTRACE_O_TRACEEXIT: ::c_int = 64;
-pub const PTRACE_O_TRACEFORK: ::c_int = 2;
-pub const PTRACE_O_TRACESYSGOOD: ::c_int = 1;
-pub const PTRACE_O_TRACEVFORK: ::c_int = 4;
-pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 32;
-pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 2097152;
-
-pub const MADV_DODUMP: ::c_int = 17;
-pub const MADV_DONTDUMP: ::c_int = 16;
-
-pub const EPOLLWAKEUP: ::c_int = 0x20000000;
-
-pub const POLLRDNORM: ::c_short = 0x040;
-pub const POLLRDBAND: ::c_short = 0x080;
-
-pub const MADV_HUGEPAGE: ::c_int = 14;
-pub const MADV_NOHUGEPAGE: ::c_int = 15;
-
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-
-pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK;
-
-pub const SFD_NONBLOCK: ::c_int = ::O_NONBLOCK;
-
-pub const TCSANOW: ::c_int = 0;
-pub const TCSADRAIN: ::c_int = 1;
-pub const TCSAFLUSH: ::c_int = 2;
-
-pub const TIOCINQ: ::c_int = ::FIONREAD;
-
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-pub const RTLD_NOLOAD: ::c_int = 0x4;
-
-// TODO(#247) Temporarily musl-specific (available since musl 0.9.12 / Linux
-// kernel 3.10).  See also notbsd/mod.rs
-pub const CLOCK_SGI_CYCLE: ::clockid_t = 10;
-pub const CLOCK_TAI: ::clockid_t = 11;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-extern {
-    pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int;
-    pub fn ptrace(request: ::c_int, ...) -> ::c_long;
-    pub fn getpriority(which: ::c_int, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::id_t, prio: ::c_int) -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] {
-        mod b64;
-        pub use self::b64::*;
-    } else if #[cfg(any(target_arch = "x86",
-                        target_arch = "mips",
-                        target_arch = "arm",
-                        target_arch = "asmjs",
-                        target_arch = "wasm32"))] {
-        mod b32;
-        pub use self::b32::*;
-    } else { }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/arm.rs
+++ /dev/null
@@ -1,203 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = u32;
-
-s! {
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_ushort,
-        __pad1: ::c_ushort,
-        pub __seq: ::c_ushort,
-        __pad2: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __pad1: ::c_uint,
-        __st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad2: ::c_uint,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino64_t,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        __unused1: ::c_ulong,
-        pub shm_dtime: ::time_t,
-        __unused2: ::c_ulong,
-        pub shm_ctime: ::time_t,
-        __unused3: ::c_ulong,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        __glibc_reserved1: ::c_ulong,
-        pub msg_rtime: ::time_t,
-        __glibc_reserved2: ::c_ulong,
-        pub msg_ctime: ::time_t,
-        __glibc_reserved3: ::c_ulong,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x10000;
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
-
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-
-pub const EDEADLOCK: ::c_int = 35;
-
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-
-pub const FIOCLEX: ::c_ulong = 0x5451;
-pub const FIONBIO: ::c_ulong = 0x5421;
-
-pub const SYS_gettid: ::c_long = 224;
-pub const SYS_perf_event_open: ::c_long = 364;
-
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-pub const TCGETS: ::c_ulong = 0x5401;
-pub const TCSETS: ::c_ulong = 0x5402;
-pub const TCSETSW: ::c_ulong = 0x5403;
-pub const TCSETSF: ::c_ulong = 0x5404;
-pub const TCGETA: ::c_ulong = 0x5405;
-pub const TCSETA: ::c_ulong = 0x5406;
-pub const TCSETAW: ::c_ulong = 0x5407;
-pub const TCSETAF: ::c_ulong = 0x5408;
-pub const TCSBRK: ::c_ulong = 0x5409;
-pub const TCXONC: ::c_ulong = 0x540A;
-pub const TCFLSH: ::c_ulong = 0x540B;
-pub const TIOCINQ: ::c_ulong = 0x541B;
-pub const TIOCGPGRP: ::c_ulong = 0x540F;
-pub const TIOCSPGRP: ::c_ulong = 0x5410;
-pub const TIOCOUTQ: ::c_ulong = 0x5411;
-pub const TIOCGWINSZ: ::c_ulong = 0x5413;
-pub const TIOCSWINSZ: ::c_ulong = 0x5414;
-pub const FIONREAD: ::c_ulong = 0x541B;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/mod.rs
+++ /dev/null
@@ -1,284 +0,0 @@
-//! 32-bit specific definitions for linux-like values
-
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type clock_t = i32;
-pub type time_t = i32;
-pub type suseconds_t = i32;
-pub type ino_t = u32;
-pub type off_t = i32;
-pub type blkcnt_t = i32;
-pub type __fsword_t = i32;
-
-pub type blksize_t = i32;
-pub type nlink_t = u32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __pad1: ::c_short,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad2: ::c_short,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused4: ::c_long,
-        __unused5: ::c_long,
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u32; 9]
-    }
-
-    pub struct sigset_t {
-        __val: [::c_ulong; 32],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 8],
-    }
-}
-
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
-
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 6;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-pub const O_FSYNC: ::c_int = 0x101000;
-
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EBADMSG: ::c_int = 74;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const EHWPOISON: ::c_int = 133;
-pub const ERFKILL: ::c_int = 132;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
-
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-
-pub const PTRACE_DETACH: ::c_uint = 17;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x0800;
-
-pub const TIOCEXCL: ::c_ulong = 0x540C;
-pub const TIOCNXCL: ::c_ulong = 0x540D;
-pub const TIOCSCTTY: ::c_ulong = 0x540E;
-pub const TIOCSTI: ::c_ulong = 0x5412;
-pub const TIOCMGET: ::c_ulong = 0x5415;
-pub const TIOCMBIS: ::c_ulong = 0x5416;
-pub const TIOCMBIC: ::c_ulong = 0x5417;
-pub const TIOCMSET: ::c_ulong = 0x5418;
-pub const TIOCCONS: ::c_ulong = 0x541D;
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-
-cfg_if! {
-    if #[cfg(target_arch = "x86")] {
-        mod x86;
-        pub use self::x86::*;
-    } else if #[cfg(target_arch = "arm")] {
-        mod arm;
-        pub use self::arm::*;
-    } else if #[cfg(target_arch = "powerpc")] {
-        mod powerpc;
-        pub use self::powerpc::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/powerpc.rs
+++ /dev/null
@@ -1,207 +0,0 @@
-pub type c_char = u8;
-pub type wchar_t = i32;
-
-s! {
-    pub struct ipc_perm {
-        __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::mode_t,
-        __seq: ::uint32_t,
-        __pad1: ::uint32_t,
-        __glibc_reserved1: ::uint64_t,
-        __glibc_reserved2: ::uint64_t,
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad2: ::c_ushort,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        __glibc_reserved1: ::c_uint,
-        pub shm_atime: ::time_t,
-        __glibc_reserved2: ::c_uint,
-        pub shm_dtime: ::time_t,
-        __glibc_reserved3: ::c_uint,
-        pub shm_ctime: ::time_t,
-        __glibc_reserved4: ::c_uint,
-        pub shm_segsz: ::size_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __glibc_reserved5: ::c_ulong,
-        __glibc_reserved6: ::c_ulong,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        __glibc_reserved1: ::c_uint,
-        pub msg_stime: ::time_t,
-        __glibc_reserved2: ::c_uint,
-        pub msg_rtime: ::time_t,
-        __glibc_reserved3: ::c_uint,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x20000;
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
-
-pub const MAP_LOCKED: ::c_int = 0x00080;
-pub const MAP_NORESERVE: ::c_int = 0x00040;
-
-pub const EDEADLOCK: ::c_int = 58;
-
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_RCVLOWAT: ::c_int = 16;
-pub const SO_SNDLOWAT: ::c_int = 17;
-pub const SO_RCVTIMEO: ::c_int = 18;
-pub const SO_SNDTIMEO: ::c_int = 19;
-pub const SO_PASSCRED: ::c_int = 20;
-pub const SO_PEERCRED: ::c_int = 21;
-
-pub const FIOCLEX: ::c_ulong = 0x20006601;
-pub const FIONBIO: ::c_ulong = 0x8004667e;
-
-pub const SYS_gettid: ::c_long = 207;
-pub const SYS_perf_event_open: ::c_long = 319;
-
-pub const MCL_CURRENT: ::c_int = 0x2000;
-pub const MCL_FUTURE: ::c_int = 0x4000;
-
-pub const SIGSTKSZ: ::size_t = 0x4000;
-pub const MINSIGSTKSZ: ::size_t = 4096;
-pub const CBAUD: ::tcflag_t = 0xff;
-pub const TAB1: ::c_int = 0x400;
-pub const TAB2: ::c_int = 0x800;
-pub const TAB3: ::c_int = 0xc00;
-pub const CR1: ::c_int  = 0x1000;
-pub const CR2: ::c_int  = 0x2000;
-pub const CR3: ::c_int  = 0x3000;
-pub const FF1: ::c_int  = 0x4000;
-pub const BS1: ::c_int  = 0x8000;
-pub const VT1: ::c_int  = 0x10000;
-pub const VWERASE: usize = 0xa;
-pub const VREPRINT: usize = 0xb;
-pub const VSUSP: usize = 0xc;
-pub const VSTART: usize = 0xd;
-pub const VSTOP: usize = 0xe;
-pub const VDISCARD: usize = 0x10;
-pub const VTIME: usize = 0x7;
-pub const IXON: ::tcflag_t = 0x200;
-pub const IXOFF: ::tcflag_t = 0x400;
-pub const ONLCR: ::tcflag_t = 0x2;
-pub const CSIZE: ::tcflag_t = 0x300;
-pub const CS6: ::tcflag_t = 0x100;
-pub const CS7: ::tcflag_t = 0x200;
-pub const CS8: ::tcflag_t = 0x300;
-pub const CSTOPB: ::tcflag_t = 0x400;
-pub const CREAD: ::tcflag_t = 0x800;
-pub const PARENB: ::tcflag_t = 0x1000;
-pub const PARODD: ::tcflag_t = 0x2000;
-pub const HUPCL: ::tcflag_t = 0x4000;
-pub const CLOCAL: ::tcflag_t = 0x8000;
-pub const ECHOKE: ::tcflag_t = 0x1;
-pub const ECHOE: ::tcflag_t = 0x2;
-pub const ECHOK: ::tcflag_t = 0x4;
-pub const ECHONL: ::tcflag_t = 0x10;
-pub const ECHOPRT: ::tcflag_t = 0x20;
-pub const ECHOCTL: ::tcflag_t = 0x40;
-pub const ISIG: ::tcflag_t = 0x80;
-pub const ICANON: ::tcflag_t = 0x100;
-pub const PENDIN: ::tcflag_t = 0x20000000;
-pub const NOFLSH: ::tcflag_t = 0x80000000;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const CBAUDEX: ::speed_t = 0o000020;
-pub const B57600: ::speed_t = 0o0020;
-pub const B115200: ::speed_t = 0o0021;
-pub const B230400: ::speed_t = 0o0022;
-pub const B460800: ::speed_t = 0o0023;
-pub const B500000: ::speed_t = 0o0024;
-pub const B576000: ::speed_t = 0o0025;
-pub const B921600: ::speed_t = 0o0026;
-pub const B1000000: ::speed_t = 0o0027;
-pub const B1152000: ::speed_t = 0o0030;
-pub const B1500000: ::speed_t = 0o0031;
-pub const B2000000: ::speed_t = 0o0032;
-pub const B2500000: ::speed_t = 0o0033;
-pub const B3000000: ::speed_t = 0o0034;
-pub const B3500000: ::speed_t = 0o0035;
-pub const B4000000: ::speed_t = 0o0036;
-
-pub const VEOL: usize = 6;
-pub const VEOL2: usize = 8;
-pub const VMIN: usize = 5;
-pub const IEXTEN: ::tcflag_t = 0x400;
-pub const TOSTOP: ::tcflag_t = 0x400000;
-pub const FLUSHO: ::tcflag_t = 0x800000;
-pub const EXTPROC: ::tcflag_t = 0x10000000;
-pub const TCGETS: ::c_ulong = 0x403c7413;
-pub const TCSETS: ::c_ulong = 0x803c7414;
-pub const TCSETSW: ::c_ulong = 0x803c7415;
-pub const TCSETSF: ::c_ulong = 0x803c7416;
-pub const TCGETA: ::c_ulong = 0x40147417;
-pub const TCSETA: ::c_ulong = 0x80147418;
-pub const TCSETAW: ::c_ulong = 0x80147419;
-pub const TCSETAF: ::c_ulong = 0x8014741c;
-pub const TCSBRK: ::c_ulong = 0x2000741d;
-pub const TCXONC: ::c_ulong = 0x2000741e;
-pub const TCFLSH: ::c_ulong = 0x2000741f;
-pub const TIOCINQ: ::c_ulong = 0x4004667f;
-pub const TIOCGPGRP: ::c_ulong = 0x40047477;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCOUTQ: ::c_ulong = 0x40047473;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const FIONREAD: ::c_ulong = 0x4004667f;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b32/x86.rs
+++ /dev/null
@@ -1,319 +0,0 @@
-pub type c_char = i8;
-pub type wchar_t = i32;
-pub type greg_t = i32;
-
-s! {
-    pub struct _libc_fpreg {
-        pub significand: [u16; 4],
-        pub exponent: u16,
-    }
-
-    pub struct _libc_fpstate {
-        pub cw: ::c_ulong,
-        pub sw: ::c_ulong,
-        pub tag: ::c_ulong,
-        pub ipoff: ::c_ulong,
-        pub cssel: ::c_ulong,
-        pub dataoff: ::c_ulong,
-        pub datasel: ::c_ulong,
-        pub _st: [_libc_fpreg; 8],
-        pub status: ::c_ulong,
-    }
-
-    pub struct user_fpregs_struct {
-        pub cwd: ::c_long,
-        pub swd: ::c_long,
-        pub twd: ::c_long,
-        pub fip: ::c_long,
-        pub fcs: ::c_long,
-        pub foo: ::c_long,
-        pub fos: ::c_long,
-        pub st_space: [::c_long; 20],
-    }
-
-    pub struct user_fpxregs_struct {
-        pub cwd: ::c_ushort,
-        pub swd: ::c_ushort,
-        pub twd: ::c_ushort,
-        pub fop: ::c_ushort,
-        pub fip: ::c_long,
-        pub fcs: ::c_long,
-        pub foo: ::c_long,
-        pub fos: ::c_long,
-        pub mxcsr: ::c_long,
-        __reserved: ::c_long,
-        pub st_space: [::c_long; 32],
-        pub xmm_space: [::c_long; 32],
-        padding: [::c_long; 56],
-    }
-
-    pub struct user_regs_struct {
-        pub ebx: ::c_long,
-        pub ecx: ::c_long,
-        pub edx: ::c_long,
-        pub esi: ::c_long,
-        pub edi: ::c_long,
-        pub ebp: ::c_long,
-        pub eax: ::c_long,
-        pub xds: ::c_long,
-        pub xes: ::c_long,
-        pub xfs: ::c_long,
-        pub xgs: ::c_long,
-        pub orig_eax: ::c_long,
-        pub eip: ::c_long,
-        pub xcs: ::c_long,
-        pub eflags: ::c_long,
-        pub esp: ::c_long,
-        pub xss: ::c_long,
-    }
-
-    pub struct user {
-        pub regs: user_regs_struct,
-        pub u_fpvalid: ::c_int,
-        pub i387: user_fpregs_struct,
-        pub u_tsize: ::c_ulong,
-        pub u_dsize: ::c_ulong,
-        pub u_ssize: ::c_ulong,
-        pub start_code: ::c_ulong,
-        pub start_stack: ::c_ulong,
-        pub signal: ::c_long,
-        __reserved: ::c_int,
-        pub u_ar0: *mut user_regs_struct,
-        pub u_fpstate: *mut user_fpregs_struct,
-        pub magic: ::c_ulong,
-        pub u_comm: [c_char; 32],
-        pub u_debugreg: [::c_int; 8],
-    }
-
-    pub struct mcontext_t {
-        pub gregs: [greg_t; 19],
-        pub fpregs: *mut _libc_fpstate,
-        pub oldmask: ::c_ulong,
-        pub cr2: ::c_ulong,
-    }
-
-    pub struct ucontext_t {
-        pub uc_flags: ::c_ulong,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: ::stack_t,
-        pub uc_mcontext: mcontext_t,
-        pub uc_sigmask: ::sigset_t,
-        __private: [u8; 112],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_ushort,
-        __pad1: ::c_ushort,
-        pub __seq: ::c_ushort,
-        __pad2: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __pad1: ::c_uint,
-        __st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad2: ::c_uint,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_ino: ::ino64_t,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        __unused1: ::c_ulong,
-        pub shm_dtime: ::time_t,
-        __unused2: ::c_ulong,
-        pub shm_ctime: ::time_t,
-        __unused3: ::c_ulong,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        __glibc_reserved1: ::c_ulong,
-        pub msg_rtime: ::time_t,
-        __glibc_reserved2: ::c_ulong,
-        pub msg_ctime: ::time_t,
-        __glibc_reserved3: ::c_ulong,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-}
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_32BIT: ::c_int = 0x0040;
-
-pub const EDEADLOCK: ::c_int = 35;
-
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-
-pub const FIOCLEX: ::c_ulong = 0x5451;
-pub const FIONBIO: ::c_ulong = 0x5421;
-
-pub const SYS_gettid: ::c_long = 224;
-pub const SYS_perf_event_open: ::c_long = 336;
-
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-pub const TCGETS: ::c_ulong = 0x5401;
-pub const TCSETS: ::c_ulong = 0x5402;
-pub const TCSETSW: ::c_ulong = 0x5403;
-pub const TCSETSF: ::c_ulong = 0x5404;
-pub const TCGETA: ::c_ulong = 0x5405;
-pub const TCSETA: ::c_ulong = 0x5406;
-pub const TCSETAW: ::c_ulong = 0x5407;
-pub const TCSETAF: ::c_ulong = 0x5408;
-pub const TCSBRK: ::c_ulong = 0x5409;
-pub const TCXONC: ::c_ulong = 0x540A;
-pub const TCFLSH: ::c_ulong = 0x540B;
-pub const TIOCINQ: ::c_ulong = 0x541B;
-pub const TIOCGPGRP: ::c_ulong = 0x540F;
-pub const TIOCSPGRP: ::c_ulong = 0x5410;
-pub const TIOCOUTQ: ::c_ulong = 0x5411;
-pub const TIOCGWINSZ: ::c_ulong = 0x5413;
-pub const TIOCSWINSZ: ::c_ulong = 0x5414;
-pub const FIONREAD: ::c_ulong = 0x541B;
-
-extern {
-    pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int;
-    pub fn setcontext(ucp: *const ucontext_t) -> ::c_int;
-    pub fn makecontext(ucp: *mut ucontext_t,
-                       func:  extern fn (),
-                       argc: ::c_int, ...);
-    pub fn swapcontext(uocp: *mut ucontext_t,
-                       ucp: *const ucontext_t) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/aarch64.rs
+++ /dev/null
@@ -1,447 +0,0 @@
-//! AArch64-specific definitions for 64-bit linux-like values
-
-pub type c_char = u8;
-pub type wchar_t = u32;
-pub type nlink_t = u32;
-pub type blksize_t = i32;
-pub type suseconds_t = i64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad1: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        __pad2: ::c_int,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_int; 2],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad1: ::dev_t,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        __pad2: ::c_int,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_int; 2],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u64; 8]
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_uint,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-}
-
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
-
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 6;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-pub const O_FSYNC: ::c_int = 0x101000;
-
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EBADMSG: ::c_int = 74;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const EHWPOISON: ::c_int = 133;
-pub const ERFKILL: ::c_int = 132;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22;
-pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23;
-pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24;
-pub const SO_BINDTODEVICE: ::c_int = 25;
-pub const SO_ATTACH_FILTER: ::c_int = 26;
-pub const SO_DETACH_FILTER: ::c_int = 27;
-pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER;
-pub const SO_PEERNAME: ::c_int = 28;
-pub const SO_TIMESTAMP: ::c_int = 29;
-pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_PEERSEC: ::c_int = 31;
-pub const SO_PASSSEC: ::c_int = 34;
-pub const SO_TIMESTAMPNS: ::c_int = 35;
-pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS;
-pub const SO_MARK: ::c_int = 36;
-pub const SO_TIMESTAMPING: ::c_int = 37;
-pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-pub const SO_RXQ_OVFL: ::c_int = 40;
-pub const SO_WIFI_STATUS: ::c_int = 41;
-pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS;
-pub const SO_PEEK_OFF: ::c_int = 42;
-pub const SO_NOFCS: ::c_int = 43;
-pub const SO_LOCK_FILTER: ::c_int = 44;
-pub const SO_SELECT_ERR_QUEUE: ::c_int = 45;
-pub const SO_BUSY_POLL: ::c_int = 46;
-pub const SO_MAX_PACING_RATE: ::c_int = 47;
-pub const SO_BPF_EXTENSIONS: ::c_int = 48;
-pub const SO_INCOMING_CPU: ::c_int = 49;
-pub const SO_ATTACH_BPF: ::c_int = 50;
-pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
-
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-
-pub const PTRACE_DETACH: ::c_uint = 17;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x0800;
-
-pub const TIOCEXCL: ::c_ulong = 0x540C;
-pub const TIOCNXCL: ::c_ulong = 0x540D;
-pub const TIOCSCTTY: ::c_ulong = 0x540E;
-pub const TIOCSTI: ::c_ulong = 0x5412;
-pub const TIOCMGET: ::c_ulong = 0x5415;
-pub const TIOCMBIS: ::c_ulong = 0x5416;
-pub const TIOCMBIC: ::c_ulong = 0x5417;
-pub const TIOCMSET: ::c_ulong = 0x5418;
-pub const TIOCCONS: ::c_ulong = 0x541D;
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 8;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 48;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 8;
-
-pub const O_DIRECT: ::c_int = 0x10000;
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
-
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-
-pub const EDEADLOCK: ::c_int = 35;
-
-pub const FIOCLEX: ::c_ulong = 0x5451;
-pub const FIONBIO: ::c_ulong = 0x5421;
-
-pub const SYS_gettid: ::c_long = 178;
-pub const SYS_perf_event_open: ::c_long = 241;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 16384;
-pub const MINSIGSTKSZ: ::size_t = 5120;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-pub const TCGETS: ::c_ulong = 0x5401;
-pub const TCSETS: ::c_ulong = 0x5402;
-pub const TCSETSW: ::c_ulong = 0x5403;
-pub const TCSETSF: ::c_ulong = 0x5404;
-pub const TCGETA: ::c_ulong = 0x5405;
-pub const TCSETA: ::c_ulong = 0x5406;
-pub const TCSETAW: ::c_ulong = 0x5407;
-pub const TCSETAF: ::c_ulong = 0x5408;
-pub const TCSBRK: ::c_ulong = 0x5409;
-pub const TCXONC: ::c_ulong = 0x540A;
-pub const TCFLSH: ::c_ulong = 0x540B;
-pub const TIOCINQ: ::c_ulong = 0x541B;
-pub const TIOCGPGRP: ::c_ulong = 0x540F;
-pub const TIOCSPGRP: ::c_ulong = 0x5410;
-pub const TIOCOUTQ: ::c_ulong = 0x5411;
-pub const TIOCGWINSZ: ::c_ulong = 0x5413;
-pub const TIOCSWINSZ: ::c_ulong = 0x5414;
-pub const FIONREAD: ::c_ulong = 0x541B;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/mod.rs
+++ /dev/null
@@ -1,67 +0,0 @@
-//! 64-bit specific definitions for linux-like values
-
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type clock_t = i64;
-pub type time_t = i64;
-pub type ino_t = u64;
-pub type off_t = i64;
-pub type blkcnt_t = i64;
-pub type __fsword_t = ::c_long;
-
-s! {
-    pub struct sigset_t {
-        __val: [::c_ulong; 16],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-}
-
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-
-cfg_if! {
-    if #[cfg(target_arch = "aarch64")] {
-        mod aarch64;
-        pub use self::aarch64::*;
-    } else if #[cfg(any(target_arch = "powerpc64"))] {
-        mod powerpc64;
-        pub use self::powerpc64::*;
-    } else if #[cfg(any(target_arch = "sparc64"))] {
-        mod sparc64;
-        pub use self::sparc64::*;
-    } else if #[cfg(any(target_arch = "x86_64"))] {
-        mod x86_64;
-        pub use self::x86_64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/powerpc64.rs
+++ /dev/null
@@ -1,446 +0,0 @@
-//! PowerPC64-specific definitions for 64-bit linux-like values
-
-pub type c_char = u8;
-pub type wchar_t = i32;
-pub type nlink_t = u64;
-pub type blksize_t = i64;
-pub type suseconds_t = i64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_long; 3],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __reserved: [::c_long; 3],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u64; 7]
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::mode_t,
-        pub __seq: ::uint32_t,
-        __pad1: ::uint32_t,
-        __unused1: ::uint64_t,
-        __unused2: ::c_ulong,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_segsz: ::size_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-}
-
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
-
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 6;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-pub const O_FSYNC: ::c_int = 0x101000;
-
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EBADMSG: ::c_int = 74;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const EHWPOISON: ::c_int = 133;
-pub const ERFKILL: ::c_int = 132;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 20;
-pub const SO_PEERCRED: ::c_int = 21;
-pub const SO_RCVLOWAT: ::c_int = 16;
-pub const SO_SNDLOWAT: ::c_int = 17;
-pub const SO_RCVTIMEO: ::c_int = 18;
-pub const SO_SNDTIMEO: ::c_int = 19;
-pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22;
-pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23;
-pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24;
-pub const SO_BINDTODEVICE: ::c_int = 25;
-pub const SO_ATTACH_FILTER: ::c_int = 26;
-pub const SO_DETACH_FILTER: ::c_int = 27;
-pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER;
-pub const SO_PEERNAME: ::c_int = 28;
-pub const SO_TIMESTAMP: ::c_int = 29;
-pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_PEERSEC: ::c_int = 31;
-pub const SO_PASSSEC: ::c_int = 34;
-pub const SO_TIMESTAMPNS: ::c_int = 35;
-pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS;
-pub const SO_MARK: ::c_int = 36;
-pub const SO_TIMESTAMPING: ::c_int = 37;
-pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-pub const SO_RXQ_OVFL: ::c_int = 40;
-pub const SO_WIFI_STATUS: ::c_int = 41;
-pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS;
-pub const SO_PEEK_OFF: ::c_int = 42;
-pub const SO_NOFCS: ::c_int = 43;
-pub const SO_LOCK_FILTER: ::c_int = 44;
-pub const SO_SELECT_ERR_QUEUE: ::c_int = 45;
-pub const SO_BUSY_POLL: ::c_int = 46;
-pub const SO_MAX_PACING_RATE: ::c_int = 47;
-pub const SO_BPF_EXTENSIONS: ::c_int = 48;
-pub const SO_INCOMING_CPU: ::c_int = 49;
-pub const SO_ATTACH_BPF: ::c_int = 50;
-pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
-
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-
-pub const PTRACE_DETACH: ::c_uint = 17;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x0800;
-
-pub const TIOCEXCL: ::c_ulong = 0x540C;
-pub const TIOCNXCL: ::c_ulong = 0x540D;
-pub const TIOCSCTTY: ::c_ulong = 0x540E;
-pub const TIOCSTI: ::c_ulong = 0x5412;
-pub const TIOCMGET: ::c_ulong = 0x5415;
-pub const TIOCMBIS: ::c_ulong = 0x5416;
-pub const TIOCMBIC: ::c_ulong = 0x5417;
-pub const TIOCMSET: ::c_ulong = 0x5418;
-pub const TIOCCONS: ::c_ulong = 0x541D;
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const O_DIRECTORY: ::c_int = 0x4000;
-pub const O_NOFOLLOW: ::c_int = 0x8000;
-pub const O_DIRECT: ::c_int = 0x20000;
-
-pub const MAP_LOCKED: ::c_int = 0x00080;
-pub const MAP_NORESERVE: ::c_int = 0x00040;
-
-pub const EDEADLOCK: ::c_int = 58;
-
-pub const FIOCLEX: ::c_ulong = 0x20006601;
-pub const FIONBIO: ::c_ulong = 0x8004667e;
-
-pub const SYS_gettid: ::c_long = 207;
-pub const SYS_perf_event_open: ::c_long = 319;
-
-pub const MCL_CURRENT: ::c_int = 0x2000;
-pub const MCL_FUTURE: ::c_int = 0x4000;
-
-pub const SIGSTKSZ: ::size_t = 0x4000;
-pub const MINSIGSTKSZ: ::size_t = 4096;
-pub const CBAUD: ::tcflag_t = 0xff;
-pub const TAB1: ::c_int = 0x400;
-pub const TAB2: ::c_int = 0x800;
-pub const TAB3: ::c_int = 0xc00;
-pub const CR1: ::c_int  = 0x1000;
-pub const CR2: ::c_int  = 0x2000;
-pub const CR3: ::c_int  = 0x3000;
-pub const FF1: ::c_int  = 0x4000;
-pub const BS1: ::c_int  = 0x8000;
-pub const VT1: ::c_int  = 0x10000;
-pub const VWERASE: usize = 0xa;
-pub const VREPRINT: usize = 0xb;
-pub const VSUSP: usize = 0xc;
-pub const VSTART: usize = 0xd;
-pub const VSTOP: usize = 0xe;
-pub const VDISCARD: usize = 0x10;
-pub const VTIME: usize = 0x7;
-pub const IXON: ::tcflag_t = 0x200;
-pub const IXOFF: ::tcflag_t = 0x400;
-pub const ONLCR: ::tcflag_t = 0x2;
-pub const CSIZE: ::tcflag_t = 0x300;
-pub const CS6: ::tcflag_t = 0x100;
-pub const CS7: ::tcflag_t = 0x200;
-pub const CS8: ::tcflag_t = 0x300;
-pub const CSTOPB: ::tcflag_t = 0x400;
-pub const CREAD: ::tcflag_t = 0x800;
-pub const PARENB: ::tcflag_t = 0x1000;
-pub const PARODD: ::tcflag_t = 0x2000;
-pub const HUPCL: ::tcflag_t = 0x4000;
-pub const CLOCAL: ::tcflag_t = 0x8000;
-pub const ECHOKE: ::tcflag_t = 0x1;
-pub const ECHOE: ::tcflag_t = 0x2;
-pub const ECHOK: ::tcflag_t = 0x4;
-pub const ECHONL: ::tcflag_t = 0x10;
-pub const ECHOPRT: ::tcflag_t = 0x20;
-pub const ECHOCTL: ::tcflag_t = 0x40;
-pub const ISIG: ::tcflag_t = 0x80;
-pub const ICANON: ::tcflag_t = 0x100;
-pub const PENDIN: ::tcflag_t = 0x20000000;
-pub const NOFLSH: ::tcflag_t = 0x80000000;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const CBAUDEX: ::speed_t = 0o000020;
-pub const B57600: ::speed_t = 0o0020;
-pub const B115200: ::speed_t = 0o0021;
-pub const B230400: ::speed_t = 0o0022;
-pub const B460800: ::speed_t = 0o0023;
-pub const B500000: ::speed_t = 0o0024;
-pub const B576000: ::speed_t = 0o0025;
-pub const B921600: ::speed_t = 0o0026;
-pub const B1000000: ::speed_t = 0o0027;
-pub const B1152000: ::speed_t = 0o0030;
-pub const B1500000: ::speed_t = 0o0031;
-pub const B2000000: ::speed_t = 0o0032;
-pub const B2500000: ::speed_t = 0o0033;
-pub const B3000000: ::speed_t = 0o0034;
-pub const B3500000: ::speed_t = 0o0035;
-pub const B4000000: ::speed_t = 0o0036;
-
-pub const VEOL: usize = 6;
-pub const VEOL2: usize = 8;
-pub const VMIN: usize = 5;
-pub const IEXTEN: ::tcflag_t = 0x400;
-pub const TOSTOP: ::tcflag_t = 0x400000;
-pub const FLUSHO: ::tcflag_t = 0x800000;
-pub const EXTPROC: ::tcflag_t = 0x10000000;
-pub const TCGETS: ::c_ulong = 0x403c7413;
-pub const TCSETS: ::c_ulong = 0x803c7414;
-pub const TCSETSW: ::c_ulong = 0x803c7415;
-pub const TCSETSF: ::c_ulong = 0x803c7416;
-pub const TCGETA: ::c_ulong = 0x40147417;
-pub const TCSETA: ::c_ulong = 0x80147418;
-pub const TCSETAW: ::c_ulong = 0x80147419;
-pub const TCSETAF: ::c_ulong = 0x8014741c;
-pub const TCSBRK: ::c_ulong = 0x2000741d;
-pub const TCXONC: ::c_ulong = 0x2000741e;
-pub const TCFLSH: ::c_ulong = 0x2000741f;
-pub const TIOCINQ: ::c_ulong = 0x4004667f;
-pub const TIOCGPGRP: ::c_ulong = 0x40047477;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCOUTQ: ::c_ulong = 0x40047473;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const FIONREAD: ::c_ulong = 0x4004667f;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/sparc64.rs
+++ /dev/null
@@ -1,370 +0,0 @@
-//! SPARC64-specific definitions for 64-bit linux-like values
-
-pub type c_char = i8;
-pub type wchar_t = i32;
-pub type nlink_t = u32;
-pub type blksize_t = i64;
-pub type suseconds_t = i32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        __pad0: u64,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad1: u64,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_long; 2],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        __pad0: u64,
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        __pad2: ::c_int,
-        pub st_size: ::off64_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __reserved: [::c_long; 2],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u64; 7]
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::mode_t,
-        __pad0: u16,
-        pub __seq: ::c_ushort,
-        __unused1: ::c_ulonglong,
-        __unused2: ::c_ulonglong,
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_segsz: ::size_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __reserved1: ::c_ulong,
-        __reserved2: ::c_ulong
-    }
-}
-
-pub const TIOCGSOFTCAR: ::c_ulong = 0x40047464;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x80047465;
-
-pub const RLIMIT_NOFILE: ::c_int = 6;
-pub const RLIMIT_NPROC: ::c_int = 7;
-
-pub const O_APPEND: ::c_int = 0x8;
-pub const O_CREAT: ::c_int = 0x200;
-pub const O_EXCL: ::c_int = 0x800;
-pub const O_NOCTTY: ::c_int = 0x8000;
-pub const O_NONBLOCK: ::c_int = 0x4000;
-pub const O_SYNC: ::c_int = 0x802000;
-pub const O_RSYNC: ::c_int = 0x802000;
-pub const O_DSYNC: ::c_int = 0x2000;
-pub const O_FSYNC: ::c_int = 0x802000;
-
-pub const MAP_GROWSDOWN: ::c_int = 0x0200;
-
-pub const EDEADLK: ::c_int = 78;
-pub const ENAMETOOLONG: ::c_int = 63;
-pub const ENOLCK: ::c_int = 79;
-pub const ENOSYS: ::c_int = 90;
-pub const ENOTEMPTY: ::c_int = 66;
-pub const ELOOP: ::c_int = 62;
-pub const ENOMSG: ::c_int = 75;
-pub const EIDRM: ::c_int = 77;
-pub const ECHRNG: ::c_int = 94;
-pub const EL2NSYNC: ::c_int = 95;
-pub const EL3HLT: ::c_int = 96;
-pub const EL3RST: ::c_int = 97;
-pub const ELNRNG: ::c_int = 98;
-pub const EUNATCH: ::c_int = 99;
-pub const ENOCSI: ::c_int = 100;
-pub const EL2HLT: ::c_int = 101;
-pub const EBADE: ::c_int = 102;
-pub const EBADR: ::c_int = 103;
-pub const EXFULL: ::c_int = 104;
-pub const ENOANO: ::c_int = 105;
-pub const EBADRQC: ::c_int = 106;
-pub const EBADSLT: ::c_int = 107;
-pub const EMULTIHOP: ::c_int = 87;
-pub const EOVERFLOW: ::c_int = 92;
-pub const ENOTUNIQ: ::c_int = 115;
-pub const EBADFD: ::c_int = 93;
-pub const EBADMSG: ::c_int = 76;
-pub const EREMCHG: ::c_int = 89;
-pub const ELIBACC: ::c_int = 114;
-pub const ELIBBAD: ::c_int = 112;
-pub const ELIBSCN: ::c_int = 124;
-pub const ELIBMAX: ::c_int = 123;
-pub const ELIBEXEC: ::c_int = 110;
-pub const EILSEQ: ::c_int = 122;
-pub const ERESTART: ::c_int = 116;
-pub const ESTRPIPE: ::c_int = 91;
-pub const EUSERS: ::c_int = 68;
-pub const ENOTSOCK: ::c_int = 38;
-pub const EDESTADDRREQ: ::c_int = 39;
-pub const EMSGSIZE: ::c_int = 40;
-pub const EPROTOTYPE: ::c_int = 41;
-pub const ENOPROTOOPT: ::c_int = 42;
-pub const EPROTONOSUPPORT: ::c_int = 43;
-pub const ESOCKTNOSUPPORT: ::c_int = 44;
-pub const EOPNOTSUPP: ::c_int = 45;
-pub const EPFNOSUPPORT: ::c_int = 46;
-pub const EAFNOSUPPORT: ::c_int = 47;
-pub const EADDRINUSE: ::c_int = 48;
-pub const EADDRNOTAVAIL: ::c_int = 49;
-pub const ENETDOWN: ::c_int = 50;
-pub const ENETUNREACH: ::c_int = 51;
-pub const ENETRESET: ::c_int = 52;
-pub const ECONNABORTED: ::c_int = 53;
-pub const ECONNRESET: ::c_int = 54;
-pub const ENOBUFS: ::c_int = 55;
-pub const EISCONN: ::c_int = 56;
-pub const ENOTCONN: ::c_int = 57;
-pub const ESHUTDOWN: ::c_int = 58;
-pub const ETOOMANYREFS: ::c_int = 59;
-pub const ETIMEDOUT: ::c_int = 60;
-pub const ECONNREFUSED: ::c_int = 61;
-pub const EHOSTDOWN: ::c_int = 64;
-pub const EHOSTUNREACH: ::c_int = 65;
-pub const EALREADY: ::c_int = 37;
-pub const EINPROGRESS: ::c_int = 36;
-pub const ESTALE: ::c_int = 70;
-pub const EDQUOT: ::c_int = 69;
-pub const ENOMEDIUM: ::c_int = 125;
-pub const EMEDIUMTYPE: ::c_int = 126;
-pub const ECANCELED: ::c_int = 127;
-pub const ENOKEY: ::c_int = 128;
-pub const EKEYEXPIRED: ::c_int = 129;
-pub const EKEYREVOKED: ::c_int = 130;
-pub const EKEYREJECTED: ::c_int = 131;
-pub const EOWNERDEAD: ::c_int = 132;
-pub const ENOTRECOVERABLE: ::c_int = 133;
-pub const EHWPOISON: ::c_int = 135;
-pub const ERFKILL: ::c_int = 134;
-
-pub const SOL_SOCKET: ::c_int = 0xffff;
-
-pub const SO_REUSEADDR: ::c_int = 4;
-pub const SO_TYPE: ::c_int = 0x1008;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_DONTROUTE: ::c_int = 16;
-pub const SO_BROADCAST: ::c_int = 32;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_KEEPALIVE: ::c_int = 8;
-pub const SO_OOBINLINE: ::c_int = 0x100;
-pub const SO_LINGER: ::c_int = 128;
-pub const SO_REUSEPORT: ::c_int = 0x200;
-pub const SO_ACCEPTCONN: ::c_int = 0x8000;
-
-pub const SA_ONSTACK: ::c_int = 1;
-pub const SA_SIGINFO: ::c_int = 0x200;
-pub const SA_NOCLDWAIT: ::c_int = 0x100;
-
-pub const SIGCHLD: ::c_int = 20;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGUSR1: ::c_int = 30;
-pub const SIGUSR2: ::c_int = 31;
-pub const SIGCONT: ::c_int = 19;
-pub const SIGSTOP: ::c_int = 17;
-pub const SIGTSTP: ::c_int = 18;
-pub const SIGURG: ::c_int = 16;
-pub const SIGIO: ::c_int = 23;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGPOLL: ::c_int = 23;
-pub const SIGPWR: ::c_int = 29;
-pub const SIG_SETMASK: ::c_int = 4;
-pub const SIG_BLOCK: ::c_int = 1;
-pub const SIG_UNBLOCK: ::c_int = 2;
-
-pub const POLLWRNORM: ::c_short = 4;
-pub const POLLWRBAND: ::c_short = 0x100;
-
-pub const O_ASYNC: ::c_int = 0x40;
-pub const O_NDELAY: ::c_int = 0x4004;
-
-pub const PTRACE_DETACH: ::c_uint = 11;
-
-pub const EFD_NONBLOCK: ::c_int = 0x4000;
-
-pub const F_GETLK: ::c_int = 7;
-pub const F_GETOWN: ::c_int = 5;
-pub const F_SETOWN: ::c_int = 6;
-pub const F_SETLK: ::c_int = 8;
-pub const F_SETLKW: ::c_int = 9;
-
-pub const SFD_NONBLOCK: ::c_int = 0x4000;
-
-pub const TIOCEXCL: ::c_ulong = 0x2000740d;
-pub const TIOCNXCL: ::c_ulong = 0x2000740e;
-pub const TIOCSCTTY: ::c_ulong = 0x20007484;
-pub const TIOCSTI: ::c_ulong = 0x80017472;
-pub const TIOCMGET: ::c_ulong = 0x4004746a;
-pub const TIOCMBIS: ::c_ulong = 0x8004746c;
-pub const TIOCMBIC: ::c_ulong = 0x8004746b;
-pub const TIOCMSET: ::c_ulong = 0x8004746d;
-pub const TIOCCONS: ::c_ulong = 0x20007424;
-
-pub const SFD_CLOEXEC: ::c_int = 0x400000;
-
-pub const NCCS: usize = 17;
-pub const O_TRUNC: ::c_int = 0x400;
-
-pub const O_CLOEXEC: ::c_int = 0x400000;
-
-pub const EBFONT: ::c_int = 109;
-pub const ENOSTR: ::c_int = 72;
-pub const ENODATA: ::c_int = 111;
-pub const ETIME: ::c_int = 73;
-pub const ENOSR: ::c_int = 74;
-pub const ENONET: ::c_int = 80;
-pub const ENOPKG: ::c_int = 113;
-pub const EREMOTE: ::c_int = 71;
-pub const ENOLINK: ::c_int = 82;
-pub const EADV: ::c_int = 83;
-pub const ESRMNT: ::c_int = 84;
-pub const ECOMM: ::c_int = 85;
-pub const EPROTO: ::c_int = 86;
-pub const EDOTDOT: ::c_int = 88;
-
-pub const SA_NODEFER: ::c_int = 0x20;
-pub const SA_RESETHAND: ::c_int = 0x4;
-pub const SA_RESTART: ::c_int = 0x2;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000008;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x400000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x400000;
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const O_DIRECTORY: ::c_int = 0o200000;
-pub const O_NOFOLLOW: ::c_int = 0o400000;
-pub const O_DIRECT: ::c_int = 0x100000;
-
-pub const MAP_LOCKED: ::c_int = 0x0100;
-pub const MAP_NORESERVE: ::c_int = 0x00040;
-
-pub const EDEADLOCK: ::c_int = 108;
-
-pub const SO_PEERCRED: ::c_int = 0x40;
-pub const SO_RCVLOWAT: ::c_int = 0x800;
-pub const SO_SNDLOWAT: ::c_int = 0x1000;
-pub const SO_RCVTIMEO: ::c_int = 0x2000;
-pub const SO_SNDTIMEO: ::c_int = 0x4000;
-
-pub const FIOCLEX: ::c_ulong = 0x20006601;
-pub const FIONBIO: ::c_ulong = 0x8004667e;
-
-pub const SYS_gettid: ::c_long = 143;
-pub const SYS_perf_event_open: ::c_long = 327;
-
-pub const MCL_CURRENT: ::c_int = 0x2000;
-pub const MCL_FUTURE: ::c_int = 0x4000;
-
-pub const SIGSTKSZ: ::size_t = 16384;
-pub const MINSIGSTKSZ: ::size_t = 4096;
-pub const CBAUD: ::tcflag_t = 0x0000100f;
-pub const TAB1: ::c_int = 0x800;
-pub const TAB2: ::c_int = 0x1000;
-pub const TAB3: ::c_int = 0x1800;
-pub const CR1: ::c_int  = 0x200;
-pub const CR2: ::c_int  = 0x400;
-pub const CR3: ::c_int  = 0x600;
-pub const FF1: ::c_int  = 0x8000;
-pub const BS1: ::c_int  = 0x2000;
-pub const VT1: ::c_int  = 0x4000;
-pub const VWERASE: usize = 0xe;
-pub const VREPRINT: usize = 0xc;
-pub const VSUSP: usize = 0xa;
-pub const VSTART: usize = 0x8;
-pub const VSTOP: usize = 0x9;
-pub const VDISCARD: usize = 0xd;
-pub const VTIME: usize = 0x5;
-pub const IXON: ::tcflag_t = 0x400;
-pub const IXOFF: ::tcflag_t = 0x1000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x30;
-pub const CS6: ::tcflag_t = 0x10;
-pub const CS7: ::tcflag_t = 0x20;
-pub const CS8: ::tcflag_t = 0x30;
-pub const CSTOPB: ::tcflag_t = 0x40;
-pub const CREAD: ::tcflag_t = 0x80;
-pub const PARENB: ::tcflag_t = 0x100;
-pub const PARODD: ::tcflag_t = 0x200;
-pub const HUPCL: ::tcflag_t = 0x400;
-pub const CLOCAL: ::tcflag_t = 0x800;
-pub const ECHOKE: ::tcflag_t = 0x800;
-pub const ECHOE: ::tcflag_t = 0x10;
-pub const ECHOK: ::tcflag_t = 0x20;
-pub const ECHONL: ::tcflag_t = 0x40;
-pub const ECHOPRT: ::tcflag_t = 0x400;
-pub const ECHOCTL: ::tcflag_t = 0x200;
-pub const ISIG: ::tcflag_t = 0x1;
-pub const ICANON: ::tcflag_t = 0x2;
-pub const PENDIN: ::tcflag_t = 0x4000;
-pub const NOFLSH: ::tcflag_t = 0x80;
-
-pub const VEOL: usize = 5;
-pub const VEOL2: usize = 6;
-pub const VMIN: usize = 4;
-pub const IEXTEN: ::tcflag_t = 0x8000;
-pub const TOSTOP: ::tcflag_t = 0x100;
-pub const FLUSHO: ::tcflag_t = 0x2000;
-pub const EXTPROC: ::tcflag_t = 0x10000;
-pub const TCGETS: ::c_ulong = 0x40245408;
-pub const TCSETS: ::c_ulong = 0x80245409;
-pub const TCSETSW: ::c_ulong = 0x8024540a;
-pub const TCSETSF: ::c_ulong = 0x8024540b;
-pub const TCGETA: ::c_ulong = 0x40125401;
-pub const TCSETA: ::c_ulong = 0x80125402;
-pub const TCSETAW: ::c_ulong = 0x80125403;
-pub const TCSETAF: ::c_ulong = 0x80125404;
-pub const TCSBRK: ::c_ulong = 0x20005405;
-pub const TCXONC: ::c_ulong = 0x20005406;
-pub const TCFLSH: ::c_ulong = 0x20005407;
-pub const TIOCINQ: ::c_ulong = 0x4004667f;
-pub const TIOCGPGRP: ::c_ulong = 0x40047483;
-pub const TIOCSPGRP: ::c_ulong = 0x80047482;
-pub const TIOCOUTQ: ::c_ulong = 0x40047473;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const FIONREAD: ::c_ulong = 0x4004667f;
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/b64/x86_64.rs
+++ /dev/null
@@ -1,580 +0,0 @@
-//! x86_64-specific definitions for 64-bit linux-like values
-
-pub type c_char = i8;
-pub type wchar_t = i32;
-pub type nlink_t = u64;
-pub type blksize_t = i64;
-pub type greg_t = i64;
-pub type suseconds_t = i64;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __unused: [::c_long; 3],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __reserved: [::c_long; 3],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u64; 7]
-    }
-
-    pub struct _libc_fpxreg {
-        pub significand: [u16; 4],
-        pub exponent: u16,
-        __private: [u16; 3],
-    }
-
-    pub struct _libc_xmmreg {
-        pub element: [u32; 4],
-    }
-
-    pub struct _libc_fpstate {
-        pub cwd: u16,
-        pub swd: u16,
-        pub ftw: u16,
-        pub fop: u16,
-        pub rip: u64,
-        pub rdp: u64,
-        pub mxcsr: u32,
-        pub mxcr_mask: u32,
-        pub _st: [_libc_fpxreg; 8],
-        pub _xmm: [_libc_xmmreg; 16],
-        __private: [u64; 12],
-    }
-
-    pub struct user_fpregs_struct {
-        pub cwd: ::c_ushort,
-        pub swd: ::c_ushort,
-        pub ftw: ::c_ushort,
-        pub fop: ::c_ushort,
-        pub rip: ::c_ulonglong,
-        pub rdp: ::c_ulonglong,
-        pub mxcsr: ::c_uint,
-        pub mxcr_mask: ::c_uint,
-        pub st_space: [::c_uint; 32],
-        pub xmm_space: [::c_uint; 64],
-        padding: [::c_uint; 24],
-    }
-
-    pub struct user_regs_struct {
-        pub r15: ::c_ulonglong,
-        pub r14: ::c_ulonglong,
-        pub r13: ::c_ulonglong,
-        pub r12: ::c_ulonglong,
-        pub rbp: ::c_ulonglong,
-        pub rbx: ::c_ulonglong,
-        pub r11: ::c_ulonglong,
-        pub r10: ::c_ulonglong,
-        pub r9: ::c_ulonglong,
-        pub r8: ::c_ulonglong,
-        pub rax: ::c_ulonglong,
-        pub rcx: ::c_ulonglong,
-        pub rdx: ::c_ulonglong,
-        pub rsi: ::c_ulonglong,
-        pub rdi: ::c_ulonglong,
-        pub orig_rax: ::c_ulonglong,
-        pub rip: ::c_ulonglong,
-        pub cs: ::c_ulonglong,
-        pub eflags: ::c_ulonglong,
-        pub rsp: ::c_ulonglong,
-        pub ss: ::c_ulonglong,
-        pub fs_base: ::c_ulonglong,
-        pub gs_base: ::c_ulonglong,
-        pub ds: ::c_ulonglong,
-        pub es: ::c_ulonglong,
-        pub fs: ::c_ulonglong,
-        pub gs: ::c_ulonglong,
-    }
-
-    pub struct user {
-        pub regs: user_regs_struct,
-        pub u_fpvalid: ::c_int,
-        pub i387: user_fpregs_struct,
-        pub u_tsize: ::c_ulonglong,
-        pub u_dsize: ::c_ulonglong,
-        pub u_ssize: ::c_ulonglong,
-        pub start_code: ::c_ulonglong,
-        pub start_stack: ::c_ulonglong,
-        pub signal: ::c_longlong,
-        __reserved: ::c_int,
-        pub u_ar0: *mut user_regs_struct,
-        pub u_fpstate: *mut user_fpregs_struct,
-        pub magic: ::c_ulonglong,
-        pub u_comm: [::c_char; 32],
-        pub u_debugreg: [::c_ulonglong; 8],
-    }
-
-    pub struct mcontext_t {
-        pub gregs: [greg_t; 23],
-        pub fpregs: *mut _libc_fpstate,
-        __private: [u64; 8],
-    }
-
-    pub struct ucontext_t {
-        pub uc_flags: ::c_ulong,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: ::stack_t,
-        pub uc_mcontext: mcontext_t,
-        pub uc_sigmask: ::sigset_t,
-        __private: [u8; 512],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_ushort,
-        __pad1: ::c_ushort,
-        pub __seq: ::c_ushort,
-        __pad2: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-}
-
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
-
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 6;
-
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-pub const O_FSYNC: ::c_int = 0x101000;
-
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-
-pub const EDEADLK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EBADMSG: ::c_int = 74;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNRESET: ::c_int = 104;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ENOTCONN: ::c_int = 107;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const EHWPOISON: ::c_int = 133;
-pub const ERFKILL: ::c_int = 132;
-
-pub const SOL_SOCKET: ::c_int = 1;
-
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_SNDBUFFORCE: ::c_int = 32;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PASSCRED: ::c_int = 16;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_SNDTIMEO: ::c_int = 21;
-pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22;
-pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23;
-pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24;
-pub const SO_BINDTODEVICE: ::c_int = 25;
-pub const SO_ATTACH_FILTER: ::c_int = 26;
-pub const SO_DETACH_FILTER: ::c_int = 27;
-pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER;
-pub const SO_PEERNAME: ::c_int = 28;
-pub const SO_TIMESTAMP: ::c_int = 29;
-pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-pub const SO_PEERSEC: ::c_int = 31;
-pub const SO_PASSSEC: ::c_int = 34;
-pub const SO_TIMESTAMPNS: ::c_int = 35;
-pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS;
-pub const SO_MARK: ::c_int = 36;
-pub const SO_TIMESTAMPING: ::c_int = 37;
-pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING;
-pub const SO_PROTOCOL: ::c_int = 38;
-pub const SO_DOMAIN: ::c_int = 39;
-pub const SO_RXQ_OVFL: ::c_int = 40;
-pub const SO_WIFI_STATUS: ::c_int = 41;
-pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS;
-pub const SO_PEEK_OFF: ::c_int = 42;
-pub const SO_NOFCS: ::c_int = 43;
-pub const SO_LOCK_FILTER: ::c_int = 44;
-pub const SO_SELECT_ERR_QUEUE: ::c_int = 45;
-pub const SO_BUSY_POLL: ::c_int = 46;
-pub const SO_MAX_PACING_RATE: ::c_int = 47;
-pub const SO_BPF_EXTENSIONS: ::c_int = 48;
-pub const SO_INCOMING_CPU: ::c_int = 49;
-pub const SO_ATTACH_BPF: ::c_int = 50;
-pub const SO_DETACH_BPF: ::c_int = SO_DETACH_FILTER;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000004;
-pub const SA_NOCLDWAIT: ::c_int = 0x00000002;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const POLLWRNORM: ::c_short = 0x100;
-pub const POLLWRBAND: ::c_short = 0x200;
-
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-
-pub const PTRACE_DETACH: ::c_uint = 17;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x0800;
-
-pub const TIOCEXCL: ::c_ulong = 0x540C;
-pub const TIOCNXCL: ::c_ulong = 0x540D;
-pub const TIOCSCTTY: ::c_ulong = 0x540E;
-pub const TIOCSTI: ::c_ulong = 0x5412;
-pub const TIOCMGET: ::c_ulong = 0x5415;
-pub const TIOCMBIS: ::c_ulong = 0x5416;
-pub const TIOCMBIC: ::c_ulong = 0x5417;
-pub const TIOCMSET: ::c_ulong = 0x5418;
-pub const TIOCCONS: ::c_ulong = 0x541D;
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_32BIT: ::c_int = 0x0040;
-
-pub const EDEADLOCK: ::c_int = 35;
-
-pub const FIOCLEX: ::c_ulong = 0x5451;
-pub const FIONBIO: ::c_ulong = 0x5421;
-
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-pub const PTRACE_O_EXITKILL: ::c_uint = 1048576;
-pub const PTRACE_O_TRACECLONE: ::c_uint = 8;
-pub const PTRACE_O_TRACEEXEC: ::c_uint = 16;
-pub const PTRACE_O_TRACEEXIT: ::c_uint = 64;
-pub const PTRACE_O_TRACEFORK: ::c_uint = 2;
-pub const PTRACE_O_TRACESYSGOOD: ::c_uint = 1;
-pub const PTRACE_O_TRACEVFORK: ::c_uint = 4;
-pub const PTRACE_O_TRACEVFORKDONE: ::c_uint = 32;
-pub const PTRACE_O_TRACESECCOMP: ::c_uint = 128;
-pub const PTRACE_O_SUSPEND_SECCOMP: ::c_uint = 2097152;
-pub const PTRACE_PEEKSIGINFO_SHARED: ::c_uint = 1;
-
-pub const SYS_gettid: ::c_long = 186;
-pub const SYS_perf_event_open: ::c_long = 298;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-pub const TCGETS: ::c_ulong = 0x5401;
-pub const TCSETS: ::c_ulong = 0x5402;
-pub const TCSETSW: ::c_ulong = 0x5403;
-pub const TCSETSF: ::c_ulong = 0x5404;
-pub const TCGETA: ::c_ulong = 0x5405;
-pub const TCSETA: ::c_ulong = 0x5406;
-pub const TCSETAW: ::c_ulong = 0x5407;
-pub const TCSETAF: ::c_ulong = 0x5408;
-pub const TCSBRK: ::c_ulong = 0x5409;
-pub const TCXONC: ::c_ulong = 0x540A;
-pub const TCFLSH: ::c_ulong = 0x540B;
-pub const TIOCINQ: ::c_ulong = 0x541B;
-pub const TIOCGPGRP: ::c_ulong = 0x540F;
-pub const TIOCSPGRP: ::c_ulong = 0x5410;
-pub const TIOCOUTQ: ::c_ulong = 0x5411;
-pub const TIOCGWINSZ: ::c_ulong = 0x5413;
-pub const TIOCSWINSZ: ::c_ulong = 0x5414;
-pub const FIONREAD: ::c_ulong = 0x541B;
-
-extern {
-    pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int;
-    pub fn setcontext(ucp: *const ucontext_t) -> ::c_int;
-    pub fn makecontext(ucp: *mut ucontext_t,
-                       func:  extern fn (),
-                       argc: ::c_int, ...);
-    pub fn swapcontext(uocp: *mut ucontext_t,
-                       ucp: *const ucontext_t) -> ::c_int;
-    pub fn iopl(level: ::c_int) -> ::c_int;
-    pub fn ioperm(from: ::c_ulong, num: ::c_ulong,
-                  turn_on: ::c_int) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/other/mod.rs
+++ /dev/null
@@ -1,521 +0,0 @@
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type rlim_t = c_ulong;
-pub type __priority_which_t = ::c_uint;
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: ::sigevent,
-        __next_prio: *mut aiocb,
-        __abs_prio: ::c_int,
-        __policy: ::c_int,
-        __error_code: ::c_int,
-        __return_value: ::ssize_t,
-        pub aio_offset: off_t,
-        #[cfg(target_pointer_width = "32")]
-        __unused1: [::c_char; 4],
-        __glibc_reserved: [::c_char; 32]
-    }
-
-    pub struct __exit_status {
-        pub e_termination: ::c_short,
-        pub e_exit: ::c_short,
-    }
-
-    pub struct __timeval {
-        pub tv_sec: ::int32_t,
-        pub tv_usec: ::int32_t,
-    }
-
-    pub struct utmpx {
-        pub ut_type: ::c_short,
-        pub ut_pid: ::pid_t,
-        pub ut_line: [::c_char; __UT_LINESIZE],
-        pub ut_id: [::c_char; 4],
-
-        pub ut_user: [::c_char; __UT_NAMESIZE],
-        pub ut_host: [::c_char; __UT_HOSTSIZE],
-        pub ut_exit: __exit_status,
-
-        #[cfg(any(target_arch = "aarch64",
-                  target_arch = "sparc64",
-                  target_pointer_width = "32"))]
-        pub ut_session: ::c_long,
-        #[cfg(any(target_arch = "aarch64",
-                  target_arch = "sparc64",
-                  target_pointer_width = "32"))]
-        pub ut_tv: ::timeval,
-
-        #[cfg(not(any(target_arch = "aarch64",
-                      target_arch = "sparc64",
-                      target_pointer_width = "32")))]
-        pub ut_session: ::int32_t,
-        #[cfg(not(any(target_arch = "aarch64",
-                      target_arch = "sparc64",
-                      target_pointer_width = "32")))]
-        pub ut_tv: __timeval,
-
-        pub ut_addr_v6: [::int32_t; 4],
-        __glibc_reserved: [::c_char; 20],
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        #[cfg(target_arch = "sparc64")]
-        __reserved0: ::c_int,
-        pub sa_flags: ::c_int,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        pub _pad: [::c_int; 29],
-        _align: [usize; 0],
-    }
-
-    pub struct glob64_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut ::c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct ucred {
-        pub pid: ::pid_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-    }
-
-    pub struct statfs {
-        pub f_type: __fsword_t,
-        pub f_bsize: __fsword_t,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-
-        pub f_namelen: __fsword_t,
-        pub f_frsize: __fsword_t,
-        f_spare: [__fsword_t; 5],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        #[cfg(not(target_arch = "sparc64"))]
-        pub c_ispeed: ::speed_t,
-        #[cfg(not(target_arch = "sparc64"))]
-        pub c_ospeed: ::speed_t,
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-    }
-
-    // FIXME this is actually a union
-    pub struct sem_t {
-        #[cfg(target_pointer_width = "32")]
-        __size: [::c_char; 16],
-        #[cfg(target_pointer_width = "64")]
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-}
-
-pub const __UT_LINESIZE: usize = 32;
-pub const __UT_NAMESIZE: usize = 32;
-pub const __UT_HOSTSIZE: usize = 256;
-pub const EMPTY: ::c_short = 0;
-pub const RUN_LVL: ::c_short = 1;
-pub const BOOT_TIME: ::c_short = 2;
-pub const NEW_TIME: ::c_short = 3;
-pub const OLD_TIME: ::c_short = 4;
-pub const INIT_PROCESS: ::c_short = 5;
-pub const LOGIN_PROCESS: ::c_short = 6;
-pub const USER_PROCESS: ::c_short = 7;
-pub const DEAD_PROCESS: ::c_short = 8;
-pub const ACCOUNTING: ::c_short = 9;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-pub const RLIM_INFINITY: ::rlim_t = !0;
-pub const RLIMIT_RTTIME: ::c_int = 15;
-pub const RLIMIT_NLIMITS: ::c_int = 16;
-
-pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK;
-
-pub const SOL_RXRPC: ::c_int = 272;
-pub const SOL_PPPOL2TP: ::c_int = 273;
-pub const SOL_BLUETOOTH: ::c_int = 274;
-pub const SOL_PNPIPE: ::c_int = 275;
-pub const SOL_RDS: ::c_int = 276;
-pub const SOL_IUCV: ::c_int = 277;
-pub const SOL_CAIF: ::c_int = 278;
-pub const SOL_ALG: ::c_int = 279;
-pub const SOL_NFC: ::c_int = 280;
-
-pub const MSG_TRYHARD: ::c_int = 4;
-
-pub const LC_PAPER: ::c_int = 7;
-pub const LC_NAME: ::c_int = 8;
-pub const LC_ADDRESS: ::c_int = 9;
-pub const LC_TELEPHONE: ::c_int = 10;
-pub const LC_MEASUREMENT: ::c_int = 11;
-pub const LC_IDENTIFICATION: ::c_int = 12;
-pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER);
-pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME);
-pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS);
-pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE);
-pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT);
-pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION);
-pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK
-                               | ::LC_NUMERIC_MASK
-                               | ::LC_TIME_MASK
-                               | ::LC_COLLATE_MASK
-                               | ::LC_MONETARY_MASK
-                               | ::LC_MESSAGES_MASK
-                               | LC_PAPER_MASK
-                               | LC_NAME_MASK
-                               | LC_ADDRESS_MASK
-                               | LC_TELEPHONE_MASK
-                               | LC_MEASUREMENT_MASK
-                               | LC_IDENTIFICATION_MASK;
-
-pub const MAP_ANON: ::c_int = 0x0020;
-pub const MAP_ANONYMOUS: ::c_int = 0x0020;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15;
-pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16;
-pub const TCP_THIN_DUPACK: ::c_int = 17;
-pub const TCP_USER_TIMEOUT: ::c_int = 18;
-pub const TCP_REPAIR: ::c_int = 19;
-pub const TCP_REPAIR_QUEUE: ::c_int = 20;
-pub const TCP_QUEUE_SEQ: ::c_int = 21;
-pub const TCP_REPAIR_OPTIONS: ::c_int = 22;
-pub const TCP_FASTOPEN: ::c_int = 23;
-pub const TCP_TIMESTAMP: ::c_int = 24;
-
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-
-pub const SIGEV_THREAD_ID: ::c_int = 4;
-
-pub const POLLRDNORM: ::c_short = 0x040;
-pub const POLLRDBAND: ::c_short = 0x080;
-
-pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01;
-pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02;
-
-pub const BUFSIZ: ::c_uint = 8192;
-pub const TMP_MAX: ::c_uint = 238328;
-pub const FOPEN_MAX: ::c_uint = 16;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-pub const _SC_2_C_VERSION: ::c_int = 96;
-pub const O_ACCMODE: ::c_int = 3;
-pub const ST_RELATIME: ::c_ulong = 4096;
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5;
-pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff;
-pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245;
-pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45;
-pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53;
-pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849;
-pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6;
-pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660;
-pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6;
-pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f;
-pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f;
-pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468;
-pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478;
-pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44;
-pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c;
-pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969;
-pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1;
-pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0;
-pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f;
-pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973;
-pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b;
-pub const TMPFS_MAGIC: ::c_long = 0x01021994;
-pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2;
-
-pub const VEOF: usize = 4;
-
-pub const CPU_SETSIZE: ::c_int = 0x400;
-
-pub const QFMT_VFS_V1: ::c_int = 4;
-
-pub const PTRACE_TRACEME: ::c_uint = 0;
-pub const PTRACE_PEEKTEXT: ::c_uint = 1;
-pub const PTRACE_PEEKDATA: ::c_uint = 2;
-pub const PTRACE_PEEKUSER: ::c_uint = 3;
-pub const PTRACE_POKETEXT: ::c_uint = 4;
-pub const PTRACE_POKEDATA: ::c_uint = 5;
-pub const PTRACE_POKEUSER: ::c_uint = 6;
-pub const PTRACE_CONT: ::c_uint = 7;
-pub const PTRACE_KILL: ::c_uint = 8;
-pub const PTRACE_SINGLESTEP: ::c_uint = 9;
-pub const PTRACE_ATTACH: ::c_uint = 16;
-pub const PTRACE_SYSCALL: ::c_uint = 24;
-pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203;
-pub const PTRACE_GETREGSET: ::c_uint = 0x4204;
-pub const PTRACE_SETREGSET: ::c_uint = 0x4205;
-pub const PTRACE_SEIZE: ::c_uint = 0x4206;
-pub const PTRACE_INTERRUPT: ::c_uint = 0x4207;
-pub const PTRACE_LISTEN: ::c_uint = 0x4208;
-pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209;
-
-pub const MADV_DODUMP: ::c_int = 17;
-pub const MADV_DONTDUMP: ::c_int = 16;
-
-pub const EPOLLWAKEUP: ::c_int = 0x20000000;
-
-pub const MADV_HUGEPAGE: ::c_int = 14;
-pub const MADV_NOHUGEPAGE: ::c_int = 15;
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const SEEK_DATA: ::c_int = 3;
-pub const SEEK_HOLE: ::c_int = 4;
-
-pub const TCSANOW: ::c_int = 0;
-pub const TCSADRAIN: ::c_int = 1;
-pub const TCSAFLUSH: ::c_int = 2;
-
-pub const TIOCLINUX: ::c_ulong = 0x541C;
-pub const TIOCGSERIAL: ::c_ulong = 0x541E;
-
-pub const RTLD_DEEPBIND: ::c_int = 0x8;
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-pub const RTLD_NOLOAD: ::c_int = 0x4;
-
-pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead;
-pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793;
-pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278;
-pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448;
-pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216;
-
-pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567;
-pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123;
-pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF;
-pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000;
-pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC;
-pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
-pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
-pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
-
-pub const NETLINK_ROUTE: ::c_int = 0;
-pub const NETLINK_UNUSED: ::c_int = 1;
-pub const NETLINK_USERSOCK: ::c_int = 2;
-pub const NETLINK_FIREWALL: ::c_int = 3;
-pub const NETLINK_SOCK_DIAG: ::c_int = 4;
-pub const NETLINK_NFLOG: ::c_int = 5;
-pub const NETLINK_XFRM: ::c_int = 6;
-pub const NETLINK_SELINUX: ::c_int = 7;
-pub const NETLINK_ISCSI: ::c_int = 8;
-pub const NETLINK_AUDIT: ::c_int = 9;
-pub const NETLINK_FIB_LOOKUP: ::c_int = 10;
-pub const NETLINK_CONNECTOR: ::c_int = 11;
-pub const NETLINK_NETFILTER: ::c_int = 12;
-pub const NETLINK_IP6_FW: ::c_int = 13;
-pub const NETLINK_DNRTMSG: ::c_int = 14;
-pub const NETLINK_KOBJECT_UEVENT: ::c_int = 15;
-pub const NETLINK_GENERIC: ::c_int = 16;
-pub const NETLINK_SCSITRANSPORT: ::c_int = 18;
-pub const NETLINK_ECRYPTFS: ::c_int = 19;
-pub const NETLINK_RDMA: ::c_int = 20;
-pub const NETLINK_CRYPTO: ::c_int = 21;
-pub const NETLINK_INET_DIAG: ::c_int = NETLINK_SOCK_DIAG;
-
-pub const MAX_LINKS: ::c_int = 32;
-
-pub const NLM_F_REQUEST: ::c_int = 1;
-pub const NLM_F_MULTI: ::c_int = 2;
-pub const NLM_F_ACK: ::c_int = 4;
-pub const NLM_F_ECHO: ::c_int = 8;
-pub const NLM_F_DUMP_INTR: ::c_int = 16;
-pub const NLM_F_DUMP_FILTERED: ::c_int = 32;
-
-pub const NLM_F_ROOT: ::c_int = 0x100;
-pub const NLM_F_MATCH: ::c_int = 0x200;
-pub const NLM_F_ATOMIC: ::c_int = 0x400;
-pub const NLM_F_DUMP: ::c_int = NLM_F_ROOT | NLM_F_MATCH;
-
-pub const NLM_F_REPLACE: ::c_int = 0x100;
-pub const NLM_F_EXCL: ::c_int = 0x200;
-pub const NLM_F_CREATE: ::c_int = 0x400;
-pub const NLM_F_APPEND: ::c_int = 0x800;
-
-pub const NLMSG_NOOP: ::c_int = 0x1;
-pub const NLMSG_ERROR: ::c_int = 0x2;
-pub const NLMSG_DONE: ::c_int = 0x3;
-pub const NLMSG_OVERRUN: ::c_int = 0x4;
-pub const NLMSG_MIN_TYPE: ::c_int = 0x10;
-
-pub const NETLINK_ADD_MEMBERSHIP: ::c_int = 1;
-pub const NETLINK_DROP_MEMBERSHIP: ::c_int = 2;
-pub const NETLINK_PKTINFO: ::c_int = 3;
-pub const NETLINK_BROADCAST_ERROR: ::c_int = 4;
-pub const NETLINK_NO_ENOBUFS: ::c_int = 5;
-pub const NETLINK_RX_RING: ::c_int = 6;
-pub const NETLINK_TX_RING: ::c_int = 7;
-pub const NETLINK_LISTEN_ALL_NSID: ::c_int = 8;
-pub const NETLINK_LIST_MEMBERSHIPS: ::c_int = 9;
-pub const NETLINK_CAP_ACK: ::c_int = 10;
-
-pub const NLA_F_NESTED: ::c_int = 1 << 15;
-pub const NLA_F_NET_BYTEORDER: ::c_int = 1 << 14;
-pub const NLA_TYPE_MASK: ::c_int = !(NLA_F_NESTED | NLA_F_NET_BYTEORDER);
-
-cfg_if! {
-    if #[cfg(any(target_arch = "arm", target_arch = "x86",
-                 target_arch = "x86_64"))] {
-        pub const PTHREAD_STACK_MIN: ::size_t = 16384;
-    } else if #[cfg(target_arch = "sparc64")] {
-        pub const PTHREAD_STACK_MIN: ::size_t = 0x6000;
-    } else {
-        pub const PTHREAD_STACK_MIN: ::size_t = 131072;
-    }
-}
-
-extern {
-    pub fn utmpxname(file: *const ::c_char) -> ::c_int;
-    pub fn getutxent() -> *mut utmpx;
-    pub fn getutxid(ut: *const utmpx) -> *mut utmpx;
-    pub fn getutxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn pututxline(ut: *const utmpx) -> *mut utmpx;
-    pub fn setutxent();
-    pub fn endutxent();
-    pub fn getpt() -> ::c_int;
-}
-
-#[link(name = "util")]
-extern {
-    pub fn sysctl(name: *mut ::c_int,
-                  namelen: ::c_int,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-    pub fn backtrace(buf: *mut *mut ::c_void,
-                     sz: ::c_int) -> ::c_int;
-    pub fn glob64(pattern: *const ::c_char,
-                  flags: ::c_int,
-                  errfunc: ::dox::Option<extern fn(epath: *const ::c_char,
-                                                   errno: ::c_int)
-                                                   -> ::c_int>,
-                  pglob: *mut glob64_t) -> ::c_int;
-    pub fn globfree64(pglob: *mut glob64_t);
-    pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
-    pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::__priority_which_t, who: ::id_t,
-                                       prio: ::c_int) -> ::c_int;
-    pub fn pthread_getaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_setaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn sched_getcpu() -> ::c_int;
-}
-
-cfg_if! {
-    if #[cfg(any(target_arch = "x86",
-                 target_arch = "arm",
-                 target_arch = "powerpc"))] {
-        mod b32;
-        pub use self::b32::*;
-    } else if #[cfg(any(target_arch = "x86_64",
-                        target_arch = "aarch64",
-                        target_arch = "powerpc64",
-                        target_arch = "sparc64"))] {
-        mod b64;
-        pub use self::b64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/linux/s390x.rs
+++ /dev/null
@@ -1,738 +0,0 @@
-pub type blkcnt_t = i64;
-pub type blksize_t = i64;
-pub type c_char = u8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type fsblkcnt_t = u64;
-pub type fsfilcnt_t = u64;
-pub type ino_t = u64;
-pub type nlink_t = u64;
-pub type off_t = i64;
-pub type rlim_t = u64;
-pub type suseconds_t = i64;
-pub type time_t = i64;
-pub type wchar_t = i32;
-pub type greg_t = u64;
-pub type clock_t = i64;
-pub type __fsword_t = ::c_long;
-pub type __priority_which_t = ::c_uint;
-
-s! {
-    pub struct aiocb {
-        pub aio_fildes: ::c_int,
-        pub aio_lio_opcode: ::c_int,
-        pub aio_reqprio: ::c_int,
-        pub aio_buf: *mut ::c_void,
-        pub aio_nbytes: ::size_t,
-        pub aio_sigevent: ::sigevent,
-        __next_prio: *mut aiocb,
-        __abs_prio: ::c_int,
-        __policy: ::c_int,
-        __error_code: ::c_int,
-        __return_value: ::ssize_t,
-        pub aio_offset: off_t,
-        #[cfg(target_pointer_width = "32")]
-        __unused1: [::c_char; 4],
-        __glibc_reserved: [::c_char; 32]
-    }
-
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        st_pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        __glibc_reserved: [::c_long; 3],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        st_pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        __glibc_reserved: [::c_long; 3],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [::c_ulong; 7]
-    }
-
-    pub struct sigaction {
-        pub sa_sigaction: ::sighandler_t,
-        __glibc_reserved0: ::c_int,
-        pub sa_flags: ::c_int,
-        pub sa_restorer: ::dox::Option<extern fn()>,
-        pub sa_mask: sigset_t,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t,
-    }
-
-    pub struct sigset_t {
-        __size: [::c_ulong; 16],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_code: ::c_int,
-        _pad: ::c_int,
-        _pad2: [::c_long; 14],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::mode_t,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_uint,
-        pub f_bsize: ::c_uint,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: ::c_uint,
-        pub f_frsize: ::c_uint,
-        pub f_flags: ::c_uint,
-        f_spare: [::c_uint; 4],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-        pub c_ispeed: ::speed_t,
-        pub c_ospeed: ::speed_t,
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-
-    pub struct glob64_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut ::c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct ucred {
-        pub pid: ::pid_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_pid: ::pid_t,
-    }
-
-    // FIXME this is actually a union
-    pub struct sem_t {
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-
-    pub struct __psw_t {
-        pub mask: u64,
-        pub addr: u64,
-    }
-
-    // FIXME: This is actually a union.
-    pub struct fpreg_t {
-        pub d: ::c_double,
-        // f: ::c_float,
-    }
-
-    pub struct fpregset_t {
-        pub fpc: u32,
-        __pad: u32,
-        pub fprs: [fpreg_t; 16],
-    }
-
-    pub struct mcontext_t {
-        pub psw: __psw_t,
-        pub gregs: [u64; 16],
-        pub aregs: [u32; 16],
-        pub fpregs: fpregset_t,
-    }
-
-    pub struct ucontext_t {
-        pub uc_flags: ::c_ulong,
-        pub uc_link: *mut ucontext_t,
-        pub uc_stack: ::stack_t,
-        pub uc_mcontext: mcontext_t,
-        pub uc_sigmask: ::sigset_t,
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-}
-
-pub const CLONE_NEWCGROUP: ::c_int = 0x02000000;
-
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const POSIX_FADV_DONTNEED: ::c_int = 6;
-pub const POSIX_FADV_NOREUSE: ::c_int = 7;
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-
-pub const EADDRINUSE: ::c_int = 98;
-pub const EADDRNOTAVAIL: ::c_int = 99;
-pub const ECONNABORTED: ::c_int = 103;
-pub const ECONNREFUSED: ::c_int = 111;
-pub const ECONNRESET: ::c_int = 104;
-pub const EDEADLK: ::c_int = 35;
-pub const ENOSYS: ::c_int = 38;
-pub const ENOTCONN: ::c_int = 107;
-pub const ETIMEDOUT: ::c_int = 110;
-pub const FIOCLEX: ::c_ulong = 0x5451;
-pub const FIONBIO: ::c_ulong = 0x5421;
-pub const MAP_ANON: ::c_int = 0x20;
-pub const O_ACCMODE: ::c_int = 3;
-pub const O_APPEND: ::c_int = 1024;
-pub const O_CREAT: ::c_int = 64;
-pub const O_EXCL: ::c_int = 128;
-pub const O_NONBLOCK: ::c_int = 2048;
-pub const PTHREAD_STACK_MIN: ::size_t = 16384;
-pub const RLIM_INFINITY: ::rlim_t = 0xffffffffffffffff;
-pub const SA_NOCLDWAIT: ::c_int = 2;
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 4;
-pub const SIGBUS: ::c_int = 7;
-pub const SIGSTKSZ: ::size_t = 0x2000;
-pub const MINSIGSTKSZ: ::size_t = 2048;
-pub const SIG_SETMASK: ::c_int = 2;
-pub const SOCK_DGRAM: ::c_int = 2;
-pub const SOCK_STREAM: ::c_int = 1;
-pub const SOL_SOCKET: ::c_int = 1;
-pub const SO_BROADCAST: ::c_int = 6;
-pub const SO_ERROR: ::c_int = 4;
-pub const SO_RCVTIMEO: ::c_int = 20;
-pub const SO_REUSEADDR: ::c_int = 2;
-pub const SO_SNDTIMEO: ::c_int = 21;
-
-pub const RLIMIT_RSS: ::c_int = 5;
-pub const RLIMIT_NOFILE: ::c_int = 7;
-pub const RLIMIT_AS: ::c_int = 9;
-pub const RLIMIT_NPROC: ::c_int = 6;
-pub const RLIMIT_MEMLOCK: ::c_int = 8;
-pub const RLIMIT_RTTIME: ::c_int = 15;
-pub const RLIMIT_NLIMITS: ::c_int = 16;
-
-pub const O_NOCTTY: ::c_int = 256;
-pub const O_SYNC: ::c_int = 1052672;
-pub const O_RSYNC: ::c_int = 1052672;
-pub const O_DSYNC: ::c_int = 4096;
-pub const O_FSYNC: ::c_int = 0x101000;
-pub const O_DIRECT: ::c_int = 0x4000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-
-pub const SOCK_NONBLOCK: ::c_int = O_NONBLOCK;
-
-pub const LC_PAPER: ::c_int = 7;
-pub const LC_NAME: ::c_int = 8;
-pub const LC_ADDRESS: ::c_int = 9;
-pub const LC_TELEPHONE: ::c_int = 10;
-pub const LC_MEASUREMENT: ::c_int = 11;
-pub const LC_IDENTIFICATION: ::c_int = 12;
-pub const LC_PAPER_MASK: ::c_int = (1 << LC_PAPER);
-pub const LC_NAME_MASK: ::c_int = (1 << LC_NAME);
-pub const LC_ADDRESS_MASK: ::c_int = (1 << LC_ADDRESS);
-pub const LC_TELEPHONE_MASK: ::c_int = (1 << LC_TELEPHONE);
-pub const LC_MEASUREMENT_MASK: ::c_int = (1 << LC_MEASUREMENT);
-pub const LC_IDENTIFICATION_MASK: ::c_int = (1 << LC_IDENTIFICATION);
-pub const LC_ALL_MASK: ::c_int = ::LC_CTYPE_MASK
-                               | ::LC_NUMERIC_MASK
-                               | ::LC_TIME_MASK
-                               | ::LC_COLLATE_MASK
-                               | ::LC_MONETARY_MASK
-                               | ::LC_MESSAGES_MASK
-                               | LC_PAPER_MASK
-                               | LC_NAME_MASK
-                               | LC_ADDRESS_MASK
-                               | LC_TELEPHONE_MASK
-                               | LC_MEASUREMENT_MASK
-                               | LC_IDENTIFICATION_MASK;
-
-pub const MAP_ANONYMOUS: ::c_int = 0x0020;
-pub const MAP_GROWSDOWN: ::c_int = 0x0100;
-pub const MAP_DENYWRITE: ::c_int = 0x0800;
-pub const MAP_EXECUTABLE: ::c_int = 0x01000;
-pub const MAP_LOCKED: ::c_int = 0x02000;
-pub const MAP_NORESERVE: ::c_int = 0x04000;
-pub const MAP_POPULATE: ::c_int = 0x08000;
-pub const MAP_NONBLOCK: ::c_int = 0x010000;
-pub const MAP_STACK: ::c_int = 0x020000;
-
-pub const EDEADLOCK: ::c_int = 35;
-pub const ENAMETOOLONG: ::c_int = 36;
-pub const ENOLCK: ::c_int = 37;
-pub const ENOTEMPTY: ::c_int = 39;
-pub const ELOOP: ::c_int = 40;
-pub const ENOMSG: ::c_int = 42;
-pub const EIDRM: ::c_int = 43;
-pub const ECHRNG: ::c_int = 44;
-pub const EL2NSYNC: ::c_int = 45;
-pub const EL3HLT: ::c_int = 46;
-pub const EL3RST: ::c_int = 47;
-pub const ELNRNG: ::c_int = 48;
-pub const EUNATCH: ::c_int = 49;
-pub const ENOCSI: ::c_int = 50;
-pub const EL2HLT: ::c_int = 51;
-pub const EBADE: ::c_int = 52;
-pub const EBADR: ::c_int = 53;
-pub const EXFULL: ::c_int = 54;
-pub const ENOANO: ::c_int = 55;
-pub const EBADRQC: ::c_int = 56;
-pub const EBADSLT: ::c_int = 57;
-pub const EMULTIHOP: ::c_int = 72;
-pub const EOVERFLOW: ::c_int = 75;
-pub const ENOTUNIQ: ::c_int = 76;
-pub const EBADFD: ::c_int = 77;
-pub const EBADMSG: ::c_int = 74;
-pub const EREMCHG: ::c_int = 78;
-pub const ELIBACC: ::c_int = 79;
-pub const ELIBBAD: ::c_int = 80;
-pub const ELIBSCN: ::c_int = 81;
-pub const ELIBMAX: ::c_int = 82;
-pub const ELIBEXEC: ::c_int = 83;
-pub const EILSEQ: ::c_int = 84;
-pub const ERESTART: ::c_int = 85;
-pub const ESTRPIPE: ::c_int = 86;
-pub const EUSERS: ::c_int = 87;
-pub const ENOTSOCK: ::c_int = 88;
-pub const EDESTADDRREQ: ::c_int = 89;
-pub const EMSGSIZE: ::c_int = 90;
-pub const EPROTOTYPE: ::c_int = 91;
-pub const ENOPROTOOPT: ::c_int = 92;
-pub const EPROTONOSUPPORT: ::c_int = 93;
-pub const ESOCKTNOSUPPORT: ::c_int = 94;
-pub const EOPNOTSUPP: ::c_int = 95;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 96;
-pub const EAFNOSUPPORT: ::c_int = 97;
-pub const ENETDOWN: ::c_int = 100;
-pub const ENETUNREACH: ::c_int = 101;
-pub const ENETRESET: ::c_int = 102;
-pub const ENOBUFS: ::c_int = 105;
-pub const EISCONN: ::c_int = 106;
-pub const ESHUTDOWN: ::c_int = 108;
-pub const ETOOMANYREFS: ::c_int = 109;
-pub const EHOSTDOWN: ::c_int = 112;
-pub const EHOSTUNREACH: ::c_int = 113;
-pub const EALREADY: ::c_int = 114;
-pub const EINPROGRESS: ::c_int = 115;
-pub const ESTALE: ::c_int = 116;
-pub const EUCLEAN: ::c_int = 117;
-pub const ENOTNAM: ::c_int = 118;
-pub const ENAVAIL: ::c_int = 119;
-pub const EISNAM: ::c_int = 120;
-pub const EREMOTEIO: ::c_int = 121;
-pub const EDQUOT: ::c_int = 122;
-pub const ENOMEDIUM: ::c_int = 123;
-pub const EMEDIUMTYPE: ::c_int = 124;
-pub const ECANCELED: ::c_int = 125;
-pub const ENOKEY: ::c_int = 126;
-pub const EKEYEXPIRED: ::c_int = 127;
-pub const EKEYREVOKED: ::c_int = 128;
-pub const EKEYREJECTED: ::c_int = 129;
-pub const EOWNERDEAD: ::c_int = 130;
-pub const ENOTRECOVERABLE: ::c_int = 131;
-pub const EHWPOISON: ::c_int = 133;
-pub const ERFKILL: ::c_int = 132;
-
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SO_TYPE: ::c_int = 3;
-pub const SO_DONTROUTE: ::c_int = 5;
-pub const SO_SNDBUF: ::c_int = 7;
-pub const SO_RCVBUF: ::c_int = 8;
-pub const SO_KEEPALIVE: ::c_int = 9;
-pub const SO_OOBINLINE: ::c_int = 10;
-pub const SO_LINGER: ::c_int = 13;
-pub const SO_REUSEPORT: ::c_int = 15;
-pub const SO_PEERCRED: ::c_int = 17;
-pub const SO_RCVLOWAT: ::c_int = 18;
-pub const SO_SNDLOWAT: ::c_int = 19;
-pub const SO_ACCEPTCONN: ::c_int = 30;
-
-pub const TCP_COOKIE_TRANSACTIONS: ::c_int = 15;
-pub const TCP_THIN_LINEAR_TIMEOUTS: ::c_int = 16;
-pub const TCP_THIN_DUPACK: ::c_int = 17;
-pub const TCP_USER_TIMEOUT: ::c_int = 18;
-pub const TCP_REPAIR: ::c_int = 19;
-pub const TCP_REPAIR_QUEUE: ::c_int = 20;
-pub const TCP_QUEUE_SEQ: ::c_int = 21;
-pub const TCP_REPAIR_OPTIONS: ::c_int = 22;
-pub const TCP_FASTOPEN: ::c_int = 23;
-pub const TCP_TIMESTAMP: ::c_int = 24;
-
-pub const SIGCHLD: ::c_int = 17;
-pub const SIGUSR1: ::c_int = 10;
-pub const SIGUSR2: ::c_int = 12;
-pub const SIGCONT: ::c_int = 18;
-pub const SIGSTOP: ::c_int = 19;
-pub const SIGTSTP: ::c_int = 20;
-pub const SIGURG: ::c_int = 23;
-pub const SIGIO: ::c_int = 29;
-pub const SIGSYS: ::c_int = 31;
-pub const SIGSTKFLT: ::c_int = 16;
-pub const SIGUNUSED: ::c_int = 31;
-pub const SIGTTIN: ::c_int = 21;
-pub const SIGTTOU: ::c_int = 22;
-pub const SIGXCPU: ::c_int = 24;
-pub const SIGXFSZ: ::c_int = 25;
-pub const SIGVTALRM: ::c_int = 26;
-pub const SIGPROF: ::c_int = 27;
-pub const SIGWINCH: ::c_int = 28;
-pub const SIGPOLL: ::c_int = 29;
-pub const SIGPWR: ::c_int = 30;
-pub const SIG_BLOCK: ::c_int = 0x000000;
-pub const SIG_UNBLOCK: ::c_int = 0x01;
-
-pub const FALLOC_FL_KEEP_SIZE: ::c_int = 0x01;
-pub const FALLOC_FL_PUNCH_HOLE: ::c_int = 0x02;
-
-pub const BUFSIZ: ::c_uint = 8192;
-pub const TMP_MAX: ::c_uint = 238328;
-pub const FOPEN_MAX: ::c_uint = 16;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-pub const _SC_2_C_VERSION: ::c_int = 96;
-pub const O_ASYNC: ::c_int = 0x2000;
-pub const O_NDELAY: ::c_int = 0x800;
-pub const ST_RELATIME: ::c_ulong = 4096;
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const ADFS_SUPER_MAGIC: ::c_int = 0x0000adf5;
-pub const AFFS_SUPER_MAGIC: ::c_int = 0x0000adff;
-pub const CODA_SUPER_MAGIC: ::c_int = 0x73757245;
-pub const CRAMFS_MAGIC: ::c_int = 0x28cd3d45;
-pub const EFS_SUPER_MAGIC: ::c_int = 0x00414a53;
-pub const EXT2_SUPER_MAGIC: ::c_int = 0x0000ef53;
-pub const EXT3_SUPER_MAGIC: ::c_int = 0x0000ef53;
-pub const EXT4_SUPER_MAGIC: ::c_int = 0x0000ef53;
-pub const HPFS_SUPER_MAGIC: ::c_int = 0xf995e849;
-pub const HUGETLBFS_MAGIC: ::c_int = 0x958458f6;
-pub const ISOFS_SUPER_MAGIC: ::c_int = 0x00009660;
-pub const JFFS2_SUPER_MAGIC: ::c_int = 0x000072b6;
-pub const MINIX_SUPER_MAGIC: ::c_int = 0x0000137f;
-pub const MINIX_SUPER_MAGIC2: ::c_int = 0x0000138f;
-pub const MINIX2_SUPER_MAGIC: ::c_int = 0x00002468;
-pub const MINIX2_SUPER_MAGIC2: ::c_int = 0x00002478;
-pub const MSDOS_SUPER_MAGIC: ::c_int = 0x00004d44;
-pub const NCP_SUPER_MAGIC: ::c_int = 0x0000564c;
-pub const NFS_SUPER_MAGIC: ::c_int = 0x00006969;
-pub const OPENPROM_SUPER_MAGIC: ::c_int = 0x00009fa1;
-pub const PROC_SUPER_MAGIC: ::c_int = 0x00009fa0;
-pub const QNX4_SUPER_MAGIC: ::c_int = 0x0000002f;
-pub const REISERFS_SUPER_MAGIC: ::c_int = 0x52654973;
-pub const SMB_SUPER_MAGIC: ::c_int = 0x0000517b;
-pub const TMPFS_MAGIC: ::c_int = 0x01021994;
-pub const USBDEVICE_SUPER_MAGIC: ::c_int = 0x00009fa2;
-
-pub const VEOF: usize = 4;
-pub const VEOL: usize = 11;
-pub const VEOL2: usize = 16;
-pub const VMIN: usize = 6;
-pub const IEXTEN: ::tcflag_t = 0x00008000;
-pub const TOSTOP: ::tcflag_t = 0x00000100;
-pub const FLUSHO: ::tcflag_t = 0x00001000;
-
-pub const CPU_SETSIZE: ::c_int = 0x400;
-
-pub const EXTPROC: ::tcflag_t = 0x00010000;
-
-pub const QFMT_VFS_V1: ::c_int = 4;
-
-pub const PTRACE_TRACEME: ::c_uint = 0;
-pub const PTRACE_PEEKTEXT: ::c_uint = 1;
-pub const PTRACE_PEEKDATA: ::c_uint = 2;
-pub const PTRACE_PEEKUSER: ::c_uint = 3;
-pub const PTRACE_POKETEXT: ::c_uint = 4;
-pub const PTRACE_POKEDATA: ::c_uint = 5;
-pub const PTRACE_POKEUSER: ::c_uint = 6;
-pub const PTRACE_CONT: ::c_uint = 7;
-pub const PTRACE_KILL: ::c_uint = 8;
-pub const PTRACE_SINGLESTEP: ::c_uint = 9;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_ATTACH: ::c_uint = 16;
-pub const PTRACE_DETACH: ::c_uint = 17;
-pub const PTRACE_SYSCALL: ::c_uint = 24;
-pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203;
-pub const PTRACE_GETREGSET: ::c_uint = 0x4204;
-pub const PTRACE_SETREGSET: ::c_uint = 0x4205;
-pub const PTRACE_SEIZE: ::c_uint = 0x4206;
-pub const PTRACE_INTERRUPT: ::c_uint = 0x4207;
-pub const PTRACE_LISTEN: ::c_uint = 0x4208;
-pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209;
-
-pub const MADV_DODUMP: ::c_int = 17;
-pub const MADV_DONTDUMP: ::c_int = 16;
-
-pub const EPOLLWAKEUP: ::c_int = 0x20000000;
-
-pub const MADV_HUGEPAGE: ::c_int = 14;
-pub const MADV_NOHUGEPAGE: ::c_int = 15;
-pub const MAP_HUGETLB: ::c_int = 0x040000;
-
-pub const EFD_NONBLOCK: ::c_int = 0x800;
-
-pub const F_GETLK: ::c_int = 5;
-pub const F_GETOWN: ::c_int = 9;
-pub const F_SETOWN: ::c_int = 8;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SEEK_DATA: ::c_int = 3;
-pub const SEEK_HOLE: ::c_int = 4;
-
-pub const SFD_NONBLOCK: ::c_int = 0x0800;
-
-pub const TCSANOW: ::c_int = 0;
-pub const TCSADRAIN: ::c_int = 1;
-pub const TCSAFLUSH: ::c_int = 2;
-
-pub const TCGETS: ::c_ulong = 0x5401;
-pub const TCSETS: ::c_ulong = 0x5402;
-pub const TCSETSW: ::c_ulong = 0x5403;
-pub const TCSETSF: ::c_ulong = 0x5404;
-pub const TCGETA: ::c_ulong = 0x5405;
-pub const TCSETA: ::c_ulong = 0x5406;
-pub const TCSETAW: ::c_ulong = 0x5407;
-pub const TCSETAF: ::c_ulong = 0x5408;
-pub const TCSBRK: ::c_ulong = 0x5409;
-pub const TCXONC: ::c_ulong = 0x540A;
-pub const TCFLSH: ::c_ulong = 0x540B;
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5419;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x541A;
-pub const TIOCINQ: ::c_ulong = 0x541B;
-pub const TIOCLINUX: ::c_ulong = 0x541C;
-pub const TIOCGSERIAL: ::c_ulong = 0x541E;
-pub const TIOCEXCL: ::c_ulong = 0x540C;
-pub const TIOCNXCL: ::c_ulong = 0x540D;
-pub const TIOCSCTTY: ::c_ulong = 0x540E;
-pub const TIOCGPGRP: ::c_ulong = 0x540F;
-pub const TIOCSPGRP: ::c_ulong = 0x5410;
-pub const TIOCOUTQ: ::c_ulong = 0x5411;
-pub const TIOCSTI: ::c_ulong = 0x5412;
-pub const TIOCGWINSZ: ::c_ulong = 0x5413;
-pub const TIOCSWINSZ: ::c_ulong = 0x5414;
-pub const TIOCMGET: ::c_ulong = 0x5415;
-pub const TIOCMBIS: ::c_ulong = 0x5416;
-pub const TIOCMBIC: ::c_ulong = 0x5417;
-pub const TIOCMSET: ::c_ulong = 0x5418;
-pub const FIONREAD: ::c_ulong = 0x541B;
-pub const TIOCCONS: ::c_ulong = 0x541D;
-
-pub const RTLD_DEEPBIND: ::c_int = 0x8;
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-pub const RTLD_NOLOAD: ::c_int = 0x4;
-
-pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead;
-pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793;
-pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278;
-pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448;
-pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216;
-
-pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567;
-pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123;
-pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF;
-pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000;
-pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC;
-pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
-pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
-pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
-
-pub const SYS_gettid: ::c_long = 236;
-pub const SYS_perf_event_open: ::c_long = 331;
-
-#[link(name = "util")]
-extern {
-    pub fn sysctl(name: *mut ::c_int,
-                  namelen: ::c_int,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-    pub fn backtrace(buf: *mut *mut ::c_void,
-                     sz: ::c_int) -> ::c_int;
-    pub fn glob64(pattern: *const ::c_char,
-                  flags: ::c_int,
-                  errfunc: ::dox::Option<extern fn(epath: *const ::c_char,
-                                                   errno: ::c_int)
-                                                   -> ::c_int>,
-                  pglob: *mut glob64_t) -> ::c_int;
-    pub fn globfree64(pglob: *mut glob64_t);
-    pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
-    pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn getpriority(which: ::__priority_which_t, who: ::id_t) -> ::c_int;
-    pub fn setpriority(which: ::__priority_which_t, who: ::id_t,
-                                       prio: ::c_int) -> ::c_int;
-    pub fn pthread_getaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_setaffinity_np(thread: ::pthread_t,
-                                  cpusetsize: ::size_t,
-                                  cpuset: *const ::cpu_set_t) -> ::c_int;
-    pub fn sched_getcpu() -> ::c_int;
-    pub fn getcontext(ucp: *mut ucontext_t) -> ::c_int;
-    pub fn setcontext(ucp: *const ucontext_t) -> ::c_int;
-    pub fn makecontext(ucp: *mut ucontext_t,
-                       func:  extern fn (),
-                       argc: ::c_int, ...);
-    pub fn swapcontext(uocp: *mut ucontext_t,
-                       ucp: *const ucontext_t) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/notbsd/mod.rs
+++ /dev/null
@@ -1,1026 +0,0 @@
-use dox::mem;
-
-pub type sa_family_t = u16;
-pub type pthread_key_t = ::c_uint;
-pub type speed_t = ::c_uint;
-pub type tcflag_t = ::c_uint;
-pub type loff_t = ::c_longlong;
-pub type clockid_t = ::c_int;
-pub type key_t = ::c_int;
-pub type id_t = ::c_uint;
-
-pub enum timezone {}
-
-s! {
-    pub struct sockaddr {
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [u8; 8],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_family: sa_family_t,
-        pub sin6_port: ::in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-
-    pub struct sockaddr_un {
-        pub sun_family: sa_family_t,
-        pub sun_path: [::c_char; 108]
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_family: sa_family_t,
-        __ss_align: ::size_t,
-        #[cfg(target_pointer_width = "32")]
-        __ss_pad2: [u8; 128 - 2 * 4],
-        #[cfg(target_pointer_width = "64")]
-        __ss_pad2: [u8; 128 - 2 * 8],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: socklen_t,
-
-        #[cfg(any(target_os = "linux",
-                  target_os = "emscripten",
-                  target_os = "fuchsia"))]
-        pub ai_addr: *mut ::sockaddr,
-
-        pub ai_canonname: *mut c_char,
-
-        #[cfg(target_os = "android")]
-        pub ai_addr: *mut ::sockaddr,
-
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct sockaddr_nl {
-        pub nl_family: ::sa_family_t,
-        nl_pad: ::c_ushort,
-        pub nl_pid: u32,
-        pub nl_groups: u32
-    }
-
-    pub struct sockaddr_ll {
-        pub sll_family: ::c_ushort,
-        pub sll_protocol: ::c_ushort,
-        pub sll_ifindex: ::c_int,
-        pub sll_hatype: ::c_ushort,
-        pub sll_pkttype: ::c_uchar,
-        pub sll_halen: ::c_uchar,
-        pub sll_addr: [::c_uchar; 8]
-    }
-
-    pub struct fd_set {
-        fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE],
-    }
-
-    pub struct tm {
-        pub tm_sec: ::c_int,
-        pub tm_min: ::c_int,
-        pub tm_hour: ::c_int,
-        pub tm_mday: ::c_int,
-        pub tm_mon: ::c_int,
-        pub tm_year: ::c_int,
-        pub tm_wday: ::c_int,
-        pub tm_yday: ::c_int,
-        pub tm_isdst: ::c_int,
-        pub tm_gmtoff: ::c_long,
-        pub tm_zone: *const ::c_char,
-    }
-
-    pub struct sched_param {
-        pub sched_priority: ::c_int,
-        #[cfg(any(target_env = "musl"))]
-        pub sched_ss_low_priority: ::c_int,
-        #[cfg(any(target_env = "musl"))]
-        pub sched_ss_repl_period: ::timespec,
-        #[cfg(any(target_env = "musl"))]
-        pub sched_ss_init_budget: ::timespec,
-        #[cfg(any(target_env = "musl"))]
-        pub sched_ss_max_repl: ::c_int,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    #[cfg_attr(any(all(target_arch = "x86",
-                       not(target_env = "musl"),
-                       not(target_os = "android")),
-                   target_arch = "x86_64"),
-               repr(packed))]
-    pub struct epoll_event {
-        pub events: ::uint32_t,
-        pub u64: ::uint64_t,
-    }
-
-    pub struct utsname {
-        pub sysname: [::c_char; 65],
-        pub nodename: [::c_char; 65],
-        pub release: [::c_char; 65],
-        pub version: [::c_char; 65],
-        pub machine: [::c_char; 65],
-        pub domainname: [::c_char; 65]
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-
-    pub struct sigevent {
-        pub sigev_value: ::sigval,
-        pub sigev_signo: ::c_int,
-        pub sigev_notify: ::c_int,
-        // Actually a union.  We only expose sigev_notify_thread_id because it's
-        // the most useful member
-        pub sigev_notify_thread_id: ::c_int,
-        #[cfg(target_pointer_width = "64")]
-        __unused1: [::c_int; 11],
-        #[cfg(target_pointer_width = "32")]
-        __unused1: [::c_int; 12]
-    }
-}
-
-// intentionally not public, only used for fd_set
-cfg_if! {
-    if #[cfg(target_pointer_width = "32")] {
-        const ULONG_SIZE: usize = 32;
-    } else if #[cfg(target_pointer_width = "64")] {
-        const ULONG_SIZE: usize = 64;
-    } else {
-        // Unknown target_pointer_width
-    }
-}
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 2147483647;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 2;
-pub const _IOLBF: ::c_int = 1;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-
-// Linux-specific fcntls
-pub const F_SETLEASE: ::c_int = 1024;
-pub const F_GETLEASE: ::c_int = 1025;
-pub const F_NOTIFY: ::c_int = 1026;
-pub const F_DUPFD_CLOEXEC: ::c_int = 1030;
-pub const F_SETPIPE_SZ: ::c_int = 1031;
-pub const F_GETPIPE_SZ: ::c_int = 1032;
-
-// TODO(#235): Include file sealing fcntls once we have a way to verify them.
-
-pub const SIGTRAP: ::c_int = 5;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 1;
-
-pub const CLOCK_REALTIME: clockid_t = 0;
-pub const CLOCK_MONOTONIC: clockid_t = 1;
-pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2;
-pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3;
-pub const CLOCK_MONOTONIC_RAW: clockid_t = 4;
-pub const CLOCK_REALTIME_COARSE: clockid_t = 5;
-pub const CLOCK_MONOTONIC_COARSE: clockid_t = 6;
-pub const CLOCK_BOOTTIME: clockid_t = 7;
-pub const CLOCK_REALTIME_ALARM: clockid_t = 8;
-pub const CLOCK_BOOTTIME_ALARM: clockid_t = 9;
-// TODO(#247) Someday our Travis shall have glibc 2.21 (released in Sep
-// 2014.) See also musl/mod.rs
-// pub const CLOCK_SGI_CYCLE: clockid_t = 10;
-// pub const CLOCK_TAI: clockid_t = 11;
-pub const TIMER_ABSTIME: ::c_int = 1;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_LOCKS: ::c_int = 10;
-pub const RLIMIT_SIGPENDING: ::c_int = 11;
-pub const RLIMIT_MSGQUEUE: ::c_int = 12;
-pub const RLIMIT_NICE: ::c_int = 13;
-pub const RLIMIT_RTPRIO: ::c_int = 14;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY;
-
-pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC;
-
-pub const S_IFIFO: ::mode_t = 4096;
-pub const S_IFCHR: ::mode_t = 8192;
-pub const S_IFBLK: ::mode_t = 24576;
-pub const S_IFDIR: ::mode_t = 16384;
-pub const S_IFREG: ::mode_t = 32768;
-pub const S_IFLNK: ::mode_t = 40960;
-pub const S_IFSOCK: ::mode_t = 49152;
-pub const S_IFMT: ::mode_t = 61440;
-pub const S_IRWXU: ::mode_t = 448;
-pub const S_IXUSR: ::mode_t = 64;
-pub const S_IWUSR: ::mode_t = 128;
-pub const S_IRUSR: ::mode_t = 256;
-pub const S_IRWXG: ::mode_t = 56;
-pub const S_IXGRP: ::mode_t = 8;
-pub const S_IWGRP: ::mode_t = 16;
-pub const S_IRGRP: ::mode_t = 32;
-pub const S_IRWXO: ::mode_t = 7;
-pub const S_IXOTH: ::mode_t = 1;
-pub const S_IWOTH: ::mode_t = 2;
-pub const S_IROTH: ::mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const LC_CTYPE: ::c_int = 0;
-pub const LC_NUMERIC: ::c_int = 1;
-pub const LC_TIME: ::c_int = 2;
-pub const LC_COLLATE: ::c_int = 3;
-pub const LC_MONETARY: ::c_int = 4;
-pub const LC_MESSAGES: ::c_int = 5;
-pub const LC_ALL: ::c_int = 6;
-pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC);
-pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME);
-pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE);
-pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES);
-// LC_ALL_MASK defined per platform
-
-pub const MAP_FILE: ::c_int = 0x0000;
-pub const MAP_SHARED: ::c_int = 0x0001;
-pub const MAP_PRIVATE: ::c_int = 0x0002;
-pub const MAP_FIXED: ::c_int = 0x0010;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-// MS_ flags for msync(2)
-pub const MS_ASYNC: ::c_int = 0x0001;
-pub const MS_INVALIDATE: ::c_int = 0x0002;
-pub const MS_SYNC: ::c_int = 0x0004;
-
-// MS_ flags for mount(2)
-pub const MS_RDONLY: ::c_ulong = 0x01;
-pub const MS_NOSUID: ::c_ulong = 0x02;
-pub const MS_NODEV: ::c_ulong = 0x04;
-pub const MS_NOEXEC: ::c_ulong = 0x08;
-pub const MS_SYNCHRONOUS: ::c_ulong = 0x10;
-pub const MS_REMOUNT: ::c_ulong = 0x20;
-pub const MS_MANDLOCK: ::c_ulong = 0x40;
-pub const MS_DIRSYNC: ::c_ulong = 0x80;
-pub const MS_NOATIME: ::c_ulong = 0x0400;
-pub const MS_NODIRATIME: ::c_ulong = 0x0800;
-pub const MS_BIND: ::c_ulong = 0x1000;
-pub const MS_MOVE: ::c_ulong = 0x2000;
-pub const MS_REC: ::c_ulong = 0x4000;
-pub const MS_SILENT: ::c_ulong = 0x8000;
-pub const MS_POSIXACL: ::c_ulong = 0x010000;
-pub const MS_UNBINDABLE: ::c_ulong = 0x020000;
-pub const MS_PRIVATE: ::c_ulong = 0x040000;
-pub const MS_SLAVE: ::c_ulong = 0x080000;
-pub const MS_SHARED: ::c_ulong = 0x100000;
-pub const MS_RELATIME: ::c_ulong = 0x200000;
-pub const MS_KERNMOUNT: ::c_ulong = 0x400000;
-pub const MS_I_VERSION: ::c_ulong = 0x800000;
-pub const MS_STRICTATIME: ::c_ulong = 0x1000000;
-pub const MS_ACTIVE: ::c_ulong = 0x40000000;
-pub const MS_NOUSER: ::c_ulong = 0x80000000;
-pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000;
-pub const MS_MGC_MSK: ::c_ulong = 0xffff0000;
-pub const MS_RMT_MASK: ::c_ulong = 0x800051;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EAGAIN: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const ENOTBLK: ::c_int = 15;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const ETXTBSY: ::c_int = 26;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const EWOULDBLOCK: ::c_int = EAGAIN;
-
-pub const SCM_RIGHTS: ::c_int = 0x01;
-pub const SCM_CREDENTIALS: ::c_int = 0x02;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-pub const PROT_GROWSDOWN: ::c_int = 0x1000000;
-pub const PROT_GROWSUP: ::c_int = 0x2000000;
-
-pub const MAP_TYPE: ::c_int = 0x000f;
-
-pub const MADV_NORMAL: ::c_int = 0;
-pub const MADV_RANDOM: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_WILLNEED: ::c_int = 3;
-pub const MADV_DONTNEED: ::c_int = 4;
-pub const MADV_REMOVE: ::c_int = 9;
-pub const MADV_DONTFORK: ::c_int = 10;
-pub const MADV_DOFORK: ::c_int = 11;
-pub const MADV_MERGEABLE: ::c_int = 12;
-pub const MADV_UNMERGEABLE: ::c_int = 13;
-pub const MADV_HWPOISON: ::c_int = 100;
-
-pub const IFF_UP: ::c_int = 0x1;
-pub const IFF_BROADCAST: ::c_int = 0x2;
-pub const IFF_DEBUG: ::c_int = 0x4;
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-pub const IFF_POINTOPOINT: ::c_int = 0x10;
-pub const IFF_NOTRAILERS: ::c_int = 0x20;
-pub const IFF_RUNNING: ::c_int = 0x40;
-pub const IFF_NOARP: ::c_int = 0x80;
-pub const IFF_PROMISC: ::c_int = 0x100;
-pub const IFF_ALLMULTI: ::c_int = 0x200;
-pub const IFF_MASTER: ::c_int = 0x400;
-pub const IFF_SLAVE: ::c_int = 0x800;
-pub const IFF_MULTICAST: ::c_int = 0x1000;
-pub const IFF_PORTSEL: ::c_int = 0x2000;
-pub const IFF_AUTOMEDIA: ::c_int = 0x4000;
-pub const IFF_DYNAMIC: ::c_int = 0x8000;
-
-pub const SOL_IP: ::c_int = 0;
-pub const SOL_TCP: ::c_int = 6;
-pub const SOL_IPV6: ::c_int = 41;
-pub const SOL_ICMPV6: ::c_int = 58;
-pub const SOL_RAW: ::c_int = 255;
-pub const SOL_DECNET: ::c_int = 261;
-pub const SOL_X25: ::c_int = 262;
-pub const SOL_PACKET: ::c_int = 263;
-pub const SOL_ATM: ::c_int = 264;
-pub const SOL_AAL: ::c_int = 265;
-pub const SOL_IRDA: ::c_int = 266;
-pub const SOL_NETBEUI: ::c_int = 267;
-pub const SOL_LLC: ::c_int = 268;
-pub const SOL_DCCP: ::c_int = 269;
-pub const SOL_NETLINK: ::c_int = 270;
-pub const SOL_TIPC: ::c_int = 271;
-
-pub const AF_UNSPEC: ::c_int = 0;
-pub const AF_UNIX: ::c_int = 1;
-pub const AF_LOCAL: ::c_int = 1;
-pub const AF_INET: ::c_int = 2;
-pub const AF_AX25: ::c_int = 3;
-pub const AF_IPX: ::c_int = 4;
-pub const AF_APPLETALK: ::c_int = 5;
-pub const AF_NETROM: ::c_int = 6;
-pub const AF_BRIDGE: ::c_int = 7;
-pub const AF_ATMPVC: ::c_int = 8;
-pub const AF_X25: ::c_int = 9;
-pub const AF_INET6: ::c_int = 10;
-pub const AF_ROSE: ::c_int = 11;
-pub const AF_DECnet: ::c_int = 12;
-pub const AF_NETBEUI: ::c_int = 13;
-pub const AF_SECURITY: ::c_int = 14;
-pub const AF_KEY: ::c_int = 15;
-pub const AF_NETLINK: ::c_int = 16;
-pub const AF_ROUTE: ::c_int = AF_NETLINK;
-pub const AF_PACKET: ::c_int = 17;
-pub const AF_ASH: ::c_int = 18;
-pub const AF_ECONET: ::c_int = 19;
-pub const AF_ATMSVC: ::c_int = 20;
-pub const AF_RDS: ::c_int = 21;
-pub const AF_SNA: ::c_int = 22;
-pub const AF_IRDA: ::c_int = 23;
-pub const AF_PPPOX: ::c_int = 24;
-pub const AF_WANPIPE: ::c_int = 25;
-pub const AF_LLC: ::c_int = 26;
-pub const AF_CAN: ::c_int = 29;
-pub const AF_TIPC: ::c_int = 30;
-pub const AF_BLUETOOTH: ::c_int = 31;
-pub const AF_IUCV: ::c_int = 32;
-pub const AF_RXRPC: ::c_int = 33;
-pub const AF_ISDN: ::c_int = 34;
-pub const AF_PHONET: ::c_int = 35;
-pub const AF_IEEE802154: ::c_int = 36;
-pub const AF_CAIF: ::c_int = 37;
-pub const AF_ALG: ::c_int = 38;
-
-pub const PF_UNSPEC: ::c_int = AF_UNSPEC;
-pub const PF_UNIX: ::c_int = AF_UNIX;
-pub const PF_LOCAL: ::c_int = AF_LOCAL;
-pub const PF_INET: ::c_int = AF_INET;
-pub const PF_AX25: ::c_int = AF_AX25;
-pub const PF_IPX: ::c_int = AF_IPX;
-pub const PF_APPLETALK: ::c_int = AF_APPLETALK;
-pub const PF_NETROM: ::c_int = AF_NETROM;
-pub const PF_BRIDGE: ::c_int = AF_BRIDGE;
-pub const PF_ATMPVC: ::c_int = AF_ATMPVC;
-pub const PF_X25: ::c_int = AF_X25;
-pub const PF_INET6: ::c_int = AF_INET6;
-pub const PF_ROSE: ::c_int = AF_ROSE;
-pub const PF_DECnet: ::c_int = AF_DECnet;
-pub const PF_NETBEUI: ::c_int = AF_NETBEUI;
-pub const PF_SECURITY: ::c_int = AF_SECURITY;
-pub const PF_KEY: ::c_int = AF_KEY;
-pub const PF_NETLINK: ::c_int = AF_NETLINK;
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_PACKET: ::c_int = AF_PACKET;
-pub const PF_ASH: ::c_int = AF_ASH;
-pub const PF_ECONET: ::c_int = AF_ECONET;
-pub const PF_ATMSVC: ::c_int = AF_ATMSVC;
-pub const PF_RDS: ::c_int = AF_RDS;
-pub const PF_SNA: ::c_int = AF_SNA;
-pub const PF_IRDA: ::c_int = AF_IRDA;
-pub const PF_PPPOX: ::c_int = AF_PPPOX;
-pub const PF_WANPIPE: ::c_int = AF_WANPIPE;
-pub const PF_LLC: ::c_int = AF_LLC;
-pub const PF_CAN: ::c_int = AF_CAN;
-pub const PF_TIPC: ::c_int = AF_TIPC;
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_IUCV: ::c_int = AF_IUCV;
-pub const PF_RXRPC: ::c_int = AF_RXRPC;
-pub const PF_ISDN: ::c_int = AF_ISDN;
-pub const PF_PHONET: ::c_int = AF_PHONET;
-pub const PF_IEEE802154: ::c_int = AF_IEEE802154;
-pub const PF_CAIF: ::c_int = AF_CAIF;
-pub const PF_ALG: ::c_int = AF_ALG;
-
-pub const SOMAXCONN: ::c_int = 128;
-
-pub const MSG_OOB: ::c_int = 1;
-pub const MSG_PEEK: ::c_int = 2;
-pub const MSG_DONTROUTE: ::c_int = 4;
-pub const MSG_CTRUNC: ::c_int = 8;
-pub const MSG_TRUNC: ::c_int = 0x20;
-pub const MSG_DONTWAIT: ::c_int = 0x40;
-pub const MSG_EOR: ::c_int = 0x80;
-pub const MSG_WAITALL: ::c_int = 0x100;
-pub const MSG_FIN: ::c_int = 0x200;
-pub const MSG_SYN: ::c_int = 0x400;
-pub const MSG_CONFIRM: ::c_int = 0x800;
-pub const MSG_RST: ::c_int = 0x1000;
-pub const MSG_ERRQUEUE: ::c_int = 0x2000;
-pub const MSG_NOSIGNAL: ::c_int = 0x4000;
-pub const MSG_MORE: ::c_int = 0x8000;
-pub const MSG_WAITFORONE: ::c_int = 0x10000;
-pub const MSG_FASTOPEN: ::c_int = 0x20000000;
-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000;
-
-pub const SOCK_RAW: ::c_int = 3;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 33;
-pub const IP_MULTICAST_LOOP: ::c_int = 34;
-pub const IP_TTL: ::c_int = 2;
-pub const IP_HDRINCL: ::c_int = 3;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
-pub const IP_TRANSPARENT: ::c_int = 19;
-pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20;
-pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21;
-
-pub const TCP_NODELAY: ::c_int = 1;
-pub const TCP_MAXSEG: ::c_int = 2;
-pub const TCP_CORK: ::c_int = 3;
-pub const TCP_KEEPIDLE: ::c_int = 4;
-pub const TCP_KEEPINTVL: ::c_int = 5;
-pub const TCP_KEEPCNT: ::c_int = 6;
-pub const TCP_SYNCNT: ::c_int = 7;
-pub const TCP_LINGER2: ::c_int = 8;
-pub const TCP_DEFER_ACCEPT: ::c_int = 9;
-pub const TCP_WINDOW_CLAMP: ::c_int = 10;
-pub const TCP_INFO: ::c_int = 11;
-pub const TCP_QUICKACK: ::c_int = 12;
-pub const TCP_CONGESTION: ::c_int = 13;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
-pub const IPV6_V6ONLY: ::c_int = 26;
-
-pub const SO_DEBUG: ::c_int = 1;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const SS_ONSTACK: ::c_int = 1;
-pub const SS_DISABLE: ::c_int = 2;
-
-pub const PATH_MAX: ::c_int = 4096;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const EPOLLIN: ::c_int = 0x1;
-pub const EPOLLPRI: ::c_int = 0x2;
-pub const EPOLLOUT: ::c_int = 0x4;
-pub const EPOLLRDNORM: ::c_int = 0x40;
-pub const EPOLLRDBAND: ::c_int = 0x80;
-pub const EPOLLWRNORM: ::c_int = 0x100;
-pub const EPOLLWRBAND: ::c_int = 0x200;
-pub const EPOLLMSG: ::c_int = 0x400;
-pub const EPOLLERR: ::c_int = 0x8;
-pub const EPOLLHUP: ::c_int = 0x10;
-pub const EPOLLET: ::c_int = 0x80000000;
-
-pub const EPOLL_CTL_ADD: ::c_int = 1;
-pub const EPOLL_CTL_MOD: ::c_int = 3;
-pub const EPOLL_CTL_DEL: ::c_int = 2;
-
-pub const MNT_DETACH: ::c_int = 0x2;
-pub const MNT_EXPIRE: ::c_int = 0x4;
-
-pub const Q_GETFMT: ::c_int = 0x800004;
-pub const Q_GETINFO: ::c_int = 0x800005;
-pub const Q_SETINFO: ::c_int = 0x800006;
-pub const QIF_BLIMITS: ::uint32_t = 1;
-pub const QIF_SPACE: ::uint32_t = 2;
-pub const QIF_ILIMITS: ::uint32_t = 4;
-pub const QIF_INODES: ::uint32_t = 8;
-pub const QIF_BTIME: ::uint32_t = 16;
-pub const QIF_ITIME: ::uint32_t = 32;
-pub const QIF_LIMITS: ::uint32_t = 5;
-pub const QIF_USAGE: ::uint32_t = 10;
-pub const QIF_TIMES: ::uint32_t = 48;
-pub const QIF_ALL: ::uint32_t = 63;
-
-pub const MNT_FORCE: ::c_int = 0x1;
-
-pub const Q_SYNC: ::c_int = 0x800001;
-pub const Q_QUOTAON: ::c_int = 0x800002;
-pub const Q_QUOTAOFF: ::c_int = 0x800003;
-pub const Q_GETQUOTA: ::c_int = 0x800007;
-pub const Q_SETQUOTA: ::c_int = 0x800008;
-
-pub const TCIOFF: ::c_int = 2;
-pub const TCION: ::c_int = 3;
-pub const TCOOFF: ::c_int = 0;
-pub const TCOON: ::c_int = 1;
-pub const TCIFLUSH: ::c_int = 0;
-pub const TCOFLUSH: ::c_int = 1;
-pub const TCIOFLUSH: ::c_int = 2;
-pub const NL0: ::c_int  = 0x00000000;
-pub const NL1: ::c_int  = 0x00000100;
-pub const TAB0: ::c_int = 0x00000000;
-pub const CR0: ::c_int  = 0x00000000;
-pub const FF0: ::c_int  = 0x00000000;
-pub const BS0: ::c_int  = 0x00000000;
-pub const VT0: ::c_int  = 0x00000000;
-pub const VERASE: usize = 2;
-pub const VKILL: usize = 3;
-pub const VINTR: usize = 0;
-pub const VQUIT: usize = 1;
-pub const VLNEXT: usize = 15;
-pub const IGNBRK: ::tcflag_t = 0x00000001;
-pub const BRKINT: ::tcflag_t = 0x00000002;
-pub const IGNPAR: ::tcflag_t = 0x00000004;
-pub const PARMRK: ::tcflag_t = 0x00000008;
-pub const INPCK: ::tcflag_t = 0x00000010;
-pub const ISTRIP: ::tcflag_t = 0x00000020;
-pub const INLCR: ::tcflag_t = 0x00000040;
-pub const IGNCR: ::tcflag_t = 0x00000080;
-pub const ICRNL: ::tcflag_t = 0x00000100;
-pub const IXANY: ::tcflag_t = 0x00000800;
-pub const IMAXBEL: ::tcflag_t = 0x00002000;
-pub const IUTF8: ::tcflag_t = 0x00004000;
-pub const OPOST: ::tcflag_t = 0x1;
-pub const CS5: ::tcflag_t = 0x00000000;
-pub const CRTSCTS: ::tcflag_t = 0x80000000;
-pub const ECHO: ::tcflag_t = 0x00000008;
-
-pub const CLONE_VM: ::c_int = 0x100;
-pub const CLONE_FS: ::c_int = 0x200;
-pub const CLONE_FILES: ::c_int = 0x400;
-pub const CLONE_SIGHAND: ::c_int = 0x800;
-pub const CLONE_PTRACE: ::c_int = 0x2000;
-pub const CLONE_VFORK: ::c_int = 0x4000;
-pub const CLONE_PARENT: ::c_int = 0x8000;
-pub const CLONE_THREAD: ::c_int = 0x10000;
-pub const CLONE_NEWNS: ::c_int = 0x20000;
-pub const CLONE_SYSVSEM: ::c_int = 0x40000;
-pub const CLONE_SETTLS: ::c_int = 0x80000;
-pub const CLONE_PARENT_SETTID: ::c_int = 0x100000;
-pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000;
-pub const CLONE_DETACHED: ::c_int = 0x400000;
-pub const CLONE_UNTRACED: ::c_int = 0x800000;
-pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000;
-pub const CLONE_NEWUTS: ::c_int = 0x04000000;
-pub const CLONE_NEWIPC: ::c_int = 0x08000000;
-pub const CLONE_NEWUSER: ::c_int = 0x10000000;
-pub const CLONE_NEWPID: ::c_int = 0x20000000;
-pub const CLONE_NEWNET: ::c_int = 0x40000000;
-pub const CLONE_IO: ::c_int = 0x80000000;
-
-pub const WNOHANG: ::c_int = 0x00000001;
-pub const WUNTRACED: ::c_int = 0x00000002;
-pub const WSTOPPED: ::c_int = WUNTRACED;
-pub const WEXITED: ::c_int = 0x00000004;
-pub const WCONTINUED: ::c_int = 0x00000008;
-pub const WNOWAIT: ::c_int = 0x01000000;
-
-pub const __WNOTHREAD: ::c_int = 0x20000000;
-pub const __WALL: ::c_int = 0x40000000;
-pub const __WCLONE: ::c_int = 0x80000000;
-
-pub const SPLICE_F_MOVE: ::c_uint = 0x01;
-pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02;
-pub const SPLICE_F_MORE: ::c_uint = 0x04;
-pub const SPLICE_F_GIFT: ::c_uint = 0x08;
-
-pub const RTLD_LOCAL: ::c_int = 0;
-
-pub const POSIX_FADV_NORMAL: ::c_int = 0;
-pub const POSIX_FADV_RANDOM: ::c_int = 1;
-pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_FADV_WILLNEED: ::c_int = 3;
-
-pub const AT_FDCWD: ::c_int = -100;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100;
-pub const AT_REMOVEDIR: ::c_int = 0x200;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400;
-pub const AT_NO_AUTOMOUNT: ::c_int = 0x800;
-pub const AT_EMPTY_PATH: ::c_int = 0x1000;
-
-pub const LOG_CRON: ::c_int = 9 << 3;
-pub const LOG_AUTHPRIV: ::c_int = 10 << 3;
-pub const LOG_FTP: ::c_int = 11 << 3;
-pub const LOG_PERROR: ::c_int = 0x20;
-
-pub const PIPE_BUF: usize = 4096;
-
-pub const SI_LOAD_SHIFT: ::c_uint = 16;
-
-pub const SIGEV_SIGNAL: ::c_int = 0;
-pub const SIGEV_NONE: ::c_int = 1;
-pub const SIGEV_THREAD: ::c_int = 2;
-
-pub const P_ALL: idtype_t = 0;
-pub const P_PID: idtype_t = 1;
-pub const P_PGID: idtype_t = 2;
-
-pub const UTIME_OMIT: c_long = 1073741822;
-pub const UTIME_NOW: c_long = 1073741823;
-
-f! {
-    pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] &= !(1 << (fd % size));
-        return
-    }
-
-    pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0
-    }
-
-    pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] |= 1 << (fd % size);
-        return
-    }
-
-    pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn WIFSTOPPED(status: ::c_int) -> bool {
-        (status & 0xff) == 0x7f
-    }
-
-    pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xff
-    }
-
-    pub fn WIFCONTINUED(status: ::c_int) -> bool {
-        status == 0xffff
-    }
-
-    pub fn WIFSIGNALED(status: ::c_int) -> bool {
-        ((status & 0x7f) + 1) as i8 >= 2
-    }
-
-    pub fn WTERMSIG(status: ::c_int) -> ::c_int {
-        status & 0x7f
-    }
-
-    pub fn WIFEXITED(status: ::c_int) -> bool {
-        (status & 0x7f) == 0
-    }
-
-    pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xff
-    }
-
-    pub fn WCOREDUMP(status: ::c_int) -> bool {
-        (status & 0x80) != 0
-    }
-}
-
-extern {
-    pub fn getpwnam_r(name: *const ::c_char,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn getpwuid_r(uid: ::uid_t,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn fdatasync(fd: ::c_int) -> ::c_int;
-    pub fn mincore(addr: *mut ::c_void, len: ::size_t,
-                   vec: *mut ::c_uchar) -> ::c_int;
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_nanosleep(clk_id: clockid_t,
-                           flags: ::c_int,
-                           rqtp: *const ::timespec,
-                           rmtp:  *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-    pub fn dirfd(dirp: *mut ::DIR) -> ::c_int;
-    pub fn settimeofday(tv: *const ::timeval, tz: *const ::timezone) -> ::c_int;
-
-    pub fn prctl(option: ::c_int, ...) -> ::c_int;
-    pub fn pthread_getattr_np(native: ::pthread_t,
-                              attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
-                                     guardsize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
-                                 stackaddr: *mut *mut ::c_void,
-                                 stacksize: *mut ::size_t) -> ::c_int;
-    pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
-    pub fn setgroups(ngroups: ::size_t,
-                     ptr: *const ::gid_t) -> ::c_int;
-    pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int;
-    pub fn sched_setscheduler(pid: ::pid_t,
-                              policy: ::c_int,
-                              param: *const sched_param) -> ::c_int;
-    pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int;
-    pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int;
-    pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int;
-    pub fn sched_setparam(pid: ::pid_t, param: *const sched_param) -> ::c_int;
-    pub fn sched_getparam(pid: ::pid_t, param: *mut sched_param) -> ::c_int;
-    pub fn sched_rr_get_interval(pid: ::pid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn epoll_create(size: ::c_int) -> ::c_int;
-    pub fn epoll_create1(flags: ::c_int) -> ::c_int;
-    pub fn epoll_ctl(epfd: ::c_int,
-                     op: ::c_int,
-                     fd: ::c_int,
-                     event: *mut epoll_event) -> ::c_int;
-    pub fn epoll_wait(epfd: ::c_int,
-                      events: *mut epoll_event,
-                      maxevents: ::c_int,
-                      timeout: ::c_int) -> ::c_int;
-    pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int;
-    pub fn mount(src: *const ::c_char,
-                 target: *const ::c_char,
-                 fstype: *const ::c_char,
-                 flags: ::c_ulong,
-                 data: *const ::c_void) -> ::c_int;
-    pub fn umount(target: *const ::c_char) -> ::c_int;
-    pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int;
-    pub fn clone(cb: extern fn(*mut ::c_void) -> ::c_int,
-                 child_stack: *mut ::c_void,
-                 flags: ::c_int,
-                 arg: *mut ::c_void, ...) -> ::c_int;
-    pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int;
-    pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int;
-    pub fn memrchr(cx: *const ::c_void,
-                   c: ::c_int,
-                   n: ::size_t) -> *mut ::c_void;
-    pub fn syscall(num: ::c_long, ...) -> ::c_long;
-    pub fn sendfile(out_fd: ::c_int,
-                    in_fd: ::c_int,
-                    offset: *mut off_t,
-                    count: ::size_t) -> ::ssize_t;
-    pub fn splice(fd_in: ::c_int,
-                  off_in: *mut ::loff_t,
-                  fd_out: ::c_int,
-                  off_out: *mut ::loff_t,
-                  len: ::size_t,
-                  flags: ::c_uint) -> ::ssize_t;
-    pub fn tee(fd_in: ::c_int,
-               fd_out: ::c_int,
-               len: ::size_t,
-               flags: ::c_uint) -> ::ssize_t;
-    pub fn vmsplice(fd: ::c_int,
-                    iov: *const ::iovec,
-                    nr_segs: ::size_t,
-                    flags: ::c_uint) -> ::ssize_t;
-
-    pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t,
-                         advise: ::c_int) -> ::c_int;
-    pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int;
-    pub fn utimensat(dirfd: ::c_int, path: *const ::c_char,
-                     times: *const ::timespec, flag: ::c_int) -> ::c_int;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t);
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int;
-    pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int;
-    pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int;
-    pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int;
-    pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t;
-    pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int;
-    pub fn mmap64(addr: *mut ::c_void,
-                  len: ::size_t,
-                  prot: ::c_int,
-                  flags: ::c_int,
-                  fd: ::c_int,
-                  offset: off64_t)
-                  -> *mut ::c_void;
-    pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int;
-    pub fn openat64(fd: ::c_int,
-                    path: *const c_char,
-                    oflag: ::c_int, ...) -> ::c_int;
-    pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t,
-                   offset: off64_t) -> ::ssize_t;
-    pub fn pwrite64(fd: ::c_int, buf: *const ::c_void, count: ::size_t,
-                    offset: off64_t) -> ::ssize_t;
-    pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64;
-    pub fn readdir64_r(dirp: *mut ::DIR, entry: *mut ::dirent64,
-                       result: *mut *mut ::dirent64) -> ::c_int;
-    pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int;
-    pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int;
-    pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int;
-    pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
-    pub fn sysinfo (info: *mut ::sysinfo) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-
-    pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
-                   mode: ::mode_t, dev: dev_t) -> ::c_int;
-    pub fn ppoll(fds: *mut ::pollfd,
-                 nfds: nfds_t,
-                 timeout: *const ::timespec,
-                 sigmask: *const sigset_t) -> ::c_int;
-    pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t,
-                                     clock_id: *mut clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t,
-                                       pshared: ::c_int) -> ::c_int;
-    pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t,
-                                       pshared: *mut ::c_int) -> ::c_int;
-    pub fn pthread_getschedparam(native: ::pthread_t,
-                                 policy: *mut ::c_int,
-                                 param: *mut ::sched_param) -> ::c_int;
-    pub fn pthread_setschedparam(native: ::pthread_t,
-                                 policy: ::c_int,
-                                 param: *const ::sched_param) -> ::c_int;
-    pub fn sched_getaffinity(pid: ::pid_t,
-                             cpusetsize: ::size_t,
-                             cpuset: *mut cpu_set_t) -> ::c_int;
-    pub fn sched_setaffinity(pid: ::pid_t,
-                             cpusetsize: ::size_t,
-                             cpuset: *const cpu_set_t) -> ::c_int;
-    pub fn unshare(flags: ::c_int) -> ::c_int;
-    pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int;
-    pub fn sem_timedwait(sem: *mut sem_t,
-                         abstime: *const ::timespec) -> ::c_int;
-    pub fn accept4(fd: ::c_int, addr: *mut ::sockaddr, len: *mut ::socklen_t,
-                   flg: ::c_int) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t,
-                                        pshared: ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t,
-                                        pshared: *mut ::c_int) -> ::c_int;
-    pub fn ptsname_r(fd: ::c_int,
-                     buf: *mut ::c_char,
-                     buflen: ::size_t) -> ::c_int;
-    pub fn clearenv() -> ::c_int;
-    pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-    pub fn sigsuspend(mask: *const ::sigset_t) -> ::c_int;
-    pub fn setreuid(ruid: ::uid_t, euid: ::uid_t) -> ::c_int;
-    pub fn setregid(rgid: ::gid_t, egid: ::gid_t) -> ::c_int;
-    pub fn getresuid(ruid: *mut ::uid_t, euid: *mut ::uid_t,
-                     suid: *mut ::uid_t) -> ::c_int;
-    pub fn getresgid(rgid: *mut ::gid_t, egid: *mut ::gid_t,
-                     sgid: *mut ::gid_t) -> ::c_int;
-    pub fn personality(persona: ::c_ulong) -> ::c_int;
-    pub fn swapon(path: *const ::c_char, swapflags: ::c_int) -> ::c_int;
-    pub fn swapoff(puath: *const ::c_char) -> ::c_int;
-    pub fn acct(filename: *const ::c_char) -> ::c_int;
-    pub fn brk(addr: *mut ::c_void) -> ::c_int;
-    pub fn sbrk(increment: ::intptr_t) -> *mut ::c_void;
-    pub fn vfork() -> ::pid_t;
-    pub fn wait4(pid: ::pid_t, status: *mut ::c_int, options: ::c_int,
-                 rusage: *mut ::rusage) -> ::pid_t;
-}
-
-cfg_if! {
-    if #[cfg(any(target_os = "linux",
-                 target_os = "emscripten",
-                 target_os = "fuchsia"))] {
-        mod linux;
-        pub use self::linux::*;
-    } else if #[cfg(target_os = "android")] {
-        mod android;
-        pub use self::android::*;
-    } else {
-        // Unknown target_os
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/solaris/mod.rs
+++ /dev/null
@@ -1,1194 +0,0 @@
-use dox::{mem, Option};
-
-pub type c_char = i8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-
-pub type clockid_t = ::c_int;
-pub type blkcnt_t = ::c_long;
-pub type clock_t = ::c_long;
-pub type daddr_t = ::c_long;
-pub type dev_t = ::c_ulong;
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type ino_t = ::c_ulong;
-pub type key_t = ::c_int;
-pub type major_t = ::c_uint;
-pub type minor_t = ::c_uint;
-pub type mode_t = ::c_uint;
-pub type nlink_t = ::c_uint;
-pub type rlim_t = ::c_ulong;
-pub type speed_t = ::c_uint;
-pub type tcflag_t = ::c_uint;
-pub type time_t = ::c_long;
-pub type wchar_t = ::c_int;
-pub type nfds_t = ::c_ulong;
-
-pub type suseconds_t = ::c_long;
-pub type off_t = ::c_long;
-pub type useconds_t = ::c_uint;
-pub type socklen_t = ::c_uint;
-pub type sa_family_t = u16;
-pub type pthread_t = ::c_uint;
-pub type pthread_key_t = ::c_uint;
-pub type blksize_t = ::c_int;
-pub type fflags_t = ::c_int;
-pub type nl_item = ::c_int;
-pub type id_t = ::c_int;
-pub type idtype_t = ::c_uint;
-
-pub enum timezone {}
-
-s! {
-    pub struct sockaddr {
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [::c_char; 8]
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_family: sa_family_t,
-        pub sin6_port: ::in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-        pub __sin6_src_id: u32
-    }
-
-    pub struct sockaddr_un {
-        pub sun_family: sa_family_t,
-        pub sun_path: [c_char; 108]
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_age: *mut ::c_char,
-        pub pw_comment: *mut ::c_char,
-        pub pw_gecos: *mut ::c_char,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char
-    }
-
-    pub struct ifaddrs {
-        pub ifa_next: *mut ifaddrs,
-        pub ifa_name: *mut ::c_char,
-        pub ifa_flags: ::c_ulong,
-        pub ifa_addr: *mut ::sockaddr,
-        pub ifa_netmask: *mut ::sockaddr,
-        pub ifa_dstaddr: *mut ::sockaddr,
-        pub ifa_data: *mut ::c_void
-    }
-
-    pub struct tm {
-        pub tm_sec: ::c_int,
-        pub tm_min: ::c_int,
-        pub tm_hour: ::c_int,
-        pub tm_mday: ::c_int,
-        pub tm_mon: ::c_int,
-        pub tm_year: ::c_int,
-        pub tm_wday: ::c_int,
-        pub tm_yday: ::c_int,
-        pub tm_isdst: ::c_int
-    }
-
-    pub struct utsname {
-        pub sysname: [::c_char; 257],
-        pub nodename: [::c_char; 257],
-        pub release: [::c_char; 257],
-        pub version: [::c_char; 257],
-        pub machine: [::c_char; 257],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::socklen_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct fd_set {
-        #[cfg(target_pointer_width = "64")]
-        fds_bits: [i64; FD_SETSIZE / 64],
-        #[cfg(target_pointer_width = "32")]
-        fds_bits: [i32; FD_SETSIZE / 32],
-    }
-
-    pub struct pthread_attr_t {
-        __pthread_attrp: *mut ::c_void
-    }
-
-    pub struct pthread_mutex_t {
-        __pthread_mutex_flag1: u16,
-        __pthread_mutex_flag2: u8,
-        __pthread_mutex_ceiling: u8,
-        __pthread_mutex_type: u16,
-        __pthread_mutex_magic: u16,
-        __pthread_mutex_lock: u64,
-        __pthread_mutex_data: u64
-    }
-
-    pub struct pthread_mutexattr_t {
-        __pthread_mutexattrp: *mut ::c_void
-    }
-
-    pub struct pthread_cond_t {
-        __pthread_cond_flag: [u8; 4],
-        __pthread_cond_type: u16,
-        __pthread_cond_magic: u16,
-        __pthread_cond_data: u64
-    }
-
-    pub struct pthread_condattr_t {
-        __pthread_condattrp: *mut ::c_void,
-    }
-
-    pub struct pthread_rwlock_t {
-        __pthread_rwlock_readers: i32,
-        __pthread_rwlock_type: u16,
-        __pthread_rwlock_magic: u16,
-        __pthread_rwlock_mutex: ::pthread_mutex_t,
-        __pthread_rwlock_readercv: ::pthread_cond_t,
-        __pthread_rwlock_writercv: ::pthread_cond_t
-    }
-
-    pub struct dirent {
-        pub d_ino: ::ino_t,
-        pub d_off: ::off_t,
-        pub d_reclen: u16,
-        pub d_name: [::c_char; 1]
-    }
-
-    pub struct glob_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv:  *mut *mut ::c_char,
-        pub gl_offs: ::size_t,
-        __unused1: *mut ::c_void,
-        __unused2: ::c_int,
-        __unused3: ::c_int,
-        __unused4: ::c_int,
-        __unused5: *mut ::c_void,
-        __unused6: *mut ::c_void,
-        __unused7: *mut ::c_void,
-        __unused8: *mut ::c_void,
-        __unused9: *mut ::c_void,
-        __unused10: *mut ::c_void,
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_family: ::sa_family_t,
-        __ss_pad1: [u8; 6],
-        __ss_align: i64,
-        __ss_pad2: [u8; 240],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: ::socklen_t,
-        pub ai_canonname: *mut ::c_char,
-        pub ai_addr: *mut ::sockaddr,
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct sigset_t {
-        bits: [u32; 4],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub si_pad: ::c_int,
-        pub si_addr: *mut ::c_void,
-        __pad: [u8; 232],
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_int,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        pub f_fsid: ::c_ulong,
-        pub f_basetype: [::c_char; 16],
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        pub f_fstr: [::c_char; 32]
-    }
-
-    pub struct sched_param {
-        pub sched_priority: ::c_int,
-        sched_pad: [::c_int; 8]
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        __unused: [::c_char; 16]
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_cc: [::cc_t; ::NCCS]
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-
-    pub struct sem_t {
-        pub sem_count: u32,
-        pub sem_type: u16,
-        pub sem_magic: u16,
-        pub sem_pad1: [u64; 3],
-        pub sem_pad2: [u64; 2]
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_sysid: ::c_int,
-        pub l_pid: ::pid_t,
-        pub l_pad: [::c_long; 4]
-    }
-
-    pub struct if_nameindex {
-        pub if_index: ::c_uint,
-        pub if_name: *mut ::c_char,
-    }
-
-    pub struct port_event {
-        pub portev_events: ::c_int,
-        pub portev_source: ::c_ushort,
-        pub portev_pad: ::c_ushort,
-        pub portev_object: ::uintptr_t,
-        pub portev_user: ::uintptr_t,
-    }
-}
-
-pub const LC_CTYPE: ::c_int = 0;
-pub const LC_NUMERIC: ::c_int = 1;
-pub const LC_TIME: ::c_int = 2;
-pub const LC_COLLATE: ::c_int = 3;
-pub const LC_MONETARY: ::c_int = 4;
-pub const LC_MESSAGES: ::c_int = 5;
-pub const LC_ALL: ::c_int = 6;
-pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC);
-pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME);
-pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE);
-pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES);
-pub const LC_ALL_MASK: ::c_int = LC_CTYPE_MASK
-                               | LC_NUMERIC_MASK
-                               | LC_TIME_MASK
-                               | LC_COLLATE_MASK
-                               | LC_MONETARY_MASK
-                               | LC_MESSAGES_MASK;
-
-pub const DAY_1: ::nl_item = 1;
-pub const DAY_2: ::nl_item = 2;
-pub const DAY_3: ::nl_item = 3;
-pub const DAY_4: ::nl_item = 4;
-pub const DAY_5: ::nl_item = 5;
-pub const DAY_6: ::nl_item = 6;
-pub const DAY_7: ::nl_item = 7;
-
-pub const ABDAY_1: ::nl_item = 8;
-pub const ABDAY_2: ::nl_item = 9;
-pub const ABDAY_3: ::nl_item = 10;
-pub const ABDAY_4: ::nl_item = 11;
-pub const ABDAY_5: ::nl_item = 12;
-pub const ABDAY_6: ::nl_item = 13;
-pub const ABDAY_7: ::nl_item = 14;
-
-pub const MON_1: ::nl_item = 15;
-pub const MON_2: ::nl_item = 16;
-pub const MON_3: ::nl_item = 17;
-pub const MON_4: ::nl_item = 18;
-pub const MON_5: ::nl_item = 19;
-pub const MON_6: ::nl_item = 20;
-pub const MON_7: ::nl_item = 21;
-pub const MON_8: ::nl_item = 22;
-pub const MON_9: ::nl_item = 23;
-pub const MON_10: ::nl_item = 24;
-pub const MON_11: ::nl_item = 25;
-pub const MON_12: ::nl_item = 26;
-
-pub const ABMON_1: ::nl_item = 27;
-pub const ABMON_2: ::nl_item = 28;
-pub const ABMON_3: ::nl_item = 29;
-pub const ABMON_4: ::nl_item = 30;
-pub const ABMON_5: ::nl_item = 31;
-pub const ABMON_6: ::nl_item = 32;
-pub const ABMON_7: ::nl_item = 33;
-pub const ABMON_8: ::nl_item = 34;
-pub const ABMON_9: ::nl_item = 35;
-pub const ABMON_10: ::nl_item = 36;
-pub const ABMON_11: ::nl_item = 37;
-pub const ABMON_12: ::nl_item = 38;
-
-pub const RADIXCHAR: ::nl_item = 39;
-pub const THOUSEP: ::nl_item = 40;
-pub const YESSTR: ::nl_item = 41;
-pub const NOSTR: ::nl_item = 42;
-pub const CRNCYSTR: ::nl_item = 43;
-
-pub const D_T_FMT: ::nl_item = 44;
-pub const D_FMT: ::nl_item = 45;
-pub const T_FMT: ::nl_item = 46;
-pub const AM_STR: ::nl_item = 47;
-pub const PM_STR: ::nl_item = 48;
-
-pub const CODESET: ::nl_item = 49;
-pub const T_FMT_AMPM: ::nl_item = 50;
-pub const ERA: ::nl_item = 51;
-pub const ERA_D_FMT: ::nl_item = 52;
-pub const ERA_D_T_FMT: ::nl_item = 53;
-pub const ERA_T_FMT: ::nl_item = 54;
-pub const ALT_DIGITS: ::nl_item = 55;
-pub const YESEXPR: ::nl_item = 56;
-pub const NOEXPR: ::nl_item = 57;
-pub const _DATE_FMT: ::nl_item = 58;
-pub const MAXSTRMSG: ::nl_item = 58;
-
-pub const PATH_MAX: ::c_int = 1024;
-
-pub const SA_ONSTACK: ::c_int = 0x00000001;
-pub const SA_RESETHAND: ::c_int = 0x00000002;
-pub const SA_RESTART: ::c_int = 0x00000004;
-pub const SA_SIGINFO: ::c_int = 0x00000008;
-pub const SA_NODEFER: ::c_int = 0x00000010;
-pub const SA_NOCLDWAIT: ::c_int = 0x00010000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00020000;
-
-pub const SS_ONSTACK: ::c_int = 1;
-pub const SS_DISABLE: ::c_int = 2;
-
-pub const FIOCLEX: ::c_int = 0x20006601;
-pub const FIONCLEX: ::c_int = 0x20006602;
-pub const FIONREAD: ::c_int = 0x4004667f;
-pub const FIONBIO: ::c_int = 0x8004667e;
-pub const FIOASYNC: ::c_int = 0x8004667d;
-pub const FIOSETOWN: ::c_int = 0x8004667c;
-pub const FIOGETOWN: ::c_int = 0x4004667b;
-
-pub const SIGCHLD: ::c_int = 18;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGINFO: ::c_int = 41;
-pub const SIG_BLOCK: ::c_int = 1;
-pub const SIG_UNBLOCK: ::c_int = 2;
-pub const SIG_SETMASK: ::c_int = 3;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 0x8;
-pub const IPV6_V6ONLY: ::c_int = 0x27;
-
-cfg_if! {
-    if #[cfg(target_pointer_width = "64")] {
-        pub const FD_SETSIZE: usize = 65536;
-    } else {
-        pub const FD_SETSIZE: usize = 1024;
-    }
-}
-
-pub const ST_RDONLY: ::c_ulong = 1;
-pub const ST_NOSUID: ::c_ulong = 2;
-
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 32767;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 4;
-pub const _IOLBF: ::c_int = 64;
-pub const BUFSIZ: ::c_uint = 1024;
-pub const FOPEN_MAX: ::c_uint = 20;
-pub const FILENAME_MAX: ::c_uint = 1024;
-pub const L_tmpnam: ::c_uint = 25;
-pub const TMP_MAX: ::c_uint = 17576;
-
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-pub const O_SEARCH: ::c_int = 0x200000;
-pub const O_EXEC: ::c_int = 0x400000;
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 256;
-pub const O_EXCL: ::c_int = 1024;
-pub const O_NOCTTY: ::c_int = 2048;
-pub const O_TRUNC: ::c_int = 512;
-pub const O_CLOEXEC: ::c_int = 0x800000;
-pub const O_ACCMODE: ::c_int = 0x600003;
-pub const S_IFIFO: mode_t = 4096;
-pub const S_IFCHR: mode_t = 8192;
-pub const S_IFBLK: mode_t = 24576;
-pub const S_IFDIR: mode_t = 16384;
-pub const S_IFREG: mode_t = 32768;
-pub const S_IFLNK: mode_t = 40960;
-pub const S_IFSOCK: mode_t = 49152;
-pub const S_IFMT: mode_t = 61440;
-pub const S_IEXEC: mode_t = 64;
-pub const S_IWRITE: mode_t = 128;
-pub const S_IREAD: mode_t = 256;
-pub const S_IRWXU: mode_t = 448;
-pub const S_IXUSR: mode_t = 64;
-pub const S_IWUSR: mode_t = 128;
-pub const S_IRUSR: mode_t = 256;
-pub const S_IRWXG: mode_t = 56;
-pub const S_IXGRP: mode_t = 8;
-pub const S_IWGRP: mode_t = 16;
-pub const S_IRGRP: mode_t = 32;
-pub const S_IRWXO: mode_t = 7;
-pub const S_IXOTH: mode_t = 1;
-pub const S_IWOTH: mode_t = 2;
-pub const S_IROTH: mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const F_LOCK: ::c_int = 1;
-pub const F_TEST: ::c_int = 3;
-pub const F_TLOCK: ::c_int = 2;
-pub const F_ULOCK: ::c_int = 0;
-pub const F_DUPFD_CLOEXEC: ::c_int = 37;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-pub const F_GETLK: ::c_int = 14;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGEMT: ::c_int = 7;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-pub const SIGUSR1: ::c_int = 16;
-pub const SIGUSR2: ::c_int = 17;
-pub const SIGPWR: ::c_int = 19;
-pub const SIGWINCH: ::c_int = 20;
-pub const SIGURG: ::c_int = 21;
-pub const SIGPOLL: ::c_int = 22;
-pub const SIGIO: ::c_int = SIGPOLL;
-pub const SIGSTOP: ::c_int = 23;
-pub const SIGTSTP: ::c_int = 24;
-pub const SIGCONT: ::c_int = 25;
-pub const SIGTTIN: ::c_int = 26;
-pub const SIGTTOU: ::c_int = 27;
-pub const SIGVTALRM: ::c_int = 28;
-pub const SIGPROF: ::c_int = 29;
-pub const SIGXCPU: ::c_int = 30;
-pub const SIGXFSZ: ::c_int = 31;
-
-pub const WNOHANG: ::c_int = 0x40;
-pub const WUNTRACED: ::c_int = 0x04;
-
-pub const WEXITED: ::c_int = 0x01;
-pub const WTRAPPED: ::c_int = 0x02;
-pub const WSTOPPED: ::c_int = WUNTRACED;
-pub const WCONTINUED: ::c_int = 0x08;
-pub const WNOWAIT: ::c_int = 0x80;
-
-// Solaris defines a great many more of these; we only expose the
-// standardized ones.
-pub const P_PID: idtype_t = 0;
-pub const P_PGID: idtype_t = 2;
-pub const P_ALL: idtype_t = 7;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const MAP_SHARED: ::c_int = 0x0001;
-pub const MAP_PRIVATE: ::c_int = 0x0002;
-pub const MAP_FIXED: ::c_int = 0x0010;
-pub const MAP_NORESERVE: ::c_int = 0x40;
-pub const MAP_ANON: ::c_int = 0x0100;
-pub const MAP_RENAME: ::c_int = 0x20;
-pub const MAP_ALIGN: ::c_int = 0x200;
-pub const MAP_TEXT: ::c_int = 0x400;
-pub const MAP_INITDATA: ::c_int = 0x800;
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const MS_SYNC: ::c_int = 0x0004;
-pub const MS_ASYNC: ::c_int = 0x0001;
-pub const MS_INVALIDATE: ::c_int = 0x0002;
-pub const MS_INVALCURPROC: ::c_int = 0x0008;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EAGAIN: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const ENOTBLK: ::c_int = 15;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const ETXTBSY: ::c_int = 26;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const ENOMSG: ::c_int = 35;
-pub const EIDRM: ::c_int = 36;
-pub const ECHRNG: ::c_int = 37;
-pub const EL2NSYNC: ::c_int = 38;
-pub const EL3HLT: ::c_int = 39;
-pub const EL3RST: ::c_int = 40;
-pub const ELNRNG: ::c_int = 41;
-pub const EUNATCH: ::c_int = 42;
-pub const ENOCSI: ::c_int = 43;
-pub const EL2HLT: ::c_int = 44;
-pub const EDEADLK: ::c_int = 45;
-pub const ENOLCK: ::c_int = 46;
-pub const ECANCELED: ::c_int = 47;
-pub const ENOTSUP: ::c_int = 48;
-pub const EDQUOT: ::c_int = 49;
-pub const EBADE: ::c_int = 50;
-pub const EBADR: ::c_int = 51;
-pub const EXFULL: ::c_int = 52;
-pub const ENOANO: ::c_int = 53;
-pub const EBADRQC: ::c_int = 54;
-pub const EBADSLT: ::c_int = 55;
-pub const EDEADLOCK: ::c_int = 56;
-pub const EBFONT: ::c_int = 57;
-pub const EOWNERDEAD: ::c_int = 58;
-pub const ENOTRECOVERABLE: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const ELOCKUNMAPPED: ::c_int = 72;
-pub const ENOTACTIVE: ::c_int = 73;
-pub const EMULTIHOP: ::c_int = 74;
-pub const EADI: ::c_int = 75;
-pub const EBADMSG: ::c_int = 77;
-pub const ENAMETOOLONG: ::c_int = 78;
-pub const EOVERFLOW: ::c_int = 79;
-pub const ENOTUNIQ: ::c_int = 80;
-pub const EBADFD: ::c_int = 81;
-pub const EREMCHG: ::c_int = 82;
-pub const ELIBACC: ::c_int = 83;
-pub const ELIBBAD: ::c_int = 84;
-pub const ELIBSCN: ::c_int = 85;
-pub const ELIBMAX: ::c_int = 86;
-pub const ELIBEXEC: ::c_int = 87;
-pub const EILSEQ: ::c_int = 88;
-pub const ENOSYS: ::c_int = 89;
-pub const ELOOP: ::c_int = 90;
-pub const ERESTART: ::c_int = 91;
-pub const ESTRPIPE: ::c_int = 92;
-pub const ENOTEMPTY: ::c_int = 93;
-pub const EUSERS: ::c_int = 94;
-pub const ENOTSOCK: ::c_int = 95;
-pub const EDESTADDRREQ: ::c_int = 96;
-pub const EMSGSIZE: ::c_int = 97;
-pub const EPROTOTYPE: ::c_int = 98;
-pub const ENOPROTOOPT: ::c_int = 99;
-pub const EPROTONOSUPPORT: ::c_int = 120;
-pub const ESOCKTNOSUPPORT: ::c_int = 121;
-pub const EOPNOTSUPP: ::c_int = 122;
-pub const EPFNOSUPPORT: ::c_int = 123;
-pub const EAFNOSUPPORT: ::c_int = 124;
-pub const EADDRINUSE: ::c_int = 125;
-pub const EADDRNOTAVAIL: ::c_int = 126;
-pub const ENETDOWN: ::c_int = 127;
-pub const ENETUNREACH: ::c_int = 128;
-pub const ENETRESET: ::c_int = 129;
-pub const ECONNABORTED: ::c_int = 130;
-pub const ECONNRESET: ::c_int = 131;
-pub const ENOBUFS: ::c_int = 132;
-pub const EISCONN: ::c_int = 133;
-pub const ENOTCONN: ::c_int = 134;
-pub const ESHUTDOWN: ::c_int = 143;
-pub const ETOOMANYREFS: ::c_int = 144;
-pub const ETIMEDOUT: ::c_int = 145;
-pub const ECONNREFUSED: ::c_int = 146;
-pub const EHOSTDOWN: ::c_int = 147;
-pub const EHOSTUNREACH: ::c_int = 148;
-pub const EWOULDBLOCK: ::c_int = EAGAIN;
-pub const EALREADY: ::c_int = 149;
-pub const EINPROGRESS: ::c_int = 150;
-
-pub const EAI_SYSTEM: ::c_int = 11;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-
-pub const SIGTRAP: ::c_int = 5;
-
-pub const GLOB_APPEND  : ::c_int = 32;
-pub const GLOB_DOOFFS  : ::c_int = 16;
-pub const GLOB_ERR     : ::c_int = 1;
-pub const GLOB_MARK    : ::c_int = 2;
-pub const GLOB_NOCHECK : ::c_int = 8;
-pub const GLOB_NOSORT  : ::c_int = 4;
-pub const GLOB_NOESCAPE: ::c_int = 64;
-
-pub const GLOB_NOSPACE : ::c_int = -2;
-pub const GLOB_ABORTED : ::c_int = -1;
-pub const GLOB_NOMATCH : ::c_int = -3;
-
-pub const POSIX_MADV_NORMAL: ::c_int = 0;
-pub const POSIX_MADV_RANDOM: ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_MADV_WILLNEED: ::c_int = 3;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-
-pub const _SC_IOV_MAX: ::c_int = 77;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 569;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 570;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 571;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 30;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 577;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 578;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 568;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 572;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 580;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 581;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 579;
-pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 582;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 583;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 573;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 574;
-pub const _SC_THREADS: ::c_int = 576;
-pub const _SC_TTY_NAME_MAX: ::c_int = 575;
-pub const _SC_ATEXIT_MAX: ::c_int = 76;
-pub const _SC_XOPEN_CRYPT: ::c_int = 62;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 63;
-pub const _SC_XOPEN_LEGACY: ::c_int = 717;
-pub const _SC_XOPEN_REALTIME: ::c_int = 718;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 719;
-pub const _SC_XOPEN_SHM: ::c_int = 64;
-pub const _SC_XOPEN_UNIX: ::c_int = 78;
-pub const _SC_XOPEN_VERSION: ::c_int = 12;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 67;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 0x40;
-pub const PTHREAD_PROCESS_SHARED: ::c_int = 1;
-pub const PTHREAD_PROCESS_PRIVATE: u16 = 0;
-pub const PTHREAD_STACK_MIN: ::size_t = 4096;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-
-// https://illumos.org/man/3c/clock_gettime
-// https://github.com/illumos/illumos-gate/
-//   blob/HEAD/usr/src/lib/libc/amd64/sys/__clock_gettime.s
-// clock_gettime(3c) doesn't seem to accept anything other than CLOCK_REALTIME
-// or __CLOCK_REALTIME0
-//
-// https://github.com/illumos/illumos-gate/
-//   blob/HEAD/usr/src/uts/common/sys/time_impl.h
-// Confusing! CLOCK_HIGHRES==CLOCK_MONOTONIC==4
-// __CLOCK_REALTIME0==0 is an obsoleted version of CLOCK_REALTIME==3
-pub const CLOCK_REALTIME: clockid_t = 3;
-pub const CLOCK_MONOTONIC: clockid_t = 4;
-pub const TIMER_RELTIME: ::c_int = 0;
-pub const TIMER_ABSTIME: ::c_int = 1;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_NOFILE: ::c_int = 5;
-pub const RLIMIT_VMEM: ::c_int = 6;
-pub const RLIMIT_AS: ::c_int = RLIMIT_VMEM;
-
-pub const RLIM_NLIMITS: rlim_t = 7;
-pub const RLIM_INFINITY: rlim_t = 0x7fffffff;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-pub const RUSAGE_CHILDREN: ::c_int = -1;
-
-pub const MADV_NORMAL: ::c_int = 0;
-pub const MADV_RANDOM: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_WILLNEED: ::c_int = 3;
-pub const MADV_DONTNEED: ::c_int = 4;
-pub const MADV_FREE: ::c_int = 5;
-
-pub const AF_INET: ::c_int = 2;
-pub const AF_INET6: ::c_int = 26;
-pub const AF_UNIX: ::c_int = 1;
-pub const SOCK_DGRAM: ::c_int = 1;
-pub const SOCK_STREAM: ::c_int = 2;
-pub const SOCK_RAW: ::c_int = 4;
-pub const SOCK_RDM: ::c_int = 5;
-pub const SOCK_SEQPACKET: ::c_int = 6;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 17;
-pub const IP_MULTICAST_LOOP: ::c_int = 18;
-pub const IP_TTL: ::c_int = 4;
-pub const IP_HDRINCL: ::c_int = 2;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 19;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 20;
-pub const IPV6_JOIN_GROUP: ::c_int = 9;
-pub const IPV6_LEAVE_GROUP: ::c_int = 10;
-
-pub const TCP_NODELAY: ::c_int = 1;
-pub const TCP_KEEPIDLE: ::c_int = 34;
-pub const SOL_SOCKET: ::c_int = 0xffff;
-pub const SO_DEBUG: ::c_int = 0x01;
-pub const SO_ACCEPTCONN: ::c_int = 0x0002;
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_USELOOPBACK: ::c_int = 0x0040;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_TYPE: ::c_int = 0x1008;
-
-pub const MSG_PEEK: ::c_int = 0x2;
-
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const F_RDLCK: ::c_short = 1;
-pub const F_WRLCK: ::c_short = 2;
-pub const F_UNLCK: ::c_short = 3;
-
-pub const O_SYNC: ::c_int = 16;
-pub const O_NONBLOCK: ::c_int = 128;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-pub const _SC_ARG_MAX: ::c_int = 1;
-pub const _SC_CHILD_MAX: ::c_int = 2;
-pub const _SC_CLK_TCK: ::c_int = 3;
-pub const _SC_NGROUPS_MAX: ::c_int = 4;
-pub const _SC_OPEN_MAX: ::c_int = 5;
-pub const _SC_JOB_CONTROL: ::c_int = 6;
-pub const _SC_SAVED_IDS: ::c_int = 7;
-pub const _SC_VERSION: ::c_int = 8;
-pub const _SC_PAGESIZE: ::c_int = 11;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 15;
-pub const _SC_STREAM_MAX: ::c_int = 16;
-pub const _SC_TZNAME_MAX: ::c_int = 17;
-pub const _SC_AIO_LISTIO_MAX: ::c_int = 18;
-pub const _SC_AIO_MAX: ::c_int = 19;
-pub const _SC_BC_BASE_MAX: ::c_int = 54;
-pub const _SC_BC_DIM_MAX: ::c_int = 55;
-pub const _SC_BC_SCALE_MAX: ::c_int = 56;
-pub const _SC_BC_STRING_MAX: ::c_int = 57;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 58;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 59;
-pub const _SC_LINE_MAX: ::c_int = 60;
-pub const _SC_RE_DUP_MAX: ::c_int = 61;
-pub const _SC_2_VERSION: ::c_int = 53;
-pub const _SC_2_C_BIND: ::c_int = 45;
-pub const _SC_2_C_DEV: ::c_int = 46;
-pub const _SC_2_CHAR_TERM: ::c_int = 66;
-pub const _SC_2_FORT_DEV: ::c_int = 48;
-pub const _SC_2_FORT_RUN: ::c_int = 49;
-pub const _SC_2_LOCALEDEF: ::c_int = 50;
-pub const _SC_2_SW_DEV: ::c_int = 51;
-pub const _SC_2_UPE: ::c_int = 52;
-pub const _SC_ASYNCHRONOUS_IO: ::c_int = 21;
-pub const _SC_MAPPED_FILES: ::c_int = 24;
-pub const _SC_MEMLOCK: ::c_int = 25;
-pub const _SC_MEMLOCK_RANGE: ::c_int = 26;
-pub const _SC_MEMORY_PROTECTION: ::c_int = 27;
-pub const _SC_MESSAGE_PASSING: ::c_int = 28;
-pub const _SC_PRIORITIZED_IO: ::c_int = 31;
-pub const _SC_PRIORITY_SCHEDULING: ::c_int = 32;
-pub const _SC_REALTIME_SIGNALS: ::c_int = 33;
-pub const _SC_SEMAPHORES: ::c_int = 35;
-pub const _SC_FSYNC: ::c_int = 23;
-pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 38;
-pub const _SC_SYNCHRONIZED_IO: ::c_int = 42;
-pub const _SC_TIMERS: ::c_int = 43;
-pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 20;
-pub const _SC_DELAYTIMER_MAX: ::c_int = 22;
-pub const _SC_MQ_OPEN_MAX: ::c_int = 29;
-pub const _SC_RTSIG_MAX: ::c_int = 34;
-pub const _SC_SEM_NSEMS_MAX: ::c_int = 36;
-pub const _SC_SEM_VALUE_MAX: ::c_int = 37;
-pub const _SC_SIGQUEUE_MAX: ::c_int = 39;
-pub const _SC_TIMER_MAX: ::c_int = 44;
-
-pub const _MUTEX_MAGIC: u16 = 0x4d58; // MX
-pub const _COND_MAGIC: u16 = 0x4356;  // CV
-pub const _RWL_MAGIC: u16 = 0x5257;   // RW
-
-pub const NCCS: usize = 19;
-
-pub const LOG_CRON: ::c_int = 15 << 3;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    __pthread_mutex_flag1: 0,
-    __pthread_mutex_flag2: 0,
-    __pthread_mutex_ceiling: 0,
-    __pthread_mutex_type: PTHREAD_PROCESS_PRIVATE,
-    __pthread_mutex_magic: _MUTEX_MAGIC,
-    __pthread_mutex_lock: 0,
-    __pthread_mutex_data: 0
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    __pthread_cond_flag: [0; 4],
-    __pthread_cond_type: PTHREAD_PROCESS_PRIVATE,
-    __pthread_cond_magic: _COND_MAGIC,
-    __pthread_cond_data: 0
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    __pthread_rwlock_readers: 0,
-    __pthread_rwlock_type: PTHREAD_PROCESS_PRIVATE,
-    __pthread_rwlock_magic: _RWL_MAGIC,
-    __pthread_rwlock_mutex: PTHREAD_MUTEX_INITIALIZER,
-    __pthread_rwlock_readercv: PTHREAD_COND_INITIALIZER,
-    __pthread_rwlock_writercv: PTHREAD_COND_INITIALIZER
-};
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 4;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-
-pub const RTLD_NEXT: *mut ::c_void = -1isize as *mut ::c_void;
-pub const RTLD_DEFAULT: *mut ::c_void = -2isize as *mut ::c_void;
-pub const RTLD_SELF: *mut ::c_void = -3isize as *mut ::c_void;
-pub const RTLD_PROBE: *mut ::c_void = -4isize as *mut ::c_void;
-
-pub const RTLD_NOW: ::c_int = 0x2;
-pub const RTLD_NOLOAD: ::c_int = 0x4;
-pub const RTLD_GLOBAL: ::c_int = 0x100;
-pub const RTLD_LOCAL: ::c_int = 0x0;
-pub const RTLD_PARENT: ::c_int = 0x200;
-pub const RTLD_GROUP: ::c_int = 0x400;
-pub const RTLD_WORLD: ::c_int = 0x800;
-pub const RTLD_NODELETE: ::c_int = 0x1000;
-pub const RTLD_FIRST: ::c_int = 0x2000;
-pub const RTLD_CONFGEN: ::c_int = 0x10000;
-
-pub const PORT_SOURCE_AIO: ::c_int = 1;
-pub const PORT_SOURCE_TIMER: ::c_int = 2;
-pub const PORT_SOURCE_USER: ::c_int = 3;
-pub const PORT_SOURCE_FD: ::c_int = 4;
-pub const PORT_SOURCE_ALERT: ::c_int = 5;
-pub const PORT_SOURCE_MQ: ::c_int = 6;
-pub const PORT_SOURCE_FILE: ::c_int = 7;
-pub const PORT_SOURCE_POSTWAIT: ::c_int = 8;
-pub const PORT_SOURCE_SIGNAL: ::c_int = 9;
-
-f! {
-    pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        (*set).fds_bits[fd / bits] &= !(1 << (fd % bits));
-        return
-    }
-
-    pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        return ((*set).fds_bits[fd / bits] & (1 << (fd % bits))) != 0
-    }
-
-    pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
-        let bits = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        let fd = fd as usize;
-        (*set).fds_bits[fd / bits] |= 1 << (fd % bits);
-        return
-    }
-
-    pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn WIFEXITED(status: ::c_int) -> bool {
-        (status & 0xFF) == 0
-    }
-
-    pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xFF
-    }
-
-    pub fn WTERMSIG(status: ::c_int) -> ::c_int {
-        status & 0x7F
-    }
-}
-
-extern {
-    pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int;
-    pub fn freeifaddrs(ifa: *mut ::ifaddrs);
-
-    pub fn stack_getbounds(sp: *mut ::stack_t) -> ::c_int;
-    pub fn mincore(addr: *const ::c_void, len: ::size_t,
-                   vec: *mut c_char) -> ::c_int;
-    pub fn setgroups(ngroups: ::c_int,
-                     ptr: *const ::gid_t) -> ::c_int;
-    pub fn ioctl(fildes: ::c_int, request: ::c_int, ...) -> ::c_int;
-    pub fn mprotect(addr: *const ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_nanosleep(clk_id: clockid_t,
-                           flags: ::c_int,
-                           rqtp: *const ::timespec,
-                           rmtp:  *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-    pub fn getnameinfo(sa: *const ::sockaddr,
-                       salen: ::socklen_t,
-                       host: *mut ::c_char,
-                       hostlen: ::socklen_t,
-                       serv: *mut ::c_char,
-                       sevlen: ::socklen_t,
-                       flags: ::c_int) -> ::c_int;
-    #[link_name = "__posix_getpwnam_r"]
-    pub fn getpwnam_r(name: *const ::c_char,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-
-    #[link_name = "__posix_getpwuid_r"]
-    pub fn getpwuid_r(uid: ::uid_t,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn setpwent();
-    pub fn getpwent() -> *mut passwd;
-    pub fn fdatasync(fd: ::c_int) -> ::c_int;
-    pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t);
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn getprogname() -> *const ::c_char;
-    pub fn setprogname(name: *const ::c_char);
-    pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int;
-    pub fn getpriority(which: ::c_int, who: ::c_int) -> ::c_int;
-    pub fn setpriority(which: ::c_int, who: ::c_int, prio: ::c_int) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-
-    pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
-                   mode: ::mode_t, dev: dev_t) -> ::c_int;
-    pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int;
-    pub fn if_nameindex() -> *mut if_nameindex;
-    pub fn if_freenameindex(ptr: *mut if_nameindex);
-    pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t,
-                                     clock_id: *mut clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn sem_timedwait(sem: *mut sem_t,
-                         abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-
-    pub fn glob(pattern: *const ::c_char,
-                flags: ::c_int,
-                errfunc: Option<extern fn(epath: *const ::c_char,
-                                          errno: ::c_int) -> ::c_int>,
-                pglob: *mut ::glob_t) -> ::c_int;
-
-    pub fn globfree(pglob: *mut ::glob_t);
-
-    pub fn posix_madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                         -> ::c_int;
-
-    pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
-
-    pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long);
-
-    pub fn telldir(dirp: *mut ::DIR) -> ::c_long;
-    pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                  -> ::c_int;
-
-    pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
-
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *mut ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int;
-    pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int;
-    pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char;
-
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::socklen_t) -> ::c_int;
-
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-
-    pub fn port_create() -> ::c_int;
-    pub fn port_associate(port: ::c_int, source: ::c_int, object: ::uintptr_t,
-                          events: ::c_int, user: ::uintptr_t) -> ::c_int;
-    pub fn port_dissociate(port: ::c_int, source: ::c_int, object: ::uintptr_t)
-                           -> ::c_int;
-    pub fn port_get(port: ::c_int, pe: *mut port_event,
-                    timeout: *const ::timespec) -> ::c_int;
-    pub fn port_getn(port: ::c_int, pe_list: *mut port_event, max: ::c_uint,
-                     nget: *mut ::c_uint, timeout: *const ::timespec)
-                     -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mips32.rs
+++ /dev/null
@@ -1,269 +0,0 @@
-pub type c_char = i8;
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type clock_t = i32;
-pub type time_t = i32;
-pub type suseconds_t = i32;
-pub type wchar_t = i32;
-pub type off_t = i32;
-pub type ino_t = u32;
-pub type blkcnt_t = i32;
-pub type blksize_t = i32;
-pub type nlink_t = u32;
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type rlim_t = c_ulong;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::dev_t,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        pub st_pad2: [::c_long; 1],
-        pub st_size: ::off_t,
-        st_pad3: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt_t,
-        st_pad5: [::c_long; 14],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::dev_t,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::dev_t,
-        st_pad2: [::c_long; 2],
-        pub st_size: ::off64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad3: ::c_long,
-        pub st_blocks: ::blkcnt64_t,
-        st_pad5: [::c_long; 14],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [u32; 9]
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_uint,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-        _restorer: *mut ::c_void,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sigset_t {
-        __val: [::c_ulong; 4],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        pub _pad: [::c_int; 29],
-    }
-
-    pub struct glob64_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut ::c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_uint,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved1: ::c_ulong,
-        pub msg_stime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved1: ::c_ulong,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved2: ::c_ulong,
-        pub msg_rtime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved2: ::c_ulong,
-        #[cfg(target_endian = "big")]
-        __glibc_reserved3: ::c_ulong,
-        pub msg_ctime: ::time_t,
-        #[cfg(target_endian = "little")]
-        __glibc_reserved3: ::c_ulong,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_long,
-        pub f_bsize: ::c_long,
-        pub f_frsize: ::c_long,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_files: ::fsblkcnt_t,
-        pub f_ffree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_fsid: ::fsid_t,
-
-        pub f_namelen: ::c_long,
-        f_spare: [::c_long; 6],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::c_int,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct flock {
-        pub l_type: ::c_short,
-        pub l_whence: ::c_short,
-        pub l_start: ::off_t,
-        pub l_len: ::off_t,
-        pub l_sysid: ::c_long,
-        pub l_pid: ::pid_t,
-        pad: [::c_long; 4],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 8],
-    }
-
-    // FIXME this is actually a union
-    pub struct sem_t {
-        #[cfg(target_pointer_width = "32")]
-        __size: [::c_char; 16],
-        #[cfg(target_pointer_width = "64")]
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-
-pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff;
-
-pub const SYS_gettid: ::c_long = 4222;   // Valid for O32
-
-#[link(name = "util")]
-extern {
-    pub fn sysctl(name: *mut ::c_int,
-                  namelen: ::c_int,
-                  oldp: *mut ::c_void,
-                  oldlenp: *mut ::size_t,
-                  newp: *mut ::c_void,
-                  newlen: ::size_t)
-                  -> ::c_int;
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-    pub fn backtrace(buf: *mut *mut ::c_void,
-                     sz: ::c_int) -> ::c_int;
-    pub fn glob64(pattern: *const ::c_char,
-                  flags: ::c_int,
-                  errfunc: ::dox::Option<extern fn(epath: *const ::c_char,
-                                                   errno: ::c_int)
-                                                   -> ::c_int>,
-                  pglob: *mut glob64_t) -> ::c_int;
-    pub fn globfree64(pglob: *mut glob64_t);
-    pub fn ptrace(request: ::c_uint, ...) -> ::c_long;
-    pub fn pthread_attr_getaffinity_np(attr: *const ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *mut ::cpu_set_t) -> ::c_int;
-    pub fn pthread_attr_setaffinity_np(attr: *mut ::pthread_attr_t,
-                                       cpusetsize: ::size_t,
-                                       cpuset: *const ::cpu_set_t) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mips64.rs
+++ /dev/null
@@ -1,209 +0,0 @@
-pub type blkcnt_t = i64;
-pub type blksize_t = i64;
-pub type c_char = i8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type ino_t = u64;
-pub type nlink_t = u64;
-pub type off_t = i64;
-pub type rlim_t = ::c_ulong;
-pub type suseconds_t = i64;
-pub type time_t = i64;
-pub type wchar_t = i32;
-
-s! {
-    pub struct stat {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        st_pad2: [::c_ulong; 1],
-        pub st_size: ::off_t,
-        st_pad3: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad4: ::c_long,
-        pub st_blocks: ::blkcnt_t,
-        st_pad5: [::c_long; 7],
-    }
-
-    pub struct stat64 {
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino64_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: ::c_ulong,
-        st_pad2: [::c_long; 2],
-        pub st_size: ::off64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad3: ::c_long,
-        pub st_blocks: ::blkcnt64_t,
-        st_pad5: [::c_long; 7],
-    }
-
-    pub struct pthread_attr_t {
-        __size: [::c_ulong; 7]
-    }
-
-    pub struct sigaction {
-        pub sa_flags: ::c_int,
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: sigset_t,
-        _restorer: *mut ::c_void,
-    }
-
-    pub struct stack_t {
-        pub ss_sp: *mut ::c_void,
-        pub ss_size: ::size_t,
-        pub ss_flags: ::c_int,
-    }
-
-    pub struct sigset_t {
-        __size: [::c_ulong; 16],
-    }
-
-    pub struct siginfo_t {
-        pub si_signo: ::c_int,
-        pub si_code: ::c_int,
-        pub si_errno: ::c_int,
-        _pad: ::c_int,
-        _pad2: [::c_long; 14],
-    }
-
-    pub struct ipc_perm {
-        pub __key: ::key_t,
-        pub uid: ::uid_t,
-        pub gid: ::gid_t,
-        pub cuid: ::uid_t,
-        pub cgid: ::gid_t,
-        pub mode: ::c_uint,
-        pub __seq: ::c_ushort,
-        __pad1: ::c_ushort,
-        __unused1: ::c_ulong,
-        __unused2: ::c_ulong
-    }
-
-    pub struct shmid_ds {
-        pub shm_perm: ::ipc_perm,
-        pub shm_segsz: ::size_t,
-        pub shm_atime: ::time_t,
-        pub shm_dtime: ::time_t,
-        pub shm_ctime: ::time_t,
-        pub shm_cpid: ::pid_t,
-        pub shm_lpid: ::pid_t,
-        pub shm_nattch: ::shmatt_t,
-        __unused4: ::c_ulong,
-        __unused5: ::c_ulong
-    }
-
-    pub struct msqid_ds {
-        pub msg_perm: ::ipc_perm,
-        pub msg_stime: ::time_t,
-        pub msg_rtime: ::time_t,
-        pub msg_ctime: ::time_t,
-        __msg_cbytes: ::c_ulong,
-        pub msg_qnum: ::msgqnum_t,
-        pub msg_qbytes: ::msglen_t,
-        pub msg_lspid: ::pid_t,
-        pub msg_lrpid: ::pid_t,
-        __glibc_reserved4: ::c_ulong,
-        __glibc_reserved5: ::c_ulong,
-    }
-
-    pub struct statfs {
-        pub f_type: ::c_long,
-        pub f_bsize: ::c_long,
-        pub f_frsize: ::c_long,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_files: ::fsblkcnt_t,
-        pub f_ffree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_fsid: ::fsid_t,
-
-        pub f_namelen: ::c_long,
-        f_spare: [::c_long; 6],
-    }
-
-    pub struct msghdr {
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct cmsghdr {
-        pub cmsg_len: ::size_t,
-        pub cmsg_level: ::c_int,
-        pub cmsg_type: ::c_int,
-    }
-
-    pub struct termios {
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct sysinfo {
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-
-    // FIXME this is actually a union
-    pub struct sem_t {
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-}
-
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-
-pub const RLIM_INFINITY: ::rlim_t = 0xffff_ffff_ffff_ffff;
-
-pub const SYS_gettid: ::c_long = 5178;   // Valid for n64
-
-#[link(name = "util")]
-extern {
-    pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/uclibc/mips/mod.rs
+++ /dev/null
@@ -1,476 +0,0 @@
-pub const SFD_CLOEXEC: ::c_int = 0x080000;
-
-pub const NCCS: usize = 32;
-
-pub const O_TRUNC: ::c_int = 512;
-
-pub const O_CLOEXEC: ::c_int = 0x80000;
-
-pub const EBFONT: ::c_int = 59;
-pub const ENOSTR: ::c_int = 60;
-pub const ENODATA: ::c_int = 61;
-pub const ETIME: ::c_int = 62;
-pub const ENOSR: ::c_int = 63;
-pub const ENONET: ::c_int = 64;
-pub const ENOPKG: ::c_int = 65;
-pub const EREMOTE: ::c_int = 66;
-pub const ENOLINK: ::c_int = 67;
-pub const EADV: ::c_int = 68;
-pub const ESRMNT: ::c_int = 69;
-pub const ECOMM: ::c_int = 70;
-pub const EPROTO: ::c_int = 71;
-pub const EDOTDOT: ::c_int = 73;
-
-pub const SA_NODEFER: ::c_int = 0x40000000;
-pub const SA_RESETHAND: ::c_int = 0x80000000;
-pub const SA_RESTART: ::c_int = 0x10000000;
-pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
-
-pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
-
-pub const EFD_CLOEXEC: ::c_int = 0x80000;
-
-pub const BUFSIZ: ::c_uint = 4096;
-pub const TMP_MAX: ::c_uint = 238328;
-pub const FOPEN_MAX: ::c_uint = 16;
-pub const POSIX_FADV_DONTNEED: ::c_int = 4;
-pub const POSIX_FADV_NOREUSE: ::c_int = 5;
-pub const POSIX_MADV_DONTNEED: ::c_int = 4;
-pub const _SC_2_C_VERSION: ::c_int = 96;
-pub const O_ACCMODE: ::c_int = 3;
-pub const O_DIRECT: ::c_int = 0x8000;
-pub const O_DIRECTORY: ::c_int = 0x10000;
-pub const O_NOFOLLOW: ::c_int = 0x20000;
-pub const ST_RELATIME: ::c_ulong = 4096;
-pub const NI_MAXHOST: ::socklen_t = 1025;
-
-pub const RLIMIT_NOFILE: ::c_int = 5;
-pub const RLIMIT_AS: ::c_int = 6;
-pub const RLIMIT_RSS: ::c_int = 7;
-pub const RLIMIT_NPROC: ::c_int = 8;
-pub const RLIMIT_MEMLOCK: ::c_int = 9;
-pub const RLIMIT_NLIMITS: ::c_int = 15;
-
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 256;
-pub const O_EXCL: ::c_int = 1024;
-pub const O_NOCTTY: ::c_int = 2048;
-pub const O_NONBLOCK: ::c_int = 128;
-pub const O_SYNC: ::c_int = 0x10;
-pub const O_RSYNC: ::c_int = 0x10;
-pub const O_DSYNC: ::c_int = 0x10;
-pub const O_FSYNC: ::c_int = 0x10;
-pub const O_ASYNC: ::c_int = 0x1000;
-pub const O_NDELAY: ::c_int = 0x80;
-
-pub const SOCK_NONBLOCK: ::c_int = 128;
-
-pub const EDEADLK: ::c_int = 45;
-pub const ENAMETOOLONG: ::c_int = 78;
-pub const ENOLCK: ::c_int = 46;
-pub const ENOSYS: ::c_int = 89;
-pub const ENOTEMPTY: ::c_int = 93;
-pub const ELOOP: ::c_int = 90;
-pub const ENOMSG: ::c_int = 35;
-pub const EIDRM: ::c_int = 36;
-pub const ECHRNG: ::c_int = 37;
-pub const EL2NSYNC: ::c_int = 38;
-pub const EL3HLT: ::c_int = 39;
-pub const EL3RST: ::c_int = 40;
-pub const ELNRNG: ::c_int = 41;
-pub const EUNATCH: ::c_int = 42;
-pub const ENOCSI: ::c_int = 43;
-pub const EL2HLT: ::c_int = 44;
-pub const EBADE: ::c_int = 50;
-pub const EBADR: ::c_int = 51;
-pub const EXFULL: ::c_int = 52;
-pub const ENOANO: ::c_int = 53;
-pub const EBADRQC: ::c_int = 54;
-pub const EBADSLT: ::c_int = 55;
-pub const EDEADLOCK: ::c_int = 56;
-pub const EMULTIHOP: ::c_int = 74;
-pub const EOVERFLOW: ::c_int = 79;
-pub const ENOTUNIQ: ::c_int = 80;
-pub const EBADFD: ::c_int = 81;
-pub const EBADMSG: ::c_int = 77;
-pub const EREMCHG: ::c_int = 82;
-pub const ELIBACC: ::c_int = 83;
-pub const ELIBBAD: ::c_int = 84;
-pub const ELIBSCN: ::c_int = 85;
-pub const ELIBMAX: ::c_int = 86;
-pub const ELIBEXEC: ::c_int = 87;
-pub const EILSEQ: ::c_int = 88;
-pub const ERESTART: ::c_int = 91;
-pub const ESTRPIPE: ::c_int = 92;
-pub const EUSERS: ::c_int = 94;
-pub const ENOTSOCK: ::c_int = 95;
-pub const EDESTADDRREQ: ::c_int = 96;
-pub const EMSGSIZE: ::c_int = 97;
-pub const EPROTOTYPE: ::c_int = 98;
-pub const ENOPROTOOPT: ::c_int = 99;
-pub const EPROTONOSUPPORT: ::c_int = 120;
-pub const ESOCKTNOSUPPORT: ::c_int = 121;
-pub const EOPNOTSUPP: ::c_int = 122;
-pub const ENOTSUP: ::c_int = EOPNOTSUPP;
-pub const EPFNOSUPPORT: ::c_int = 123;
-pub const EAFNOSUPPORT: ::c_int = 124;
-pub const EADDRINUSE: ::c_int = 125;
-pub const EADDRNOTAVAIL: ::c_int = 126;
-pub const ENETDOWN: ::c_int = 127;
-pub const ENETUNREACH: ::c_int = 128;
-pub const ENETRESET: ::c_int = 129;
-pub const ECONNABORTED: ::c_int = 130;
-pub const ECONNRESET: ::c_int = 131;
-pub const ENOBUFS: ::c_int = 132;
-pub const EISCONN: ::c_int = 133;
-pub const ENOTCONN: ::c_int = 134;
-pub const ESHUTDOWN: ::c_int = 143;
-pub const ETOOMANYREFS: ::c_int = 144;
-pub const ETIMEDOUT: ::c_int = 145;
-pub const ECONNREFUSED: ::c_int = 146;
-pub const EHOSTDOWN: ::c_int = 147;
-pub const EHOSTUNREACH: ::c_int = 148;
-pub const EALREADY: ::c_int = 149;
-pub const EINPROGRESS: ::c_int = 150;
-pub const ESTALE: ::c_int = 151;
-pub const EUCLEAN: ::c_int = 135;
-pub const ENOTNAM: ::c_int = 137;
-pub const ENAVAIL: ::c_int = 138;
-pub const EISNAM: ::c_int = 139;
-pub const EREMOTEIO: ::c_int = 140;
-pub const EDQUOT: ::c_int = 1133;
-pub const ENOMEDIUM: ::c_int = 159;
-pub const EMEDIUMTYPE: ::c_int = 160;
-pub const ECANCELED: ::c_int = 158;
-pub const ENOKEY: ::c_int = 161;
-pub const EKEYEXPIRED: ::c_int = 162;
-pub const EKEYREVOKED: ::c_int = 163;
-pub const EKEYREJECTED: ::c_int = 164;
-pub const EOWNERDEAD: ::c_int = 165;
-pub const ENOTRECOVERABLE: ::c_int = 166;
-pub const ERFKILL: ::c_int = 167;
-
-pub const MAP_NORESERVE: ::c_int = 0x400;
-pub const MAP_ANON: ::c_int = 0x800;
-pub const MAP_ANONYMOUS: ::c_int = 0x800;
-pub const MAP_GROWSDOWN: ::c_int = 0x1000;
-pub const MAP_DENYWRITE: ::c_int = 0x2000;
-pub const MAP_EXECUTABLE: ::c_int = 0x4000;
-pub const MAP_LOCKED: ::c_int = 0x8000;
-pub const MAP_POPULATE: ::c_int = 0x10000;
-pub const MAP_NONBLOCK: ::c_int = 0x20000;
-pub const MAP_STACK: ::c_int = 0x40000;
-
-pub const SOCK_STREAM: ::c_int = 2;
-pub const SOCK_DGRAM: ::c_int = 1;
-pub const SOCK_SEQPACKET: ::c_int = 5;
-
-pub const SOL_SOCKET: ::c_int = 0xffff;
-
-pub const SO_REUSEADDR: ::c_int = 0x0004;
-pub const SO_KEEPALIVE: ::c_int = 0x0008;
-pub const SO_DONTROUTE: ::c_int = 0x0010;
-pub const SO_BROADCAST: ::c_int = 0x0020;
-pub const SO_LINGER: ::c_int = 0x0080;
-pub const SO_OOBINLINE: ::c_int = 0x0100;
-pub const SO_REUSEPORT: ::c_int = 0x0200;
-pub const SO_TYPE: ::c_int = 0x1008;
-pub const SO_STYLE: ::c_int = SO_TYPE;
-pub const SO_ERROR: ::c_int = 0x1007;
-pub const SO_SNDBUF: ::c_int = 0x1001;
-pub const SO_RCVBUF: ::c_int = 0x1002;
-pub const SO_SNDLOWAT: ::c_int = 0x1003;
-pub const SO_RCVLOWAT: ::c_int = 0x1004;
-pub const SO_SNDTIMEO: ::c_int = 0x1005;
-pub const SO_RCVTIMEO: ::c_int = 0x1006;
-pub const SO_ACCEPTCONN: ::c_int = 0x1009;
-pub const SO_PROTOCOL: ::c_int = 0x1028;
-pub const SO_DOMAIN: ::c_int = 0x1029;
-pub const SO_NO_CHECK: ::c_int = 11;
-pub const SO_PRIORITY: ::c_int = 12;
-pub const SO_BSDCOMPAT: ::c_int = 14;
-pub const SO_PASSCRED: ::c_int = 17;
-pub const SO_PEERCRED: ::c_int = 18;
-pub const SO_SECURITY_AUTHENTICATION: ::c_int = 22;
-pub const SO_SECURITY_ENCRYPTION_TRANSPORT: ::c_int = 23;
-pub const SO_SECURITY_ENCRYPTION_NETWORK: ::c_int = 24;
-pub const SO_BINDTODEVICE: ::c_int = 25;
-pub const SO_ATTACH_FILTER: ::c_int = 26;
-pub const SO_DETACH_FILTER: ::c_int = 27;
-pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER;
-pub const SO_PEERNAME: ::c_int = 28;
-pub const SO_TIMESTAMP: ::c_int = 29;
-pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP;
-pub const SO_PEERSEC: ::c_int = 30;
-pub const SO_SNDBUFFORCE: ::c_int = 31;
-pub const SO_RCVBUFFORCE: ::c_int = 33;
-pub const SO_PASSSEC: ::c_int = 34;
-pub const SO_TIMESTAMPNS: ::c_int = 35;
-pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS;
-pub const SO_MARK: ::c_int = 36;
-pub const SO_TIMESTAMPING: ::c_int = 37;
-pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING;
-pub const SO_RXQ_OVFL: ::c_int = 40;
-pub const SO_WIFI_STATUS: ::c_int = 41;
-pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS;
-pub const SO_PEEK_OFF: ::c_int = 42;
-pub const SO_NOFCS: ::c_int = 43;
-pub const SO_LOCK_FILTER: ::c_int = 44;
-pub const SO_SELECT_ERR_QUEUE: ::c_int = 45;
-pub const SO_BUSY_POLL: ::c_int = 46;
-pub const SO_MAX_PACING_RATE: ::c_int = 47;
-pub const SO_BPF_EXTENSIONS: ::c_int = 48;
-
-pub const FIOCLEX: ::c_ulong = 0x6601;
-pub const FIONBIO: ::c_ulong = 0x667e;
-
-pub const SA_ONSTACK: ::c_int = 0x08000000;
-pub const SA_SIGINFO: ::c_int = 0x00000008;
-pub const SA_NOCLDWAIT: ::c_int = 0x00010000;
-
-pub const SIGCHLD: ::c_int = 18;
-pub const SIGBUS: ::c_int = 10;
-pub const SIGTTIN: ::c_int = 26;
-pub const SIGTTOU: ::c_int = 27;
-pub const SIGXCPU: ::c_int = 30;
-pub const SIGXFSZ: ::c_int = 31;
-pub const SIGVTALRM: ::c_int = 28;
-pub const SIGPROF: ::c_int = 29;
-pub const SIGWINCH: ::c_int = 20;
-pub const SIGUSR1: ::c_int = 16;
-pub const SIGUSR2: ::c_int = 17;
-pub const SIGCONT: ::c_int = 25;
-pub const SIGSTOP: ::c_int = 23;
-pub const SIGTSTP: ::c_int = 24;
-pub const SIGURG: ::c_int = 21;
-pub const SIGIO: ::c_int = 22;
-pub const SIGSYS: ::c_int = 12;
-pub const SIGPOLL: ::c_int = 22;
-pub const SIGPWR: ::c_int = 19;
-pub const SIG_SETMASK: ::c_int = 3;
-pub const SIG_BLOCK: ::c_int = 0x1;
-pub const SIG_UNBLOCK: ::c_int = 0x2;
-
-pub const POLLRDNORM: ::c_short = 0x040;
-pub const POLLWRNORM: ::c_short = 0x004;
-pub const POLLRDBAND: ::c_short = 0x080;
-pub const POLLWRBAND: ::c_short = 0x100;
-
-pub const PTHREAD_STACK_MIN: ::size_t = 16384;
-
-pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5;
-pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff;
-pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245;
-pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45;
-pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53;
-pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53;
-pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849;
-pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6;
-pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660;
-pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6;
-pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f;
-pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f;
-pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468;
-pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478;
-pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44;
-pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c;
-pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969;
-pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1;
-pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0;
-pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f;
-pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973;
-pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b;
-pub const TMPFS_MAGIC: ::c_long = 0x01021994;
-pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2;
-
-pub const VEOF: usize = 16;
-pub const VEOL: usize = 17;
-pub const VEOL2: usize = 6;
-pub const VMIN: usize = 4;
-pub const IEXTEN: ::tcflag_t = 0x00000100;
-pub const TOSTOP: ::tcflag_t = 0x00008000;
-pub const FLUSHO: ::tcflag_t = 0x00002000;
-pub const IUTF8: ::tcflag_t = 0x00004000;
-pub const TCSANOW: ::c_int = 0x540e;
-pub const TCSADRAIN: ::c_int = 0x540f;
-pub const TCSAFLUSH: ::c_int = 0x5410;
-
-pub const CPU_SETSIZE: ::c_int = 0x400;
-
-pub const PTRACE_TRACEME: ::c_uint = 0;
-pub const PTRACE_PEEKTEXT: ::c_uint = 1;
-pub const PTRACE_PEEKDATA: ::c_uint = 2;
-pub const PTRACE_PEEKUSER: ::c_uint = 3;
-pub const PTRACE_POKETEXT: ::c_uint = 4;
-pub const PTRACE_POKEDATA: ::c_uint = 5;
-pub const PTRACE_POKEUSER: ::c_uint = 6;
-pub const PTRACE_CONT: ::c_uint = 7;
-pub const PTRACE_KILL: ::c_uint = 8;
-pub const PTRACE_SINGLESTEP: ::c_uint = 9;
-pub const PTRACE_ATTACH: ::c_uint = 16;
-pub const PTRACE_DETACH: ::c_uint = 17;
-pub const PTRACE_SYSCALL: ::c_uint = 24;
-pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200;
-pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201;
-pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202;
-pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203;
-pub const PTRACE_GETFPREGS: ::c_uint = 14;
-pub const PTRACE_SETFPREGS: ::c_uint = 15;
-pub const PTRACE_GETFPXREGS: ::c_uint = 18;
-pub const PTRACE_SETFPXREGS: ::c_uint = 19;
-pub const PTRACE_GETREGS: ::c_uint = 12;
-pub const PTRACE_SETREGS: ::c_uint = 13;
-
-pub const EFD_NONBLOCK: ::c_int = 0x80;
-
-pub const F_GETLK: ::c_int = 14;
-pub const F_GETOWN: ::c_int = 23;
-pub const F_SETOWN: ::c_int = 24;
-pub const F_SETLK: ::c_int = 6;
-pub const F_SETLKW: ::c_int = 7;
-
-pub const SFD_NONBLOCK: ::c_int = 0x80;
-
-pub const TCGETS: ::c_ulong = 0x540d;
-pub const TCSETS: ::c_ulong = 0x540e;
-pub const TCSETSW: ::c_ulong = 0x540f;
-pub const TCSETSF: ::c_ulong = 0x5410;
-pub const TCGETA: ::c_ulong = 0x5401;
-pub const TCSETA: ::c_ulong = 0x5402;
-pub const TCSETAW: ::c_ulong = 0x5403;
-pub const TCSETAF: ::c_ulong = 0x5404;
-pub const TCSBRK: ::c_ulong = 0x5405;
-pub const TCXONC: ::c_ulong = 0x5406;
-pub const TCFLSH: ::c_ulong = 0x5407;
-pub const TIOCGSOFTCAR: ::c_ulong = 0x5481;
-pub const TIOCSSOFTCAR: ::c_ulong = 0x5482;
-pub const TIOCINQ: ::c_ulong = 0x467f;
-pub const TIOCLINUX: ::c_ulong = 0x5483;
-pub const TIOCGSERIAL: ::c_ulong = 0x5484;
-pub const TIOCEXCL: ::c_ulong = 0x740d;
-pub const TIOCNXCL: ::c_ulong = 0x740e;
-pub const TIOCSCTTY: ::c_ulong = 0x5480;
-pub const TIOCGPGRP: ::c_ulong = 0x40047477;
-pub const TIOCSPGRP: ::c_ulong = 0x80047476;
-pub const TIOCOUTQ: ::c_ulong = 0x7472;
-pub const TIOCSTI: ::c_ulong = 0x5472;
-pub const TIOCGWINSZ: ::c_ulong = 0x40087468;
-pub const TIOCSWINSZ: ::c_ulong = 0x80087467;
-pub const TIOCMGET: ::c_ulong = 0x741d;
-pub const TIOCMBIS: ::c_ulong = 0x741b;
-pub const TIOCMBIC: ::c_ulong = 0x741c;
-pub const TIOCMSET: ::c_ulong = 0x741a;
-pub const FIONREAD: ::c_ulong = 0x467f;
-pub const TIOCCONS: ::c_ulong = 0x80047478;
-
-pub const RTLD_DEEPBIND: ::c_int = 0x10;
-pub const RTLD_GLOBAL: ::c_int = 0x4;
-pub const RTLD_NOLOAD: ::c_int = 0x8;
-
-pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead;
-pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793;
-pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278;
-pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448;
-pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216;
-
-pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567;
-pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123;
-pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF;
-pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000;
-pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC;
-pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4;
-pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2;
-pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543;
-
-pub const MCL_CURRENT: ::c_int = 0x0001;
-pub const MCL_FUTURE: ::c_int = 0x0002;
-
-pub const SIGSTKSZ: ::size_t = 8192;
-pub const CBAUD: ::tcflag_t = 0o0010017;
-pub const TAB1: ::c_int = 0x00000800;
-pub const TAB2: ::c_int = 0x00001000;
-pub const TAB3: ::c_int = 0x00001800;
-pub const CR1: ::c_int  = 0x00000200;
-pub const CR2: ::c_int  = 0x00000400;
-pub const CR3: ::c_int  = 0x00000600;
-pub const FF1: ::c_int  = 0x00008000;
-pub const BS1: ::c_int  = 0x00002000;
-pub const VT1: ::c_int  = 0x00004000;
-pub const VWERASE: usize = 14;
-pub const VREPRINT: usize = 12;
-pub const VSUSP: usize = 10;
-pub const VSTART: usize = 8;
-pub const VSTOP: usize = 9;
-pub const VDISCARD: usize = 13;
-pub const VTIME: usize = 5;
-pub const IXON: ::tcflag_t = 0x00000400;
-pub const IXOFF: ::tcflag_t = 0x00001000;
-pub const ONLCR: ::tcflag_t = 0x4;
-pub const CSIZE: ::tcflag_t = 0x00000030;
-pub const CS6: ::tcflag_t = 0x00000010;
-pub const CS7: ::tcflag_t = 0x00000020;
-pub const CS8: ::tcflag_t = 0x00000030;
-pub const CSTOPB: ::tcflag_t = 0x00000040;
-pub const CREAD: ::tcflag_t = 0x00000080;
-pub const PARENB: ::tcflag_t = 0x00000100;
-pub const PARODD: ::tcflag_t = 0x00000200;
-pub const HUPCL: ::tcflag_t = 0x00000400;
-pub const CLOCAL: ::tcflag_t = 0x00000800;
-pub const ECHOKE: ::tcflag_t = 0x00000800;
-pub const ECHOE: ::tcflag_t = 0x00000010;
-pub const ECHOK: ::tcflag_t = 0x00000020;
-pub const ECHONL: ::tcflag_t = 0x00000040;
-pub const ECHOPRT: ::tcflag_t = 0x00000400;
-pub const ECHOCTL: ::tcflag_t = 0x00000200;
-pub const ISIG: ::tcflag_t = 0x00000001;
-pub const ICANON: ::tcflag_t = 0x00000002;
-pub const PENDIN: ::tcflag_t = 0x00004000;
-pub const NOFLSH: ::tcflag_t = 0x00000080;
-
-pub const B0: ::speed_t = 0o000000;
-pub const B50: ::speed_t = 0o000001;
-pub const B75: ::speed_t = 0o000002;
-pub const B110: ::speed_t = 0o000003;
-pub const B134: ::speed_t = 0o000004;
-pub const B150: ::speed_t = 0o000005;
-pub const B200: ::speed_t = 0o000006;
-pub const B300: ::speed_t = 0o000007;
-pub const B600: ::speed_t = 0o000010;
-pub const B1200: ::speed_t = 0o000011;
-pub const B1800: ::speed_t = 0o000012;
-pub const B2400: ::speed_t = 0o000013;
-pub const B4800: ::speed_t = 0o000014;
-pub const B9600: ::speed_t = 0o000015;
-pub const B19200: ::speed_t = 0o000016;
-pub const B38400: ::speed_t = 0o000017;
-pub const EXTA: ::speed_t = B19200;
-pub const EXTB: ::speed_t = B38400;
-pub const B57600: ::speed_t = 0o010001;
-pub const B115200: ::speed_t = 0o010002;
-pub const B230400: ::speed_t = 0o010003;
-pub const B460800: ::speed_t = 0o010004;
-pub const B500000: ::speed_t = 0o010005;
-pub const B576000: ::speed_t = 0o010006;
-pub const B921600: ::speed_t = 0o010007;
-pub const B1000000: ::speed_t = 0o010010;
-pub const B1152000: ::speed_t = 0o010011;
-pub const B1500000: ::speed_t = 0o010012;
-pub const B2000000: ::speed_t = 0o010013;
-pub const B2500000: ::speed_t = 0o010014;
-pub const B3000000: ::speed_t = 0o010015;
-pub const B3500000: ::speed_t = 0o010016;
-pub const B4000000: ::speed_t = 0o010017;
-
-cfg_if! {
-    if #[cfg(target_arch = "mips")] {
-        mod mips32;
-        pub use self::mips32::*;
-    } else if #[cfg(target_arch = "mips64")] {
-        mod mips64;
-        pub use self::mips64::*;
-    } else {
-        // Unknown target_arch
-    }
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/uclibc/mod.rs
+++ /dev/null
@@ -1,1769 +0,0 @@
-use dox::{mem, Option};
-
-pub type sa_family_t = u16;
-pub type pthread_key_t = ::c_uint;
-pub type speed_t = ::c_uint;
-pub type tcflag_t = ::c_uint;
-pub type loff_t = ::c_longlong;
-pub type clockid_t = ::c_int;
-pub type key_t = ::c_int;
-pub type id_t = ::c_uint;
-pub type useconds_t = u32;
-pub type dev_t = u64;
-pub type socklen_t = u32;
-pub type pthread_t = ::c_ulong;
-pub type mode_t = u32;
-pub type ino64_t = u64;
-pub type off64_t = i64;
-pub type blkcnt64_t = i64;
-pub type rlim64_t = u64;
-pub type shmatt_t = ::c_ulong;
-pub type mqd_t = ::c_int;
-pub type msgqnum_t = ::c_ulong;
-pub type msglen_t = ::c_ulong;
-pub type nfds_t = ::c_ulong;
-pub type nl_item = ::c_int;
-pub type idtype_t = ::c_uint;
-
-pub enum fpos64_t {} // TODO: fill this out with a struct
-
-pub enum timezone {}
-
-s! {
-    pub struct sockaddr {
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [u8; 8],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_family: sa_family_t,
-        pub sin6_port: ::in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-
-    pub struct sockaddr_un {
-        pub sun_family: sa_family_t,
-        pub sun_path: [::c_char; 108]
-    }
-
-    pub struct sockaddr_storage {
-        pub ss_family: sa_family_t,
-        __ss_align: ::size_t,
-        #[cfg(target_pointer_width = "32")]
-        __ss_pad2: [u8; 128 - 2 * 4],
-        #[cfg(target_pointer_width = "64")]
-        __ss_pad2: [u8; 128 - 2 * 8],
-    }
-
-    pub struct addrinfo {
-        pub ai_flags: ::c_int,
-        pub ai_family: ::c_int,
-        pub ai_socktype: ::c_int,
-        pub ai_protocol: ::c_int,
-        pub ai_addrlen: socklen_t,
-
-        pub ai_addr: *mut ::sockaddr,
-
-        pub ai_canonname: *mut c_char,
-
-        pub ai_next: *mut addrinfo,
-    }
-
-    pub struct sockaddr_nl {
-        pub nl_family: ::sa_family_t,
-        nl_pad: ::c_ushort,
-        pub nl_pid: u32,
-        pub nl_groups: u32
-    }
-
-    pub struct sockaddr_ll {
-        pub sll_family: ::c_ushort,
-        pub sll_protocol: ::c_ushort,
-        pub sll_ifindex: ::c_int,
-        pub sll_hatype: ::c_ushort,
-        pub sll_pkttype: ::c_uchar,
-        pub sll_halen: ::c_uchar,
-        pub sll_addr: [::c_uchar; 8]
-    }
-
-    pub struct fd_set {
-        fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE],
-    }
-
-    pub struct tm {
-        pub tm_sec: ::c_int,
-        pub tm_min: ::c_int,
-        pub tm_hour: ::c_int,
-        pub tm_mday: ::c_int,
-        pub tm_mon: ::c_int,
-        pub tm_year: ::c_int,
-        pub tm_wday: ::c_int,
-        pub tm_yday: ::c_int,
-        pub tm_isdst: ::c_int,
-        pub tm_gmtoff: ::c_long,
-        pub tm_zone: *const ::c_char,
-    }
-
-    pub struct sched_param {
-        pub sched_priority: ::c_int,
-    }
-
-    pub struct Dl_info {
-        pub dli_fname: *const ::c_char,
-        pub dli_fbase: *mut ::c_void,
-        pub dli_sname: *const ::c_char,
-        pub dli_saddr: *mut ::c_void,
-    }
-
-    #[cfg_attr(any(all(target_arch = "x86",
-                   target_arch = "x86_64")),
-               repr(packed))]
-    pub struct epoll_event {
-        pub events: ::uint32_t,
-        pub u64: ::uint64_t,
-    }
-
-    pub struct utsname {
-        pub sysname: [::c_char; 65],
-        pub nodename: [::c_char; 65],
-        pub release: [::c_char; 65],
-        pub version: [::c_char; 65],
-        pub machine: [::c_char; 65],
-        pub domainname: [::c_char; 65]
-    }
-
-    pub struct lconv {
-        pub decimal_point: *mut ::c_char,
-        pub thousands_sep: *mut ::c_char,
-        pub grouping: *mut ::c_char,
-        pub int_curr_symbol: *mut ::c_char,
-        pub currency_symbol: *mut ::c_char,
-        pub mon_decimal_point: *mut ::c_char,
-        pub mon_thousands_sep: *mut ::c_char,
-        pub mon_grouping: *mut ::c_char,
-        pub positive_sign: *mut ::c_char,
-        pub negative_sign: *mut ::c_char,
-        pub int_frac_digits: ::c_char,
-        pub frac_digits: ::c_char,
-        pub p_cs_precedes: ::c_char,
-        pub p_sep_by_space: ::c_char,
-        pub n_cs_precedes: ::c_char,
-        pub n_sep_by_space: ::c_char,
-        pub p_sign_posn: ::c_char,
-        pub n_sign_posn: ::c_char,
-        pub int_p_cs_precedes: ::c_char,
-        pub int_p_sep_by_space: ::c_char,
-        pub int_n_cs_precedes: ::c_char,
-        pub int_n_sep_by_space: ::c_char,
-        pub int_p_sign_posn: ::c_char,
-        pub int_n_sign_posn: ::c_char,
-    }
-
-    pub struct sigevent {
-        pub sigev_value: ::sigval,
-        pub sigev_signo: ::c_int,
-        pub sigev_notify: ::c_int,
-        // Actually a union.  We only expose sigev_notify_thread_id because it's
-        // the most useful member
-        pub sigev_notify_thread_id: ::c_int,
-        #[cfg(target_pointer_width = "64")]
-        __unused1: [::c_int; 11],
-        #[cfg(target_pointer_width = "32")]
-        __unused1: [::c_int; 12]
-    }
-
-    pub struct dirent {
-        pub d_ino: ::ino_t,
-        pub d_off: ::off_t,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct dirent64 {
-        pub d_ino: ::ino64_t,
-        pub d_off: ::off64_t,
-        pub d_reclen: ::c_ushort,
-        pub d_type: ::c_uchar,
-        pub d_name: [::c_char; 256],
-    }
-
-    pub struct rlimit64 {
-        pub rlim_cur: rlim64_t,
-        pub rlim_max: rlim64_t,
-    }
-
-    pub struct glob_t {
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct ifaddrs {
-        pub ifa_next: *mut ifaddrs,
-        pub ifa_name: *mut c_char,
-        pub ifa_flags: ::c_uint,
-        pub ifa_addr: *mut ::sockaddr,
-        pub ifa_netmask: *mut ::sockaddr,
-        pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union
-        pub ifa_data: *mut ::c_void
-    }
-
-    pub struct pthread_mutex_t {
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEX_T],
-    }
-
-    pub struct pthread_rwlock_t {
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_RWLOCK_T],
-    }
-
-    pub struct pthread_mutexattr_t {
-        #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64",
-                  target_arch = "mips64", target_arch = "s390x",
-                  target_arch = "sparc64"))]
-        __align: [::c_int; 0],
-        #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64",
-                      target_arch = "mips64", target_arch = "s390x",
-                      target_arch = "sparc64")))]
-        __align: [::c_long; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T],
-    }
-
-    pub struct pthread_cond_t {
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_COND_T],
-    }
-
-    pub struct pthread_condattr_t {
-        __align: [::c_int; 0],
-        size: [u8; __SIZEOF_PTHREAD_CONDATTR_T],
-    }
-
-    pub struct passwd {
-        pub pw_name: *mut ::c_char,
-        pub pw_passwd: *mut ::c_char,
-        pub pw_uid: ::uid_t,
-        pub pw_gid: ::gid_t,
-        pub pw_gecos: *mut ::c_char,
-        pub pw_dir: *mut ::c_char,
-        pub pw_shell: *mut ::c_char,
-    }
-
-    pub struct spwd {
-        pub sp_namp: *mut ::c_char,
-        pub sp_pwdp: *mut ::c_char,
-        pub sp_lstchg: ::c_long,
-        pub sp_min: ::c_long,
-        pub sp_max: ::c_long,
-        pub sp_warn: ::c_long,
-        pub sp_inact: ::c_long,
-        pub sp_expire: ::c_long,
-        pub sp_flag: ::c_ulong,
-    }
-
-    pub struct statvfs {
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        #[cfg(target_endian = "little")]
-        pub f_fsid: ::c_ulong,
-        #[cfg(target_pointer_width = "32")]
-        __f_unused: ::c_int,
-        #[cfg(target_endian = "big")]
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        __f_spare: [::c_int; 6],
-    }
-
-    pub struct dqblk {
-        pub dqb_bhardlimit: ::uint32_t,
-        pub dqb_bsoftlimit: ::uint32_t,
-        pub dqb_curblocks: ::uint32_t,
-        pub dqb_ihardlimit: ::uint32_t,
-        pub dqb_isoftlimit: ::uint32_t,
-        pub dqb_curinodes: ::uint32_t,
-        pub dqb_btime: ::time_t,
-        pub dqb_itime: ::time_t,
-    }
-
-    pub struct signalfd_siginfo {
-        pub ssi_signo: ::uint32_t,
-        pub ssi_errno: ::int32_t,
-        pub ssi_code: ::int32_t,
-        pub ssi_pid: ::uint32_t,
-        pub ssi_uid: ::uint32_t,
-        pub ssi_fd: ::int32_t,
-        pub ssi_tid: ::uint32_t,
-        pub ssi_band: ::uint32_t,
-        pub ssi_overrun: ::uint32_t,
-        pub ssi_trapno: ::uint32_t,
-        pub ssi_status: ::int32_t,
-        pub ssi_int: ::int32_t,
-        pub ssi_ptr: ::uint64_t,
-        pub ssi_utime: ::uint64_t,
-        pub ssi_stime: ::uint64_t,
-        pub ssi_addr: ::uint64_t,
-        _pad: [::uint8_t; 48],
-    }
-
-    pub struct fsid_t {
-        __val: [::c_int; 2],
-    }
-
-    pub struct mq_attr {
-        pub mq_flags: ::c_long,
-        pub mq_maxmsg: ::c_long,
-        pub mq_msgsize: ::c_long,
-        pub mq_curmsgs: ::c_long,
-        pad: [::c_long; 4]
-    }
-
-    pub struct cpu_set_t {
-        #[cfg(target_pointer_width = "32")]
-        bits: [u32; 32],
-        #[cfg(target_pointer_width = "64")]
-        bits: [u64; 16],
-    }
-
-    pub struct if_nameindex {
-        pub if_index: ::c_uint,
-        pub if_name: *mut ::c_char,
-    }
-
-    // System V IPC
-    pub struct msginfo {
-        pub msgpool: ::c_int,
-        pub msgmap: ::c_int,
-        pub msgmax: ::c_int,
-        pub msgmnb: ::c_int,
-        pub msgmni: ::c_int,
-        pub msgssz: ::c_int,
-        pub msgtql: ::c_int,
-        pub msgseg: ::c_ushort,
-    }
-}
-
-// intentionally not public, only used for fd_set
-cfg_if! {
-    if #[cfg(target_pointer_width = "32")] {
-        const ULONG_SIZE: usize = 32;
-    } else if #[cfg(target_pointer_width = "64")] {
-        const ULONG_SIZE: usize = 64;
-    } else {
-        // Unknown target_pointer_width
-    }
-}
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 2147483647;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 2;
-pub const _IOLBF: ::c_int = 1;
-
-pub const F_DUPFD: ::c_int = 0;
-pub const F_GETFD: ::c_int = 1;
-pub const F_SETFD: ::c_int = 2;
-pub const F_GETFL: ::c_int = 3;
-pub const F_SETFL: ::c_int = 4;
-
-// Linux-specific fcntls
-pub const F_SETLEASE: ::c_int = 1024;
-pub const F_GETLEASE: ::c_int = 1025;
-pub const F_NOTIFY: ::c_int = 1026;
-pub const F_DUPFD_CLOEXEC: ::c_int = 1030;
-
-// TODO(#235): Include file sealing fcntls once we have a way to verify them.
-
-pub const SIGTRAP: ::c_int = 5;
-
-pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0;
-pub const PTHREAD_CREATE_DETACHED: ::c_int = 1;
-
-pub const CLOCK_REALTIME: clockid_t = 0;
-pub const CLOCK_MONOTONIC: clockid_t = 1;
-pub const CLOCK_PROCESS_CPUTIME_ID: clockid_t = 2;
-pub const CLOCK_THREAD_CPUTIME_ID: clockid_t = 3;
-// TODO(#247) Someday our Travis shall have glibc 2.21 (released in Sep
-// 2014.) See also musl/mod.rs
-// pub const CLOCK_SGI_CYCLE: clockid_t = 10;
-// pub const CLOCK_TAI: clockid_t = 11;
-pub const TIMER_ABSTIME: ::c_int = 1;
-
-pub const RLIMIT_CPU: ::c_int = 0;
-pub const RLIMIT_FSIZE: ::c_int = 1;
-pub const RLIMIT_DATA: ::c_int = 2;
-pub const RLIMIT_STACK: ::c_int = 3;
-pub const RLIMIT_CORE: ::c_int = 4;
-pub const RLIMIT_LOCKS: ::c_int = 10;
-pub const RLIMIT_SIGPENDING: ::c_int = 11;
-pub const RLIMIT_MSGQUEUE: ::c_int = 12;
-pub const RLIMIT_NICE: ::c_int = 13;
-pub const RLIMIT_RTPRIO: ::c_int = 14;
-
-pub const RUSAGE_SELF: ::c_int = 0;
-
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-
-pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC;
-
-pub const S_IFIFO: ::mode_t = 4096;
-pub const S_IFCHR: ::mode_t = 8192;
-pub const S_IFBLK: ::mode_t = 24576;
-pub const S_IFDIR: ::mode_t = 16384;
-pub const S_IFREG: ::mode_t = 32768;
-pub const S_IFLNK: ::mode_t = 40960;
-pub const S_IFSOCK: ::mode_t = 49152;
-pub const S_IFMT: ::mode_t = 61440;
-pub const S_IRWXU: ::mode_t = 448;
-pub const S_IXUSR: ::mode_t = 64;
-pub const S_IWUSR: ::mode_t = 128;
-pub const S_IRUSR: ::mode_t = 256;
-pub const S_IRWXG: ::mode_t = 56;
-pub const S_IXGRP: ::mode_t = 8;
-pub const S_IWGRP: ::mode_t = 16;
-pub const S_IRGRP: ::mode_t = 32;
-pub const S_IRWXO: ::mode_t = 7;
-pub const S_IXOTH: ::mode_t = 1;
-pub const S_IWOTH: ::mode_t = 2;
-pub const S_IROTH: ::mode_t = 4;
-pub const F_OK: ::c_int = 0;
-pub const R_OK: ::c_int = 4;
-pub const W_OK: ::c_int = 2;
-pub const X_OK: ::c_int = 1;
-pub const STDIN_FILENO: ::c_int = 0;
-pub const STDOUT_FILENO: ::c_int = 1;
-pub const STDERR_FILENO: ::c_int = 2;
-pub const SIGHUP: ::c_int = 1;
-pub const SIGINT: ::c_int = 2;
-pub const SIGQUIT: ::c_int = 3;
-pub const SIGILL: ::c_int = 4;
-pub const SIGABRT: ::c_int = 6;
-pub const SIGFPE: ::c_int = 8;
-pub const SIGKILL: ::c_int = 9;
-pub const SIGSEGV: ::c_int = 11;
-pub const SIGPIPE: ::c_int = 13;
-pub const SIGALRM: ::c_int = 14;
-pub const SIGTERM: ::c_int = 15;
-
-pub const PROT_NONE: ::c_int = 0;
-pub const PROT_READ: ::c_int = 1;
-pub const PROT_WRITE: ::c_int = 2;
-pub const PROT_EXEC: ::c_int = 4;
-
-pub const LC_CTYPE: ::c_int = 0;
-pub const LC_NUMERIC: ::c_int = 1;
-pub const LC_MONETARY: ::c_int = 2;
-pub const LC_TIME: ::c_int = 3;
-pub const LC_COLLATE: ::c_int = 4;
-pub const LC_MESSAGES: ::c_int = 5;
-pub const LC_ALL: ::c_int = 6;
-pub const LC_CTYPE_MASK: ::c_int = (1 << LC_CTYPE);
-pub const LC_NUMERIC_MASK: ::c_int = (1 << LC_NUMERIC);
-pub const LC_TIME_MASK: ::c_int = (1 << LC_TIME);
-pub const LC_COLLATE_MASK: ::c_int = (1 << LC_COLLATE);
-pub const LC_MONETARY_MASK: ::c_int = (1 << LC_MONETARY);
-pub const LC_MESSAGES_MASK: ::c_int = (1 << LC_MESSAGES);
-// LC_ALL_MASK defined per platform
-
-pub const MAP_FILE: ::c_int = 0x0000;
-pub const MAP_SHARED: ::c_int = 0x0001;
-pub const MAP_PRIVATE: ::c_int = 0x0002;
-pub const MAP_FIXED: ::c_int = 0x0010;
-
-pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void;
-
-// MS_ flags for msync(2)
-pub const MS_ASYNC: ::c_int = 0x0001;
-pub const MS_INVALIDATE: ::c_int = 0x0002;
-pub const MS_SYNC: ::c_int = 0x0004;
-
-// MS_ flags for mount(2)
-pub const MS_RDONLY: ::c_ulong = 0x01;
-pub const MS_NOSUID: ::c_ulong = 0x02;
-pub const MS_NODEV: ::c_ulong = 0x04;
-pub const MS_NOEXEC: ::c_ulong = 0x08;
-pub const MS_SYNCHRONOUS: ::c_ulong = 0x10;
-pub const MS_REMOUNT: ::c_ulong = 0x20;
-pub const MS_MANDLOCK: ::c_ulong = 0x40;
-pub const MS_NOATIME: ::c_ulong = 0x0400;
-pub const MS_NODIRATIME: ::c_ulong = 0x0800;
-pub const MS_BIND: ::c_ulong = 0x1000;
-pub const MS_NOUSER: ::c_ulong = 0x80000000;
-pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000;
-pub const MS_MGC_MSK: ::c_ulong = 0xffff0000;
-pub const MS_RMT_MASK: ::c_ulong = 0x800051;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EAGAIN: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const ENOTBLK: ::c_int = 15;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const ETXTBSY: ::c_int = 26;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const EWOULDBLOCK: ::c_int = EAGAIN;
-
-pub const SCM_RIGHTS: ::c_int = 0x01;
-pub const SCM_CREDENTIALS: ::c_int = 0x02;
-
-pub const IPPROTO_RAW: ::c_int = 255;
-
-pub const PROT_GROWSDOWN: ::c_int = 0x1000000;
-pub const PROT_GROWSUP: ::c_int = 0x2000000;
-
-pub const MAP_TYPE: ::c_int = 0x000f;
-
-pub const MADV_NORMAL: ::c_int = 0;
-pub const MADV_RANDOM: ::c_int = 1;
-pub const MADV_SEQUENTIAL: ::c_int = 2;
-pub const MADV_WILLNEED: ::c_int = 3;
-pub const MADV_DONTNEED: ::c_int = 4;
-pub const MADV_REMOVE: ::c_int = 9;
-pub const MADV_DONTFORK: ::c_int = 10;
-pub const MADV_DOFORK: ::c_int = 11;
-pub const MADV_MERGEABLE: ::c_int = 12;
-pub const MADV_UNMERGEABLE: ::c_int = 13;
-pub const MADV_HWPOISON: ::c_int = 100;
-
-pub const IFF_UP: ::c_int = 0x1;
-pub const IFF_BROADCAST: ::c_int = 0x2;
-pub const IFF_DEBUG: ::c_int = 0x4;
-pub const IFF_LOOPBACK: ::c_int = 0x8;
-pub const IFF_POINTOPOINT: ::c_int = 0x10;
-pub const IFF_NOTRAILERS: ::c_int = 0x20;
-pub const IFF_RUNNING: ::c_int = 0x40;
-pub const IFF_NOARP: ::c_int = 0x80;
-pub const IFF_PROMISC: ::c_int = 0x100;
-pub const IFF_ALLMULTI: ::c_int = 0x200;
-pub const IFF_MASTER: ::c_int = 0x400;
-pub const IFF_SLAVE: ::c_int = 0x800;
-pub const IFF_MULTICAST: ::c_int = 0x1000;
-pub const IFF_PORTSEL: ::c_int = 0x2000;
-pub const IFF_AUTOMEDIA: ::c_int = 0x4000;
-pub const IFF_DYNAMIC: ::c_int = 0x8000;
-
-pub const SOL_IP: ::c_int = 0;
-pub const SOL_TCP: ::c_int = 6;
-pub const SOL_IPV6: ::c_int = 41;
-pub const SOL_ICMPV6: ::c_int = 58;
-pub const SOL_RAW: ::c_int = 255;
-pub const SOL_DECNET: ::c_int = 261;
-pub const SOL_X25: ::c_int = 262;
-pub const SOL_PACKET: ::c_int = 263;
-pub const SOL_ATM: ::c_int = 264;
-pub const SOL_AAL: ::c_int = 265;
-pub const SOL_IRDA: ::c_int = 266;
-
-pub const AF_UNSPEC: ::c_int = 0;
-pub const AF_UNIX: ::c_int = 1;
-pub const AF_LOCAL: ::c_int = 1;
-pub const AF_INET: ::c_int = 2;
-pub const AF_AX25: ::c_int = 3;
-pub const AF_IPX: ::c_int = 4;
-pub const AF_APPLETALK: ::c_int = 5;
-pub const AF_NETROM: ::c_int = 6;
-pub const AF_BRIDGE: ::c_int = 7;
-pub const AF_ATMPVC: ::c_int = 8;
-pub const AF_X25: ::c_int = 9;
-pub const AF_INET6: ::c_int = 10;
-pub const AF_ROSE: ::c_int = 11;
-pub const AF_DECnet: ::c_int = 12;
-pub const AF_NETBEUI: ::c_int = 13;
-pub const AF_SECURITY: ::c_int = 14;
-pub const AF_KEY: ::c_int = 15;
-pub const AF_NETLINK: ::c_int = 16;
-pub const AF_ROUTE: ::c_int = AF_NETLINK;
-pub const AF_PACKET: ::c_int = 17;
-pub const AF_ASH: ::c_int = 18;
-pub const AF_ECONET: ::c_int = 19;
-pub const AF_ATMSVC: ::c_int = 20;
-pub const AF_SNA: ::c_int = 22;
-pub const AF_IRDA: ::c_int = 23;
-pub const AF_PPPOX: ::c_int = 24;
-pub const AF_WANPIPE: ::c_int = 25;
-pub const AF_LLC: ::c_int = 26;
-pub const AF_CAN: ::c_int = 29;
-pub const AF_TIPC: ::c_int = 30;
-pub const AF_BLUETOOTH: ::c_int = 31;
-pub const AF_IUCV: ::c_int = 32;
-pub const AF_RXRPC: ::c_int = 33;
-pub const AF_ISDN: ::c_int = 34;
-pub const AF_PHONET: ::c_int = 35;
-pub const AF_IEEE802154: ::c_int = 36;
-pub const AF_CAIF: ::c_int = 37;
-pub const AF_ALG: ::c_int = 38;
-
-pub const PF_UNSPEC: ::c_int = AF_UNSPEC;
-pub const PF_UNIX: ::c_int = AF_UNIX;
-pub const PF_LOCAL: ::c_int = AF_LOCAL;
-pub const PF_INET: ::c_int = AF_INET;
-pub const PF_AX25: ::c_int = AF_AX25;
-pub const PF_IPX: ::c_int = AF_IPX;
-pub const PF_APPLETALK: ::c_int = AF_APPLETALK;
-pub const PF_NETROM: ::c_int = AF_NETROM;
-pub const PF_BRIDGE: ::c_int = AF_BRIDGE;
-pub const PF_ATMPVC: ::c_int = AF_ATMPVC;
-pub const PF_X25: ::c_int = AF_X25;
-pub const PF_INET6: ::c_int = AF_INET6;
-pub const PF_ROSE: ::c_int = AF_ROSE;
-pub const PF_DECnet: ::c_int = AF_DECnet;
-pub const PF_NETBEUI: ::c_int = AF_NETBEUI;
-pub const PF_SECURITY: ::c_int = AF_SECURITY;
-pub const PF_KEY: ::c_int = AF_KEY;
-pub const PF_NETLINK: ::c_int = AF_NETLINK;
-pub const PF_ROUTE: ::c_int = AF_ROUTE;
-pub const PF_PACKET: ::c_int = AF_PACKET;
-pub const PF_ASH: ::c_int = AF_ASH;
-pub const PF_ECONET: ::c_int = AF_ECONET;
-pub const PF_ATMSVC: ::c_int = AF_ATMSVC;
-pub const PF_SNA: ::c_int = AF_SNA;
-pub const PF_IRDA: ::c_int = AF_IRDA;
-pub const PF_PPPOX: ::c_int = AF_PPPOX;
-pub const PF_WANPIPE: ::c_int = AF_WANPIPE;
-pub const PF_LLC: ::c_int = AF_LLC;
-pub const PF_CAN: ::c_int = AF_CAN;
-pub const PF_TIPC: ::c_int = AF_TIPC;
-pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH;
-pub const PF_IUCV: ::c_int = AF_IUCV;
-pub const PF_RXRPC: ::c_int = AF_RXRPC;
-pub const PF_ISDN: ::c_int = AF_ISDN;
-pub const PF_PHONET: ::c_int = AF_PHONET;
-pub const PF_IEEE802154: ::c_int = AF_IEEE802154;
-pub const PF_CAIF: ::c_int = AF_CAIF;
-pub const PF_ALG: ::c_int = AF_ALG;
-
-pub const SOMAXCONN: ::c_int = 128;
-
-pub const MSG_OOB: ::c_int = 1;
-pub const MSG_PEEK: ::c_int = 2;
-pub const MSG_DONTROUTE: ::c_int = 4;
-pub const MSG_CTRUNC: ::c_int = 8;
-pub const MSG_TRUNC: ::c_int = 0x20;
-pub const MSG_DONTWAIT: ::c_int = 0x40;
-pub const MSG_EOR: ::c_int = 0x80;
-pub const MSG_WAITALL: ::c_int = 0x100;
-pub const MSG_FIN: ::c_int = 0x200;
-pub const MSG_SYN: ::c_int = 0x400;
-pub const MSG_CONFIRM: ::c_int = 0x800;
-pub const MSG_RST: ::c_int = 0x1000;
-pub const MSG_ERRQUEUE: ::c_int = 0x2000;
-pub const MSG_NOSIGNAL: ::c_int = 0x4000;
-pub const MSG_MORE: ::c_int = 0x8000;
-pub const MSG_WAITFORONE: ::c_int = 0x10000;
-pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000;
-
-pub const SOCK_RAW: ::c_int = 3;
-pub const IPPROTO_ICMP: ::c_int = 1;
-pub const IPPROTO_ICMPV6: ::c_int = 58;
-pub const IPPROTO_TCP: ::c_int = 6;
-pub const IPPROTO_IP: ::c_int = 0;
-pub const IPPROTO_IPV6: ::c_int = 41;
-pub const IP_MULTICAST_TTL: ::c_int = 33;
-pub const IP_MULTICAST_LOOP: ::c_int = 34;
-pub const IP_TTL: ::c_int = 2;
-pub const IP_HDRINCL: ::c_int = 3;
-pub const IP_ADD_MEMBERSHIP: ::c_int = 35;
-pub const IP_DROP_MEMBERSHIP: ::c_int = 36;
-
-pub const TCP_NODELAY: ::c_int = 1;
-pub const TCP_MAXSEG: ::c_int = 2;
-pub const TCP_CORK: ::c_int = 3;
-pub const TCP_KEEPIDLE: ::c_int = 4;
-pub const TCP_KEEPINTVL: ::c_int = 5;
-pub const TCP_KEEPCNT: ::c_int = 6;
-pub const TCP_SYNCNT: ::c_int = 7;
-pub const TCP_LINGER2: ::c_int = 8;
-pub const TCP_DEFER_ACCEPT: ::c_int = 9;
-pub const TCP_WINDOW_CLAMP: ::c_int = 10;
-pub const TCP_INFO: ::c_int = 11;
-pub const TCP_QUICKACK: ::c_int = 12;
-pub const TCP_CONGESTION: ::c_int = 13;
-
-pub const IPV6_MULTICAST_LOOP: ::c_int = 19;
-pub const IPV6_V6ONLY: ::c_int = 26;
-
-pub const SO_DEBUG: ::c_int = 1;
-
-pub const SHUT_RD: ::c_int = 0;
-pub const SHUT_WR: ::c_int = 1;
-pub const SHUT_RDWR: ::c_int = 2;
-
-pub const LOCK_SH: ::c_int = 1;
-pub const LOCK_EX: ::c_int = 2;
-pub const LOCK_NB: ::c_int = 4;
-pub const LOCK_UN: ::c_int = 8;
-
-pub const SS_ONSTACK: ::c_int = 1;
-pub const SS_DISABLE: ::c_int = 2;
-
-pub const PATH_MAX: ::c_int = 4096;
-
-pub const FD_SETSIZE: usize = 1024;
-
-pub const EPOLLIN: ::c_int = 0x1;
-pub const EPOLLPRI: ::c_int = 0x2;
-pub const EPOLLOUT: ::c_int = 0x4;
-pub const EPOLLRDNORM: ::c_int = 0x40;
-pub const EPOLLRDBAND: ::c_int = 0x80;
-pub const EPOLLWRNORM: ::c_int = 0x100;
-pub const EPOLLWRBAND: ::c_int = 0x200;
-pub const EPOLLMSG: ::c_int = 0x400;
-pub const EPOLLERR: ::c_int = 0x8;
-pub const EPOLLHUP: ::c_int = 0x10;
-pub const EPOLLET: ::c_int = 0x80000000;
-
-pub const EPOLL_CTL_ADD: ::c_int = 1;
-pub const EPOLL_CTL_MOD: ::c_int = 3;
-pub const EPOLL_CTL_DEL: ::c_int = 2;
-
-pub const MNT_DETACH: ::c_int = 0x2;
-pub const MNT_EXPIRE: ::c_int = 0x4;
-
-pub const MNT_FORCE: ::c_int = 0x1;
-
-pub const Q_SYNC: ::c_int = 0x600;
-pub const Q_QUOTAON: ::c_int = 0x100;
-pub const Q_QUOTAOFF: ::c_int = 0x200;
-pub const Q_GETQUOTA: ::c_int = 0x300;
-pub const Q_SETQUOTA: ::c_int = 0x400;
-
-pub const TCIOFF: ::c_int = 2;
-pub const TCION: ::c_int = 3;
-pub const TCOOFF: ::c_int = 0;
-pub const TCOON: ::c_int = 1;
-pub const TCIFLUSH: ::c_int = 0;
-pub const TCOFLUSH: ::c_int = 1;
-pub const TCIOFLUSH: ::c_int = 2;
-pub const NL0: ::c_int  = 0x00000000;
-pub const NL1: ::c_int  = 0x00000100;
-pub const TAB0: ::c_int = 0x00000000;
-pub const CR0: ::c_int  = 0x00000000;
-pub const FF0: ::c_int  = 0x00000000;
-pub const BS0: ::c_int  = 0x00000000;
-pub const VT0: ::c_int  = 0x00000000;
-pub const VERASE: usize = 2;
-pub const VKILL: usize = 3;
-pub const VINTR: usize = 0;
-pub const VQUIT: usize = 1;
-pub const VLNEXT: usize = 15;
-pub const IGNBRK: ::tcflag_t = 0x00000001;
-pub const BRKINT: ::tcflag_t = 0x00000002;
-pub const IGNPAR: ::tcflag_t = 0x00000004;
-pub const PARMRK: ::tcflag_t = 0x00000008;
-pub const INPCK: ::tcflag_t = 0x00000010;
-pub const ISTRIP: ::tcflag_t = 0x00000020;
-pub const INLCR: ::tcflag_t = 0x00000040;
-pub const IGNCR: ::tcflag_t = 0x00000080;
-pub const ICRNL: ::tcflag_t = 0x00000100;
-pub const IXANY: ::tcflag_t = 0x00000800;
-pub const IMAXBEL: ::tcflag_t = 0x00002000;
-pub const OPOST: ::tcflag_t = 0x1;
-pub const CS5: ::tcflag_t = 0x00000000;
-pub const CRTSCTS: ::tcflag_t = 0x80000000;
-pub const ECHO: ::tcflag_t = 0x00000008;
-
-pub const CLONE_VM: ::c_int = 0x100;
-pub const CLONE_FS: ::c_int = 0x200;
-pub const CLONE_FILES: ::c_int = 0x400;
-pub const CLONE_SIGHAND: ::c_int = 0x800;
-pub const CLONE_PTRACE: ::c_int = 0x2000;
-pub const CLONE_VFORK: ::c_int = 0x4000;
-pub const CLONE_PARENT: ::c_int = 0x8000;
-pub const CLONE_THREAD: ::c_int = 0x10000;
-pub const CLONE_NEWNS: ::c_int = 0x20000;
-pub const CLONE_SYSVSEM: ::c_int = 0x40000;
-pub const CLONE_SETTLS: ::c_int = 0x80000;
-pub const CLONE_PARENT_SETTID: ::c_int = 0x100000;
-pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000;
-pub const CLONE_DETACHED: ::c_int = 0x400000;
-pub const CLONE_UNTRACED: ::c_int = 0x800000;
-pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000;
-pub const CLONE_NEWUTS: ::c_int = 0x04000000;
-pub const CLONE_NEWIPC: ::c_int = 0x08000000;
-pub const CLONE_NEWUSER: ::c_int = 0x10000000;
-pub const CLONE_NEWPID: ::c_int = 0x20000000;
-pub const CLONE_NEWNET: ::c_int = 0x40000000;
-pub const CLONE_IO: ::c_int = 0x80000000;
-
-pub const WNOHANG: ::c_int = 0x00000001;
-pub const WUNTRACED: ::c_int = 0x00000002;
-pub const WSTOPPED: ::c_int = WUNTRACED;
-pub const WEXITED: ::c_int = 0x00000004;
-pub const WCONTINUED: ::c_int = 0x00000008;
-pub const WNOWAIT: ::c_int = 0x01000000;
-
-pub const __WNOTHREAD: ::c_int = 0x20000000;
-pub const __WALL: ::c_int = 0x40000000;
-pub const __WCLONE: ::c_int = 0x80000000;
-
-pub const SPLICE_F_MOVE: ::c_uint = 0x01;
-pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02;
-pub const SPLICE_F_MORE: ::c_uint = 0x04;
-pub const SPLICE_F_GIFT: ::c_uint = 0x08;
-
-pub const RTLD_LOCAL: ::c_int = 0;
-
-pub const POSIX_FADV_NORMAL: ::c_int = 0;
-pub const POSIX_FADV_RANDOM: ::c_int = 1;
-pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_FADV_WILLNEED: ::c_int = 3;
-
-pub const AT_FDCWD: ::c_int = -100;
-pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100;
-pub const AT_REMOVEDIR: ::c_int = 0x200;
-pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400;
-
-pub const LOG_CRON: ::c_int = 9 << 3;
-pub const LOG_AUTHPRIV: ::c_int = 10 << 3;
-pub const LOG_FTP: ::c_int = 11 << 3;
-pub const LOG_PERROR: ::c_int = 0x20;
-
-pub const PIPE_BUF: usize = 4096;
-
-pub const SI_LOAD_SHIFT: ::c_uint = 16;
-
-pub const SIGEV_SIGNAL: ::c_int = 0;
-pub const SIGEV_NONE: ::c_int = 1;
-pub const SIGEV_THREAD: ::c_int = 2;
-
-pub const P_ALL: idtype_t = 0;
-pub const P_PID: idtype_t = 1;
-pub const P_PGID: idtype_t = 2;
-
-pub const UTIME_OMIT: c_long = 1073741822;
-pub const UTIME_NOW: c_long = 1073741823;
-
-pub const L_tmpnam: ::c_uint = 20;
-pub const _PC_LINK_MAX: ::c_int = 0;
-pub const _PC_MAX_CANON: ::c_int = 1;
-pub const _PC_MAX_INPUT: ::c_int = 2;
-pub const _PC_NAME_MAX: ::c_int = 3;
-pub const _PC_PATH_MAX: ::c_int = 4;
-pub const _PC_PIPE_BUF: ::c_int = 5;
-pub const _PC_CHOWN_RESTRICTED: ::c_int = 6;
-pub const _PC_NO_TRUNC: ::c_int = 7;
-pub const _PC_VDISABLE: ::c_int = 8;
-
-pub const _SC_ARG_MAX: ::c_int = 0;
-pub const _SC_CHILD_MAX: ::c_int = 1;
-pub const _SC_CLK_TCK: ::c_int = 2;
-pub const _SC_NGROUPS_MAX: ::c_int = 3;
-pub const _SC_OPEN_MAX: ::c_int = 4;
-pub const _SC_STREAM_MAX: ::c_int = 5;
-pub const _SC_TZNAME_MAX: ::c_int = 6;
-pub const _SC_JOB_CONTROL: ::c_int = 7;
-pub const _SC_SAVED_IDS: ::c_int = 8;
-pub const _SC_REALTIME_SIGNALS: ::c_int = 9;
-pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10;
-pub const _SC_TIMERS: ::c_int = 11;
-pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12;
-pub const _SC_PRIORITIZED_IO: ::c_int = 13;
-pub const _SC_SYNCHRONIZED_IO: ::c_int = 14;
-pub const _SC_FSYNC: ::c_int = 15;
-pub const _SC_MAPPED_FILES: ::c_int = 16;
-pub const _SC_MEMLOCK: ::c_int = 17;
-pub const _SC_MEMLOCK_RANGE: ::c_int = 18;
-pub const _SC_MEMORY_PROTECTION: ::c_int = 19;
-pub const _SC_MESSAGE_PASSING: ::c_int = 20;
-pub const _SC_SEMAPHORES: ::c_int = 21;
-pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22;
-pub const _SC_AIO_LISTIO_MAX: ::c_int = 23;
-pub const _SC_AIO_MAX: ::c_int = 24;
-pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25;
-pub const _SC_DELAYTIMER_MAX: ::c_int = 26;
-pub const _SC_MQ_OPEN_MAX: ::c_int = 27;
-pub const _SC_MQ_PRIO_MAX: ::c_int = 28;
-pub const _SC_VERSION: ::c_int = 29;
-pub const _SC_PAGESIZE: ::c_int = 30;
-pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE;
-pub const _SC_RTSIG_MAX: ::c_int = 31;
-pub const _SC_SEM_NSEMS_MAX: ::c_int = 32;
-pub const _SC_SEM_VALUE_MAX: ::c_int = 33;
-pub const _SC_SIGQUEUE_MAX: ::c_int = 34;
-pub const _SC_TIMER_MAX: ::c_int = 35;
-pub const _SC_BC_BASE_MAX: ::c_int = 36;
-pub const _SC_BC_DIM_MAX: ::c_int = 37;
-pub const _SC_BC_SCALE_MAX: ::c_int = 38;
-pub const _SC_BC_STRING_MAX: ::c_int = 39;
-pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40;
-pub const _SC_EXPR_NEST_MAX: ::c_int = 42;
-pub const _SC_LINE_MAX: ::c_int = 43;
-pub const _SC_RE_DUP_MAX: ::c_int = 44;
-pub const _SC_2_VERSION: ::c_int = 46;
-pub const _SC_2_C_BIND: ::c_int = 47;
-pub const _SC_2_C_DEV: ::c_int = 48;
-pub const _SC_2_FORT_DEV: ::c_int = 49;
-pub const _SC_2_FORT_RUN: ::c_int = 50;
-pub const _SC_2_SW_DEV: ::c_int = 51;
-pub const _SC_2_LOCALEDEF: ::c_int = 52;
-pub const _SC_IOV_MAX: ::c_int = 60;
-pub const _SC_THREADS: ::c_int = 67;
-pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68;
-pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69;
-pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70;
-pub const _SC_LOGIN_NAME_MAX: ::c_int = 71;
-pub const _SC_TTY_NAME_MAX: ::c_int = 72;
-pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73;
-pub const _SC_THREAD_KEYS_MAX: ::c_int = 74;
-pub const _SC_THREAD_STACK_MIN: ::c_int = 75;
-pub const _SC_THREAD_THREADS_MAX: ::c_int = 76;
-pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77;
-pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78;
-pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79;
-pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80;
-pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81;
-pub const _SC_NPROCESSORS_ONLN: ::c_int = 84;
-pub const _SC_ATEXIT_MAX: ::c_int = 87;
-pub const _SC_XOPEN_VERSION: ::c_int = 89;
-pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90;
-pub const _SC_XOPEN_UNIX: ::c_int = 91;
-pub const _SC_XOPEN_CRYPT: ::c_int = 92;
-pub const _SC_XOPEN_ENH_I18N: ::c_int = 93;
-pub const _SC_XOPEN_SHM: ::c_int = 94;
-pub const _SC_2_CHAR_TERM: ::c_int = 95;
-pub const _SC_2_UPE: ::c_int = 97;
-pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125;
-pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126;
-pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128;
-pub const _SC_XOPEN_LEGACY: ::c_int = 129;
-pub const _SC_XOPEN_REALTIME: ::c_int = 130;
-pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131;
-pub const _SC_HOST_NAME_MAX: ::c_int = 180;
-
-pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY;
-pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY;
-
-pub const GLOB_ERR: ::c_int = 1 << 0;
-pub const GLOB_MARK: ::c_int = 1 << 1;
-pub const GLOB_NOSORT: ::c_int = 1 << 2;
-pub const GLOB_DOOFFS: ::c_int = 1 << 3;
-pub const GLOB_NOCHECK: ::c_int = 1 << 4;
-pub const GLOB_APPEND: ::c_int = 1 << 5;
-pub const GLOB_NOESCAPE: ::c_int = 1 << 6;
-
-pub const GLOB_NOSPACE: ::c_int = 1;
-pub const GLOB_ABORTED: ::c_int = 2;
-pub const GLOB_NOMATCH: ::c_int = 3;
-
-pub const POSIX_MADV_NORMAL: ::c_int = 0;
-pub const POSIX_MADV_RANDOM: ::c_int = 1;
-pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2;
-pub const POSIX_MADV_WILLNEED: ::c_int = 3;
-
-pub const S_IEXEC: mode_t = 64;
-pub const S_IWRITE: mode_t = 128;
-pub const S_IREAD: mode_t = 256;
-
-pub const F_LOCK: ::c_int = 1;
-pub const F_TEST: ::c_int = 3;
-pub const F_TLOCK: ::c_int = 2;
-pub const F_ULOCK: ::c_int = 0;
-
-pub const ST_RDONLY: ::c_ulong = 1;
-pub const ST_NOSUID: ::c_ulong = 2;
-pub const ST_NODEV: ::c_ulong = 4;
-pub const ST_NOEXEC: ::c_ulong = 8;
-pub const ST_SYNCHRONOUS: ::c_ulong = 16;
-pub const ST_MANDLOCK: ::c_ulong = 64;
-pub const ST_WRITE: ::c_ulong = 128;
-pub const ST_APPEND: ::c_ulong = 256;
-pub const ST_IMMUTABLE: ::c_ulong = 512;
-pub const ST_NOATIME: ::c_ulong = 1024;
-pub const ST_NODIRATIME: ::c_ulong = 2048;
-
-pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void;
-pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void;
-pub const RTLD_NODELETE: ::c_int = 0x1000;
-pub const RTLD_NOW: ::c_int = 0x2;
-
-pub const TCP_MD5SIG: ::c_int = 14;
-
-pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_MUTEX_T],
-};
-pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_COND_T],
-};
-pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t {
-    __align: [],
-    size: [0; __SIZEOF_PTHREAD_RWLOCK_T],
-};
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-pub const __SIZEOF_PTHREAD_COND_T: usize = 48;
-
-pub const SCHED_OTHER: ::c_int = 0;
-pub const SCHED_FIFO: ::c_int = 1;
-pub const SCHED_RR: ::c_int = 2;
-pub const SCHED_BATCH: ::c_int = 3;
-pub const SCHED_IDLE: ::c_int = 5;
-
-// System V IPC
-pub const IPC_PRIVATE: ::key_t = 0;
-
-pub const IPC_CREAT: ::c_int = 0o1000;
-pub const IPC_EXCL: ::c_int = 0o2000;
-pub const IPC_NOWAIT: ::c_int = 0o4000;
-
-pub const IPC_RMID: ::c_int = 0;
-pub const IPC_SET: ::c_int = 1;
-pub const IPC_STAT: ::c_int = 2;
-pub const IPC_INFO: ::c_int = 3;
-pub const MSG_STAT: ::c_int = 11;
-pub const MSG_INFO: ::c_int = 12;
-
-pub const MSG_NOERROR: ::c_int = 0o10000;
-pub const MSG_EXCEPT: ::c_int = 0o20000;
-
-pub const SHM_R: ::c_int = 0o400;
-pub const SHM_W: ::c_int = 0o200;
-
-pub const SHM_RDONLY: ::c_int = 0o10000;
-pub const SHM_RND: ::c_int = 0o20000;
-pub const SHM_REMAP: ::c_int = 0o40000;
-
-pub const SHM_LOCK: ::c_int = 11;
-pub const SHM_UNLOCK: ::c_int = 12;
-
-pub const SHM_HUGETLB: ::c_int = 0o4000;
-pub const SHM_NORESERVE: ::c_int = 0o10000;
-
-pub const EPOLLRDHUP: ::c_int = 0x2000;
-pub const EPOLLONESHOT: ::c_int = 0x40000000;
-
-pub const QFMT_VFS_OLD: ::c_int = 1;
-pub const QFMT_VFS_V0: ::c_int = 2;
-
-pub const EFD_SEMAPHORE: ::c_int = 0x1;
-
-pub const LOG_NFACILITIES: ::c_int = 24;
-
-pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t;
-
-pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32;
-pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32;
-pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32;
-pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32;
-pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32;
-
-pub const AI_PASSIVE: ::c_int = 0x0001;
-pub const AI_CANONNAME: ::c_int = 0x0002;
-pub const AI_NUMERICHOST: ::c_int = 0x0004;
-pub const AI_V4MAPPED: ::c_int = 0x0008;
-pub const AI_ALL: ::c_int = 0x0010;
-pub const AI_ADDRCONFIG: ::c_int = 0x0020;
-
-pub const AI_NUMERICSERV: ::c_int = 0x0400;
-
-pub const EAI_BADFLAGS: ::c_int = -1;
-pub const EAI_NONAME: ::c_int = -2;
-pub const EAI_AGAIN: ::c_int = -3;
-pub const EAI_FAIL: ::c_int = -4;
-pub const EAI_FAMILY: ::c_int = -6;
-pub const EAI_SOCKTYPE: ::c_int = -7;
-pub const EAI_SERVICE: ::c_int = -8;
-pub const EAI_MEMORY: ::c_int = -10;
-pub const EAI_OVERFLOW: ::c_int = -12;
-
-pub const NI_NUMERICHOST: ::c_int = 1;
-pub const NI_NUMERICSERV: ::c_int = 2;
-pub const NI_NOFQDN: ::c_int = 4;
-pub const NI_NAMEREQD: ::c_int = 8;
-pub const NI_DGRAM: ::c_int = 16;
-
-pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1;
-pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2;
-pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4;
-
-pub const EAI_SYSTEM: ::c_int = -11;
-
-pub const MREMAP_MAYMOVE: ::c_int = 1;
-pub const MREMAP_FIXED: ::c_int = 2;
-
-pub const PR_SET_PDEATHSIG: ::c_int = 1;
-pub const PR_GET_PDEATHSIG: ::c_int = 2;
-
-pub const PR_GET_DUMPABLE: ::c_int = 3;
-pub const PR_SET_DUMPABLE: ::c_int = 4;
-
-pub const PR_GET_UNALIGN: ::c_int = 5;
-pub const PR_SET_UNALIGN: ::c_int = 6;
-pub const PR_UNALIGN_NOPRINT: ::c_int = 1;
-pub const PR_UNALIGN_SIGBUS: ::c_int = 2;
-
-pub const PR_GET_KEEPCAPS: ::c_int = 7;
-pub const PR_SET_KEEPCAPS: ::c_int = 8;
-
-pub const PR_GET_FPEMU: ::c_int = 9;
-pub const PR_SET_FPEMU: ::c_int = 10;
-pub const PR_FPEMU_NOPRINT: ::c_int = 1;
-pub const PR_FPEMU_SIGFPE: ::c_int = 2;
-
-pub const PR_GET_FPEXC: ::c_int = 11;
-pub const PR_SET_FPEXC: ::c_int = 12;
-pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80;
-pub const PR_FP_EXC_DIV: ::c_int = 0x010000;
-pub const PR_FP_EXC_OVF: ::c_int = 0x020000;
-pub const PR_FP_EXC_UND: ::c_int = 0x040000;
-pub const PR_FP_EXC_RES: ::c_int = 0x080000;
-pub const PR_FP_EXC_INV: ::c_int = 0x100000;
-pub const PR_FP_EXC_DISABLED: ::c_int = 0;
-pub const PR_FP_EXC_NONRECOV: ::c_int = 1;
-pub const PR_FP_EXC_ASYNC: ::c_int = 2;
-pub const PR_FP_EXC_PRECISE: ::c_int = 3;
-
-pub const PR_GET_TIMING: ::c_int = 13;
-pub const PR_SET_TIMING: ::c_int = 14;
-pub const PR_TIMING_STATISTICAL: ::c_int = 0;
-pub const PR_TIMING_TIMESTAMP: ::c_int = 1;
-
-pub const PR_SET_NAME: ::c_int = 15;
-pub const PR_GET_NAME: ::c_int = 16;
-
-pub const PR_GET_ENDIAN: ::c_int = 19;
-pub const PR_SET_ENDIAN: ::c_int = 20;
-pub const PR_ENDIAN_BIG: ::c_int = 0;
-pub const PR_ENDIAN_LITTLE: ::c_int = 1;
-pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2;
-
-pub const PR_GET_SECCOMP: ::c_int = 21;
-pub const PR_SET_SECCOMP: ::c_int = 22;
-
-pub const PR_CAPBSET_READ: ::c_int = 23;
-pub const PR_CAPBSET_DROP: ::c_int = 24;
-
-pub const PR_GET_TSC: ::c_int = 25;
-pub const PR_SET_TSC: ::c_int = 26;
-pub const PR_TSC_ENABLE: ::c_int = 1;
-pub const PR_TSC_SIGSEGV: ::c_int = 2;
-
-pub const PR_GET_SECUREBITS: ::c_int = 27;
-pub const PR_SET_SECUREBITS: ::c_int = 28;
-
-pub const PR_SET_TIMERSLACK: ::c_int = 29;
-pub const PR_GET_TIMERSLACK: ::c_int = 30;
-
-pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31;
-pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32;
-
-pub const PR_MCE_KILL: ::c_int = 33;
-pub const PR_MCE_KILL_CLEAR: ::c_int = 0;
-pub const PR_MCE_KILL_SET: ::c_int = 1;
-
-pub const PR_MCE_KILL_LATE: ::c_int = 0;
-pub const PR_MCE_KILL_EARLY: ::c_int = 1;
-pub const PR_MCE_KILL_DEFAULT: ::c_int = 2;
-
-pub const PR_MCE_KILL_GET: ::c_int = 34;
-
-pub const PR_SET_MM: ::c_int = 35;
-pub const PR_SET_MM_START_CODE: ::c_int = 1;
-pub const PR_SET_MM_END_CODE: ::c_int = 2;
-pub const PR_SET_MM_START_DATA: ::c_int = 3;
-pub const PR_SET_MM_END_DATA: ::c_int = 4;
-pub const PR_SET_MM_START_STACK: ::c_int = 5;
-pub const PR_SET_MM_START_BRK: ::c_int = 6;
-pub const PR_SET_MM_BRK: ::c_int = 7;
-pub const PR_SET_MM_ARG_START: ::c_int = 8;
-pub const PR_SET_MM_ARG_END: ::c_int = 9;
-pub const PR_SET_MM_ENV_START: ::c_int = 10;
-pub const PR_SET_MM_ENV_END: ::c_int = 11;
-pub const PR_SET_MM_AUXV: ::c_int = 12;
-pub const PR_SET_MM_EXE_FILE: ::c_int = 13;
-pub const PR_SET_MM_MAP: ::c_int = 14;
-pub const PR_SET_MM_MAP_SIZE: ::c_int = 15;
-
-pub const PR_SET_PTRACER: ::c_int = 0x59616d61;
-
-pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36;
-pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37;
-
-pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38;
-pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39;
-
-pub const PR_GET_TID_ADDRESS: ::c_int = 40;
-
-pub const PR_SET_THP_DISABLE: ::c_int = 41;
-pub const PR_GET_THP_DISABLE: ::c_int = 42;
-
-pub const ABDAY_1: ::nl_item = 0x300;
-pub const ABDAY_2: ::nl_item = 0x301;
-pub const ABDAY_3: ::nl_item = 0x302;
-pub const ABDAY_4: ::nl_item = 0x303;
-pub const ABDAY_5: ::nl_item = 0x304;
-pub const ABDAY_6: ::nl_item = 0x305;
-pub const ABDAY_7: ::nl_item = 0x306;
-
-pub const DAY_1: ::nl_item = 0x307;
-pub const DAY_2: ::nl_item = 0x308;
-pub const DAY_3: ::nl_item = 0x309;
-pub const DAY_4: ::nl_item = 0x30A;
-pub const DAY_5: ::nl_item = 0x30B;
-pub const DAY_6: ::nl_item = 0x30C;
-pub const DAY_7: ::nl_item = 0x30D;
-
-pub const ABMON_1: ::nl_item = 0x30E;
-pub const ABMON_2: ::nl_item = 0x30F;
-pub const ABMON_3: ::nl_item = 0x310;
-pub const ABMON_4: ::nl_item = 0x311;
-pub const ABMON_5: ::nl_item = 0x312;
-pub const ABMON_6: ::nl_item = 0x313;
-pub const ABMON_7: ::nl_item = 0x314;
-pub const ABMON_8: ::nl_item = 0x315;
-pub const ABMON_9: ::nl_item = 0x316;
-pub const ABMON_10: ::nl_item = 0x317;
-pub const ABMON_11: ::nl_item = 0x318;
-pub const ABMON_12: ::nl_item = 0x319;
-
-pub const MON_1: ::nl_item = 0x31A;
-pub const MON_2: ::nl_item = 0x31B;
-pub const MON_3: ::nl_item = 0x31C;
-pub const MON_4: ::nl_item = 0x31D;
-pub const MON_5: ::nl_item = 0x31E;
-pub const MON_6: ::nl_item = 0x31F;
-pub const MON_7: ::nl_item = 0x320;
-pub const MON_8: ::nl_item = 0x321;
-pub const MON_9: ::nl_item = 0x322;
-pub const MON_10: ::nl_item = 0x323;
-pub const MON_11: ::nl_item = 0x324;
-pub const MON_12: ::nl_item = 0x325;
-
-pub const AM_STR: ::nl_item = 0x326;
-pub const PM_STR: ::nl_item = 0x327;
-
-pub const D_T_FMT: ::nl_item = 0x328;
-pub const D_FMT: ::nl_item = 0x329;
-pub const T_FMT: ::nl_item = 0x32A;
-pub const T_FMT_AMPM: ::nl_item = 0x32B;
-
-pub const ERA: ::nl_item = 0x32C;
-pub const ERA_D_FMT: ::nl_item = 0x32E;
-pub const ALT_DIGITS: ::nl_item = 0x32F;
-pub const ERA_D_T_FMT: ::nl_item = 0x330;
-pub const ERA_T_FMT: ::nl_item = 0x331;
-
-pub const CODESET: ::nl_item = 10;
-
-pub const CRNCYSTR: ::nl_item = 0x215;
-
-pub const RADIXCHAR: ::nl_item = 0x100;
-pub const THOUSEP: ::nl_item = 0x101;
-
-pub const NOEXPR: ::nl_item = 0x501;
-pub const YESSTR: ::nl_item = 0x502;
-pub const NOSTR: ::nl_item = 0x503;
-
-pub const FILENAME_MAX: ::c_uint = 4095;
-
-pub const AF_MAX: ::c_int = 39;
-
-f! {
-    pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] &= !(1 << (fd % size));
-        return
-    }
-
-    pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0
-    }
-
-    pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () {
-        let fd = fd as usize;
-        let size = mem::size_of_val(&(*set).fds_bits[0]) * 8;
-        (*set).fds_bits[fd / size] |= 1 << (fd % size);
-        return
-    }
-
-    pub fn FD_ZERO(set: *mut fd_set) -> () {
-        for slot in (*set).fds_bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn WIFSTOPPED(status: ::c_int) -> bool {
-        (status & 0xff) == 0x7f
-    }
-
-    pub fn WSTOPSIG(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xff
-    }
-
-    pub fn WIFCONTINUED(status: ::c_int) -> bool {
-        status == 0xffff
-    }
-
-    pub fn WIFSIGNALED(status: ::c_int) -> bool {
-        ((status & 0x7f) + 1) as i8 >= 2
-    }
-
-    pub fn WTERMSIG(status: ::c_int) -> ::c_int {
-        status & 0x7f
-    }
-
-    pub fn WIFEXITED(status: ::c_int) -> bool {
-        (status & 0x7f) == 0
-    }
-
-    pub fn WEXITSTATUS(status: ::c_int) -> ::c_int {
-        (status >> 8) & 0xff
-    }
-
-    pub fn WCOREDUMP(status: ::c_int) -> bool {
-        (status & 0x80) != 0
-    }
-
-    pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () {
-        for slot in cpuset.bits.iter_mut() {
-            *slot = 0;
-        }
-    }
-
-    pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        cpuset.bits[idx] |= 1 << offset;
-        ()
-    }
-
-    pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        cpuset.bits[idx] &= !(1 << offset);
-        ()
-    }
-
-    pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool {
-        let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]);
-        let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits);
-        0 != (cpuset.bits[idx] & (1 << offset))
-    }
-
-    pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool {
-        set1.bits == set2.bits
-    }
-}
-
-extern {
-    pub fn getpwnam_r(name: *const ::c_char,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn getpwuid_r(uid: ::uid_t,
-                      pwd: *mut passwd,
-                      buf: *mut ::c_char,
-                      buflen: ::size_t,
-                      result: *mut *mut passwd) -> ::c_int;
-    pub fn fdatasync(fd: ::c_int) -> ::c_int;
-    pub fn mincore(addr: *mut ::c_void, len: ::size_t,
-                   vec: *mut ::c_uchar) -> ::c_int;
-    pub fn clock_getres(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_gettime(clk_id: clockid_t, tp: *mut ::timespec) -> ::c_int;
-    pub fn clock_nanosleep(clk_id: clockid_t,
-                           flags: ::c_int,
-                           rqtp: *const ::timespec,
-                           rmtp:  *mut ::timespec) -> ::c_int;
-    pub fn clock_settime(clk_id: clockid_t, tp: *const ::timespec) -> ::c_int;
-    pub fn prctl(option: ::c_int, ...) -> ::c_int;
-    pub fn pthread_getattr_np(native: ::pthread_t,
-                              attr: *mut ::pthread_attr_t) -> ::c_int;
-    pub fn pthread_attr_getguardsize(attr: *const ::pthread_attr_t,
-                                     guardsize: *mut ::size_t) -> ::c_int;
-    pub fn pthread_attr_getstack(attr: *const ::pthread_attr_t,
-                                 stackaddr: *mut *mut ::c_void,
-                                 stacksize: *mut ::size_t) -> ::c_int;
-    pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
-    pub fn setgroups(ngroups: ::size_t,
-                     ptr: *const ::gid_t) -> ::c_int;
-    pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int;
-    pub fn sched_setscheduler(pid: ::pid_t,
-                              policy: ::c_int,
-                              param: *const sched_param) -> ::c_int;
-    pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int;
-    pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int;
-    pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int;
-    pub fn epoll_create(size: ::c_int) -> ::c_int;
-    pub fn epoll_create1(flags: ::c_int) -> ::c_int;
-    pub fn epoll_ctl(epfd: ::c_int,
-                     op: ::c_int,
-                     fd: ::c_int,
-                     event: *mut epoll_event) -> ::c_int;
-    pub fn epoll_wait(epfd: ::c_int,
-                      events: *mut epoll_event,
-                      maxevents: ::c_int,
-                      timeout: ::c_int) -> ::c_int;
-    pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int;
-    pub fn mount(src: *const ::c_char,
-                 target: *const ::c_char,
-                 fstype: *const ::c_char,
-                 flags: ::c_ulong,
-                 data: *const ::c_void) -> ::c_int;
-    pub fn umount(target: *const ::c_char) -> ::c_int;
-    pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int;
-    pub fn clone(cb: extern fn(*mut ::c_void) -> ::c_int,
-                 child_stack: *mut ::c_void,
-                 flags: ::c_int,
-                 arg: *mut ::c_void, ...) -> ::c_int;
-    pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int;
-    pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int;
-    pub fn memrchr(cx: *const ::c_void,
-                   c: ::c_int,
-                   n: ::size_t) -> *mut ::c_void;
-    pub fn syscall(num: ::c_long, ...) -> ::c_long;
-    pub fn sendfile(out_fd: ::c_int,
-                    in_fd: ::c_int,
-                    offset: *mut off_t,
-                    count: ::size_t) -> ::ssize_t;
-    pub fn splice(fd_in: ::c_int,
-                  off_in: *mut ::loff_t,
-                  fd_out: ::c_int,
-                  off_out: *mut ::loff_t,
-                  len: ::size_t,
-                  flags: ::c_uint) -> ::ssize_t;
-    pub fn tee(fd_in: ::c_int,
-               fd_out: ::c_int,
-               len: ::size_t,
-               flags: ::c_uint) -> ::ssize_t;
-    pub fn vmsplice(fd: ::c_int,
-                    iov: *const ::iovec,
-                    nr_segs: ::size_t,
-                    flags: ::c_uint) -> ::ssize_t;
-
-    pub fn posix_fadvise(fd: ::c_int, offset: ::off_t, len: ::off_t,
-                         advise: ::c_int) -> ::c_int;
-    pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int;
-    pub fn utimensat(dirfd: ::c_int, path: *const ::c_char,
-                     times: *const ::timespec, flag: ::c_int) -> ::c_int;
-    pub fn duplocale(base: ::locale_t) -> ::locale_t;
-    pub fn freelocale(loc: ::locale_t);
-    pub fn newlocale(mask: ::c_int,
-                     locale: *const ::c_char,
-                     base: ::locale_t) -> ::locale_t;
-    pub fn uselocale(loc: ::locale_t) -> ::locale_t;
-    pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int;
-    pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int;
-    pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int;
-    pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int;
-    pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t;
-    pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int;
-    pub fn mmap64(addr: *mut ::c_void,
-                  len: ::size_t,
-                  prot: ::c_int,
-                  flags: ::c_int,
-                  fd: ::c_int,
-                  offset: off64_t)
-                  -> *mut ::c_void;
-    pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int;
-    pub fn openat64(fd: ::c_int,
-                    path: *const c_char,
-                    oflag: ::c_int, ...) -> ::c_int;
-    pub fn pread64(fd: ::c_int, buf: *mut ::c_void, count: ::size_t,
-                   offset: off64_t) -> ::ssize_t;
-    pub fn pwrite64(fd: ::c_int, buf: *const ::c_void, count: ::size_t,
-                    offset: off64_t) -> ::ssize_t;
-    pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64;
-    pub fn readdir64_r(dirp: *mut ::DIR, entry: *mut ::dirent64,
-                       result: *mut *mut ::dirent64) -> ::c_int;
-    pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int;
-    pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int;
-    pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int;
-    pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int;
-
-    pub fn fdopendir(fd: ::c_int) -> *mut ::DIR;
-
-    pub fn mknodat(dirfd: ::c_int, pathname: *const ::c_char,
-                   mode: ::mode_t, dev: dev_t) -> ::c_int;
-    pub fn ppoll(fds: *mut ::pollfd,
-                 nfds: nfds_t,
-                 timeout: *const ::timespec,
-                 sigmask: *const sigset_t) -> ::c_int;
-    pub fn pthread_condattr_getclock(attr: *const pthread_condattr_t,
-                                     clock_id: *mut clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setclock(attr: *mut pthread_condattr_t,
-                                     clock_id: clockid_t) -> ::c_int;
-    pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t,
-                                       pshared: ::c_int) -> ::c_int;
-    pub fn pthread_condattr_getpshared(attr: *const pthread_condattr_t,
-                                       pshared: *mut ::c_int) -> ::c_int;
-    pub fn sched_getaffinity(pid: ::pid_t,
-                             cpusetsize: ::size_t,
-                             cpuset: *mut cpu_set_t) -> ::c_int;
-    pub fn sched_setaffinity(pid: ::pid_t,
-                             cpusetsize: ::size_t,
-                             cpuset: *const cpu_set_t) -> ::c_int;
-    pub fn unshare(flags: ::c_int) -> ::c_int;
-    pub fn sem_timedwait(sem: *mut sem_t,
-                         abstime: *const ::timespec) -> ::c_int;
-    pub fn accept4(fd: ::c_int, addr: *mut ::sockaddr, len: *mut ::socklen_t,
-                   flg: ::c_int) -> ::c_int;
-    pub fn pthread_mutex_timedlock(lock: *mut pthread_mutex_t,
-                                   abstime: *const ::timespec) -> ::c_int;
-    pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t,
-                                        pshared: ::c_int) -> ::c_int;
-    pub fn pthread_mutexattr_getpshared(attr: *const pthread_mutexattr_t,
-                                        pshared: *mut ::c_int) -> ::c_int;
-    pub fn ptsname_r(fd: ::c_int,
-                     buf: *mut ::c_char,
-                     buflen: ::size_t) -> ::c_int;
-    pub fn clearenv() -> ::c_int;
-    pub fn waitid(idtype: idtype_t, id: id_t, infop: *mut ::siginfo_t,
-                  options: ::c_int) -> ::c_int;
-
-    pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int;
-
-    pub fn setpwent();
-    pub fn getpwent() -> *mut passwd;
-    pub fn setspent();
-    pub fn endspent();
-    pub fn getspent() -> *mut spwd;
-    pub fn getspnam(__name: *const ::c_char) -> *mut spwd;
-
-    pub fn shm_open(name: *const c_char, oflag: ::c_int,
-                    mode: mode_t) -> ::c_int;
-
-    // System V IPC
-    pub fn shmget(key: ::key_t, size: ::size_t, shmflg: ::c_int) -> ::c_int;
-    pub fn shmat(shmid: ::c_int,
-                 shmaddr: *const ::c_void,
-                 shmflg: ::c_int) -> *mut ::c_void;
-    pub fn shmdt(shmaddr: *const ::c_void) -> ::c_int;
-    pub fn shmctl(shmid: ::c_int,
-                  cmd: ::c_int,
-                  buf: *mut ::shmid_ds) -> ::c_int;
-    pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t;
-    pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) -> ::c_int;
-    pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int;
-    pub fn msgrcv(msqid: ::c_int, msgp: *mut ::c_void, msgsz: ::size_t,
-                  msgtyp: ::c_long, msgflg: ::c_int) -> ::ssize_t;
-    pub fn msgsnd(msqid: ::c_int, msgp: *const ::c_void, msgsz: ::size_t,
-                  msgflg: ::c_int) -> ::c_int;
-
-    pub fn mprotect(addr: *mut ::c_void, len: ::size_t, prot: ::c_int)
-                    -> ::c_int;
-    pub fn __errno_location() -> *mut ::c_int;
-
-    pub fn fopen64(filename: *const c_char,
-                   mode: *const c_char) -> *mut ::FILE;
-    pub fn freopen64(filename: *const c_char, mode: *const c_char,
-                     file: *mut ::FILE) -> *mut ::FILE;
-    pub fn tmpfile64() -> *mut ::FILE;
-    pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int;
-    pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int;
-    pub fn fseeko64(stream: *mut ::FILE,
-                    offset: ::off64_t,
-                    whence: ::c_int) -> ::c_int;
-    pub fn ftello64(stream: *mut ::FILE) -> ::off64_t;
-    pub fn readahead(fd: ::c_int, offset: ::off64_t,
-                     count: ::size_t) -> ::ssize_t;
-    pub fn getxattr(path: *const c_char, name: *const c_char,
-                    value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn lgetxattr(path: *const c_char, name: *const c_char,
-                     value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn fgetxattr(filedes: ::c_int, name: *const c_char,
-                     value: *mut ::c_void, size: ::size_t) -> ::ssize_t;
-    pub fn setxattr(path: *const c_char, name: *const c_char,
-                    value: *const ::c_void, size: ::size_t,
-                    flags: ::c_int) -> ::c_int;
-    pub fn lsetxattr(path: *const c_char, name: *const c_char,
-                     value: *const ::c_void, size: ::size_t,
-                     flags: ::c_int) -> ::c_int;
-    pub fn fsetxattr(filedes: ::c_int, name: *const c_char,
-                     value: *const ::c_void, size: ::size_t,
-                     flags: ::c_int) -> ::c_int;
-    pub fn listxattr(path: *const c_char, list: *mut c_char,
-                     size: ::size_t) -> ::ssize_t;
-    pub fn llistxattr(path: *const c_char, list: *mut c_char,
-                      size: ::size_t) -> ::ssize_t;
-    pub fn flistxattr(filedes: ::c_int, list: *mut c_char,
-                      size: ::size_t) -> ::ssize_t;
-    pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int;
-    pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int;
-    pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int;
-    pub fn signalfd(fd: ::c_int,
-                    mask: *const ::sigset_t,
-                    flags: ::c_int) -> ::c_int;
-    pub fn quotactl(cmd: ::c_int,
-                    special: *const ::c_char,
-                    id: ::c_int,
-                    data: *mut ::c_char) -> ::c_int;
-    pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t;
-    pub fn mq_close(mqd: ::mqd_t) -> ::c_int;
-    pub fn mq_unlink(name: *const ::c_char) -> ::c_int;
-    pub fn mq_receive(mqd: ::mqd_t,
-                      msg_ptr: *mut ::c_char,
-                      msg_len: ::size_t,
-                      msq_prio: *mut ::c_uint) -> ::ssize_t;
-    pub fn mq_send(mqd: ::mqd_t,
-                   msg_ptr: *const ::c_char,
-                   msg_len: ::size_t,
-                   msq_prio: ::c_uint) -> ::c_int;
-    pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int;
-    pub fn mq_setattr(mqd: ::mqd_t,
-                      newattr: *const ::mq_attr,
-                      oldattr: *mut ::mq_attr) -> ::c_int;
-    pub fn epoll_pwait(epfd: ::c_int,
-                       events: *mut ::epoll_event,
-                       maxevents: ::c_int,
-                       timeout: ::c_int,
-                       sigmask: *const ::sigset_t) -> ::c_int;
-    pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int;
-    pub fn sigtimedwait(set: *const sigset_t,
-                        info: *mut siginfo_t,
-                        timeout: *const ::timespec) -> ::c_int;
-    pub fn sigwaitinfo(set: *const sigset_t,
-                       info: *mut siginfo_t) -> ::c_int;
-    pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) -> *mut ::c_char;
-    pub fn prlimit(pid: ::pid_t, resource: ::c_int, new_limit: *const ::rlimit,
-                   old_limit: *mut ::rlimit) -> ::c_int;
-    pub fn prlimit64(pid: ::pid_t,
-                     resource: ::c_int,
-                     new_limit: *const ::rlimit64,
-                     old_limit: *mut ::rlimit64) -> ::c_int;
-    pub fn reboot(how_to: ::c_int) -> ::c_int;
-    pub fn setfsgid(gid: ::gid_t) -> ::c_int;
-    pub fn setfsuid(uid: ::uid_t) -> ::c_int;
-    pub fn setresgid(rgid: ::gid_t, egid: ::gid_t, sgid: ::gid_t) -> ::c_int;
-    pub fn setresuid(ruid: ::uid_t, euid: ::uid_t, suid: ::uid_t) -> ::c_int;
-
-    // Not available now on Android
-    pub fn mkfifoat(dirfd: ::c_int, pathname: *const ::c_char,
-                    mode: ::mode_t) -> ::c_int;
-    pub fn if_nameindex() -> *mut if_nameindex;
-    pub fn if_freenameindex(ptr: *mut if_nameindex);
-    pub fn sync_file_range(fd: ::c_int, offset: ::off64_t,
-                           nbytes: ::off64_t, flags: ::c_uint) -> ::c_int;
-    pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int;
-    pub fn freeifaddrs(ifa: *mut ::ifaddrs);
-
-    pub fn mremap(addr: *mut ::c_void,
-                  len: ::size_t,
-                  new_len: ::size_t,
-                  flags: ::c_int,
-                  ...) -> *mut ::c_void;
-
-    pub fn glob(pattern: *const c_char,
-                flags: ::c_int,
-                errfunc: Option<extern fn(epath: *const c_char,
-                                          errno: ::c_int) -> ::c_int>,
-                pglob: *mut ::glob_t) -> ::c_int;
-    pub fn globfree(pglob: *mut ::glob_t);
-
-    pub fn shm_unlink(name: *const ::c_char) -> ::c_int;
-
-    pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long);
-
-    pub fn telldir(dirp: *mut ::DIR) -> ::c_long;
-    pub fn madvise(addr: *mut ::c_void, len: ::size_t, advice: ::c_int)
-                  -> ::c_int;
-
-    pub fn msync(addr: *mut ::c_void, len: ::size_t, flags: ::c_int) -> ::c_int;
-
-    pub fn recvfrom(socket: ::c_int, buf: *mut ::c_void, len: ::size_t,
-                    flags: ::c_int, addr: *mut ::sockaddr,
-                    addrlen: *mut ::socklen_t) -> ::ssize_t;
-    pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char;
-
-    pub fn bind(socket: ::c_int, address: *const ::sockaddr,
-                address_len: ::socklen_t) -> ::c_int;
-
-    pub fn writev(fd: ::c_int,
-                  iov: *const ::iovec,
-                  iovcnt: ::c_int) -> ::ssize_t;
-    pub fn readv(fd: ::c_int,
-                 iov: *const ::iovec,
-                 iovcnt: ::c_int) -> ::ssize_t;
-
-    pub fn sendmsg(fd: ::c_int,
-                   msg: *const ::msghdr,
-                   flags: ::c_int) -> ::ssize_t;
-    pub fn recvmsg(fd: ::c_int, msg: *mut ::msghdr, flags: ::c_int)
-                   -> ::ssize_t;
-}
-
-cfg_if! {
-    if #[cfg(target_arch = "mips")] {
-        mod mips;
-        pub use self::mips::*;
-    } else if #[cfg(target_arch = "x86_64")] {
-        mod x86_64;
-        pub use self::x86_64::*;
-    } else {
-        pub use unsupported_target;
-    }
-}
-
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/unix/uclibc/x86_64/mod.rs
+++ /dev/null
@@ -1,312 +0,0 @@
-//! Definitions for l4re-uclibc on 64bit systems
-
-pub type blkcnt_t = i64;
-pub type blksize_t = i64;
-pub type c_char = u8;
-pub type c_long = i64;
-pub type c_ulong = u64;
-pub type fsblkcnt_t = ::c_ulong;
-pub type fsfilcnt_t = ::c_ulong;
-pub type fsword_t = ::c_long;
-pub type ino_t = ::c_ulong;
-pub type nlink_t = ::c_uint;
-pub type off_t = ::c_long;
-pub type rlim_t = c_ulong;
-pub type rlim64_t = u64;
-pub type suseconds_t = ::c_long;
-pub type time_t = ::c_int;
-pub type wchar_t = ::c_int;
-
-// ToDo, used?
-//pub type d_ino = ::c_ulong;
-pub type nfds_t = ::c_ulong;
-
-s! {
-    // ------------------------------------------------------------
-    // networking
-    pub struct in_addr {
-        pub s_addr: in_addr_t,
-    }
-
-    pub struct in6_addr {
-        pub s6_addr: [u8; 16],
-        __align: [u32; 0],
-    }
-
-    pub struct sockaddr {
-        pub sa_family: sa_family_t,
-        pub sa_data: [::c_char; 14],
-    }
-
-    pub struct sockaddr_in {
-        pub sin_family: sa_family_t,
-        pub sin_port: ::in_port_t,
-        pub sin_addr: ::in_addr,
-        pub sin_zero: [u8; 8],
-    }
-
-    pub struct sockaddr_in6 {
-        pub sin6_family: sa_family_t,
-        pub sin6_port: in_port_t,
-        pub sin6_flowinfo: u32,
-        pub sin6_addr: ::in6_addr,
-        pub sin6_scope_id: u32,
-    }
-
-    // ------------------------------------------------------------
-    // definitions below are *unverified* and might **break** the software
-    pub struct stat { // ToDo
-        pub st_dev: ::c_ulong,
-        st_pad1: [::c_long; 2],
-        pub st_ino: ::ino_t,
-        pub st_mode: ::mode_t,
-        pub st_nlink: ::nlink_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        pub st_rdev: u64,
-        pub st_pad2: [u64; 1],
-        pub st_size: off_t,
-        st_pad3: ::c_long,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        pub st_blksize: ::blksize_t,
-        st_pad4: ::c_long,
-        pub st_blocks: ::blkcnt_t,
-        st_pad5: [::c_long; 7],
-    }
-
-    pub struct statvfs { // ToDo: broken
-        pub f_bsize: ::c_ulong,
-        pub f_frsize: ::c_ulong,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_favail: ::fsfilcnt_t,
-        #[cfg(target_endian = "little")]
-        pub f_fsid: ::c_ulong,
-        #[cfg(target_pointer_width = "32")]
-        __f_unused: ::c_int,
-        #[cfg(target_endian = "big")]
-        pub f_fsid: ::c_ulong,
-        pub f_flag: ::c_ulong,
-        pub f_namemax: ::c_ulong,
-        __f_spare: [::c_int; 6],
-    }
-
-    pub struct dirent { // Todo
-        pub d_ino: ino_64_t,
-        pub d_off: off64_t,
-        d_reclen: u16,
-        pub d_type: u8,
-        pub d_name: [i8; 256],
-    }
-
-    pub struct dirent64 { //
-        pub d_ino: ino64_t,
-        pub d_off: off64_t,
-        pub d_reclen: u16,
-        pub d_type: u8,
-        pub d_name: [i8; 256],
-    }
-
-    pub struct pthread_attr_t { // ToDo
-        __size: [u64; 7]
-    }
-
-    pub struct sigaction { // TODO!!
-        pub sa_sigaction: ::sighandler_t,
-        pub sa_mask: ::sigset_t,
-        #[cfg(target_arch = "sparc64")]
-        __reserved0: ::c_int,
-        pub sa_flags: ::c_int,
-        _restorer: *mut ::c_void,
-    }
-
-    pub struct stack_t { // ToDo
-        pub ss_sp: *mut ::c_void,
-        pub ss_flags: ::c_int,
-        pub ss_size: ::size_t
-    }
-
-    pub struct statfs { // ToDo
-        pub f_type: fsword_t,
-        pub f_bsize: fsword_t,
-        pub f_blocks: ::fsblkcnt_t,
-        pub f_bfree: ::fsblkcnt_t,
-        pub f_bavail: ::fsblkcnt_t,
-        pub f_files: ::fsfilcnt_t,
-        pub f_ffree: ::fsfilcnt_t,
-        pub f_fsid: ::fsid_t,
-        pub f_namelen: fsword_t,
-        pub f_frsize: fsword_t,
-        f_spare: [fsword_t; 5],
-    }
-
-    pub struct msghdr { // ToDo
-        pub msg_name: *mut ::c_void,
-        pub msg_namelen: ::socklen_t,
-        pub msg_iov: *mut ::iovec,
-        pub msg_iovlen: ::size_t,
-        pub msg_control: *mut ::c_void,
-        pub msg_controllen: ::size_t,
-        pub msg_flags: ::c_int,
-    }
-
-    pub struct termios { // ToDo
-        pub c_iflag: ::tcflag_t,
-        pub c_oflag: ::tcflag_t,
-        pub c_cflag: ::tcflag_t,
-        pub c_lflag: ::tcflag_t,
-        pub c_line: ::cc_t,
-        pub c_cc: [::cc_t; ::NCCS],
-    }
-
-    pub struct sem_t { // ToDo
-        #[cfg(target_pointer_width = "32")]
-        __size: [::c_char; 16],
-        #[cfg(target_pointer_width = "64")]
-        __size: [::c_char; 32],
-        __align: [::c_long; 0],
-    }
-
-    pub struct pthread_mutex_t { // ToDo
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEX_T],
-    }
-
-    pub struct pthread_mutexattr_t { // ToDo
-        #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64",
-                  target_arch = "mips64", target_arch = "s390x",
-                  target_arch = "sparc64"))]
-        __align: [::c_int; 0],
-        #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64",
-                      target_arch = "mips64", target_arch = "s390x",
-                      target_arch = "sparc64")))]
-        __align: [::c_long; 0],
-        size: [u8; __SIZEOF_PTHREAD_MUTEXATTR_T],
-    }
-
-    pub struct pthread_cond_t { // ToDo
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_COND_T],
-    }
-
-    pub struct pthread_condattr_t { // ToDo
-        __align: [::c_int; 0],
-        size: [u8; __SIZEOF_PTHREAD_CONDATTR_T],
-    }
-
-    pub struct pthread_rwlock_t { // ToDo
-        #[cfg(any(target_arch = "mips", target_arch = "arm",
-                  target_arch = "powerpc"))]
-        __align: [::c_long; 0],
-        #[cfg(not(any(target_arch = "mips", target_arch = "arm",
-                      target_arch = "powerpc")))]
-        __align: [::c_longlong; 0],
-        size: [u8; __SIZEOF_PTHREAD_RWLOCK_T],
-    }
-
-    pub struct sigset_t { // ToDo
-        __val: [::c_ulong; 16],
-    }
-
-    pub struct sysinfo { // ToDo
-        pub uptime: ::c_long,
-        pub loads: [::c_ulong; 3],
-        pub totalram: ::c_ulong,
-        pub freeram: ::c_ulong,
-        pub sharedram: ::c_ulong,
-        pub bufferram: ::c_ulong,
-        pub totalswap: ::c_ulong,
-        pub freeswap: ::c_ulong,
-        pub procs: ::c_ushort,
-        pub pad: ::c_ushort,
-        pub totalhigh: ::c_ulong,
-        pub freehigh: ::c_ulong,
-        pub mem_unit: ::c_uint,
-        pub _f: [::c_char; 0],
-    }
-
-    pub struct glob_t { // ToDo
-        pub gl_pathc: ::size_t,
-        pub gl_pathv: *mut *mut c_char,
-        pub gl_offs: ::size_t,
-        pub gl_flags: ::c_int,
-        __unused1: *mut ::c_void,
-        __unused2: *mut ::c_void,
-        __unused3: *mut ::c_void,
-        __unused4: *mut ::c_void,
-        __unused5: *mut ::c_void,
-    }
-
-    pub struct stat64 { // ToDo
-        pub st_dev: ::dev_t,
-        pub st_ino: ::ino64_t,
-        pub st_nlink: ::nlink_t,
-        pub st_mode: ::mode_t,
-        pub st_uid: ::uid_t,
-        pub st_gid: ::gid_t,
-        __pad0: ::c_int,
-        pub st_rdev: ::dev_t,
-        pub st_size: ::off_t,
-        pub st_blksize: ::blksize_t,
-        pub st_blocks: ::blkcnt64_t,
-        pub st_atime: ::time_t,
-        pub st_atime_nsec: ::c_long,
-        pub st_mtime: ::time_t,
-        pub st_mtime_nsec: ::c_long,
-        pub st_ctime: ::time_t,
-        pub st_ctime_nsec: ::c_long,
-        __reserved: [::c_long; 3],
-    }
-
-    pub struct rlimit64 { // ToDo
-        pub rlim_cur: rlim64_t,
-        pub rlim_max: rlim64_t,
-    }
-
-    pub struct cpu_set_t { // ToDo
-        #[cfg(target_pointer_width = "32")]
-        bits: [u32; 32],
-        #[cfg(target_pointer_width = "64")]
-        bits: [u64; 16],
-    }
-
-    pub struct timespec { // ToDo
-        tv_sec: time_t, // seconds
-        tv_nsec: ::c_ulong, // nanoseconds
-    }
-
-    pub struct fsid_t { // ToDo
-        __val: [::c_int; 2],
-    }
-}
-
-// constants
-pub const O_CLOEXEC: ::c_int = 0x80000;
-pub const O_DIRECTORY: ::c_int = 0200000;
-pub const NCCS: usize = 32;
-pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 40;
-pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
-pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0;
-pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1;
-pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2;
-pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL;
-pub const __SIZEOF_PTHREAD_COND_T: usize = 48;
-pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
-pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56;
-
-extern {
-    pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void;
-}
deleted file mode 100644
--- a/third_party/rust/libc-0.2.24/src/windows.rs
+++ /dev/null
@@ -1,235 +0,0 @@
-//! Windows CRT definitions
-
-pub type c_char = i8;
-pub type c_long = i32;
-pub type c_ulong = u32;
-pub type wchar_t = u16;
-
-pub type clock_t = i32;
-
-cfg_if! {
-    if #[cfg(all(target_arch = "x86", target_env = "gnu"))] {
-        pub type time_t = i32;
-    } else {
-        pub type time_t = i64;
-    }
-}
-
-pub type off_t = i32;
-pub type dev_t = u32;
-pub type ino_t = u16;
-pub enum timezone {}
-pub type time64_t = i64;
-
-s! {
-    // note this is the struct called stat64 in Windows. Not stat, nor stati64.
-    pub struct stat {
-        pub st_dev: dev_t,
-        pub st_ino: ino_t,
-        pub st_mode: u16,
-        pub st_nlink: ::c_short,
-        pub st_uid: ::c_short,
-        pub st_gid: ::c_short,
-        pub st_rdev: dev_t,
-        pub st_size: i64,
-        pub st_atime: time64_t,
-        pub st_mtime: time64_t,
-        pub st_ctime: time64_t,
-    }
-
-    // note that this is called utimbuf64 in Windows
-    pub struct utimbuf {
-        pub actime: time64_t,
-        pub modtime: time64_t,
-    }
-
-    pub struct timeval {
-        pub tv_sec: c_long,
-        pub tv_usec: c_long,
-    }
-
-    pub struct timespec {
-        pub tv_sec: time_t,
-        pub tv_nsec: c_long,
-    }
-}
-
-pub const EXIT_FAILURE: ::c_int = 1;
-pub const EXIT_SUCCESS: ::c_int = 0;
-pub const RAND_MAX: ::c_int = 32767;
-pub const EOF: ::c_int = -1;
-pub const SEEK_SET: ::c_int = 0;
-pub const SEEK_CUR: ::c_int = 1;
-pub const SEEK_END: ::c_int = 2;
-pub const _IOFBF: ::c_int = 0;
-pub const _IONBF: ::c_int = 4;
-pub const _IOLBF: ::c_int = 64;
-pub const BUFSIZ: ::c_uint = 512;
-pub const FOPEN_MAX: ::c_uint = 20;
-pub const FILENAME_MAX: ::c_uint = 260;
-
-cfg_if! {
-    if #[cfg(all(target_env = "gnu"))] {
-        pub const L_tmpnam: ::c_uint = 14;
-        pub const TMP_MAX: ::c_uint = 0x7fff;
-    } else if #[cfg(all(target_env = "msvc"))] {
-        pub const L_tmpnam: ::c_uint = 260;
-        pub const TMP_MAX: ::c_uint = 0x7fff_ffff;
-    } else {
-        // Unknown target_env
-    }
-}
-
-pub const O_RDONLY: ::c_int = 0;
-pub const O_WRONLY: ::c_int = 1;
-pub const O_RDWR: ::c_int = 2;
-pub const O_APPEND: ::c_int = 8;
-pub const O_CREAT: ::c_int = 256;
-pub const O_EXCL: ::c_int = 1024;
-pub const O_TEXT: ::c_int = 16384;
-pub const O_BINARY: ::c_int = 32768;
-pub const O_NOINHERIT: ::c_int = 128;
-pub const O_TRUNC: ::c_int = 512;
-pub const S_IFCHR: ::c_int = 8192;
-pub const S_IFDIR: ::c_int = 16384;
-pub const S_IFREG: ::c_int = 32768;
-pub const S_IFMT: ::c_int = 61440;
-pub const S_IEXEC: ::c_int = 64;
-pub const S_IWRITE: ::c_int = 128;
-pub const S_IREAD: ::c_int = 256;
-
-pub const LC_ALL: ::c_int = 0;
-pub const LC_COLLATE: ::c_int = 1;
-pub const LC_CTYPE: ::c_int = 2;
-pub const LC_MONETARY: ::c_int = 3;
-pub const LC_NUMERIC: ::c_int = 4;
-pub const LC_TIME: ::c_int = 5;
-
-pub const EPERM: ::c_int = 1;
-pub const ENOENT: ::c_int = 2;
-pub const ESRCH: ::c_int = 3;
-pub const EINTR: ::c_int = 4;
-pub const EIO: ::c_int = 5;
-pub const ENXIO: ::c_int = 6;
-pub const E2BIG: ::c_int = 7;
-pub const ENOEXEC: ::c_int = 8;
-pub const EBADF: ::c_int = 9;
-pub const ECHILD: ::c_int = 10;
-pub const EAGAIN: ::c_int = 11;
-pub const ENOMEM: ::c_int = 12;
-pub const EACCES: ::c_int = 13;
-pub const EFAULT: ::c_int = 14;
-pub const EBUSY: ::c_int = 16;
-pub const EEXIST: ::c_int = 17;
-pub const EXDEV: ::c_int = 18;
-pub const ENODEV: ::c_int = 19;
-pub const ENOTDIR: ::c_int = 20;
-pub const EISDIR: ::c_int = 21;
-pub const EINVAL: ::c_int = 22;
-pub const ENFILE: ::c_int = 23;
-pub const EMFILE: ::c_int = 24;
-pub const ENOTTY: ::c_int = 25;
-pub const EFBIG: ::c_int = 27;
-pub const ENOSPC: ::c_int = 28;
-pub const ESPIPE: ::c_int = 29;
-pub const EROFS: ::c_int = 30;
-pub const EMLINK: ::c_int = 31;
-pub const EPIPE: ::c_int = 32;
-pub const EDOM: ::c_int = 33;
-pub const ERANGE: ::c_int = 34;
-pub const EDEADLK: ::c_int = 36;
-pub const EDEADLOCK: ::c_int = 36;
-pub const ENAMETOOLONG: ::c_int = 38;
-pub const ENOLCK: ::c_int = 39;
-pub const ENOSYS: ::c_int = 40;
-pub const ENOTEMPTY: ::c_int = 41;
-pub const EILSEQ: ::c_int = 42;
-pub const STRUNCATE: ::c_int = 80;
-
-#[cfg(all(target_env = "msvc", stdbuild))] // " if " -- appease style checker
-#[link(name = "msvcrt", cfg(not(target_feature = "crt-static")))]
-#[link(name = "libcmt", cfg(target_feature = "crt-static"))]
-extern {}
-
-extern {
-    #[link_name = "_chmod"]
-    pub fn chmod(path: *const c_char, mode: ::c_int) -> ::c_int;
-    #[link_name = "_wchmod"]
-    pub fn wchmod(path: *const wchar_t, mode: ::c_int) -> ::c_int;
-    #[link_name = "_mkdir"]
-    pub fn mkdir(path: *const c_char) -> ::c_int;
-    #[link_name = "_wrmdir"]
-    pub fn wrmdir(path: *const wchar_t) -> ::c_int;
-    #[link_name = "_fstat64"]
-    pub fn fstat(fildes: ::c_int, buf: *mut stat) -> ::c_int;
-    #[link_name = "_stat64"]
-    pub fn stat(path: *const c_char, buf: *mut stat) -> ::c_int;
-    #[link_name = "_wstat64"]
-    pub fn wstat(path: *const wchar_t, buf: *mut stat) -> ::c_int;
-    #[link_name = "_wutime64"]
-    pub fn wutime(file: *const wchar_t, buf: *mut utimbuf) -> ::c_int;
-    #[link_name = "_popen"]
-    pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE;
-    #[link_name = "_pclose"]
-    pub fn pclose(stream: *mut ::FILE) -> ::c_int;
-    #[link_name = "_fdopen"]
-    pub fn fdopen(fd: ::c_int, mode: *const c_char) -> *mut ::FILE;
-    #[link_name = "_fileno"]
-    pub fn fileno(stream: *mut ::FILE) -> ::c_int;
-    #[link_name = "_open"]
-    pub fn open(path: *const c_char, oflag: ::c_int, ...) -> ::c_int;
-    #[link_name = "_wopen"]
-    pub fn wopen(path: *const wchar_t, oflag: ::c_int, ...) -> ::c_int;
-    #[link_name = "_creat"]
-    pub fn creat(path: *const c_char, mode: ::c_int) -> ::c_int;
-    #[link_name = "_access"]
-    pub fn access(path: *const c_char, amode: ::c_int) -> ::c_int;
-    #[link_name = "_chdir"]
-    pub fn chdir(dir: *const c_char) -> ::c_int;
-    #[link_name = "_close"]
-    pub fn close(fd: ::c_int) -> ::c_int;
-    #[link_name = "_dup"]
-    pub fn dup(fd: ::c_int) -> ::c_int;
-    #[link_name = "_dup2"]
-    pub fn dup2(src: ::c_int, dst: ::c_int) -> ::c_int;
-    #[link_name = "_execv"]
-    pub fn execv(prog: *const c_char, argv: *const *const c_char) -> ::intptr_t;
-    #[link_name = "_execve"]
-    pub fn execve(prog: *const c_char, argv: *const *const c_char,
-                  envp: *const *const c_char) -> ::c_int;
-    #[link_name = "_execvp"]
-    pub fn execvp(c: *const c_char, argv: *const *const c_char) -> ::c_int;
-    #[link_name = "_execvpe"]
-    pub fn execvpe(c: *const c_char, argv: *const *const c_char,
-                   envp: *const *const c_char) -> ::c_int;
-    #[link_name = "_getcwd"]
-    pub fn getcwd(buf: *mut c_char, size: ::c_int) -> *mut c_char;
-    #[link_name = "_getpid"]
-    pub fn getpid() -> ::c_int;
-    #[link_name = "_isatty"]
-    pub fn isatty(fd: ::c_int) -> ::c_int;
-    #[link_name = "_lseek"]
-    pub fn lseek(fd: ::c_int, offset: c_long, origin: ::c_int) -> c_long;
-    #[link_name = "_pipe"]
-    pub fn pipe(fds: *mut ::c_int,
-                psize: ::c_uint,
-                textmode: ::c_int) -> ::c_int;
-    #[link_name = "_read"]
-    pub fn read(fd: ::c_int, buf: *mut ::c_void, count: ::c_uint) -> ::c_int;
-    #[link_name = "_rmdir"]
-    pub fn rmdir(path: *const c_char) -> ::c_int;
-    #[link_name = "_unlink"]
-    pub fn unlink(c: *const c_char) -> ::c_int;
-    #[link_name = "_write"]
-    pub fn write(fd: ::c_int, buf: *const ::c_void, count: ::c_uint) -> ::c_int;
-    #[link_name = "_commit"]
-    pub fn commit(fd: ::c_int) -> ::c_int;
-    #[link_name = "_get_osfhandle"]
-    pub fn get_osfhandle(fd: ::c_int) -> ::intptr_t;
-    #[link_name = "_open_osfhandle"]
-    pub fn open_osfhandle(osfhandle: ::intptr_t, flags: ::c_int) -> ::c_int;
-    pub fn setlocale(category: ::c_int, locale: *const c_char) -> *mut c_char;
-    #[link_name = "_wsetlocale"]
-    pub fn wsetlocale(category: ::c_int,
-                      locale: *const wchar_t) -> *mut wchar_t;
-}
deleted file mode 100644
--- a/third_party/rust/matches-0.1.4/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"8bbbe858562332a57f5f5551b427e79874ae3c3df52766df61860871288e827a","LICENSE":"d7b49708075b5f43f8e108464f1970c8c66fa8b6afce4f9c944da3af77cc1460","lib.rs":"d927e99fc4fd88b0e30b44580384b411e63bc504e9953ac7cc85029437372266"},"package":"efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/matches-0.1.4/Cargo.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-[package]
-name = "matches"
-version = "0.1.4"
-authors = ["Simon Sapin <simon.sapin@exyr.org>"]
-license = "MIT"
-repository = "https://github.com/SimonSapin/rust-std-candidates"
-description = "A macro to evaluate, as a boolean, whether an expression matches a pattern."
-
-[lib]
-name = "matches"
-path = "lib.rs"
-doctest = false
deleted file mode 100644
--- a/third_party/rust/matches-0.1.4/LICENSE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014-2016 Simon Sapin
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/matches-0.1.4/lib.rs
+++ /dev/null
@@ -1,62 +0,0 @@
-#[macro_export]
-macro_rules! matches {
-    ($expression:expr, $($pattern:tt)+) => {
-        _matches_tt_as_expr_hack! {
-            match $expression {
-                $($pattern)+ => true,
-                _ => false
-            }
-        }
-    }
-}
-
-/// Work around "error: unexpected token: `an interpolated tt`", whatever that means.
-#[macro_export]
-macro_rules! _matches_tt_as_expr_hack {
-    ($value:expr) => ($value)
-}
-
-#[macro_export]
-macro_rules! assert_matches {
-    ($expression:expr, $($pattern:tt)+) => {
-        _matches_tt_as_expr_hack! {
-            match $expression {
-                $($pattern)+ => (),
-                ref e => panic!("assertion failed: `{:?}` does not match `{}`", e, stringify!($($pattern)+)),
-            }
-        }
-    }
-}
-
-#[macro_export]
-macro_rules! debug_assert_matches {
-    ($($arg:tt)*) => (if cfg!(debug_assertions) { assert_matches!($($arg)*); })
-}
-
-#[test]
-fn matches_works() {
-    let foo = Some("-12");
-    assert!(matches!(foo, Some(bar) if
-        matches!(bar.as_bytes()[0], b'+' | b'-') &&
-        matches!(bar.as_bytes()[1], b'0'...b'9')
-    ));
-}
-
-#[test]
-fn assert_matches_works() {
-    let foo = Some("-12");
-    assert_matches!(foo, Some(bar) if
-        matches!(bar.as_bytes()[0], b'+' | b'-') &&
-        matches!(bar.as_bytes()[1], b'0'...b'9')
-    );
-}
-
-#[test]
-#[should_panic(expected = "assertion failed: `Some(\"-AB\")` does not match ")]
-fn assert_matches_panics() {
-    let foo = Some("-AB");
-    assert_matches!(foo, Some(bar) if
-        matches!(bar.as_bytes()[0], b'+' | b'-') &&
-        matches!(bar.as_bytes()[1], b'0'...b'9')
-    );
-}
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"7c44542bc6662b5af4f15a98b2bcf052a57190922eb280bce93688785c31e323","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"5413b7fd49541b0fd15a0719f9b1f052c5c965ae3cdee53258a87557ad981e8b","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","Makefile":"a45a128685a2ae7d4fa39d310786674417ee113055ef290a11f88002285865fc","README.md":"74e385c51a2402527a61a500d66e509fea97961f15bfffab85040064e576fe31","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","appveyor.yml":"b5c1a28f805854370f24e530df912764a9520f4581b33da090f44cec0eef181c","benches/bench.rs":"87cfb76154c3c322691201c6f5649b37665ed8bf1cf303bca971309a4eef6b61","ctags.rust":"3d128d3cc59f702e68953ba2fe6c3f46bc6991fc575308db060482d5da0c79f3","session.vim":"95cb1d7caf0ff7fbe76ec911988d908ddd883381c925ba64b537695bc9f021c4","src/lib.rs":"4c0d116ddfdb0fd4130b4c5690671760401937d4108b1d913a17c3a6fde776b1"},"package":"1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: rust
-rust:
-  - 1.12.0
-  - stable
-  - beta
-  - nightly
-script:
-  - cargo build --verbose --no-default-features
-  - cargo build --verbose
-  - cargo test --verbose
-  - cargo doc
-  - if [ "$TRAVIS_RUST_VERSION" = "nightly" ]; then
-      cargo bench --verbose;
-    fi
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/COPYING
+++ /dev/null
@@ -1,3 +0,0 @@
-This project is dual-licensed under the Unlicense and MIT licenses.
-
-You may use this code under the terms of either license.
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/Cargo.toml
+++ /dev/null
@@ -1,28 +0,0 @@
-[package]
-name = "memchr"
-version = "1.0.1"  #:version
-authors = ["Andrew Gallant <jamslam@gmail.com>", "bluss"]
-description = "Safe interface to memchr."
-documentation = "https://docs.rs/memchr/"
-homepage = "https://github.com/BurntSushi/rust-memchr"
-repository = "https://github.com/BurntSushi/rust-memchr"
-readme = "README.md"
-keywords = ["memchr", "char", "scan", "strchr", "string"]
-license = "Unlicense/MIT"
-
-[lib]
-name = "memchr"
-bench = false
-
-[features]
-default = ["use_std"]
-use_std = ["libc/use_std"]
-
-[dependencies]
-libc = { version = "0.2.18", default-features = false }
-
-[dev-dependencies]
-quickcheck = "0.4.1"
-
-[profile.test]
-opt-level = 3
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/LICENSE-MIT
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Andrew Gallant
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-all:
-	echo Nothing to do...
-
-ctags:
-	ctags --recurse --options=ctags.rust --languages=Rust
-
-docs:
-	cargo doc
-	in-dir ./target/doc fix-perms
-	rscp ./target/doc/* gopher:~/www/burntsushi.net/rustdoc/
-
-push:
-	git push origin master
-	git push github master
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-This crate provides a safe interface `libc`'s `memchr` and `memrchr`.
-This crate also provides fallback implementations when either function is
-unavailable.
-
-[![Build status](https://api.travis-ci.org/BurntSushi/rust-memchr.png)](https://travis-ci.org/BurntSushi/rust-memchr)
-[![Build status](https://ci.appveyor.com/api/projects/status/8i9484t8l4w7uql0/branch/master?svg=true)](https://ci.appveyor.com/project/BurntSushi/rust-memchr/branch/master)
-[![](http://meritbadge.herokuapp.com/memchr)](https://crates.io/crates/memchr)
-
-Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
-
-
-### Documentation
-
-[https://docs.rs/memchr](https://docs.rs/memchr)
-
-### no_std
-
-memchr links to the standard library by default, but you can disable the
-`use_std` feature if you want to use it in a `#![no_std]` crate:
-
-```toml
-[dependencies]
-memchr = { version = "1.0", default-features = false }
-```
-
-### Performance
-
-On my system (Linux/amd64), `memchr` is about an order of magnitude faster than
-the more idiomatic `haystack.iter().position(|&b| b == needle)`:
-
-```
-test iterator          ... bench:       5,280 ns/iter (+/- 13) = 1893 MB/s
-test iterator_reversed ... bench:       5,271 ns/iter (+/- 7) = 1897 MB/s
-test libc_memchr       ... bench:         202 ns/iter (+/- 0) = 49504 MB/s
-test libc_memrchr      ... bench:         197 ns/iter (+/- 1) = 50761 MB/s
-```
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/UNLICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <http://unlicense.org/>
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/appveyor.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: i686-pc-windows-gnu
-install:
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
-  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - SET PATH=%PATH%;C:\MinGW\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo build --verbose
-  - cargo test --verbose
-  - cargo bench --verbose
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/benches/bench.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-#![feature(test)]
-
-extern crate memchr;
-extern crate test;
-
-use std::iter;
-
-fn bench_data() -> Vec<u8> { iter::repeat(b'z').take(10000).collect() }
-
-#[bench]
-fn iterator_memchr(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let needle = b'a';
-    b.iter(|| {
-        assert!(haystack.iter().position(|&b| b == needle).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn optimized_memchr(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let needle = b'a';
-    b.iter(|| {
-        assert!(memchr::memchr(needle, &haystack).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn iterator_memrchr(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let needle = b'a';
-    b.iter(|| {
-        assert!(haystack.iter().rposition(|&b| b == needle).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn optimized_memrchr(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let needle = b'a';
-    b.iter(|| {
-        assert!(memchr::memrchr(needle, &haystack).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn iterator_memchr2(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let (needle1, needle2) = (b'a', b'b');
-    b.iter(|| {
-        assert!(haystack.iter().position(|&b| {
-            b == needle1 || b == needle2
-        }).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn manual_memchr2(b: &mut test::Bencher) {
-    fn find_singles(
-        sparse: &[bool],
-        text: &[u8],
-    ) -> Option<(usize, usize)> {
-        for (hi, &b) in text.iter().enumerate() {
-            if sparse[b as usize] {
-                return Some((hi, hi+1));
-            }
-        }
-        None
-    }
-
-    let haystack = bench_data();
-    let mut sparse = vec![false; 256];
-    sparse[b'a' as usize] = true;
-    sparse[b'b' as usize] = true;
-    b.iter(|| {
-        assert!(find_singles(&sparse, &haystack).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn optimized_memchr2(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let (needle1, needle2) = (b'a', b'b');
-    b.iter(|| {
-        assert!(memchr::memchr2(needle1, needle2, &haystack).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn iterator_memchr3(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let (needle1, needle2, needle3) = (b'a', b'b', b'c');
-    b.iter(|| {
-        assert!(haystack.iter().position(|&b| {
-            b == needle1 || b == needle2 || b == needle3
-        }).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
-
-#[bench]
-fn optimized_memchr3(b: &mut test::Bencher) {
-    let haystack = bench_data();
-    let (needle1, needle2, needle3) = (b'a', b'b', b'c');
-    b.iter(|| {
-        assert!(memchr::memchr3(
-            needle1, needle2, needle3, &haystack).is_none());
-    });
-    b.bytes = haystack.len() as u64;
-}
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/ctags.rust
+++ /dev/null
@@ -1,11 +0,0 @@
---langdef=Rust
---langmap=Rust:.rs
---regex-Rust=/^[ \t]*(#\[[^\]]\][ \t]*)*(pub[ \t]+)?(extern[ \t]+)?("[^"]+"[ \t]+)?(unsafe[ \t]+)?fn[ \t]+([a-zA-Z0-9_]+)/\6/f,functions,function definitions/
---regex-Rust=/^[ \t]*(pub[ \t]+)?type[ \t]+([a-zA-Z0-9_]+)/\2/T,types,type definitions/
---regex-Rust=/^[ \t]*(pub[ \t]+)?enum[ \t]+([a-zA-Z0-9_]+)/\2/g,enum,enumeration names/
---regex-Rust=/^[ \t]*(pub[ \t]+)?struct[ \t]+([a-zA-Z0-9_]+)/\2/s,structure names/
---regex-Rust=/^[ \t]*(pub[ \t]+)?mod[ \t]+([a-zA-Z0-9_]+)/\2/m,modules,module names/
---regex-Rust=/^[ \t]*(pub[ \t]+)?static[ \t]+([a-zA-Z0-9_]+)/\2/c,consts,static constants/
---regex-Rust=/^[ \t]*(pub[ \t]+)?trait[ \t]+([a-zA-Z0-9_]+)/\2/t,traits,traits/
---regex-Rust=/^[ \t]*(pub[ \t]+)?impl([ \t\n]+<.*>)?[ \t]+([a-zA-Z0-9_]+)/\3/i,impls,trait implementations/
---regex-Rust=/^[ \t]*macro_rules![ \t]+([a-zA-Z0-9_]+)/\1/d,macros,macro definitions/
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/session.vim
+++ /dev/null
@@ -1,1 +0,0 @@
-au BufWritePost *.rs silent!make ctags > /dev/null 2>&1
deleted file mode 100644
--- a/third_party/rust/memchr-1.0.1/src/lib.rs
+++ /dev/null
@@ -1,877 +0,0 @@
-/*!
-This crate defines two functions, `memchr` and `memrchr`, which expose a safe interface
-to the corresponding functions in `libc`.
-*/
-
-#![deny(missing_docs)]
-#![allow(unused_imports)]
-
-#![cfg_attr(not(feature = "use_std"), no_std)]
-
-#[cfg(all(test, not(feature = "use_std")))]
-#[macro_use]
-extern crate std;
-
-extern crate libc;
-
-use libc::c_void;
-use libc::{c_int, size_t};
-
-#[cfg(feature = "use_std")]
-use std::cmp;
-#[cfg(not(feature = "use_std"))]
-use core::cmp;
-
-const LO_U64: u64 = 0x0101010101010101;
-const HI_U64: u64 = 0x8080808080808080;
-
-// use truncation
-const LO_USIZE: usize = LO_U64 as usize;
-const HI_USIZE: usize = HI_U64 as usize;
-
-#[cfg(target_pointer_width = "32")]
-const USIZE_BYTES: usize = 4;
-#[cfg(target_pointer_width = "64")]
-const USIZE_BYTES: usize = 8;
-
-/// Return `true` if `x` contains any zero byte.
-///
-/// From *Matters Computational*, J. Arndt
-///
-/// "The idea is to subtract one from each of the bytes and then look for
-/// bytes where the borrow propagated all the way to the most significant
-/// bit."
-#[inline]
-fn contains_zero_byte(x: usize) -> bool {
-    x.wrapping_sub(LO_USIZE) & !x & HI_USIZE != 0
-}
-
-#[cfg(target_pointer_width = "32")]
-#[inline]
-fn repeat_byte(b: u8) -> usize {
-    let mut rep = (b as usize) << 8 | b as usize;
-    rep = rep << 16 | rep;
-    rep
-}
-
-#[cfg(target_pointer_width = "64")]
-#[inline]
-fn repeat_byte(b: u8) -> usize {
-    let mut rep = (b as usize) << 8 | b as usize;
-    rep = rep << 16 | rep;
-    rep = rep << 32 | rep;
-    rep
-}
-
-/// An iterator for memchr
-pub struct Memchr<'a> {
-    needle: u8,
-    // The haystack to iterate over
-    haystack: &'a [u8],
-    // The index
-    position: usize,
-    rposition: usize,
-}
-
-impl<'a> Memchr<'a> {
-    /// Creates a new iterator that yields all positions of needle in haystack.
-    pub fn new(needle: u8, haystack: &[u8]) -> Memchr {
-        Memchr {
-            needle: needle,
-            haystack: haystack,
-            position: 0,
-            rposition: 0,
-        }
-    }
-}
-
-impl<'a> Iterator for Memchr<'a> {
-    type Item = usize;
-
-    fn next(&mut self) -> Option<usize> {
-        let search_result = memchr(self.needle, &self.haystack);
-        match search_result {
-            Some(index) => {
-                // Move our internal position
-                self.haystack = self.haystack.split_at(index + 1).1;
-                self.position = self.position + index + 1;
-                Some(self.position)
-            }
-            None => None,
-        }
-    }
-}
-
-impl<'a> DoubleEndedIterator for Memchr<'a> {
-    fn next_back(&mut self) -> Option<Self::Item> {
-        let search_result = memrchr(self.needle, &self.haystack);
-        match search_result {
-            Some(index) => {
-                // Move our internal position
-                self.haystack = self.haystack.split_at(index).0;
-                if self.rposition > 0{
-                    //memrchr has been used once already.
-                    self.rposition = self.rposition - index;
-                    return Some(self.rposition);
-                }else{
-                    return Some(self.position + index+1);
-                }
-            }
-            None => None,
-        }
-    }
-}
-
-/// A safe interface to `memchr`.
-///
-/// Returns the index corresponding to the first occurrence of `needle` in
-/// `haystack`, or `None` if one is not found.
-///
-/// memchr reduces to super-optimized machine code at around an order of
-/// magnitude faster than `haystack.iter().position(|&b| b == needle)`.
-/// (See benchmarks.)
-///
-/// # Example
-///
-/// This shows how to find the first position of a byte in a byte string.
-///
-/// ```rust
-/// use memchr::memchr;
-///
-/// let haystack = b"the quick brown fox";
-/// assert_eq!(memchr(b'k', haystack), Some(8));
-/// ```
-#[inline(always)] // reduces constant overhead
-pub fn memchr(needle: u8, haystack: &[u8]) -> Option<usize> {
-    // libc memchr
-    #[cfg(any(not(target_os = "windows"),
-              not(any(target_pointer_width = "32",
-                      target_pointer_width = "64"))))]
-    #[inline(always)] // reduces constant overhead
-    fn memchr_specific(needle: u8, haystack: &[u8]) -> Option<usize> {
-        use libc::memchr as libc_memchr;
-
-        let p = unsafe {
-            libc_memchr(haystack.as_ptr() as *const c_void,
-                        needle as c_int,
-                        haystack.len() as size_t)
-        };
-        if p.is_null() {
-            None
-        } else {
-            Some(p as usize - (haystack.as_ptr() as usize))
-        }
-    }
-
-    // use fallback on windows, since it's faster
-    #[cfg(all(target_os = "windows",
-              any(target_pointer_width = "32",
-                  target_pointer_width = "64")))]
-    fn memchr_specific(needle: u8, haystack: &[u8]) -> Option<usize> {
-        fallback::memchr(needle, haystack)
-    }
-
-    memchr_specific(needle, haystack)
-}
-
-/// A safe interface to `memrchr`.
-///
-/// Returns the index corresponding to the last occurrence of `needle` in
-/// `haystack`, or `None` if one is not found.
-///
-/// # Example
-///
-/// This shows how to find the last position of a byte in a byte string.
-///
-/// ```rust
-/// use memchr::memrchr;
-///
-/// let haystack = b"the quick brown fox";
-/// assert_eq!(memrchr(b'o', haystack), Some(17));
-/// ```
-#[inline(always)] // reduces constant overhead
-pub fn memrchr(needle: u8, haystack: &[u8]) -> Option<usize> {
-
-    #[cfg(target_os = "linux")]
-    #[inline(always)] // reduces constant overhead
-    fn memrchr_specific(needle: u8, haystack: &[u8]) -> Option<usize> {
-        // GNU's memrchr() will - unlike memchr() - error if haystack is empty.
-        if haystack.is_empty() {
-            return None;
-        }
-        let p = unsafe {
-            libc::memrchr(haystack.as_ptr() as *const c_void,
-                          needle as c_int,
-                          haystack.len() as size_t)
-        };
-        if p.is_null() {
-            None
-        } else {
-            Some(p as usize - (haystack.as_ptr() as usize))
-        }
-    }
-
-    #[cfg(all(not(target_os = "linux"),
-              any(target_pointer_width = "32", target_pointer_width = "64")))]
-    fn memrchr_specific(needle: u8, haystack: &[u8]) -> Option<usize> {
-        fallback::memrchr(needle, haystack)
-    }
-
-    // For the rare case of neither 32 bit nor 64-bit platform.
-    #[cfg(all(not(target_os = "linux"),
-              not(target_pointer_width = "32"),
-              not(target_pointer_width = "64")))]
-    fn memrchr_specific(needle: u8, haystack: &[u8]) -> Option<usize> {
-        haystack.iter().rposition(|&b| b == needle)
-    }
-
-    memrchr_specific(needle, haystack)
-}
-
-/// An iterator for Memchr2
-pub struct Memchr2<'a> {
-    needle1: u8,
-    needle2: u8,
-    // The haystack to iterate over
-    haystack: &'a [u8],
-    // The index
-    position: usize,
-}
-
-impl<'a> Memchr2<'a> {
-    /// Creates a new iterator that yields all positions of needle in haystack.
-    pub fn new(needle1: u8, needle2: u8, haystack: &[u8]) -> Memchr2 {
-        Memchr2 {
-            needle1: needle1,
-            needle2: needle2,
-            haystack: haystack,
-            position: 0,
-        }
-    }
-}
-
-impl<'a> Iterator for Memchr2<'a> {
-    type Item = usize;
-
-    fn next(&mut self) -> Option<usize> {
-        let search_result = memchr2(self.needle1, self.needle2, &self.haystack);
-        match search_result {
-            Some(index) => {
-                // Move our internal position
-                self.haystack = self.haystack.split_at(index + 1).1;
-                self.position = self.position + index + 1;
-                Some(self.position)
-            }
-            None => None,
-        }
-    }
-}
-
-
-/// Like `memchr`, but searches for two bytes instead of one.
-pub fn memchr2(needle1: u8, needle2: u8, haystack: &[u8]) -> Option<usize> {
-    fn slow(b1: u8, b2: u8, haystack: &[u8]) -> Option<usize> {
-        haystack.iter().position(|&b| b == b1 || b == b2)
-    }
-
-    let len = haystack.len();
-    let ptr = haystack.as_ptr();
-    let align = (ptr as usize) & (USIZE_BYTES - 1);
-    let mut i = 0;
-    if align > 0 {
-        i = cmp::min(USIZE_BYTES - align, len);
-        if let Some(found) = slow(needle1, needle2, &haystack[..i]) {
-            return Some(found);
-        }
-    }
-    let repeated_b1 = repeat_byte(needle1);
-    let repeated_b2 = repeat_byte(needle2);
-    if len >= USIZE_BYTES {
-        while i <= len - USIZE_BYTES {
-            unsafe {
-                let u = *(ptr.offset(i as isize) as *const usize);
-                let found_ub1 = contains_zero_byte(u ^ repeated_b1);
-                let found_ub2 = contains_zero_byte(u ^ repeated_b2);
-                if found_ub1 || found_ub2 {
-                    break;
-                }
-            }
-            i += USIZE_BYTES;
-        }
-    }
-    slow(needle1, needle2, &haystack[i..]).map(|pos| i + pos)
-}
-
-/// An iterator for Memchr3
-pub struct Memchr3<'a> {
-    needle1: u8,
-    needle2: u8,
-    needle3: u8,
-    // The haystack to iterate over
-    haystack: &'a [u8],
-    // The index
-    position: usize,
-}
-
-impl<'a> Memchr3<'a> {
-    /// Create a new Memchr2 that's initalized to zero with a haystack
-    pub fn new(needle1: u8, needle2: u8, needle3: u8, haystack: &[u8]) -> Memchr3 {
-        Memchr3 {
-            needle1: needle1,
-            needle2: needle2,
-            needle3: needle3,
-            haystack: haystack,
-            position: 0,
-        }
-    }
-}
-
-impl<'a> Iterator for Memchr3<'a> {
-    type Item = usize;
-
-    fn next(&mut self) -> Option<usize> {
-        let search_result = memchr3(self.needle1, self.needle2, self.needle3, &self.haystack);
-        match search_result {
-            Some(index) => {
-                // Move our internal position
-                self.haystack = self.haystack.split_at(index + 1).1;
-                self.position = self.position + index + 1;
-                Some(self.position)
-            }
-            None => None,
-        }
-    }
-}
-
-/// Like `memchr`, but searches for three bytes instead of one.
-pub fn memchr3(needle1: u8, needle2: u8, needle3: u8, haystack: &[u8]) -> Option<usize> {
-    fn slow(b1: u8, b2: u8, b3: u8, haystack: &[u8]) -> Option<usize> {
-        haystack.iter().position(|&b| b == b1 || b == b2 || b == b3)
-    }
-
-    let len = haystack.len();
-    let ptr = haystack.as_ptr();
-    let align = (ptr as usize) & (USIZE_BYTES - 1);
-    let mut i = 0;
-    if align > 0 {
-        i = cmp::min(USIZE_BYTES - align, len);
-        if let Some(found) = slow(needle1, needle2, needle3, &haystack[..i]) {
-            return Some(found);
-        }
-    }
-    let repeated_b1 = repeat_byte(needle1);
-    let repeated_b2 = repeat_byte(needle2);
-    let repeated_b3 = repeat_byte(needle3);
-    if len >= USIZE_BYTES {
-        while i <= len - USIZE_BYTES {
-            unsafe {
-                let u = *(ptr.offset(i as isize) as *const usize);
-                let found_ub1 = contains_zero_byte(u ^ repeated_b1);
-                let found_ub2 = contains_zero_byte(u ^ repeated_b2);
-                let found_ub3 = contains_zero_byte(u ^ repeated_b3);
-                if found_ub1 || found_ub2 || found_ub3 {
-                    break;
-                }
-            }
-            i += USIZE_BYTES;
-        }
-    }
-    slow(needle1, needle2, needle3, &haystack[i..]).map(|pos| i + pos)
-}
-
-#[allow(dead_code)]
-#[cfg(any(test, all(not(target_os = "linux"),
-          any(target_pointer_width = "32", target_pointer_width = "64"))))]
-mod fallback {
-    #[cfg(feature = "use_std")]
-    use std::cmp;
-    #[cfg(not(feature = "use_std"))]
-    use core::cmp;
-
-    use super::{LO_U64, HI_U64, LO_USIZE, HI_USIZE, USIZE_BYTES, contains_zero_byte, repeat_byte};
-
-    /// Return the first index matching the byte `a` in `text`.
-    pub fn memchr(x: u8, text: &[u8]) -> Option<usize> {
-        // Scan for a single byte value by reading two `usize` words at a time.
-        //
-        // Split `text` in three parts
-        // - unaligned inital part, before the first word aligned address in text
-        // - body, scan by 2 words at a time
-        // - the last remaining part, < 2 word size
-        let len = text.len();
-        let ptr = text.as_ptr();
-
-        // search up to an aligned boundary
-        let align = (ptr as usize) & (USIZE_BYTES - 1);
-        let mut offset;
-        if align > 0 {
-            offset = cmp::min(USIZE_BYTES - align, len);
-            if let Some(index) = text[..offset].iter().position(|elt| *elt == x) {
-                return Some(index);
-            }
-        } else {
-            offset = 0;
-        }
-
-        // search the body of the text
-        let repeated_x = repeat_byte(x);
-
-        if len >= 2 * USIZE_BYTES {
-            while offset <= len - 2 * USIZE_BYTES {
-                debug_assert_eq!((ptr as usize + offset) % USIZE_BYTES, 0);
-                unsafe {
-                    let u = *(ptr.offset(offset as isize) as *const usize);
-                    let v = *(ptr.offset((offset + USIZE_BYTES) as isize) as *const usize);
-
-                    // break if there is a matching byte
-                    let zu = contains_zero_byte(u ^ repeated_x);
-                    let zv = contains_zero_byte(v ^ repeated_x);
-                    if zu || zv {
-                        break;
-                    }
-                }
-                offset += USIZE_BYTES * 2;
-            }
-        }
-
-        // find the byte after the point the body loop stopped
-        text[offset..].iter().position(|elt| *elt == x).map(|i| offset + i)
-    }
-
-    /// Return the last index matching the byte `a` in `text`.
-    pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
-        // Scan for a single byte value by reading two `usize` words at a time.
-        //
-        // Split `text` in three parts
-        // - unaligned tail, after the last word aligned address in text
-        // - body, scan by 2 words at a time
-        // - the first remaining bytes, < 2 word size
-        let len = text.len();
-        let ptr = text.as_ptr();
-
-        // search to an aligned boundary
-        let end_align = (ptr as usize + len) & (USIZE_BYTES - 1);
-        let mut offset;
-        if end_align > 0 {
-            offset = if end_align >= len { 0 } else { len - end_align };
-            if let Some(index) = text[offset..].iter().rposition(|elt| *elt == x) {
-                return Some(offset + index);
-            }
-        } else {
-            offset = len;
-        }
-
-        // search the body of the text
-        let repeated_x = repeat_byte(x);
-
-        while offset >= 2 * USIZE_BYTES {
-            debug_assert_eq!((ptr as usize + offset) % USIZE_BYTES, 0);
-            unsafe {
-                let u = *(ptr.offset(offset as isize - 2 * USIZE_BYTES as isize) as *const usize);
-                let v = *(ptr.offset(offset as isize - USIZE_BYTES as isize) as *const usize);
-
-                // break if there is a matching byte
-                let zu = contains_zero_byte(u ^ repeated_x);
-                let zv = contains_zero_byte(v ^ repeated_x);
-                if zu || zv {
-                    break;
-                }
-            }
-            offset -= 2 * USIZE_BYTES;
-        }
-
-        // find the byte before the point the body loop stopped
-        text[..offset].iter().rposition(|elt| *elt == x)
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    extern crate quickcheck;
-    use std::prelude::v1::*;
-
-    use super::{memchr, memrchr, memchr2, memchr3, Memchr, Memchr2, Memchr3};
-    // Use a macro to test both native and fallback impls on all configurations
-    macro_rules! memchr_tests {
-        ($mod_name:ident, $memchr:path, $memrchr:path) => {
-            mod $mod_name {
-            use std::prelude::v1::*;
-            use super::quickcheck;
-            #[test]
-            fn matches_one() {
-                assert_eq!(Some(0), $memchr(b'a', b"a"));
-            }
-
-            #[test]
-            fn matches_begin() {
-                assert_eq!(Some(0), $memchr(b'a', b"aaaa"));
-            }
-
-            #[test]
-            fn matches_end() {
-                assert_eq!(Some(4), $memchr(b'z', b"aaaaz"));
-            }
-
-            #[test]
-            fn matches_nul() {
-                assert_eq!(Some(4), $memchr(b'\x00', b"aaaa\x00"));
-            }
-
-            #[test]
-            fn matches_past_nul() {
-                assert_eq!(Some(5), $memchr(b'z', b"aaaa\x00z"));
-            }
-
-            #[test]
-            fn no_match_empty() {
-                assert_eq!(None, $memchr(b'a', b""));
-            }
-
-            #[test]
-            fn no_match() {
-                assert_eq!(None, $memchr(b'a', b"xyz"));
-            }
-
-            #[test]
-            fn qc_never_fail() {
-                fn prop(needle: u8, haystack: Vec<u8>) -> bool {
-                    $memchr(needle, &haystack); true
-                }
-                quickcheck::quickcheck(prop as fn(u8, Vec<u8>) -> bool);
-            }
-
-            #[test]
-            fn matches_one_reversed() {
-                assert_eq!(Some(0), $memrchr(b'a', b"a"));
-            }
-
-            #[test]
-            fn matches_begin_reversed() {
-                assert_eq!(Some(3), $memrchr(b'a', b"aaaa"));
-            }
-
-            #[test]
-            fn matches_end_reversed() {
-                assert_eq!(Some(0), $memrchr(b'z', b"zaaaa"));
-            }
-
-            #[test]
-            fn matches_nul_reversed() {
-                assert_eq!(Some(4), $memrchr(b'\x00', b"aaaa\x00"));
-            }
-
-            #[test]
-            fn matches_past_nul_reversed() {
-                assert_eq!(Some(0), $memrchr(b'z', b"z\x00aaaa"));
-            }
-
-            #[test]
-            fn no_match_empty_reversed() {
-                assert_eq!(None, $memrchr(b'a', b""));
-            }
-
-            #[test]
-            fn no_match_reversed() {
-                assert_eq!(None, $memrchr(b'a', b"xyz"));
-            }
-
-            #[test]
-            fn qc_never_fail_reversed() {
-                fn prop(needle: u8, haystack: Vec<u8>) -> bool {
-                    $memrchr(needle, &haystack); true
-                }
-                quickcheck::quickcheck(prop as fn(u8, Vec<u8>) -> bool);
-            }
-
-            #[test]
-            fn qc_correct_memchr() {
-                fn prop(v: Vec<u8>, offset: u8) -> bool {
-                    // test all pointer alignments
-                    let uoffset = (offset & 0xF) as usize;
-                    let data = if uoffset <= v.len() {
-                        &v[uoffset..]
-                    } else {
-                        &v[..]
-                    };
-                    for byte in 0..256u32 {
-                        let byte = byte as u8;
-                        if $memchr(byte, &data) != data.iter().position(|elt| *elt == byte) {
-                            return false;
-                        }
-                    }
-                    true
-                }
-                quickcheck::quickcheck(prop as fn(Vec<u8>, u8) -> bool);
-            }
-
-            #[test]
-            fn qc_correct_memrchr() {
-                fn prop(v: Vec<u8>, offset: u8) -> bool {
-                    // test all pointer alignments
-                    let uoffset = (offset & 0xF) as usize;
-                    let data = if uoffset <= v.len() {
-                        &v[uoffset..]
-                    } else {
-                        &v[..]
-                    };
-                    for byte in 0..256u32 {
-                        let byte = byte as u8;
-                        if $memrchr(byte, &data) != data.iter().rposition(|elt| *elt == byte) {
-                            return false;
-                        }
-                    }
-                    true
-                }
-                quickcheck::quickcheck(prop as fn(Vec<u8>, u8) -> bool);
-            }
-            }
-        }
-    }
-
-    memchr_tests! { native, ::memchr, ::memrchr }
-    memchr_tests! { fallback, ::fallback::memchr, ::fallback::memrchr }
-
-    #[test]
-    fn memchr2_matches_one() {
-        assert_eq!(Some(0), memchr2(b'a', b'b', b"a"));
-        assert_eq!(Some(0), memchr2(b'a', b'b', b"b"));
-        assert_eq!(Some(0), memchr2(b'b', b'a', b"a"));
-        assert_eq!(Some(0), memchr2(b'b', b'a', b"b"));
-    }
-
-    #[test]
-    fn memchr2_matches_begin() {
-        assert_eq!(Some(0), memchr2(b'a', b'b', b"aaaa"));
-        assert_eq!(Some(0), memchr2(b'a', b'b', b"bbbb"));
-    }
-
-    #[test]
-    fn memchr2_matches_end() {
-        assert_eq!(Some(4), memchr2(b'z', b'y', b"aaaaz"));
-        assert_eq!(Some(4), memchr2(b'z', b'y', b"aaaay"));
-    }
-
-    #[test]
-    fn memchr2_matches_nul() {
-        assert_eq!(Some(4), memchr2(b'\x00', b'z', b"aaaa\x00"));
-        assert_eq!(Some(4), memchr2(b'z', b'\x00', b"aaaa\x00"));
-    }
-
-    #[test]
-    fn memchr2_matches_past_nul() {
-        assert_eq!(Some(5), memchr2(b'z', b'y', b"aaaa\x00z"));
-        assert_eq!(Some(5), memchr2(b'y', b'z', b"aaaa\x00z"));
-    }
-
-    #[test]
-    fn memchr2_no_match_empty() {
-        assert_eq!(None, memchr2(b'a', b'b', b""));
-        assert_eq!(None, memchr2(b'b', b'a', b""));
-    }
-
-    #[test]
-    fn memchr2_no_match() {
-        assert_eq!(None, memchr2(b'a', b'b', b"xyz"));
-    }
-
-    #[test]
-    fn qc_never_fail_memchr2() {
-        fn prop(needle1: u8, needle2: u8, haystack: Vec<u8>) -> bool {
-            memchr2(needle1, needle2, &haystack);
-            true
-        }
-        quickcheck::quickcheck(prop as fn(u8, u8, Vec<u8>) -> bool);
-    }
-
-    #[test]
-    fn memchr3_matches_one() {
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"a"));
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"b"));
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"c"));
-    }
-
-    #[test]
-    fn memchr3_matches_begin() {
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"aaaa"));
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"bbbb"));
-        assert_eq!(Some(0), memchr3(b'a', b'b', b'c', b"cccc"));
-    }
-
-    #[test]
-    fn memchr3_matches_end() {
-        assert_eq!(Some(4), memchr3(b'z', b'y', b'x', b"aaaaz"));
-        assert_eq!(Some(4), memchr3(b'z', b'y', b'x', b"aaaay"));
-        assert_eq!(Some(4), memchr3(b'z', b'y', b'x', b"aaaax"));
-    }
-
-    #[test]
-    fn memchr3_matches_nul() {
-        assert_eq!(Some(4), memchr3(b'\x00', b'z', b'y', b"aaaa\x00"));
-        assert_eq!(Some(4), memchr3(b'z', b'\x00', b'y', b"aaaa\x00"));
-        assert_eq!(Some(4), memchr3(b'z', b'y', b'\x00', b"aaaa\x00"));
-    }
-
-    #[test]
-    fn memchr3_matches_past_nul() {
-        assert_eq!(Some(5), memchr3(b'z', b'y', b'x', b"aaaa\x00z"));
-        assert_eq!(Some(5), memchr3(b'y', b'z', b'x', b"aaaa\x00z"));
-        assert_eq!(Some(5), memchr3(b'y', b'x', b'z', b"aaaa\x00z"));
-    }
-
-    #[test]
-    fn memchr3_no_match_empty() {
-        assert_eq!(None, memchr3(b'a', b'b', b'c', b""));
-        assert_eq!(None, memchr3(b'b', b'a', b'c', b""));
-        assert_eq!(None, memchr3(b'c', b'b', b'a', b""));
-    }
-
-    #[test]
-    fn memchr3_no_match() {
-        assert_eq!(None, memchr3(b'a', b'b', b'c', b"xyz"));
-    }
-
-    #[test]
-    fn memchr_iter() {
-        let haystack = b"aaaabaaaab";
-        let mut memchr_iter = Memchr::new(b'b', haystack);
-        let first = memchr_iter.next();
-        let second = memchr_iter.next();
-        let third = memchr_iter.next();
-        assert_eq!(Some(5), first);
-        assert_eq!(Some(10), second);
-        assert_eq!(None, third);
-    }
-
-    #[test]
-    fn memchr2_iter() {
-        let haystack = b"ab";
-        let mut memchr_iter = Memchr2::new(b'a', b'b', haystack);
-        let first = memchr_iter.next();
-        let second = memchr_iter.next();
-        let third = memchr_iter.next();
-        assert_eq!(Some(1), first);
-        assert_eq!(Some(2), second);
-        assert_eq!(None, third);
-    }
-
-    #[test]
-    fn memchr3_iter() {
-        let haystack = b"abc";
-        let mut memchr_iter = Memchr3::new(b'a', b'b', b'c', haystack);
-        let first = memchr_iter.next();
-        let second = memchr_iter.next();
-        let third = memchr_iter.next();
-        let fourth = memchr_iter.next();
-        assert_eq!(Some(1), first);
-        assert_eq!(Some(2), second);
-        assert_eq!(Some(3), third);
-        assert_eq!(None, fourth);
-    }
-
-    #[test]
-    fn memchr_reverse_iter() {
-        let haystack = b"aaaabaaaabaaaab";
-        let mut memchr_iter = Memchr::new(b'b', haystack);
-        let first = memchr_iter.next();
-        let second = memchr_iter.next_back();
-        let third = memchr_iter.next();
-        let fourth = memchr_iter.next_back();
-
-        assert_eq!(Some(5), first);
-        assert_eq!(Some(15), second);
-        assert_eq!(Some(10), third);
-        assert_eq!(None, fourth);
-    }
-
-    #[test]
-    fn memrchr_iter(){
-        let haystack = b"aaaabaaaabaaaab";
-        let mut memchr_iter = Memchr::new(b'b', haystack);
-        let first = memchr_iter.next_back();
-        let second = memchr_iter.next_back();
-        let third = memchr_iter.next_back();
-        let fourth = memchr_iter.next_back();
-
-        assert_eq!(Some(15), first);
-        assert_eq!(Some(10), second);
-        assert_eq!(Some(5), third);
-        assert_eq!(None, fourth);
-
-    }
-
-    #[test]
-    fn qc_never_fail_memchr3() {
-        fn prop(needle1: u8, needle2: u8, needle3: u8, haystack: Vec<u8>) -> bool {
-            memchr3(needle1, needle2, needle3, &haystack);
-            true
-        }
-        quickcheck::quickcheck(prop as fn(u8, u8, u8, Vec<u8>) -> bool);
-    }
-
-    #[test]
-    fn qc_correct_memchr() {
-        fn prop(v: Vec<u8>, offset: u8) -> bool {
-            // test all pointer alignments
-            let uoffset = (offset & 0xF) as usize;
-            let data = if uoffset <= v.len() {
-                &v[uoffset..]
-            } else {
-                &v[..]
-            };
-            for byte in 0..256u32 {
-                let byte = byte as u8;
-                if memchr(byte, &data) != data.iter().position(|elt| *elt == byte) {
-                    return false;
-                }
-            }
-            true
-        }
-        quickcheck::quickcheck(prop as fn(Vec<u8>, u8) -> bool);
-    }
-
-    #[test]
-    fn qc_correct_memrchr() {
-        fn prop(v: Vec<u8>, offset: u8) -> bool {
-            // test all pointer alignments
-            let uoffset = (offset & 0xF) as usize;
-            let data = if uoffset <= v.len() {
-                &v[uoffset..]
-            } else {
-                &v[..]
-            };
-            for byte in 0..256u32 {
-                let byte = byte as u8;
-                if memrchr(byte, &data) != data.iter().rposition(|elt| *elt == byte) {
-                    return false;
-                }
-            }
-            true
-        }
-        quickcheck::quickcheck(prop as fn(Vec<u8>, u8) -> bool);
-    }
-
-    #[test]
-    fn qc_correct_memchr2() {
-        fn prop(v: Vec<u8>, offset: u8) -> bool {
-            // test all pointer alignments
-            let uoffset = (offset & 0xF) as usize;
-            let data = if uoffset <= v.len() {
-                &v[uoffset..]
-            } else {
-                &v[..]
-            };
-            for b1 in 0..256u32 {
-                for b2 in 0..256u32 {
-                    let (b1, b2) = (b1 as u8, b2 as u8);
-                    let expected = data.iter().position(|&b| b == b1 || b == b2);
-                    let got = memchr2(b1, b2, &data);
-                    if expected != got {
-                        return false;
-                    }
-                }
-            }
-            true
-        }
-        quickcheck::quickcheck(prop as fn(Vec<u8>, u8) -> bool);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/num-integer-0.1.33/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"69c84ad73d7c646a1ef4672b6d8f958c5f18d43e43c17b902f1198f9fed4ae5e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/lib.rs":"c49cb1f2c2c5b414d28556ba7076d0243fe73378dd3a3ae97d29b3b4dc060a58"},"package":"21e4df1098d1d797d27ef0c69c178c3fab64941559b290fcae198e0825c9c8b5"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/num-integer-0.1.33/Cargo.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[package]
-authors = ["The Rust Project Developers"]
-description = "Integer traits and functions"
-documentation = "http://rust-num.github.io/num"
-homepage = "https://github.com/rust-num/num"
-keywords = ["mathematics", "numerics"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/rust-num/num"
-name = "num-integer"
-version = "0.1.33"
-
-[dependencies.num-traits]
-path = "../traits"
-version = "0.1.32"
deleted file mode 100644
--- a/third_party/rust/num-integer-0.1.33/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/num-integer-0.1.33/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/num-integer-0.1.33/src/lib.rs
+++ /dev/null
@@ -1,694 +0,0 @@
-// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Integer trait and functions.
-#![doc(html_logo_url = "https://rust-num.github.io/num/rust-logo-128x128-blk-v2.png",
-       html_favicon_url = "https://rust-num.github.io/num/favicon.ico",
-       html_root_url = "https://rust-num.github.io/num/",
-       html_playground_url = "http://play.integer32.com/")]
-
-extern crate num_traits as traits;
-
-use traits::{Num, Signed};
-
-pub trait Integer: Sized + Num + PartialOrd + Ord + Eq {
-    /// Floored integer division.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert!(( 8).div_floor(& 3) ==  2);
-    /// assert!(( 8).div_floor(&-3) == -3);
-    /// assert!((-8).div_floor(& 3) == -3);
-    /// assert!((-8).div_floor(&-3) ==  2);
-    ///
-    /// assert!(( 1).div_floor(& 2) ==  0);
-    /// assert!(( 1).div_floor(&-2) == -1);
-    /// assert!((-1).div_floor(& 2) == -1);
-    /// assert!((-1).div_floor(&-2) ==  0);
-    /// ~~~
-    fn div_floor(&self, other: &Self) -> Self;
-
-    /// Floored integer modulo, satisfying:
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// # let n = 1; let d = 1;
-    /// assert!(n.div_floor(&d) * d + n.mod_floor(&d) == n)
-    /// ~~~
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert!(( 8).mod_floor(& 3) ==  2);
-    /// assert!(( 8).mod_floor(&-3) == -1);
-    /// assert!((-8).mod_floor(& 3) ==  1);
-    /// assert!((-8).mod_floor(&-3) == -2);
-    ///
-    /// assert!(( 1).mod_floor(& 2) ==  1);
-    /// assert!(( 1).mod_floor(&-2) == -1);
-    /// assert!((-1).mod_floor(& 2) ==  1);
-    /// assert!((-1).mod_floor(&-2) == -1);
-    /// ~~~
-    fn mod_floor(&self, other: &Self) -> Self;
-
-    /// Greatest Common Divisor (GCD).
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(6.gcd(&8), 2);
-    /// assert_eq!(7.gcd(&3), 1);
-    /// ~~~
-    fn gcd(&self, other: &Self) -> Self;
-
-    /// Lowest Common Multiple (LCM).
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(7.lcm(&3), 21);
-    /// assert_eq!(2.lcm(&4), 4);
-    /// ~~~
-    fn lcm(&self, other: &Self) -> Self;
-
-    /// Deprecated, use `is_multiple_of` instead.
-    fn divides(&self, other: &Self) -> bool;
-
-    /// Returns `true` if `other` is a multiple of `self`.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(9.is_multiple_of(&3), true);
-    /// assert_eq!(3.is_multiple_of(&9), false);
-    /// ~~~
-    fn is_multiple_of(&self, other: &Self) -> bool;
-
-    /// Returns `true` if the number is even.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(3.is_even(), false);
-    /// assert_eq!(4.is_even(), true);
-    /// ~~~
-    fn is_even(&self) -> bool;
-
-    /// Returns `true` if the number is odd.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(3.is_odd(), true);
-    /// assert_eq!(4.is_odd(), false);
-    /// ~~~
-    fn is_odd(&self) -> bool;
-
-    /// Simultaneous truncated integer division and modulus.
-    /// Returns `(quotient, remainder)`.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(( 8).div_rem( &3), ( 2,  2));
-    /// assert_eq!(( 8).div_rem(&-3), (-2,  2));
-    /// assert_eq!((-8).div_rem( &3), (-2, -2));
-    /// assert_eq!((-8).div_rem(&-3), ( 2, -2));
-    ///
-    /// assert_eq!(( 1).div_rem( &2), ( 0,  1));
-    /// assert_eq!(( 1).div_rem(&-2), ( 0,  1));
-    /// assert_eq!((-1).div_rem( &2), ( 0, -1));
-    /// assert_eq!((-1).div_rem(&-2), ( 0, -1));
-    /// ~~~
-    #[inline]
-    fn div_rem(&self, other: &Self) -> (Self, Self);
-
-    /// Simultaneous floored integer division and modulus.
-    /// Returns `(quotient, remainder)`.
-    ///
-    /// # Examples
-    ///
-    /// ~~~
-    /// # use num_integer::Integer;
-    /// assert_eq!(( 8).div_mod_floor( &3), ( 2,  2));
-    /// assert_eq!(( 8).div_mod_floor(&-3), (-3, -1));
-    /// assert_eq!((-8).div_mod_floor( &3), (-3,  1));
-    /// assert_eq!((-8).div_mod_floor(&-3), ( 2, -2));
-    ///
-    /// assert_eq!(( 1).div_mod_floor( &2), ( 0,  1));
-    /// assert_eq!(( 1).div_mod_floor(&-2), (-1, -1));
-    /// assert_eq!((-1).div_mod_floor( &2), (-1,  1));
-    /// assert_eq!((-1).div_mod_floor(&-2), ( 0, -1));
-    /// ~~~
-    fn div_mod_floor(&self, other: &Self) -> (Self, Self) {
-        (self.div_floor(other), self.mod_floor(other))
-    }
-}
-
-/// Simultaneous integer division and modulus
-#[inline]
-pub fn div_rem<T: Integer>(x: T, y: T) -> (T, T) {
-    x.div_rem(&y)
-}
-/// Floored integer division
-#[inline]
-pub fn div_floor<T: Integer>(x: T, y: T) -> T {
-    x.div_floor(&y)
-}
-/// Floored integer modulus
-#[inline]
-pub fn mod_floor<T: Integer>(x: T, y: T) -> T {
-    x.mod_floor(&y)
-}
-/// Simultaneous floored integer division and modulus
-#[inline]
-pub fn div_mod_floor<T: Integer>(x: T, y: T) -> (T, T) {
-    x.div_mod_floor(&y)
-}
-
-/// Calculates the Greatest Common Divisor (GCD) of the number and `other`. The
-/// result is always positive.
-#[inline(always)]
-pub fn gcd<T: Integer>(x: T, y: T) -> T {
-    x.gcd(&y)
-}
-/// Calculates the Lowest Common Multiple (LCM) of the number and `other`.
-#[inline(always)]
-pub fn lcm<T: Integer>(x: T, y: T) -> T {
-    x.lcm(&y)
-}
-
-macro_rules! impl_integer_for_isize {
-    ($T:ty, $test_mod:ident) => (
-        impl Integer for $T {
-            /// Floored integer division
-            #[inline]
-            fn div_floor(&self, other: &Self) -> Self {
-                // Algorithm from [Daan Leijen. _Division and Modulus for Computer Scientists_,
-                // December 2001](http://research.microsoft.com/pubs/151917/divmodnote-letter.pdf)
-                match self.div_rem(other) {
-                    (d, r) if (r > 0 && *other < 0)
-                           || (r < 0 && *other > 0) => d - 1,
-                    (d, _)                          => d,
-                }
-            }
-
-            /// Floored integer modulo
-            #[inline]
-            fn mod_floor(&self, other: &Self) -> Self {
-                // Algorithm from [Daan Leijen. _Division and Modulus for Computer Scientists_,
-                // December 2001](http://research.microsoft.com/pubs/151917/divmodnote-letter.pdf)
-                match *self % *other {
-                    r if (r > 0 && *other < 0)
-                      || (r < 0 && *other > 0) => r + *other,
-                    r                          => r,
-                }
-            }
-
-            /// Calculates `div_floor` and `mod_floor` simultaneously
-            #[inline]
-            fn div_mod_floor(&self, other: &Self) -> (Self, Self) {
-                // Algorithm from [Daan Leijen. _Division and Modulus for Computer Scientists_,
-                // December 2001](http://research.microsoft.com/pubs/151917/divmodnote-letter.pdf)
-                match self.div_rem(other) {
-                    (d, r) if (r > 0 && *other < 0)
-                           || (r < 0 && *other > 0) => (d - 1, r + *other),
-                    (d, r)                          => (d, r),
-                }
-            }
-
-            /// Calculates the Greatest Common Divisor (GCD) of the number and
-            /// `other`. The result is always positive.
-            #[inline]
-            fn gcd(&self, other: &Self) -> Self {
-                // Use Stein's algorithm
-                let mut m = *self;
-                let mut n = *other;
-                if m == 0 || n == 0 { return (m | n).abs() }
-
-                // find common factors of 2
-                let shift = (m | n).trailing_zeros();
-
-                // The algorithm needs positive numbers, but the minimum value
-                // can't be represented as a positive one.
-                // It's also a power of two, so the gcd can be
-                // calculated by bitshifting in that case
-
-                // Assuming two's complement, the number created by the shift
-                // is positive for all numbers except gcd = abs(min value)
-                // The call to .abs() causes a panic in debug mode
-                if m == Self::min_value() || n == Self::min_value() {
-                    return (1 << shift).abs()
-                }
-
-                // guaranteed to be positive now, rest like unsigned algorithm
-                m = m.abs();
-                n = n.abs();
-
-                // divide n and m by 2 until odd
-                // m inside loop
-                n >>= n.trailing_zeros();
-
-                while m != 0 {
-                    m >>= m.trailing_zeros();
-                    if n > m { ::std::mem::swap(&mut n, &mut m) }
-                    m -= n;
-                }
-
-                n << shift
-            }
-
-            /// Calculates the Lowest Common Multiple (LCM) of the number and
-            /// `other`.
-            #[inline]
-            fn lcm(&self, other: &Self) -> Self {
-                // should not have to recalculate abs
-                (*self * (*other / self.gcd(other))).abs()
-            }
-
-            /// Deprecated, use `is_multiple_of` instead.
-            #[inline]
-            fn divides(&self, other: &Self) -> bool {
-                self.is_multiple_of(other)
-            }
-
-            /// Returns `true` if the number is a multiple of `other`.
-            #[inline]
-            fn is_multiple_of(&self, other: &Self) -> bool {
-                *self % *other == 0
-            }
-
-            /// Returns `true` if the number is divisible by `2`
-            #[inline]
-            fn is_even(&self) -> bool { (*self) & 1 == 0 }
-
-            /// Returns `true` if the number is not divisible by `2`
-            #[inline]
-            fn is_odd(&self) -> bool { !self.is_even() }
-
-            /// Simultaneous truncated integer division and modulus.
-            #[inline]
-            fn div_rem(&self, other: &Self) -> (Self, Self) {
-                (*self / *other, *self % *other)
-            }
-        }
-
-        #[cfg(test)]
-        mod $test_mod {
-            use Integer;
-
-            /// Checks that the division rule holds for:
-            ///
-            /// - `n`: numerator (dividend)
-            /// - `d`: denominator (divisor)
-            /// - `qr`: quotient and remainder
-            #[cfg(test)]
-            fn test_division_rule((n,d): ($T, $T), (q,r): ($T, $T)) {
-                assert_eq!(d * q + r, n);
-            }
-
-            #[test]
-            fn test_div_rem() {
-                fn test_nd_dr(nd: ($T,$T), qr: ($T,$T)) {
-                    let (n,d) = nd;
-                    let separate_div_rem = (n / d, n % d);
-                    let combined_div_rem = n.div_rem(&d);
-
-                    assert_eq!(separate_div_rem, qr);
-                    assert_eq!(combined_div_rem, qr);
-
-                    test_division_rule(nd, separate_div_rem);
-                    test_division_rule(nd, combined_div_rem);
-                }
-
-                test_nd_dr(( 8,  3), ( 2,  2));
-                test_nd_dr(( 8, -3), (-2,  2));
-                test_nd_dr((-8,  3), (-2, -2));
-                test_nd_dr((-8, -3), ( 2, -2));
-
-                test_nd_dr(( 1,  2), ( 0,  1));
-                test_nd_dr(( 1, -2), ( 0,  1));
-                test_nd_dr((-1,  2), ( 0, -1));
-                test_nd_dr((-1, -2), ( 0, -1));
-            }
-
-            #[test]
-            fn test_div_mod_floor() {
-                fn test_nd_dm(nd: ($T,$T), dm: ($T,$T)) {
-                    let (n,d) = nd;
-                    let separate_div_mod_floor = (n.div_floor(&d), n.mod_floor(&d));
-                    let combined_div_mod_floor = n.div_mod_floor(&d);
-
-                    assert_eq!(separate_div_mod_floor, dm);
-                    assert_eq!(combined_div_mod_floor, dm);
-
-                    test_division_rule(nd, separate_div_mod_floor);
-                    test_division_rule(nd, combined_div_mod_floor);
-                }
-
-                test_nd_dm(( 8,  3), ( 2,  2));
-                test_nd_dm(( 8, -3), (-3, -1));
-                test_nd_dm((-8,  3), (-3,  1));
-                test_nd_dm((-8, -3), ( 2, -2));
-
-                test_nd_dm(( 1,  2), ( 0,  1));
-                test_nd_dm(( 1, -2), (-1, -1));
-                test_nd_dm((-1,  2), (-1,  1));
-                test_nd_dm((-1, -2), ( 0, -1));
-            }
-
-            #[test]
-            fn test_gcd() {
-                assert_eq!((10 as $T).gcd(&2), 2 as $T);
-                assert_eq!((10 as $T).gcd(&3), 1 as $T);
-                assert_eq!((0 as $T).gcd(&3), 3 as $T);
-                assert_eq!((3 as $T).gcd(&3), 3 as $T);
-                assert_eq!((56 as $T).gcd(&42), 14 as $T);
-                assert_eq!((3 as $T).gcd(&-3), 3 as $T);
-                assert_eq!((-6 as $T).gcd(&3), 3 as $T);
-                assert_eq!((-4 as $T).gcd(&-2), 2 as $T);
-            }
-
-            #[test]
-            fn test_gcd_cmp_with_euclidean() {
-                fn euclidean_gcd(mut m: $T, mut n: $T) -> $T {
-                    while m != 0 {
-                        ::std::mem::swap(&mut m, &mut n);
-                        m %= n;
-                    }
-
-                    n.abs()
-                }
-
-                // gcd(-128, b) = 128 is not representable as positive value
-                // for i8
-                for i in -127..127 {
-                    for j in -127..127 {
-                        assert_eq!(euclidean_gcd(i,j), i.gcd(&j));
-                    }
-                }
-
-                // last value
-                // FIXME: Use inclusive ranges for above loop when implemented
-                let i = 127;
-                for j in -127..127 {
-                    assert_eq!(euclidean_gcd(i,j), i.gcd(&j));
-                }
-                assert_eq!(127.gcd(&127), 127);
-            }
-
-            #[test]
-            fn test_gcd_min_val() {
-                let min = <$T>::min_value();
-                let max = <$T>::max_value();
-                let max_pow2 = max / 2 + 1;
-                assert_eq!(min.gcd(&max), 1 as $T);
-                assert_eq!(max.gcd(&min), 1 as $T);
-                assert_eq!(min.gcd(&max_pow2), max_pow2);
-                assert_eq!(max_pow2.gcd(&min), max_pow2);
-                assert_eq!(min.gcd(&42), 2 as $T);
-                assert_eq!((42 as $T).gcd(&min), 2 as $T);
-            }
-
-            #[test]
-            #[should_panic]
-            fn test_gcd_min_val_min_val() {
-                let min = <$T>::min_value();
-                assert!(min.gcd(&min) >= 0);
-            }
-
-            #[test]
-            #[should_panic]
-            fn test_gcd_min_val_0() {
-                let min = <$T>::min_value();
-                assert!(min.gcd(&0) >= 0);
-            }
-
-            #[test]
-            #[should_panic]
-            fn test_gcd_0_min_val() {
-                let min = <$T>::min_value();
-                assert!((0 as $T).gcd(&min) >= 0);
-            }
-
-            #[test]
-            fn test_lcm() {
-                assert_eq!((1 as $T).lcm(&0), 0 as $T);
-                assert_eq!((0 as $T).lcm(&1), 0 as $T);
-                assert_eq!((1 as $T).lcm(&1), 1 as $T);
-                assert_eq!((-1 as $T).lcm(&1), 1 as $T);
-                assert_eq!((1 as $T).lcm(&-1), 1 as $T);
-                assert_eq!((-1 as $T).lcm(&-1), 1 as $T);
-                assert_eq!((8 as $T).lcm(&9), 72 as $T);
-                assert_eq!((11 as $T).lcm(&5), 55 as $T);
-            }
-
-            #[test]
-            fn test_even() {
-                assert_eq!((-4 as $T).is_even(), true);
-                assert_eq!((-3 as $T).is_even(), false);
-                assert_eq!((-2 as $T).is_even(), true);
-                assert_eq!((-1 as $T).is_even(), false);
-                assert_eq!((0 as $T).is_even(), true);
-                assert_eq!((1 as $T).is_even(), false);
-                assert_eq!((2 as $T).is_even(), true);
-                assert_eq!((3 as $T).is_even(), false);
-                assert_eq!((4 as $T).is_even(), true);
-            }
-
-            #[test]
-            fn test_odd() {
-                assert_eq!((-4 as $T).is_odd(), false);
-                assert_eq!((-3 as $T).is_odd(), true);
-                assert_eq!((-2 as $T).is_odd(), false);
-                assert_eq!((-1 as $T).is_odd(), true);
-                assert_eq!((0 as $T).is_odd(), false);
-                assert_eq!((1 as $T).is_odd(), true);
-                assert_eq!((2 as $T).is_odd(), false);
-                assert_eq!((3 as $T).is_odd(), true);
-                assert_eq!((4 as $T).is_odd(), false);
-            }
-        }
-    )
-}
-
-impl_integer_for_isize!(i8, test_integer_i8);
-impl_integer_for_isize!(i16, test_integer_i16);
-impl_integer_for_isize!(i32, test_integer_i32);
-impl_integer_for_isize!(i64, test_integer_i64);
-impl_integer_for_isize!(isize, test_integer_isize);
-
-macro_rules! impl_integer_for_usize {
-    ($T:ty, $test_mod:ident) => (
-        impl Integer for $T {
-            /// Unsigned integer division. Returns the same result as `div` (`/`).
-            #[inline]
-            fn div_floor(&self, other: &Self) -> Self {
-                *self / *other
-            }
-
-            /// Unsigned integer modulo operation. Returns the same result as `rem` (`%`).
-            #[inline]
-            fn mod_floor(&self, other: &Self) -> Self {
-                *self % *other
-            }
-
-            /// Calculates the Greatest Common Divisor (GCD) of the number and `other`
-            #[inline]
-            fn gcd(&self, other: &Self) -> Self {
-                // Use Stein's algorithm
-                let mut m = *self;
-                let mut n = *other;
-                if m == 0 || n == 0 { return m | n }
-
-                // find common factors of 2
-                let shift = (m | n).trailing_zeros();
-
-                // divide n and m by 2 until odd
-                // m inside loop
-                n >>= n.trailing_zeros();
-
-                while m != 0 {
-                    m >>= m.trailing_zeros();
-                    if n > m { ::std::mem::swap(&mut n, &mut m) }
-                    m -= n;
-                }
-
-                n << shift
-            }
-
-            /// Calculates the Lowest Common Multiple (LCM) of the number and `other`.
-            #[inline]
-            fn lcm(&self, other: &Self) -> Self {
-                *self * (*other / self.gcd(other))
-            }
-
-            /// Deprecated, use `is_multiple_of` instead.
-            #[inline]
-            fn divides(&self, other: &Self) -> bool {
-                self.is_multiple_of(other)
-            }
-
-            /// Returns `true` if the number is a multiple of `other`.
-            #[inline]
-            fn is_multiple_of(&self, other: &Self) -> bool {
-                *self % *other == 0
-            }
-
-            /// Returns `true` if the number is divisible by `2`.
-            #[inline]
-            fn is_even(&self) -> bool {
-                *self % 2 == 0
-            }
-
-            /// Returns `true` if the number is not divisible by `2`.
-            #[inline]
-            fn is_odd(&self) -> bool {
-                !self.is_even()
-            }
-
-            /// Simultaneous truncated integer division and modulus.
-            #[inline]
-            fn div_rem(&self, other: &Self) -> (Self, Self) {
-                (*self / *other, *self % *other)
-            }
-        }
-
-        #[cfg(test)]
-        mod $test_mod {
-            use Integer;
-
-            #[test]
-            fn test_div_mod_floor() {
-                assert_eq!((10 as $T).div_floor(&(3 as $T)), 3 as $T);
-                assert_eq!((10 as $T).mod_floor(&(3 as $T)), 1 as $T);
-                assert_eq!((10 as $T).div_mod_floor(&(3 as $T)), (3 as $T, 1 as $T));
-                assert_eq!((5 as $T).div_floor(&(5 as $T)), 1 as $T);
-                assert_eq!((5 as $T).mod_floor(&(5 as $T)), 0 as $T);
-                assert_eq!((5 as $T).div_mod_floor(&(5 as $T)), (1 as $T, 0 as $T));
-                assert_eq!((3 as $T).div_floor(&(7 as $T)), 0 as $T);
-                assert_eq!((3 as $T).mod_floor(&(7 as $T)), 3 as $T);
-                assert_eq!((3 as $T).div_mod_floor(&(7 as $T)), (0 as $T, 3 as $T));
-            }
-
-            #[test]
-            fn test_gcd() {
-                assert_eq!((10 as $T).gcd(&2), 2 as $T);
-                assert_eq!((10 as $T).gcd(&3), 1 as $T);
-                assert_eq!((0 as $T).gcd(&3), 3 as $T);
-                assert_eq!((3 as $T).gcd(&3), 3 as $T);
-                assert_eq!((56 as $T).gcd(&42), 14 as $T);
-            }
-
-            #[test]
-            fn test_gcd_cmp_with_euclidean() {
-                fn euclidean_gcd(mut m: $T, mut n: $T) -> $T {
-                    while m != 0 {
-                        ::std::mem::swap(&mut m, &mut n);
-                        m %= n;
-                    }
-                    n
-                }
-
-                for i in 0..255 {
-                    for j in 0..255 {
-                        assert_eq!(euclidean_gcd(i,j), i.gcd(&j));
-                    }
-                }
-
-                // last value
-                // FIXME: Use inclusive ranges for above loop when implemented
-                let i = 255;
-                for j in 0..255 {
-                    assert_eq!(euclidean_gcd(i,j), i.gcd(&j));
-                }
-                assert_eq!(255.gcd(&255), 255);
-            }
-
-            #[test]
-            fn test_lcm() {
-                assert_eq!((1 as $T).lcm(&0), 0 as $T);
-                assert_eq!((0 as $T).lcm(&1), 0 as $T);
-                assert_eq!((1 as $T).lcm(&1), 1 as $T);
-                assert_eq!((8 as $T).lcm(&9), 72 as $T);
-                assert_eq!((11 as $T).lcm(&5), 55 as $T);
-                assert_eq!((15 as $T).lcm(&17), 255 as $T);
-            }
-
-            #[test]
-            fn test_is_multiple_of() {
-                assert!((6 as $T).is_multiple_of(&(6 as $T)));
-                assert!((6 as $T).is_multiple_of(&(3 as $T)));
-                assert!((6 as $T).is_multiple_of(&(1 as $T)));
-            }
-
-            #[test]
-            fn test_even() {
-                assert_eq!((0 as $T).is_even(), true);
-                assert_eq!((1 as $T).is_even(), false);
-                assert_eq!((2 as $T).is_even(), true);
-                assert_eq!((3 as $T).is_even(), false);
-                assert_eq!((4 as $T).is_even(), true);
-            }
-
-            #[test]
-            fn test_odd() {
-                assert_eq!((0 as $T).is_odd(), false);
-                assert_eq!((1 as $T).is_odd(), true);
-                assert_eq!((2 as $T).is_odd(), false);
-                assert_eq!((3 as $T).is_odd(), true);
-                assert_eq!((4 as $T).is_odd(), false);
-            }
-        }
-    )
-}
-
-impl_integer_for_usize!(u8, test_integer_u8);
-impl_integer_for_usize!(u16, test_integer_u16);
-impl_integer_for_usize!(u32, test_integer_u32);
-impl_integer_for_usize!(u64, test_integer_u64);
-impl_integer_for_usize!(usize, test_integer_usize);
-
-#[test]
-fn test_lcm_overflow() {
-    macro_rules! check {
-        ($t:ty, $x:expr, $y:expr, $r:expr) => { {
-            let x: $t = $x;
-            let y: $t = $y;
-            let o = x.checked_mul(y);
-            assert!(o.is_none(),
-                    "sanity checking that {} input {} * {} overflows",
-                    stringify!($t), x, y);
-            assert_eq!(x.lcm(&y), $r);
-            assert_eq!(y.lcm(&x), $r);
-        } }
-    }
-
-    // Original bug (Issue #166)
-    check!(i64, 46656000000000000, 600, 46656000000000000);
-
-    check!(i8, 0x40, 0x04, 0x40);
-    check!(u8, 0x80, 0x02, 0x80);
-    check!(i16, 0x40_00, 0x04, 0x40_00);
-    check!(u16, 0x80_00, 0x02, 0x80_00);
-    check!(i32, 0x4000_0000, 0x04, 0x4000_0000);
-    check!(u32, 0x8000_0000, 0x02, 0x8000_0000);
-    check!(i64, 0x4000_0000_0000_0000, 0x04, 0x4000_0000_0000_0000);
-    check!(u64, 0x8000_0000_0000_0000, 0x02, 0x8000_0000_0000_0000);
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"66a7dc4de5cbd1880cb7e5498317fd58c5bdca69fb3073c37f0a6604e0722387","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/bounds.rs":"3666fbdf8b347fa1daad3ee92e3ac4a10df99d26bc340b877d5bbba914b61782","src/cast.rs":"c44c11863751810ef40763ac3470facdf0c3f0d16db9474d3e566a8c78eafdaa","src/float.rs":"1f9d571bd3946d1d93dc7f4f4ae344bfabf5fd871243145aad120e242599c2e4","src/identities.rs":"c78281aa689c5f376a2cfbe1e81aefd54d634f410671ce1660a2c117b3ae6b04","src/int.rs":"b7b42dfa10423308f858216ac63fa52e26c49a7bc8900cd98de210992efc3f5f","src/lib.rs":"84c84706da4df88b87a0f5ed2e412dcfc644f9f849db2dc4302faa5d8b79379a","src/ops/checked.rs":"bc667779636f81c7eca138c6d57252a6bb6ca4cd1f0ff706a993067044d86f94","src/ops/mod.rs":"668ea4d117bc1fdf7eaf0fe16692fa40dfbdfcbc7a2010237fe395ce0086e02e","src/ops/saturating.rs":"46821d815c90c16b2f6bec0b94b4d7ebdbddf3ea42edc0467de738c56abf6436","src/ops/wrapping.rs":"a444c7eb3366f2ad4c3a9938f1158b1994b9da4bbf9097884b5e8e27a9b581dd","src/pow.rs":"73b611ad8d595ef917871ba859ff0c25efc2382220d30568e5fbb930bf6b4daa","src/sign.rs":"732736f44c3c410f43da98eb3c8887319d94ad2c4883d614a9c353659402b315"},"package":"1708c0628602a98b52fad936cf3edb9a107af06e52e49fdf0707e884456a6af6"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/Cargo.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-[package]
-authors = ["The Rust Project Developers"]
-description = "Numeric traits for generic mathematics"
-documentation = "http://rust-num.github.io/num"
-homepage = "https://github.com/rust-num/num"
-keywords = ["mathematics", "numerics"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/rust-num/num"
-name = "num-traits"
-version = "0.1.39"
-
-[dependencies]
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/bounds.rs
+++ /dev/null
@@ -1,99 +0,0 @@
-use std::{usize, u8, u16, u32, u64};
-use std::{isize, i8, i16, i32, i64};
-use std::{f32, f64};
-use std::num::Wrapping;
-
-/// Numbers which have upper and lower bounds
-pub trait Bounded {
-    // FIXME (#5527): These should be associated constants
-    /// returns the smallest finite number this type can represent
-    fn min_value() -> Self;
-    /// returns the largest finite number this type can represent
-    fn max_value() -> Self;
-}
-
-macro_rules! bounded_impl {
-    ($t:ty, $min:expr, $max:expr) => {
-        impl Bounded for $t {
-            #[inline]
-            fn min_value() -> $t { $min }
-
-            #[inline]
-            fn max_value() -> $t { $max }
-        }
-    }
-}
-
-bounded_impl!(usize, usize::MIN, usize::MAX);
-bounded_impl!(u8,    u8::MIN,    u8::MAX);
-bounded_impl!(u16,   u16::MIN,   u16::MAX);
-bounded_impl!(u32,   u32::MIN,   u32::MAX);
-bounded_impl!(u64,   u64::MIN,   u64::MAX);
-
-bounded_impl!(isize, isize::MIN, isize::MAX);
-bounded_impl!(i8,    i8::MIN,    i8::MAX);
-bounded_impl!(i16,   i16::MIN,   i16::MAX);
-bounded_impl!(i32,   i32::MIN,   i32::MAX);
-bounded_impl!(i64,   i64::MIN,   i64::MAX);
-
-impl<T: Bounded> Bounded for Wrapping<T> {
-    fn min_value() -> Self { Wrapping(T::min_value()) }
-    fn max_value() -> Self { Wrapping(T::max_value()) }
-}
-
-bounded_impl!(f32, f32::MIN, f32::MAX);
-
-macro_rules! for_each_tuple_ {
-    ( $m:ident !! ) => (
-        $m! { }
-    );
-    ( $m:ident !! $h:ident, $($t:ident,)* ) => (
-        $m! { $h $($t)* }
-        for_each_tuple_! { $m !! $($t,)* }
-    );
-}
-macro_rules! for_each_tuple {
-    ( $m:ident ) => (
-        for_each_tuple_! { $m !! A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, }
-    );
-}
-
-macro_rules! bounded_tuple {
-    ( $($name:ident)* ) => (
-        impl<$($name: Bounded,)*> Bounded for ($($name,)*) {
-            #[inline]
-            fn min_value() -> Self {
-                ($($name::min_value(),)*)
-            }
-            #[inline]
-            fn max_value() -> Self {
-                ($($name::max_value(),)*)
-            }
-        }
-    );
-}
-
-for_each_tuple!(bounded_tuple);
-bounded_impl!(f64, f64::MIN, f64::MAX);
-
-
-macro_rules! test_wrapping_bounded {
-    ($($t:ty)+) => {
-        $(
-            assert_eq!(Wrapping::<$t>::min_value().0, <$t>::min_value());
-            assert_eq!(Wrapping::<$t>::max_value().0, <$t>::max_value());
-        )+   
-    };
-}
-
-#[test]
-fn wrapping_bounded() {
-    test_wrapping_bounded!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
-}
-
-#[test]
-fn wrapping_is_bounded() {
-    fn require_bounded<T: Bounded>(_: &T) {}
-    require_bounded(&Wrapping(42_u32));
-    require_bounded(&Wrapping(-42));
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/cast.rs
+++ /dev/null
@@ -1,511 +0,0 @@
-use std::mem::size_of;
-use std::num::Wrapping;
-
-use identities::Zero;
-use bounds::Bounded;
-
-/// A generic trait for converting a value to a number.
-pub trait ToPrimitive {
-    /// Converts the value of `self` to an `isize`.
-    #[inline]
-    fn to_isize(&self) -> Option<isize> {
-        self.to_i64().and_then(|x| x.to_isize())
-    }
-
-    /// Converts the value of `self` to an `i8`.
-    #[inline]
-    fn to_i8(&self) -> Option<i8> {
-        self.to_i64().and_then(|x| x.to_i8())
-    }
-
-    /// Converts the value of `self` to an `i16`.
-    #[inline]
-    fn to_i16(&self) -> Option<i16> {
-        self.to_i64().and_then(|x| x.to_i16())
-    }
-
-    /// Converts the value of `self` to an `i32`.
-    #[inline]
-    fn to_i32(&self) -> Option<i32> {
-        self.to_i64().and_then(|x| x.to_i32())
-    }
-
-    /// Converts the value of `self` to an `i64`.
-    fn to_i64(&self) -> Option<i64>;
-
-    /// Converts the value of `self` to a `usize`.
-    #[inline]
-    fn to_usize(&self) -> Option<usize> {
-        self.to_u64().and_then(|x| x.to_usize())
-    }
-
-    /// Converts the value of `self` to an `u8`.
-    #[inline]
-    fn to_u8(&self) -> Option<u8> {
-        self.to_u64().and_then(|x| x.to_u8())
-    }
-
-    /// Converts the value of `self` to an `u16`.
-    #[inline]
-    fn to_u16(&self) -> Option<u16> {
-        self.to_u64().and_then(|x| x.to_u16())
-    }
-
-    /// Converts the value of `self` to an `u32`.
-    #[inline]
-    fn to_u32(&self) -> Option<u32> {
-        self.to_u64().and_then(|x| x.to_u32())
-    }
-
-    /// Converts the value of `self` to an `u64`.
-    #[inline]
-    fn to_u64(&self) -> Option<u64>;
-
-    /// Converts the value of `self` to an `f32`.
-    #[inline]
-    fn to_f32(&self) -> Option<f32> {
-        self.to_f64().and_then(|x| x.to_f32())
-    }
-
-    /// Converts the value of `self` to an `f64`.
-    #[inline]
-    fn to_f64(&self) -> Option<f64> {
-        self.to_i64().and_then(|x| x.to_f64())
-    }
-}
-
-macro_rules! impl_to_primitive_int_to_int {
-    ($SrcT:ty, $DstT:ty, $slf:expr) => (
-        {
-            if size_of::<$SrcT>() <= size_of::<$DstT>() {
-                Some($slf as $DstT)
-            } else {
-                let n = $slf as i64;
-                let min_value: $DstT = Bounded::min_value();
-                let max_value: $DstT = Bounded::max_value();
-                if min_value as i64 <= n && n <= max_value as i64 {
-                    Some($slf as $DstT)
-                } else {
-                    None
-                }
-            }
-        }
-    )
-}
-
-macro_rules! impl_to_primitive_int_to_uint {
-    ($SrcT:ty, $DstT:ty, $slf:expr) => (
-        {
-            let zero: $SrcT = Zero::zero();
-            let max_value: $DstT = Bounded::max_value();
-            if zero <= $slf && $slf as u64 <= max_value as u64 {
-                Some($slf as $DstT)
-            } else {
-                None
-            }
-        }
-    )
-}
-
-macro_rules! impl_to_primitive_int {
-    ($T:ty) => (
-        impl ToPrimitive for $T {
-            #[inline]
-            fn to_isize(&self) -> Option<isize> { impl_to_primitive_int_to_int!($T, isize, *self) }
-            #[inline]
-            fn to_i8(&self) -> Option<i8> { impl_to_primitive_int_to_int!($T, i8, *self) }
-            #[inline]
-            fn to_i16(&self) -> Option<i16> { impl_to_primitive_int_to_int!($T, i16, *self) }
-            #[inline]
-            fn to_i32(&self) -> Option<i32> { impl_to_primitive_int_to_int!($T, i32, *self) }
-            #[inline]
-            fn to_i64(&self) -> Option<i64> { impl_to_primitive_int_to_int!($T, i64, *self) }
-
-            #[inline]
-            fn to_usize(&self) -> Option<usize> { impl_to_primitive_int_to_uint!($T, usize, *self) }
-            #[inline]
-            fn to_u8(&self) -> Option<u8> { impl_to_primitive_int_to_uint!($T, u8, *self) }
-            #[inline]
-            fn to_u16(&self) -> Option<u16> { impl_to_primitive_int_to_uint!($T, u16, *self) }
-            #[inline]
-            fn to_u32(&self) -> Option<u32> { impl_to_primitive_int_to_uint!($T, u32, *self) }
-            #[inline]
-            fn to_u64(&self) -> Option<u64> { impl_to_primitive_int_to_uint!($T, u64, *self) }
-
-            #[inline]
-            fn to_f32(&self) -> Option<f32> { Some(*self as f32) }
-            #[inline]
-            fn to_f64(&self) -> Option<f64> { Some(*self as f64) }
-        }
-    )
-}
-
-impl_to_primitive_int!(isize);
-impl_to_primitive_int!(i8);
-impl_to_primitive_int!(i16);
-impl_to_primitive_int!(i32);
-impl_to_primitive_int!(i64);
-
-macro_rules! impl_to_primitive_uint_to_int {
-    ($DstT:ty, $slf:expr) => (
-        {
-            let max_value: $DstT = Bounded::max_value();
-            if $slf as u64 <= max_value as u64 {
-                Some($slf as $DstT)
-            } else {
-                None
-            }
-        }
-    )
-}
-
-macro_rules! impl_to_primitive_uint_to_uint {
-    ($SrcT:ty, $DstT:ty, $slf:expr) => (
-        {
-            if size_of::<$SrcT>() <= size_of::<$DstT>() {
-                Some($slf as $DstT)
-            } else {
-                let zero: $SrcT = Zero::zero();
-                let max_value: $DstT = Bounded::max_value();
-                if zero <= $slf && $slf as u64 <= max_value as u64 {
-                    Some($slf as $DstT)
-                } else {
-                    None
-                }
-            }
-        }
-    )
-}
-
-macro_rules! impl_to_primitive_uint {
-    ($T:ty) => (
-        impl ToPrimitive for $T {
-            #[inline]
-            fn to_isize(&self) -> Option<isize> { impl_to_primitive_uint_to_int!(isize, *self) }
-            #[inline]
-            fn to_i8(&self) -> Option<i8> { impl_to_primitive_uint_to_int!(i8, *self) }
-            #[inline]
-            fn to_i16(&self) -> Option<i16> { impl_to_primitive_uint_to_int!(i16, *self) }
-            #[inline]
-            fn to_i32(&self) -> Option<i32> { impl_to_primitive_uint_to_int!(i32, *self) }
-            #[inline]
-            fn to_i64(&self) -> Option<i64> { impl_to_primitive_uint_to_int!(i64, *self) }
-
-            #[inline]
-            fn to_usize(&self) -> Option<usize> {
-                impl_to_primitive_uint_to_uint!($T, usize, *self)
-            }
-            #[inline]
-            fn to_u8(&self) -> Option<u8> { impl_to_primitive_uint_to_uint!($T, u8, *self) }
-            #[inline]
-            fn to_u16(&self) -> Option<u16> { impl_to_primitive_uint_to_uint!($T, u16, *self) }
-            #[inline]
-            fn to_u32(&self) -> Option<u32> { impl_to_primitive_uint_to_uint!($T, u32, *self) }
-            #[inline]
-            fn to_u64(&self) -> Option<u64> { impl_to_primitive_uint_to_uint!($T, u64, *self) }
-
-            #[inline]
-            fn to_f32(&self) -> Option<f32> { Some(*self as f32) }
-            #[inline]
-            fn to_f64(&self) -> Option<f64> { Some(*self as f64) }
-        }
-    )
-}
-
-impl_to_primitive_uint!(usize);
-impl_to_primitive_uint!(u8);
-impl_to_primitive_uint!(u16);
-impl_to_primitive_uint!(u32);
-impl_to_primitive_uint!(u64);
-
-macro_rules! impl_to_primitive_float_to_float {
-    ($SrcT:ident, $DstT:ident, $slf:expr) => (
-        if size_of::<$SrcT>() <= size_of::<$DstT>() {
-            Some($slf as $DstT)
-        } else {
-            // Make sure the value is in range for the cast.
-            // NaN and +-inf are cast as they are.
-            let n = $slf as f64;
-            let max_value: $DstT = ::std::$DstT::MAX;
-            if !n.is_finite() || (-max_value as f64 <= n && n <= max_value as f64) {
-                Some($slf as $DstT)
-            } else {
-                None
-            }
-        }
-    )
-}
-
-macro_rules! impl_to_primitive_float {
-    ($T:ident) => (
-        impl ToPrimitive for $T {
-            #[inline]
-            fn to_isize(&self) -> Option<isize> { Some(*self as isize) }
-            #[inline]
-            fn to_i8(&self) -> Option<i8> { Some(*self as i8) }
-            #[inline]
-            fn to_i16(&self) -> Option<i16> { Some(*self as i16) }
-            #[inline]
-            fn to_i32(&self) -> Option<i32> { Some(*self as i32) }
-            #[inline]
-            fn to_i64(&self) -> Option<i64> { Some(*self as i64) }
-
-            #[inline]
-            fn to_usize(&self) -> Option<usize> { Some(*self as usize) }
-            #[inline]
-            fn to_u8(&self) -> Option<u8> { Some(*self as u8) }
-            #[inline]
-            fn to_u16(&self) -> Option<u16> { Some(*self as u16) }
-            #[inline]
-            fn to_u32(&self) -> Option<u32> { Some(*self as u32) }
-            #[inline]
-            fn to_u64(&self) -> Option<u64> { Some(*self as u64) }
-
-            #[inline]
-            fn to_f32(&self) -> Option<f32> { impl_to_primitive_float_to_float!($T, f32, *self) }
-            #[inline]
-            fn to_f64(&self) -> Option<f64> { impl_to_primitive_float_to_float!($T, f64, *self) }
-        }
-    )
-}
-
-impl_to_primitive_float!(f32);
-impl_to_primitive_float!(f64);
-
-/// A generic trait for converting a number to a value.
-pub trait FromPrimitive: Sized {
-    /// Convert an `isize` to return an optional value of this type. If the
-    /// value cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_isize(n: isize) -> Option<Self> {
-        FromPrimitive::from_i64(n as i64)
-    }
-
-    /// Convert an `i8` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_i8(n: i8) -> Option<Self> {
-        FromPrimitive::from_i64(n as i64)
-    }
-
-    /// Convert an `i16` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_i16(n: i16) -> Option<Self> {
-        FromPrimitive::from_i64(n as i64)
-    }
-
-    /// Convert an `i32` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_i32(n: i32) -> Option<Self> {
-        FromPrimitive::from_i64(n as i64)
-    }
-
-    /// Convert an `i64` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    fn from_i64(n: i64) -> Option<Self>;
-
-    /// Convert a `usize` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_usize(n: usize) -> Option<Self> {
-        FromPrimitive::from_u64(n as u64)
-    }
-
-    /// Convert an `u8` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_u8(n: u8) -> Option<Self> {
-        FromPrimitive::from_u64(n as u64)
-    }
-
-    /// Convert an `u16` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_u16(n: u16) -> Option<Self> {
-        FromPrimitive::from_u64(n as u64)
-    }
-
-    /// Convert an `u32` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_u32(n: u32) -> Option<Self> {
-        FromPrimitive::from_u64(n as u64)
-    }
-
-    /// Convert an `u64` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    fn from_u64(n: u64) -> Option<Self>;
-
-    /// Convert a `f32` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_f32(n: f32) -> Option<Self> {
-        FromPrimitive::from_f64(n as f64)
-    }
-
-    /// Convert a `f64` to return an optional value of this type. If the
-    /// type cannot be represented by this value, the `None` is returned.
-    #[inline]
-    fn from_f64(n: f64) -> Option<Self> {
-        FromPrimitive::from_i64(n as i64)
-    }
-}
-
-macro_rules! impl_from_primitive {
-    ($T:ty, $to_ty:ident) => (
-        #[allow(deprecated)]
-        impl FromPrimitive for $T {
-            #[inline] fn from_i8(n: i8) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_i16(n: i16) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_i32(n: i32) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_i64(n: i64) -> Option<$T> { n.$to_ty() }
-
-            #[inline] fn from_u8(n: u8) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_u16(n: u16) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_u32(n: u32) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_u64(n: u64) -> Option<$T> { n.$to_ty() }
-
-            #[inline] fn from_f32(n: f32) -> Option<$T> { n.$to_ty() }
-            #[inline] fn from_f64(n: f64) -> Option<$T> { n.$to_ty() }
-        }
-    )
-}
-
-impl_from_primitive!(isize, to_isize);
-impl_from_primitive!(i8,    to_i8);
-impl_from_primitive!(i16,   to_i16);
-impl_from_primitive!(i32,   to_i32);
-impl_from_primitive!(i64,   to_i64);
-impl_from_primitive!(usize, to_usize);
-impl_from_primitive!(u8,    to_u8);
-impl_from_primitive!(u16,   to_u16);
-impl_from_primitive!(u32,   to_u32);
-impl_from_primitive!(u64,   to_u64);
-impl_from_primitive!(f32,   to_f32);
-impl_from_primitive!(f64,   to_f64);
-
-
-impl<T: ToPrimitive> ToPrimitive for Wrapping<T> {
-    fn to_i64(&self) -> Option<i64> { self.0.to_i64() }
-    fn to_u64(&self) -> Option<u64> { self.0.to_u64() }
-}
-impl<T: FromPrimitive> FromPrimitive for Wrapping<T> {
-    fn from_u64(n: u64) -> Option<Self> { T::from_u64(n).map(Wrapping) }
-    fn from_i64(n: i64) -> Option<Self> { T::from_i64(n).map(Wrapping) }
-}
-
-
-/// Cast from one machine scalar to another.
-///
-/// # Examples
-///
-/// ```
-/// # use num_traits as num;
-/// let twenty: f32 = num::cast(0x14).unwrap();
-/// assert_eq!(twenty, 20f32);
-/// ```
-///
-#[inline]
-pub fn cast<T: NumCast, U: NumCast>(n: T) -> Option<U> {
-    NumCast::from(n)
-}
-
-/// An interface for casting between machine scalars.
-pub trait NumCast: Sized + ToPrimitive {
-    /// Creates a number from another value that can be converted into
-    /// a primitive via the `ToPrimitive` trait.
-    fn from<T: ToPrimitive>(n: T) -> Option<Self>;
-}
-
-macro_rules! impl_num_cast {
-    ($T:ty, $conv:ident) => (
-        impl NumCast for $T {
-            #[inline]
-            #[allow(deprecated)]
-            fn from<N: ToPrimitive>(n: N) -> Option<$T> {
-                // `$conv` could be generated using `concat_idents!`, but that
-                // macro seems to be broken at the moment
-                n.$conv()
-            }
-        }
-    )
-}
-
-impl_num_cast!(u8,    to_u8);
-impl_num_cast!(u16,   to_u16);
-impl_num_cast!(u32,   to_u32);
-impl_num_cast!(u64,   to_u64);
-impl_num_cast!(usize, to_usize);
-impl_num_cast!(i8,    to_i8);
-impl_num_cast!(i16,   to_i16);
-impl_num_cast!(i32,   to_i32);
-impl_num_cast!(i64,   to_i64);
-impl_num_cast!(isize, to_isize);
-impl_num_cast!(f32,   to_f32);
-impl_num_cast!(f64,   to_f64);
-
-impl<T: NumCast> NumCast for Wrapping<T> {
-    fn from<U: ToPrimitive>(n: U) -> Option<Self> {
-        T::from(n).map(Wrapping)
-    }
-}
-
-#[test]
-fn to_primitive_float() {
-    use std::f32;
-    use std::f64;
-
-    let f32_toolarge = 1e39f64;
-    assert_eq!(f32_toolarge.to_f32(), None);
-    assert_eq!((f32::MAX as f64).to_f32(), Some(f32::MAX));
-    assert_eq!((-f32::MAX as f64).to_f32(), Some(-f32::MAX));
-    assert_eq!(f64::INFINITY.to_f32(), Some(f32::INFINITY));
-    assert_eq!((f64::NEG_INFINITY).to_f32(), Some(f32::NEG_INFINITY));
-    assert!((f64::NAN).to_f32().map_or(false, |f| f.is_nan()));
-}
-
-macro_rules! test_wrapping_to_primitive {
-    ($($t:ty)+) => {
-        $({
-            let i: $t = 0;
-            let w = Wrapping(i);
-            assert_eq!(i.to_u8(),    w.to_u8());
-            assert_eq!(i.to_u16(),   w.to_u16());
-            assert_eq!(i.to_u32(),   w.to_u32());
-            assert_eq!(i.to_u64(),   w.to_u64());
-            assert_eq!(i.to_usize(), w.to_usize());
-            assert_eq!(i.to_i8(),    w.to_i8());
-            assert_eq!(i.to_i16(),   w.to_i16());
-            assert_eq!(i.to_i32(),   w.to_i32());
-            assert_eq!(i.to_i64(),   w.to_i64());
-            assert_eq!(i.to_isize(), w.to_isize());
-            assert_eq!(i.to_f32(),   w.to_f32());
-            assert_eq!(i.to_f64(),   w.to_f64());
-        })+   
-    };
-}
-
-#[test]
-fn wrapping_to_primitive() {
-    test_wrapping_to_primitive!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
-}
-
-#[test]
-fn wrapping_is_toprimitive() {
-    fn require_toprimitive<T: ToPrimitive>(_: &T) {}
-    require_toprimitive(&Wrapping(42));
-}
-
-#[test]
-fn wrapping_is_fromprimitive() {
-    fn require_fromprimitive<T: FromPrimitive>(_: &T) {}
-    require_fromprimitive(&Wrapping(42));
-}
-
-#[test]
-fn wrapping_is_numcast() {
-    fn require_numcast<T: NumCast>(_: &T) {}
-    require_numcast(&Wrapping(42));
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/float.rs
+++ /dev/null
@@ -1,1346 +0,0 @@
-use std::mem;
-use std::ops::Neg;
-use std::num::FpCategory;
-
-// Used for default implementation of `epsilon`
-use std::f32;
-
-use {Num, NumCast};
-
-// FIXME: these doctests aren't actually helpful, because they're using and
-// testing the inherent methods directly, not going through `Float`.
-
-pub trait Float
-    : Num
-    + Copy
-    + NumCast
-    + PartialOrd
-    + Neg<Output = Self>
-{
-    /// Returns the `NaN` value.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let nan: f32 = Float::nan();
-    ///
-    /// assert!(nan.is_nan());
-    /// ```
-    fn nan() -> Self;
-    /// Returns the infinite value.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f32;
-    ///
-    /// let infinity: f32 = Float::infinity();
-    ///
-    /// assert!(infinity.is_infinite());
-    /// assert!(!infinity.is_finite());
-    /// assert!(infinity > f32::MAX);
-    /// ```
-    fn infinity() -> Self;
-    /// Returns the negative infinite value.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f32;
-    ///
-    /// let neg_infinity: f32 = Float::neg_infinity();
-    ///
-    /// assert!(neg_infinity.is_infinite());
-    /// assert!(!neg_infinity.is_finite());
-    /// assert!(neg_infinity < f32::MIN);
-    /// ```
-    fn neg_infinity() -> Self;
-    /// Returns `-0.0`.
-    ///
-    /// ```
-    /// use num_traits::{Zero, Float};
-    ///
-    /// let inf: f32 = Float::infinity();
-    /// let zero: f32 = Zero::zero();
-    /// let neg_zero: f32 = Float::neg_zero();
-    ///
-    /// assert_eq!(zero, neg_zero);
-    /// assert_eq!(7.0f32/inf, zero);
-    /// assert_eq!(zero * 10.0, zero);
-    /// ```
-    fn neg_zero() -> Self;
-
-    /// Returns the smallest finite value that this type can represent.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x: f64 = Float::min_value();
-    ///
-    /// assert_eq!(x, f64::MIN);
-    /// ```
-    fn min_value() -> Self;
-
-    /// Returns the smallest positive, normalized value that this type can represent.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x: f64 = Float::min_positive_value();
-    ///
-    /// assert_eq!(x, f64::MIN_POSITIVE);
-    /// ```
-    fn min_positive_value() -> Self;
-
-    /// Returns epsilon, a small positive value.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x: f64 = Float::epsilon();
-    ///
-    /// assert_eq!(x, f64::EPSILON);
-    /// ```
-    ///
-    /// # Panics
-    ///
-    /// The default implementation will panic if `f32::EPSILON` cannot
-    /// be cast to `Self`.
-    fn epsilon() -> Self {
-        Self::from(f32::EPSILON).expect("Unable to cast from f32::EPSILON")
-    }
-
-    /// Returns the largest finite value that this type can represent.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x: f64 = Float::max_value();
-    /// assert_eq!(x, f64::MAX);
-    /// ```
-    fn max_value() -> Self;
-
-    /// Returns `true` if this value is `NaN` and false otherwise.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let nan = f64::NAN;
-    /// let f = 7.0;
-    ///
-    /// assert!(nan.is_nan());
-    /// assert!(!f.is_nan());
-    /// ```
-    fn is_nan(self) -> bool;
-
-    /// Returns `true` if this value is positive infinity or negative infinity and
-    /// false otherwise.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f32;
-    ///
-    /// let f = 7.0f32;
-    /// let inf: f32 = Float::infinity();
-    /// let neg_inf: f32 = Float::neg_infinity();
-    /// let nan: f32 = f32::NAN;
-    ///
-    /// assert!(!f.is_infinite());
-    /// assert!(!nan.is_infinite());
-    ///
-    /// assert!(inf.is_infinite());
-    /// assert!(neg_inf.is_infinite());
-    /// ```
-    fn is_infinite(self) -> bool;
-
-    /// Returns `true` if this number is neither infinite nor `NaN`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f32;
-    ///
-    /// let f = 7.0f32;
-    /// let inf: f32 = Float::infinity();
-    /// let neg_inf: f32 = Float::neg_infinity();
-    /// let nan: f32 = f32::NAN;
-    ///
-    /// assert!(f.is_finite());
-    ///
-    /// assert!(!nan.is_finite());
-    /// assert!(!inf.is_finite());
-    /// assert!(!neg_inf.is_finite());
-    /// ```
-    fn is_finite(self) -> bool;
-
-    /// Returns `true` if the number is neither zero, infinite,
-    /// [subnormal][subnormal], or `NaN`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f32;
-    ///
-    /// let min = f32::MIN_POSITIVE; // 1.17549435e-38f32
-    /// let max = f32::MAX;
-    /// let lower_than_min = 1.0e-40_f32;
-    /// let zero = 0.0f32;
-    ///
-    /// assert!(min.is_normal());
-    /// assert!(max.is_normal());
-    ///
-    /// assert!(!zero.is_normal());
-    /// assert!(!f32::NAN.is_normal());
-    /// assert!(!f32::INFINITY.is_normal());
-    /// // Values between `0` and `min` are Subnormal.
-    /// assert!(!lower_than_min.is_normal());
-    /// ```
-    /// [subnormal]: http://en.wikipedia.org/wiki/Denormal_number
-    fn is_normal(self) -> bool;
-
-    /// Returns the floating point category of the number. If only one property
-    /// is going to be tested, it is generally faster to use the specific
-    /// predicate instead.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::num::FpCategory;
-    /// use std::f32;
-    ///
-    /// let num = 12.4f32;
-    /// let inf = f32::INFINITY;
-    ///
-    /// assert_eq!(num.classify(), FpCategory::Normal);
-    /// assert_eq!(inf.classify(), FpCategory::Infinite);
-    /// ```
-    fn classify(self) -> FpCategory;
-
-    /// Returns the largest integer less than or equal to a number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 3.99;
-    /// let g = 3.0;
-    ///
-    /// assert_eq!(f.floor(), 3.0);
-    /// assert_eq!(g.floor(), 3.0);
-    /// ```
-    fn floor(self) -> Self;
-
-    /// Returns the smallest integer greater than or equal to a number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 3.01;
-    /// let g = 4.0;
-    ///
-    /// assert_eq!(f.ceil(), 4.0);
-    /// assert_eq!(g.ceil(), 4.0);
-    /// ```
-    fn ceil(self) -> Self;
-
-    /// Returns the nearest integer to a number. Round half-way cases away from
-    /// `0.0`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 3.3;
-    /// let g = -3.3;
-    ///
-    /// assert_eq!(f.round(), 3.0);
-    /// assert_eq!(g.round(), -3.0);
-    /// ```
-    fn round(self) -> Self;
-
-    /// Return the integer part of a number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 3.3;
-    /// let g = -3.7;
-    ///
-    /// assert_eq!(f.trunc(), 3.0);
-    /// assert_eq!(g.trunc(), -3.0);
-    /// ```
-    fn trunc(self) -> Self;
-
-    /// Returns the fractional part of a number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 3.5;
-    /// let y = -3.5;
-    /// let abs_difference_x = (x.fract() - 0.5).abs();
-    /// let abs_difference_y = (y.fract() - (-0.5)).abs();
-    ///
-    /// assert!(abs_difference_x < 1e-10);
-    /// assert!(abs_difference_y < 1e-10);
-    /// ```
-    fn fract(self) -> Self;
-
-    /// Computes the absolute value of `self`. Returns `Float::nan()` if the
-    /// number is `Float::nan()`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = 3.5;
-    /// let y = -3.5;
-    ///
-    /// let abs_difference_x = (x.abs() - x).abs();
-    /// let abs_difference_y = (y.abs() - (-y)).abs();
-    ///
-    /// assert!(abs_difference_x < 1e-10);
-    /// assert!(abs_difference_y < 1e-10);
-    ///
-    /// assert!(f64::NAN.abs().is_nan());
-    /// ```
-    fn abs(self) -> Self;
-
-    /// Returns a number that represents the sign of `self`.
-    ///
-    /// - `1.0` if the number is positive, `+0.0` or `Float::infinity()`
-    /// - `-1.0` if the number is negative, `-0.0` or `Float::neg_infinity()`
-    /// - `Float::nan()` if the number is `Float::nan()`
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let f = 3.5;
-    ///
-    /// assert_eq!(f.signum(), 1.0);
-    /// assert_eq!(f64::NEG_INFINITY.signum(), -1.0);
-    ///
-    /// assert!(f64::NAN.signum().is_nan());
-    /// ```
-    fn signum(self) -> Self;
-
-    /// Returns `true` if `self` is positive, including `+0.0` and
-    /// `Float::infinity()`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let nan: f64 = f64::NAN;
-    ///
-    /// let f = 7.0;
-    /// let g = -7.0;
-    ///
-    /// assert!(f.is_sign_positive());
-    /// assert!(!g.is_sign_positive());
-    /// // Requires both tests to determine if is `NaN`
-    /// assert!(!nan.is_sign_positive() && !nan.is_sign_negative());
-    /// ```
-    fn is_sign_positive(self) -> bool;
-
-    /// Returns `true` if `self` is negative, including `-0.0` and
-    /// `Float::neg_infinity()`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let nan = f64::NAN;
-    ///
-    /// let f = 7.0;
-    /// let g = -7.0;
-    ///
-    /// assert!(!f.is_sign_negative());
-    /// assert!(g.is_sign_negative());
-    /// // Requires both tests to determine if is `NaN`.
-    /// assert!(!nan.is_sign_positive() && !nan.is_sign_negative());
-    /// ```
-    fn is_sign_negative(self) -> bool;
-
-    /// Fused multiply-add. Computes `(self * a) + b` with only one rounding
-    /// error. This produces a more accurate result with better performance than
-    /// a separate multiplication operation followed by an add.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let m = 10.0;
-    /// let x = 4.0;
-    /// let b = 60.0;
-    ///
-    /// // 100.0
-    /// let abs_difference = (m.mul_add(x, b) - (m*x + b)).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn mul_add(self, a: Self, b: Self) -> Self;
-    /// Take the reciprocal (inverse) of a number, `1/x`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 2.0;
-    /// let abs_difference = (x.recip() - (1.0/x)).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn recip(self) -> Self;
-
-    /// Raise a number to an integer power.
-    ///
-    /// Using this function is generally faster than using `powf`
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 2.0;
-    /// let abs_difference = (x.powi(2) - x*x).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn powi(self, n: i32) -> Self;
-
-    /// Raise a number to a floating point power.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 2.0;
-    /// let abs_difference = (x.powf(2.0) - x*x).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn powf(self, n: Self) -> Self;
-
-    /// Take the square root of a number.
-    ///
-    /// Returns NaN if `self` is a negative number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let positive = 4.0;
-    /// let negative = -4.0;
-    ///
-    /// let abs_difference = (positive.sqrt() - 2.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// assert!(negative.sqrt().is_nan());
-    /// ```
-    fn sqrt(self) -> Self;
-
-    /// Returns `e^(self)`, (the exponential function).
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let one = 1.0;
-    /// // e^1
-    /// let e = one.exp();
-    ///
-    /// // ln(e) - 1 == 0
-    /// let abs_difference = (e.ln() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn exp(self) -> Self;
-
-    /// Returns `2^(self)`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 2.0;
-    ///
-    /// // 2^2 - 4 == 0
-    /// let abs_difference = (f.exp2() - 4.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn exp2(self) -> Self;
-
-    /// Returns the natural logarithm of the number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let one = 1.0;
-    /// // e^1
-    /// let e = one.exp();
-    ///
-    /// // ln(e) - 1 == 0
-    /// let abs_difference = (e.ln() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn ln(self) -> Self;
-
-    /// Returns the logarithm of the number with respect to an arbitrary base.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let ten = 10.0;
-    /// let two = 2.0;
-    ///
-    /// // log10(10) - 1 == 0
-    /// let abs_difference_10 = (ten.log(10.0) - 1.0).abs();
-    ///
-    /// // log2(2) - 1 == 0
-    /// let abs_difference_2 = (two.log(2.0) - 1.0).abs();
-    ///
-    /// assert!(abs_difference_10 < 1e-10);
-    /// assert!(abs_difference_2 < 1e-10);
-    /// ```
-    fn log(self, base: Self) -> Self;
-
-    /// Returns the base 2 logarithm of the number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let two = 2.0;
-    ///
-    /// // log2(2) - 1 == 0
-    /// let abs_difference = (two.log2() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn log2(self) -> Self;
-
-    /// Returns the base 10 logarithm of the number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let ten = 10.0;
-    ///
-    /// // log10(10) - 1 == 0
-    /// let abs_difference = (ten.log10() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn log10(self) -> Self;
-
-    /// Converts radians to degrees.
-    ///
-    /// ```
-    /// use std::f64::consts;
-    ///
-    /// let angle = consts::PI;
-    ///
-    /// let abs_difference = (angle.to_degrees() - 180.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    #[inline]
-    fn to_degrees(self) -> Self {
-        let halfpi = Self::zero().acos();
-        let ninety = Self::from(90u8).unwrap();
-        self * ninety / halfpi
-    }
-
-    /// Converts degrees to radians.
-    ///
-    /// ```
-    /// use std::f64::consts;
-    ///
-    /// let angle = 180.0_f64;
-    ///
-    /// let abs_difference = (angle.to_radians() - consts::PI).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    #[inline]
-    fn to_radians(self) -> Self {
-        let halfpi = Self::zero().acos();
-        let ninety = Self::from(90u8).unwrap();
-        self * halfpi / ninety
-    }
-
-    /// Returns the maximum of the two numbers.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 1.0;
-    /// let y = 2.0;
-    ///
-    /// assert_eq!(x.max(y), y);
-    /// ```
-    fn max(self, other: Self) -> Self;
-
-    /// Returns the minimum of the two numbers.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 1.0;
-    /// let y = 2.0;
-    ///
-    /// assert_eq!(x.min(y), x);
-    /// ```
-    fn min(self, other: Self) -> Self;
-
-    /// The positive difference of two numbers.
-    ///
-    /// * If `self <= other`: `0:0`
-    /// * Else: `self - other`
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 3.0;
-    /// let y = -3.0;
-    ///
-    /// let abs_difference_x = (x.abs_sub(1.0) - 2.0).abs();
-    /// let abs_difference_y = (y.abs_sub(1.0) - 0.0).abs();
-    ///
-    /// assert!(abs_difference_x < 1e-10);
-    /// assert!(abs_difference_y < 1e-10);
-    /// ```
-    fn abs_sub(self, other: Self) -> Self;
-
-    /// Take the cubic root of a number.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 8.0;
-    ///
-    /// // x^(1/3) - 2 == 0
-    /// let abs_difference = (x.cbrt() - 2.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn cbrt(self) -> Self;
-
-    /// Calculate the length of the hypotenuse of a right-angle triangle given
-    /// legs of length `x` and `y`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 2.0;
-    /// let y = 3.0;
-    ///
-    /// // sqrt(x^2 + y^2)
-    /// let abs_difference = (x.hypot(y) - (x.powi(2) + y.powi(2)).sqrt()).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn hypot(self, other: Self) -> Self;
-
-    /// Computes the sine of a number (in radians).
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = f64::consts::PI/2.0;
-    ///
-    /// let abs_difference = (x.sin() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn sin(self) -> Self;
-
-    /// Computes the cosine of a number (in radians).
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = 2.0*f64::consts::PI;
-    ///
-    /// let abs_difference = (x.cos() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn cos(self) -> Self;
-
-    /// Computes the tangent of a number (in radians).
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = f64::consts::PI/4.0;
-    /// let abs_difference = (x.tan() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-14);
-    /// ```
-    fn tan(self) -> Self;
-
-    /// Computes the arcsine of a number. Return value is in radians in
-    /// the range [-pi/2, pi/2] or NaN if the number is outside the range
-    /// [-1, 1].
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let f = f64::consts::PI / 2.0;
-    ///
-    /// // asin(sin(pi/2))
-    /// let abs_difference = (f.sin().asin() - f64::consts::PI / 2.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn asin(self) -> Self;
-
-    /// Computes the arccosine of a number. Return value is in radians in
-    /// the range [0, pi] or NaN if the number is outside the range
-    /// [-1, 1].
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let f = f64::consts::PI / 4.0;
-    ///
-    /// // acos(cos(pi/4))
-    /// let abs_difference = (f.cos().acos() - f64::consts::PI / 4.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn acos(self) -> Self;
-
-    /// Computes the arctangent of a number. Return value is in radians in the
-    /// range [-pi/2, pi/2];
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let f = 1.0;
-    ///
-    /// // atan(tan(1))
-    /// let abs_difference = (f.tan().atan() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn atan(self) -> Self;
-
-    /// Computes the four quadrant arctangent of `self` (`y`) and `other` (`x`).
-    ///
-    /// * `x = 0`, `y = 0`: `0`
-    /// * `x >= 0`: `arctan(y/x)` -> `[-pi/2, pi/2]`
-    /// * `y >= 0`: `arctan(y/x) + pi` -> `(pi/2, pi]`
-    /// * `y < 0`: `arctan(y/x) - pi` -> `(-pi, -pi/2)`
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let pi = f64::consts::PI;
-    /// // All angles from horizontal right (+x)
-    /// // 45 deg counter-clockwise
-    /// let x1 = 3.0;
-    /// let y1 = -3.0;
-    ///
-    /// // 135 deg clockwise
-    /// let x2 = -3.0;
-    /// let y2 = 3.0;
-    ///
-    /// let abs_difference_1 = (y1.atan2(x1) - (-pi/4.0)).abs();
-    /// let abs_difference_2 = (y2.atan2(x2) - 3.0*pi/4.0).abs();
-    ///
-    /// assert!(abs_difference_1 < 1e-10);
-    /// assert!(abs_difference_2 < 1e-10);
-    /// ```
-    fn atan2(self, other: Self) -> Self;
-
-    /// Simultaneously computes the sine and cosine of the number, `x`. Returns
-    /// `(sin(x), cos(x))`.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = f64::consts::PI/4.0;
-    /// let f = x.sin_cos();
-    ///
-    /// let abs_difference_0 = (f.0 - x.sin()).abs();
-    /// let abs_difference_1 = (f.1 - x.cos()).abs();
-    ///
-    /// assert!(abs_difference_0 < 1e-10);
-    /// assert!(abs_difference_0 < 1e-10);
-    /// ```
-    fn sin_cos(self) -> (Self, Self);
-
-    /// Returns `e^(self) - 1` in a way that is accurate even if the
-    /// number is close to zero.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 7.0;
-    ///
-    /// // e^(ln(7)) - 1
-    /// let abs_difference = (x.ln().exp_m1() - 6.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn exp_m1(self) -> Self;
-
-    /// Returns `ln(1+n)` (natural logarithm) more accurately than if
-    /// the operations were performed separately.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let x = f64::consts::E - 1.0;
-    ///
-    /// // ln(1 + (e - 1)) == ln(e) == 1
-    /// let abs_difference = (x.ln_1p() - 1.0).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn ln_1p(self) -> Self;
-
-    /// Hyperbolic sine function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let e = f64::consts::E;
-    /// let x = 1.0;
-    ///
-    /// let f = x.sinh();
-    /// // Solving sinh() at 1 gives `(e^2-1)/(2e)`
-    /// let g = (e*e - 1.0)/(2.0*e);
-    /// let abs_difference = (f - g).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    fn sinh(self) -> Self;
-
-    /// Hyperbolic cosine function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let e = f64::consts::E;
-    /// let x = 1.0;
-    /// let f = x.cosh();
-    /// // Solving cosh() at 1 gives this result
-    /// let g = (e*e + 1.0)/(2.0*e);
-    /// let abs_difference = (f - g).abs();
-    ///
-    /// // Same result
-    /// assert!(abs_difference < 1.0e-10);
-    /// ```
-    fn cosh(self) -> Self;
-
-    /// Hyperbolic tangent function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let e = f64::consts::E;
-    /// let x = 1.0;
-    ///
-    /// let f = x.tanh();
-    /// // Solving tanh() at 1 gives `(1 - e^(-2))/(1 + e^(-2))`
-    /// let g = (1.0 - e.powi(-2))/(1.0 + e.powi(-2));
-    /// let abs_difference = (f - g).abs();
-    ///
-    /// assert!(abs_difference < 1.0e-10);
-    /// ```
-    fn tanh(self) -> Self;
-
-    /// Inverse hyperbolic sine function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 1.0;
-    /// let f = x.sinh().asinh();
-    ///
-    /// let abs_difference = (f - x).abs();
-    ///
-    /// assert!(abs_difference < 1.0e-10);
-    /// ```
-    fn asinh(self) -> Self;
-
-    /// Inverse hyperbolic cosine function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let x = 1.0;
-    /// let f = x.cosh().acosh();
-    ///
-    /// let abs_difference = (f - x).abs();
-    ///
-    /// assert!(abs_difference < 1.0e-10);
-    /// ```
-    fn acosh(self) -> Self;
-
-    /// Inverse hyperbolic tangent function.
-    ///
-    /// ```
-    /// use num_traits::Float;
-    /// use std::f64;
-    ///
-    /// let e = f64::consts::E;
-    /// let f = e.tanh().atanh();
-    ///
-    /// let abs_difference = (f - e).abs();
-    ///
-    /// assert!(abs_difference < 1.0e-10);
-    /// ```
-    fn atanh(self) -> Self;
-
-
-    /// Returns the mantissa, base 2 exponent, and sign as integers, respectively.
-    /// The original number can be recovered by `sign * mantissa * 2 ^ exponent`.
-    /// The floating point encoding is documented in the [Reference][floating-point].
-    ///
-    /// ```
-    /// use num_traits::Float;
-    ///
-    /// let num = 2.0f32;
-    ///
-    /// // (8388608, -22, 1)
-    /// let (mantissa, exponent, sign) = Float::integer_decode(num);
-    /// let sign_f = sign as f32;
-    /// let mantissa_f = mantissa as f32;
-    /// let exponent_f = num.powf(exponent as f32);
-    ///
-    /// // 1 * 8388608 * 2^(-22) == 2
-    /// let abs_difference = (sign_f * mantissa_f * exponent_f - num).abs();
-    ///
-    /// assert!(abs_difference < 1e-10);
-    /// ```
-    /// [floating-point]: ../../../../../reference.html#machine-types
-    fn integer_decode(self) -> (u64, i16, i8);
-}
-
-macro_rules! float_impl {
-    ($T:ident $decode:ident) => (
-        impl Float for $T {
-            #[inline]
-            fn nan() -> Self {
-                ::std::$T::NAN
-            }
-
-            #[inline]
-            fn infinity() -> Self {
-                ::std::$T::INFINITY
-            }
-
-            #[inline]
-            fn neg_infinity() -> Self {
-                ::std::$T::NEG_INFINITY
-            }
-
-            #[inline]
-            fn neg_zero() -> Self {
-                -0.0
-            }
-
-            #[inline]
-            fn min_value() -> Self {
-                ::std::$T::MIN
-            }
-
-            #[inline]
-            fn min_positive_value() -> Self {
-                ::std::$T::MIN_POSITIVE
-            }
-
-            #[inline]
-            fn epsilon() -> Self {
-                ::std::$T::EPSILON
-            }
-
-            #[inline]
-            fn max_value() -> Self {
-                ::std::$T::MAX
-            }
-
-            #[inline]
-            fn is_nan(self) -> bool {
-                <$T>::is_nan(self)
-            }
-
-            #[inline]
-            fn is_infinite(self) -> bool {
-                <$T>::is_infinite(self)
-            }
-
-            #[inline]
-            fn is_finite(self) -> bool {
-                <$T>::is_finite(self)
-            }
-
-            #[inline]
-            fn is_normal(self) -> bool {
-                <$T>::is_normal(self)
-            }
-
-            #[inline]
-            fn classify(self) -> FpCategory {
-                <$T>::classify(self)
-            }
-
-            #[inline]
-            fn floor(self) -> Self {
-                <$T>::floor(self)
-            }
-
-            #[inline]
-            fn ceil(self) -> Self {
-                <$T>::ceil(self)
-            }
-
-            #[inline]
-            fn round(self) -> Self {
-                <$T>::round(self)
-            }
-
-            #[inline]
-            fn trunc(self) -> Self {
-                <$T>::trunc(self)
-            }
-
-            #[inline]
-            fn fract(self) -> Self {
-                <$T>::fract(self)
-            }
-
-            #[inline]
-            fn abs(self) -> Self {
-                <$T>::abs(self)
-            }
-
-            #[inline]
-            fn signum(self) -> Self {
-                <$T>::signum(self)
-            }
-
-            #[inline]
-            fn is_sign_positive(self) -> bool {
-                <$T>::is_sign_positive(self)
-            }
-
-            #[inline]
-            fn is_sign_negative(self) -> bool {
-                <$T>::is_sign_negative(self)
-            }
-
-            #[inline]
-            fn mul_add(self, a: Self, b: Self) -> Self {
-                <$T>::mul_add(self, a, b)
-            }
-
-            #[inline]
-            fn recip(self) -> Self {
-                <$T>::recip(self)
-            }
-
-            #[inline]
-            fn powi(self, n: i32) -> Self {
-                <$T>::powi(self, n)
-            }
-
-            #[inline]
-            fn powf(self, n: Self) -> Self {
-                <$T>::powf(self, n)
-            }
-
-            #[inline]
-            fn sqrt(self) -> Self {
-                <$T>::sqrt(self)
-            }
-
-            #[inline]
-            fn exp(self) -> Self {
-                <$T>::exp(self)
-            }
-
-            #[inline]
-            fn exp2(self) -> Self {
-                <$T>::exp2(self)
-            }
-
-            #[inline]
-            fn ln(self) -> Self {
-                <$T>::ln(self)
-            }
-
-            #[inline]
-            fn log(self, base: Self) -> Self {
-                <$T>::log(self, base)
-            }
-
-            #[inline]
-            fn log2(self) -> Self {
-                <$T>::log2(self)
-            }
-
-            #[inline]
-            fn log10(self) -> Self {
-                <$T>::log10(self)
-            }
-
-            #[inline]
-            fn to_degrees(self) -> Self {
-                // NB: `f32` didn't stabilize this until 1.7
-                // <$T>::to_degrees(self)
-                self * (180. / ::std::$T::consts::PI)
-            }
-
-            #[inline]
-            fn to_radians(self) -> Self {
-                // NB: `f32` didn't stabilize this until 1.7
-                // <$T>::to_radians(self)
-                self * (::std::$T::consts::PI / 180.)
-            }
-
-            #[inline]
-            fn max(self, other: Self) -> Self {
-                <$T>::max(self, other)
-            }
-
-            #[inline]
-            fn min(self, other: Self) -> Self {
-                <$T>::min(self, other)
-            }
-
-            #[inline]
-            #[allow(deprecated)]
-            fn abs_sub(self, other: Self) -> Self {
-                <$T>::abs_sub(self, other)
-            }
-
-            #[inline]
-            fn cbrt(self) -> Self {
-                <$T>::cbrt(self)
-            }
-
-            #[inline]
-            fn hypot(self, other: Self) -> Self {
-                <$T>::hypot(self, other)
-            }
-
-            #[inline]
-            fn sin(self) -> Self {
-                <$T>::sin(self)
-            }
-
-            #[inline]
-            fn cos(self) -> Self {
-                <$T>::cos(self)
-            }
-
-            #[inline]
-            fn tan(self) -> Self {
-                <$T>::tan(self)
-            }
-
-            #[inline]
-            fn asin(self) -> Self {
-                <$T>::asin(self)
-            }
-
-            #[inline]
-            fn acos(self) -> Self {
-                <$T>::acos(self)
-            }
-
-            #[inline]
-            fn atan(self) -> Self {
-                <$T>::atan(self)
-            }
-
-            #[inline]
-            fn atan2(self, other: Self) -> Self {
-                <$T>::atan2(self, other)
-            }
-
-            #[inline]
-            fn sin_cos(self) -> (Self, Self) {
-                <$T>::sin_cos(self)
-            }
-
-            #[inline]
-            fn exp_m1(self) -> Self {
-                <$T>::exp_m1(self)
-            }
-
-            #[inline]
-            fn ln_1p(self) -> Self {
-                <$T>::ln_1p(self)
-            }
-
-            #[inline]
-            fn sinh(self) -> Self {
-                <$T>::sinh(self)
-            }
-
-            #[inline]
-            fn cosh(self) -> Self {
-                <$T>::cosh(self)
-            }
-
-            #[inline]
-            fn tanh(self) -> Self {
-                <$T>::tanh(self)
-            }
-
-            #[inline]
-            fn asinh(self) -> Self {
-                <$T>::asinh(self)
-            }
-
-            #[inline]
-            fn acosh(self) -> Self {
-                <$T>::acosh(self)
-            }
-
-            #[inline]
-            fn atanh(self) -> Self {
-                <$T>::atanh(self)
-            }
-
-            #[inline]
-            fn integer_decode(self) -> (u64, i16, i8) {
-                $decode(self)
-            }
-        }
-    )
-}
-
-fn integer_decode_f32(f: f32) -> (u64, i16, i8) {
-    let bits: u32 = unsafe { mem::transmute(f) };
-    let sign: i8 = if bits >> 31 == 0 {
-        1
-    } else {
-        -1
-    };
-    let mut exponent: i16 = ((bits >> 23) & 0xff) as i16;
-    let mantissa = if exponent == 0 {
-        (bits & 0x7fffff) << 1
-    } else {
-        (bits & 0x7fffff) | 0x800000
-    };
-    // Exponent bias + mantissa shift
-    exponent -= 127 + 23;
-    (mantissa as u64, exponent, sign)
-}
-
-fn integer_decode_f64(f: f64) -> (u64, i16, i8) {
-    let bits: u64 = unsafe { mem::transmute(f) };
-    let sign: i8 = if bits >> 63 == 0 {
-        1
-    } else {
-        -1
-    };
-    let mut exponent: i16 = ((bits >> 52) & 0x7ff) as i16;
-    let mantissa = if exponent == 0 {
-        (bits & 0xfffffffffffff) << 1
-    } else {
-        (bits & 0xfffffffffffff) | 0x10000000000000
-    };
-    // Exponent bias + mantissa shift
-    exponent -= 1023 + 52;
-    (mantissa, exponent, sign)
-}
-
-float_impl!(f32 integer_decode_f32);
-float_impl!(f64 integer_decode_f64);
-
-macro_rules! float_const_impl {
-    ($(#[$doc:meta] $constant:ident,)+) => (
-        #[allow(non_snake_case)]
-        pub trait FloatConst {
-            $(#[$doc] fn $constant() -> Self;)+
-        }
-        float_const_impl! { @float f32, $($constant,)+ }
-        float_const_impl! { @float f64, $($constant,)+ }
-    );
-    (@float $T:ident, $($constant:ident,)+) => (
-        impl FloatConst for $T {
-            $(
-                #[inline]
-                fn $constant() -> Self {
-                    ::std::$T::consts::$constant
-                }
-            )+
-        }
-    );
-}
-
-float_const_impl! {
-    #[doc = "Return Euler’s number."]
-    E,
-    #[doc = "Return `1.0 / π`."]
-    FRAC_1_PI,
-    #[doc = "Return `1.0 / sqrt(2.0)`."]
-    FRAC_1_SQRT_2,
-    #[doc = "Return `2.0 / π`."]
-    FRAC_2_PI,
-    #[doc = "Return `2.0 / sqrt(π)`."]
-    FRAC_2_SQRT_PI,
-    #[doc = "Return `π / 2.0`."]
-    FRAC_PI_2,
-    #[doc = "Return `π / 3.0`."]
-    FRAC_PI_3,
-    #[doc = "Return `π / 4.0`."]
-    FRAC_PI_4,
-    #[doc = "Return `π / 6.0`."]
-    FRAC_PI_6,
-    #[doc = "Return `π / 8.0`."]
-    FRAC_PI_8,
-    #[doc = "Return `ln(10.0)`."]
-    LN_10,
-    #[doc = "Return `ln(2.0)`."]
-    LN_2,
-    #[doc = "Return `log10(e)`."]
-    LOG10_E,
-    #[doc = "Return `log2(e)`."]
-    LOG2_E,
-    #[doc = "Return Archimedes’ constant."]
-    PI,
-    #[doc = "Return `sqrt(2.0)`."]
-    SQRT_2,
-}
-
-#[cfg(test)]
-mod tests {
-    use Float;
-
-    #[test]
-    fn convert_deg_rad() {
-        use std::f64::consts;
-
-        const DEG_RAD_PAIRS: [(f64, f64); 7] = [
-            (0.0, 0.),
-            (22.5, consts::FRAC_PI_8),
-            (30.0, consts::FRAC_PI_6),
-            (45.0, consts::FRAC_PI_4),
-            (60.0, consts::FRAC_PI_3),
-            (90.0, consts::FRAC_PI_2),
-            (180.0, consts::PI),
-        ];
-
-        for &(deg, rad) in &DEG_RAD_PAIRS {
-            assert!((Float::to_degrees(rad) - deg).abs() < 1e-6);
-            assert!((Float::to_radians(deg) - rad).abs() < 1e-6);
-
-            let (deg, rad) = (deg as f32, rad as f32);
-            assert!((Float::to_degrees(rad) - deg).abs() < 1e-6);
-            assert!((Float::to_radians(deg) - rad).abs() < 1e-6);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/identities.rs
+++ /dev/null
@@ -1,148 +0,0 @@
-use std::ops::{Add, Mul};
-use std::num::Wrapping;
-
-/// Defines an additive identity element for `Self`.
-pub trait Zero: Sized + Add<Self, Output = Self> {
-    /// Returns the additive identity element of `Self`, `0`.
-    ///
-    /// # Laws
-    ///
-    /// ```{.text}
-    /// a + 0 = a       ∀ a ∈ Self
-    /// 0 + a = a       ∀ a ∈ Self
-    /// ```
-    ///
-    /// # Purity
-    ///
-    /// This function should return the same result at all times regardless of
-    /// external mutable state, for example values stored in TLS or in
-    /// `static mut`s.
-    // FIXME (#5527): This should be an associated constant
-    fn zero() -> Self;
-
-    /// Returns `true` if `self` is equal to the additive identity.
-    #[inline]
-    fn is_zero(&self) -> bool;
-}
-
-macro_rules! zero_impl {
-    ($t:ty, $v:expr) => {
-        impl Zero for $t {
-            #[inline]
-            fn zero() -> $t { $v }
-            #[inline]
-            fn is_zero(&self) -> bool { *self == $v }
-        }
-    }
-}
-
-zero_impl!(usize, 0usize);
-zero_impl!(u8,    0u8);
-zero_impl!(u16,   0u16);
-zero_impl!(u32,   0u32);
-zero_impl!(u64,   0u64);
-
-zero_impl!(isize, 0isize);
-zero_impl!(i8,    0i8);
-zero_impl!(i16,   0i16);
-zero_impl!(i32,   0i32);
-zero_impl!(i64,   0i64);
-
-zero_impl!(f32, 0.0f32);
-zero_impl!(f64, 0.0f64);
-
-impl<T: Zero> Zero for Wrapping<T> where Wrapping<T>: Add<Output=Wrapping<T>> {
-    fn is_zero(&self) -> bool {
-        self.0.is_zero()
-    }
-    fn zero() -> Self {
-        Wrapping(T::zero())
-    }
-}
-
-
-/// Defines a multiplicative identity element for `Self`.
-pub trait One: Sized + Mul<Self, Output = Self> {
-    /// Returns the multiplicative identity element of `Self`, `1`.
-    ///
-    /// # Laws
-    ///
-    /// ```{.text}
-    /// a * 1 = a       ∀ a ∈ Self
-    /// 1 * a = a       ∀ a ∈ Self
-    /// ```
-    ///
-    /// # Purity
-    ///
-    /// This function should return the same result at all times regardless of
-    /// external mutable state, for example values stored in TLS or in
-    /// `static mut`s.
-    // FIXME (#5527): This should be an associated constant
-    fn one() -> Self;
-}
-
-macro_rules! one_impl {
-    ($t:ty, $v:expr) => {
-        impl One for $t {
-            #[inline]
-            fn one() -> $t { $v }
-        }
-    }
-}
-
-one_impl!(usize, 1usize);
-one_impl!(u8,    1u8);
-one_impl!(u16,   1u16);
-one_impl!(u32,   1u32);
-one_impl!(u64,   1u64);
-
-one_impl!(isize, 1isize);
-one_impl!(i8,    1i8);
-one_impl!(i16,   1i16);
-one_impl!(i32,   1i32);
-one_impl!(i64,   1i64);
-
-one_impl!(f32, 1.0f32);
-one_impl!(f64, 1.0f64);
-
-impl<T: One> One for Wrapping<T> where Wrapping<T>: Mul<Output=Wrapping<T>> {
-    fn one() -> Self {
-        Wrapping(T::one())
-    }
-}
-
-// Some helper functions provided for backwards compatibility.
-
-/// Returns the additive identity, `0`.
-#[inline(always)] pub fn zero<T: Zero>() -> T { Zero::zero() }
-
-/// Returns the multiplicative identity, `1`.
-#[inline(always)] pub fn one<T: One>() -> T { One::one() }
-
-
-macro_rules! test_wrapping_identities {
-    ($($t:ty)+) => {
-        $(
-            assert_eq!(zero::<$t>(), zero::<Wrapping<$t>>().0);
-            assert_eq!(one::<$t>(), one::<Wrapping<$t>>().0);
-            assert_eq!((0 as $t).is_zero(), Wrapping(0 as $t).is_zero());
-            assert_eq!((1 as $t).is_zero(), Wrapping(1 as $t).is_zero());
-        )+   
-    };
-}
-
-#[test]
-fn wrapping_identities() {
-    test_wrapping_identities!(isize i8 i16 i32 i64 usize u8 u16 u32 u64);
-}
-
-#[test]
-fn wrapping_is_zero() {
-    fn require_zero<T: Zero>(_: &T) {}
-    require_zero(&Wrapping(42));
-}
-#[test]
-fn wrapping_is_one() {
-    fn require_one<T: One>(_: &T) {}
-    require_one(&Wrapping(42));
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/int.rs
+++ /dev/null
@@ -1,376 +0,0 @@
-use std::ops::{Not, BitAnd, BitOr, BitXor, Shl, Shr};
-
-use {Num, NumCast};
-use bounds::Bounded;
-use ops::checked::*;
-use ops::saturating::Saturating;
-
-pub trait PrimInt
-    : Sized
-    + Copy
-    + Num + NumCast
-    + Bounded
-    + PartialOrd + Ord + Eq
-    + Not<Output=Self>
-    + BitAnd<Output=Self>
-    + BitOr<Output=Self>
-    + BitXor<Output=Self>
-    + Shl<usize, Output=Self>
-    + Shr<usize, Output=Self>
-    + CheckedAdd<Output=Self>
-    + CheckedSub<Output=Self>
-    + CheckedMul<Output=Self>
-    + CheckedDiv<Output=Self>
-    + Saturating
-{
-    /// Returns the number of ones in the binary representation of `self`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0b01001100u8;
-    ///
-    /// assert_eq!(n.count_ones(), 3);
-    /// ```
-    fn count_ones(self) -> u32;
-
-    /// Returns the number of zeros in the binary representation of `self`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0b01001100u8;
-    ///
-    /// assert_eq!(n.count_zeros(), 5);
-    /// ```
-    fn count_zeros(self) -> u32;
-
-    /// Returns the number of leading zeros in the binary representation
-    /// of `self`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0b0101000u16;
-    ///
-    /// assert_eq!(n.leading_zeros(), 10);
-    /// ```
-    fn leading_zeros(self) -> u32;
-
-    /// Returns the number of trailing zeros in the binary representation
-    /// of `self`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0b0101000u16;
-    ///
-    /// assert_eq!(n.trailing_zeros(), 3);
-    /// ```
-    fn trailing_zeros(self) -> u32;
-
-    /// Shifts the bits to the left by a specified amount amount, `n`, wrapping
-    /// the truncated bits to the end of the resulting integer.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    /// let m = 0x3456789ABCDEF012u64;
-    ///
-    /// assert_eq!(n.rotate_left(12), m);
-    /// ```
-    fn rotate_left(self, n: u32) -> Self;
-
-    /// Shifts the bits to the right by a specified amount amount, `n`, wrapping
-    /// the truncated bits to the beginning of the resulting integer.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    /// let m = 0xDEF0123456789ABCu64;
-    ///
-    /// assert_eq!(n.rotate_right(12), m);
-    /// ```
-    fn rotate_right(self, n: u32) -> Self;
-
-    /// Shifts the bits to the left by a specified amount amount, `n`, filling
-    /// zeros in the least significant bits.
-    ///
-    /// This is bitwise equivalent to signed `Shl`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    /// let m = 0x3456789ABCDEF000u64;
-    ///
-    /// assert_eq!(n.signed_shl(12), m);
-    /// ```
-    fn signed_shl(self, n: u32) -> Self;
-
-    /// Shifts the bits to the right by a specified amount amount, `n`, copying
-    /// the "sign bit" in the most significant bits even for unsigned types.
-    ///
-    /// This is bitwise equivalent to signed `Shr`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0xFEDCBA9876543210u64;
-    /// let m = 0xFFFFEDCBA9876543u64;
-    ///
-    /// assert_eq!(n.signed_shr(12), m);
-    /// ```
-    fn signed_shr(self, n: u32) -> Self;
-
-    /// Shifts the bits to the left by a specified amount amount, `n`, filling
-    /// zeros in the least significant bits.
-    ///
-    /// This is bitwise equivalent to unsigned `Shl`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFi64;
-    /// let m = 0x3456789ABCDEF000i64;
-    ///
-    /// assert_eq!(n.unsigned_shl(12), m);
-    /// ```
-    fn unsigned_shl(self, n: u32) -> Self;
-
-    /// Shifts the bits to the right by a specified amount amount, `n`, filling
-    /// zeros in the most significant bits.
-    ///
-    /// This is bitwise equivalent to unsigned `Shr`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0xFEDCBA9876543210i64;
-    /// let m = 0x000FEDCBA9876543i64;
-    ///
-    /// assert_eq!(n.unsigned_shr(12), m);
-    /// ```
-    fn unsigned_shr(self, n: u32) -> Self;
-
-    /// Reverses the byte order of the integer.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    /// let m = 0xEFCDAB8967452301u64;
-    ///
-    /// assert_eq!(n.swap_bytes(), m);
-    /// ```
-    fn swap_bytes(self) -> Self;
-
-    /// Convert an integer from big endian to the target's endianness.
-    ///
-    /// On big endian this is a no-op. On little endian the bytes are swapped.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    ///
-    /// if cfg!(target_endian = "big") {
-    ///     assert_eq!(u64::from_be(n), n)
-    /// } else {
-    ///     assert_eq!(u64::from_be(n), n.swap_bytes())
-    /// }
-    /// ```
-    fn from_be(x: Self) -> Self;
-
-    /// Convert an integer from little endian to the target's endianness.
-    ///
-    /// On little endian this is a no-op. On big endian the bytes are swapped.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    ///
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(u64::from_le(n), n)
-    /// } else {
-    ///     assert_eq!(u64::from_le(n), n.swap_bytes())
-    /// }
-    /// ```
-    fn from_le(x: Self) -> Self;
-
-    /// Convert `self` to big endian from the target's endianness.
-    ///
-    /// On big endian this is a no-op. On little endian the bytes are swapped.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    ///
-    /// if cfg!(target_endian = "big") {
-    ///     assert_eq!(n.to_be(), n)
-    /// } else {
-    ///     assert_eq!(n.to_be(), n.swap_bytes())
-    /// }
-    /// ```
-    fn to_be(self) -> Self;
-
-    /// Convert `self` to little endian from the target's endianness.
-    ///
-    /// On little endian this is a no-op. On big endian the bytes are swapped.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// let n = 0x0123456789ABCDEFu64;
-    ///
-    /// if cfg!(target_endian = "little") {
-    ///     assert_eq!(n.to_le(), n)
-    /// } else {
-    ///     assert_eq!(n.to_le(), n.swap_bytes())
-    /// }
-    /// ```
-    fn to_le(self) -> Self;
-
-    /// Raises self to the power of `exp`, using exponentiation by squaring.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use num_traits::PrimInt;
-    ///
-    /// assert_eq!(2i32.pow(4), 16);
-    /// ```
-    fn pow(self, exp: u32) -> Self;
-}
-
-macro_rules! prim_int_impl {
-    ($T:ty, $S:ty, $U:ty) => (
-        impl PrimInt for $T {
-            #[inline]
-            fn count_ones(self) -> u32 {
-                <$T>::count_ones(self)
-            }
-
-            #[inline]
-            fn count_zeros(self) -> u32 {
-                <$T>::count_zeros(self)
-            }
-
-            #[inline]
-            fn leading_zeros(self) -> u32 {
-                <$T>::leading_zeros(self)
-            }
-
-            #[inline]
-            fn trailing_zeros(self) -> u32 {
-                <$T>::trailing_zeros(self)
-            }
-
-            #[inline]
-            fn rotate_left(self, n: u32) -> Self {
-                <$T>::rotate_left(self, n)
-            }
-
-            #[inline]
-            fn rotate_right(self, n: u32) -> Self {
-                <$T>::rotate_right(self, n)
-            }
-
-            #[inline]
-            fn signed_shl(self, n: u32) -> Self {
-                ((self as $S) << n) as $T
-            }
-
-            #[inline]
-            fn signed_shr(self, n: u32) -> Self {
-                ((self as $S) >> n) as $T
-            }
-
-            #[inline]
-            fn unsigned_shl(self, n: u32) -> Self {
-                ((self as $U) << n) as $T
-            }
-
-            #[inline]
-            fn unsigned_shr(self, n: u32) -> Self {
-                ((self as $U) >> n) as $T
-            }
-
-            #[inline]
-            fn swap_bytes(self) -> Self {
-                <$T>::swap_bytes(self)
-            }
-
-            #[inline]
-            fn from_be(x: Self) -> Self {
-                <$T>::from_be(x)
-            }
-
-            #[inline]
-            fn from_le(x: Self) -> Self {
-                <$T>::from_le(x)
-            }
-
-            #[inline]
-            fn to_be(self) -> Self {
-                <$T>::to_be(self)
-            }
-
-            #[inline]
-            fn to_le(self) -> Self {
-                <$T>::to_le(self)
-            }
-
-            #[inline]
-            fn pow(self, exp: u32) -> Self {
-                <$T>::pow(self, exp)
-            }
-        }
-    )
-}
-
-// prim_int_impl!(type, signed, unsigned);
-prim_int_impl!(u8,    i8,    u8);
-prim_int_impl!(u16,   i16,   u16);
-prim_int_impl!(u32,   i32,   u32);
-prim_int_impl!(u64,   i64,   u64);
-prim_int_impl!(usize, isize, usize);
-prim_int_impl!(i8,    i8,    u8);
-prim_int_impl!(i16,   i16,   u16);
-prim_int_impl!(i32,   i32,   u32);
-prim_int_impl!(i64,   i64,   u64);
-prim_int_impl!(isize, isize, usize);
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/lib.rs
+++ /dev/null
@@ -1,435 +0,0 @@
-// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Numeric traits for generic mathematics
-#![doc(html_logo_url = "https://rust-num.github.io/num/rust-logo-128x128-blk-v2.png",
-       html_favicon_url = "https://rust-num.github.io/num/favicon.ico",
-       html_root_url = "https://rust-num.github.io/num/",
-       html_playground_url = "http://play.integer32.com/")]
-
-use std::ops::{Add, Sub, Mul, Div, Rem};
-use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
-use std::num::Wrapping;
-
-pub use bounds::Bounded;
-pub use float::{Float, FloatConst};
-pub use identities::{Zero, One, zero, one};
-pub use ops::checked::*;
-pub use ops::wrapping::*;
-pub use ops::saturating::Saturating;
-pub use sign::{Signed, Unsigned, abs, abs_sub, signum};
-pub use cast::*;
-pub use int::PrimInt;
-pub use pow::{pow, checked_pow};
-
-pub mod identities;
-pub mod sign;
-pub mod ops;
-pub mod bounds;
-pub mod float;
-pub mod cast;
-pub mod int;
-pub mod pow;
-
-/// The base trait for numeric types, covering `0` and `1` values,
-/// comparisons, basic numeric operations, and string conversion.
-pub trait Num: PartialEq + Zero + One + NumOps
-{
-    type FromStrRadixErr;
-
-    /// Convert from a string and radix <= 36.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use num_traits::Num;
-    ///
-    /// let result = <i32 as Num>::from_str_radix("27", 10);
-    /// assert_eq!(result, Ok(27));
-    ///
-    /// let result = <i32 as Num>::from_str_radix("foo", 10);
-    /// assert!(result.is_err());
-    /// ```
-    fn from_str_radix(str: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr>;
-}
-
-/// The trait for types implementing basic numeric operations
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait NumOps<Rhs = Self, Output = Self>
-    : Add<Rhs, Output = Output>
-    + Sub<Rhs, Output = Output>
-    + Mul<Rhs, Output = Output>
-    + Div<Rhs, Output = Output>
-    + Rem<Rhs, Output = Output>
-{}
-
-impl<T, Rhs, Output> NumOps<Rhs, Output> for T
-where T: Add<Rhs, Output = Output>
-       + Sub<Rhs, Output = Output>
-       + Mul<Rhs, Output = Output>
-       + Div<Rhs, Output = Output>
-       + Rem<Rhs, Output = Output>
-{}
-
-/// The trait for `Num` types which also implement numeric operations taking
-/// the second operand by reference.
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait NumRef: Num + for<'r> NumOps<&'r Self> {}
-impl<T> NumRef for T where T: Num + for<'r> NumOps<&'r T> {}
-
-/// The trait for references which implement numeric operations, taking the
-/// second operand either by value or by reference.
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait RefNum<Base>: NumOps<Base, Base> + for<'r> NumOps<&'r Base, Base> {}
-impl<T, Base> RefNum<Base> for T where T: NumOps<Base, Base> + for<'r> NumOps<&'r Base, Base> {}
-
-/// The trait for types implementing numeric assignment operators (like `+=`).
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait NumAssignOps<Rhs = Self>
-    : AddAssign<Rhs>
-    + SubAssign<Rhs>
-    + MulAssign<Rhs>
-    + DivAssign<Rhs>
-    + RemAssign<Rhs>
-{}
-
-impl<T, Rhs> NumAssignOps<Rhs> for T
-where T: AddAssign<Rhs>
-       + SubAssign<Rhs>
-       + MulAssign<Rhs>
-       + DivAssign<Rhs>
-       + RemAssign<Rhs>
-{}
-
-/// The trait for `Num` types which also implement assignment operators.
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait NumAssign: Num + NumAssignOps {}
-impl<T> NumAssign for T where T: Num + NumAssignOps {}
-
-/// The trait for `NumAssign` types which also implement assignment operations
-/// taking the second operand by reference.
-///
-/// This is automatically implemented for types which implement the operators.
-pub trait NumAssignRef: NumAssign + for<'r> NumAssignOps<&'r Self> {}
-impl<T> NumAssignRef for T where T: NumAssign + for<'r> NumAssignOps<&'r T> {}
-
-
-macro_rules! int_trait_impl {
-    ($name:ident for $($t:ty)*) => ($(
-        impl $name for $t {
-            type FromStrRadixErr = ::std::num::ParseIntError;
-            #[inline]
-            fn from_str_radix(s: &str, radix: u32)
-                              -> Result<Self, ::std::num::ParseIntError>
-            {
-                <$t>::from_str_radix(s, radix)
-            }
-        }
-    )*)
-}
-int_trait_impl!(Num for usize u8 u16 u32 u64 isize i8 i16 i32 i64);
-
-impl<T: Num> Num for Wrapping<T>
-    where Wrapping<T>:
-          Add<Output = Wrapping<T>> + Sub<Output = Wrapping<T>>
-        + Mul<Output = Wrapping<T>> + Div<Output = Wrapping<T>> + Rem<Output = Wrapping<T>>
-{
-    type FromStrRadixErr = T::FromStrRadixErr;
-    fn from_str_radix(str: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
-        T::from_str_radix(str, radix).map(Wrapping)
-    }
-}
-
-
-#[derive(Debug)]
-pub enum FloatErrorKind {
-    Empty,
-    Invalid,
-}
-// FIXME: std::num::ParseFloatError is stable in 1.0, but opaque to us,
-// so there's not really any way for us to reuse it.
-#[derive(Debug)]
-pub struct ParseFloatError {
-    pub kind: FloatErrorKind,
-}
-
-// FIXME: The standard library from_str_radix on floats was deprecated, so we're stuck
-// with this implementation ourselves until we want to make a breaking change.
-// (would have to drop it from `Num` though)
-macro_rules! float_trait_impl {
-    ($name:ident for $($t:ty)*) => ($(
-        impl $name for $t {
-            type FromStrRadixErr = ParseFloatError;
-
-            fn from_str_radix(src: &str, radix: u32)
-                              -> Result<Self, Self::FromStrRadixErr>
-            {
-                use self::FloatErrorKind::*;
-                use self::ParseFloatError as PFE;
-
-                // Special values
-                match src {
-                    "inf"   => return Ok(Float::infinity()),
-                    "-inf"  => return Ok(Float::neg_infinity()),
-                    "NaN"   => return Ok(Float::nan()),
-                    _       => {},
-                }
-
-                fn slice_shift_char(src: &str) -> Option<(char, &str)> {
-                    src.chars().nth(0).map(|ch| (ch, &src[1..]))
-                }
-
-                let (is_positive, src) =  match slice_shift_char(src) {
-                    None             => return Err(PFE { kind: Empty }),
-                    Some(('-', ""))  => return Err(PFE { kind: Empty }),
-                    Some(('-', src)) => (false, src),
-                    Some((_, _))     => (true,  src),
-                };
-
-                // The significand to accumulate
-                let mut sig = if is_positive { 0.0 } else { -0.0 };
-                // Necessary to detect overflow
-                let mut prev_sig = sig;
-                let mut cs = src.chars().enumerate();
-                // Exponent prefix and exponent index offset
-                let mut exp_info = None::<(char, usize)>;
-
-                // Parse the integer part of the significand
-                for (i, c) in cs.by_ref() {
-                    match c.to_digit(radix) {
-                        Some(digit) => {
-                            // shift significand one digit left
-                            sig = sig * (radix as $t);
-
-                            // add/subtract current digit depending on sign
-                            if is_positive {
-                                sig = sig + ((digit as isize) as $t);
-                            } else {
-                                sig = sig - ((digit as isize) as $t);
-                            }
-
-                            // Detect overflow by comparing to last value, except
-                            // if we've not seen any non-zero digits.
-                            if prev_sig != 0.0 {
-                                if is_positive && sig <= prev_sig
-                                    { return Ok(Float::infinity()); }
-                                if !is_positive && sig >= prev_sig
-                                    { return Ok(Float::neg_infinity()); }
-
-                                // Detect overflow by reversing the shift-and-add process
-                                if is_positive && (prev_sig != (sig - digit as $t) / radix as $t)
-                                    { return Ok(Float::infinity()); }
-                                if !is_positive && (prev_sig != (sig + digit as $t) / radix as $t)
-                                    { return Ok(Float::neg_infinity()); }
-                            }
-                            prev_sig = sig;
-                        },
-                        None => match c {
-                            'e' | 'E' | 'p' | 'P' => {
-                                exp_info = Some((c, i + 1));
-                                break;  // start of exponent
-                            },
-                            '.' => {
-                                break;  // start of fractional part
-                            },
-                            _ => {
-                                return Err(PFE { kind: Invalid });
-                            },
-                        },
-                    }
-                }
-
-                // If we are not yet at the exponent parse the fractional
-                // part of the significand
-                if exp_info.is_none() {
-                    let mut power = 1.0;
-                    for (i, c) in cs.by_ref() {
-                        match c.to_digit(radix) {
-                            Some(digit) => {
-                                // Decrease power one order of magnitude
-                                power = power / (radix as $t);
-                                // add/subtract current digit depending on sign
-                                sig = if is_positive {
-                                    sig + (digit as $t) * power
-                                } else {
-                                    sig - (digit as $t) * power
-                                };
-                                // Detect overflow by comparing to last value
-                                if is_positive && sig < prev_sig
-                                    { return Ok(Float::infinity()); }
-                                if !is_positive && sig > prev_sig
-                                    { return Ok(Float::neg_infinity()); }
-                                prev_sig = sig;
-                            },
-                            None => match c {
-                                'e' | 'E' | 'p' | 'P' => {
-                                    exp_info = Some((c, i + 1));
-                                    break; // start of exponent
-                                },
-                                _ => {
-                                    return Err(PFE { kind: Invalid });
-                                },
-                            },
-                        }
-                    }
-                }
-
-                // Parse and calculate the exponent
-                let exp = match exp_info {
-                    Some((c, offset)) => {
-                        let base = match c {
-                            'E' | 'e' if radix == 10 => 10.0,
-                            'P' | 'p' if radix == 16 => 2.0,
-                            _ => return Err(PFE { kind: Invalid }),
-                        };
-
-                        // Parse the exponent as decimal integer
-                        let src = &src[offset..];
-                        let (is_positive, exp) = match slice_shift_char(src) {
-                            Some(('-', src)) => (false, src.parse::<usize>()),
-                            Some(('+', src)) => (true,  src.parse::<usize>()),
-                            Some((_, _))     => (true,  src.parse::<usize>()),
-                            None             => return Err(PFE { kind: Invalid }),
-                        };
-
-                        match (is_positive, exp) {
-                            (true,  Ok(exp)) => base.powi(exp as i32),
-                            (false, Ok(exp)) => 1.0 / base.powi(exp as i32),
-                            (_, Err(_))      => return Err(PFE { kind: Invalid }),
-                        }
-                    },
-                    None => 1.0, // no exponent
-                };
-
-                Ok(sig * exp)
-            }
-        }
-    )*)
-}
-float_trait_impl!(Num for f32 f64);
-
-/// A value bounded by a minimum and a maximum
-///
-///  If input is less than min then this returns min.
-///  If input is greater than max then this returns max.
-///  Otherwise this returns input.
-#[inline]
-pub fn clamp<T: PartialOrd>(input: T, min: T, max: T) -> T {
-    debug_assert!(min <= max, "min must be less than or equal to max");
-    if input < min {
-        min
-    } else if input > max {
-        max
-    } else {
-        input
-    }
-}
-
-#[test]
-fn clamp_test() {
-    // Int test
-    assert_eq!(1, clamp(1, -1, 2));
-    assert_eq!(-1, clamp(-2, -1, 2));
-    assert_eq!(2, clamp(3, -1, 2));
-
-    // Float test
-    assert_eq!(1.0, clamp(1.0, -1.0, 2.0));
-    assert_eq!(-1.0, clamp(-2.0, -1.0, 2.0));
-    assert_eq!(2.0, clamp(3.0, -1.0, 2.0));
-}
-
-#[test]
-fn from_str_radix_unwrap() {
-    // The Result error must impl Debug to allow unwrap()
-
-    let i: i32 = Num::from_str_radix("0", 10).unwrap();
-    assert_eq!(i, 0);
-
-    let f: f32 = Num::from_str_radix("0.0", 10).unwrap();
-    assert_eq!(f, 0.0);
-}
-
-macro_rules! test_wrapping_from_str_radix {
-    ($($t:ty)+) => {
-        $(
-            for &(s, r) in &[("42", 10), ("42", 2), ("-13.0", 10), ("foo", 10)] {
-                let w = Wrapping::<$t>::from_str_radix(s, r).map(|w| w.0);
-                assert_eq!(w, <$t as Num>::from_str_radix(s, r));
-            } 
-        )+   
-    };
-}
-#[test]
-fn wrapping_is_num() {
-    fn require_num<T: Num>(_: &T) {}
-    require_num(&Wrapping(42_u32));
-    require_num(&Wrapping(-42));
-}
-#[test]
-fn wrapping_from_str_radix() {
-    test_wrapping_from_str_radix!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
-}
-
-#[test]
-fn check_num_ops() {
-    fn compute<T: Num + Copy>(x: T, y: T) -> T {
-        x * y / y % y + y - y
-    }
-    assert_eq!(compute(1, 2), 1)
-}
-
-#[test]
-fn check_numref_ops() {
-    fn compute<T: NumRef>(x: T, y: &T) -> T {
-        x * y / y % y + y - y
-    }
-    assert_eq!(compute(1, &2), 1)
-}
-
-#[test]
-fn check_refnum_ops() {
-    fn compute<T: Copy>(x: &T, y: T) -> T
-        where for<'a> &'a T: RefNum<T>
-    {
-        &(&(&(&(x * y) / y) % y) + y) - y
-    }
-    assert_eq!(compute(&1, 2), 1)
-}
-
-#[test]
-fn check_refref_ops() {
-    fn compute<T>(x: &T, y: &T) -> T
-        where for<'a> &'a T: RefNum<T>
-    {
-        &(&(&(&(x * y) / y) % y) + y) - y
-    }
-    assert_eq!(compute(&1, &2), 1)
-}
-
-#[test]
-fn check_numassign_ops() {
-    fn compute<T: NumAssign + Copy>(mut x: T, y: T) -> T {
-        x *= y;
-        x /= y;
-        x %= y;
-        x += y;
-        x -= y;
-        x
-    }
-    assert_eq!(compute(1, 2), 1)
-}
-
-// TODO test `NumAssignRef`, but even the standard numeric types don't
-// implement this yet. (see rust pr41336)
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/ops/checked.rs
+++ /dev/null
@@ -1,92 +0,0 @@
-use std::ops::{Add, Sub, Mul, Div};
-
-/// Performs addition that returns `None` instead of wrapping around on
-/// overflow.
-pub trait CheckedAdd: Sized + Add<Self, Output=Self> {
-    /// Adds two numbers, checking for overflow. If overflow happens, `None` is
-    /// returned.
-    fn checked_add(&self, v: &Self) -> Option<Self>;
-}
-
-macro_rules! checked_impl {
-    ($trait_name:ident, $method:ident, $t:ty) => {
-        impl $trait_name for $t {
-            #[inline]
-            fn $method(&self, v: &$t) -> Option<$t> {
-                <$t>::$method(*self, *v)
-            }
-        }
-    }
-}
-
-checked_impl!(CheckedAdd, checked_add, u8);
-checked_impl!(CheckedAdd, checked_add, u16);
-checked_impl!(CheckedAdd, checked_add, u32);
-checked_impl!(CheckedAdd, checked_add, u64);
-checked_impl!(CheckedAdd, checked_add, usize);
-
-checked_impl!(CheckedAdd, checked_add, i8);
-checked_impl!(CheckedAdd, checked_add, i16);
-checked_impl!(CheckedAdd, checked_add, i32);
-checked_impl!(CheckedAdd, checked_add, i64);
-checked_impl!(CheckedAdd, checked_add, isize);
-
-/// Performs subtraction that returns `None` instead of wrapping around on underflow.
-pub trait CheckedSub: Sized + Sub<Self, Output=Self> {
-    /// Subtracts two numbers, checking for underflow. If underflow happens,
-    /// `None` is returned.
-    fn checked_sub(&self, v: &Self) -> Option<Self>;
-}
-
-checked_impl!(CheckedSub, checked_sub, u8);
-checked_impl!(CheckedSub, checked_sub, u16);
-checked_impl!(CheckedSub, checked_sub, u32);
-checked_impl!(CheckedSub, checked_sub, u64);
-checked_impl!(CheckedSub, checked_sub, usize);
-
-checked_impl!(CheckedSub, checked_sub, i8);
-checked_impl!(CheckedSub, checked_sub, i16);
-checked_impl!(CheckedSub, checked_sub, i32);
-checked_impl!(CheckedSub, checked_sub, i64);
-checked_impl!(CheckedSub, checked_sub, isize);
-
-/// Performs multiplication that returns `None` instead of wrapping around on underflow or
-/// overflow.
-pub trait CheckedMul: Sized + Mul<Self, Output=Self> {
-    /// Multiplies two numbers, checking for underflow or overflow. If underflow
-    /// or overflow happens, `None` is returned.
-    fn checked_mul(&self, v: &Self) -> Option<Self>;
-}
-
-checked_impl!(CheckedMul, checked_mul, u8);
-checked_impl!(CheckedMul, checked_mul, u16);
-checked_impl!(CheckedMul, checked_mul, u32);
-checked_impl!(CheckedMul, checked_mul, u64);
-checked_impl!(CheckedMul, checked_mul, usize);
-
-checked_impl!(CheckedMul, checked_mul, i8);
-checked_impl!(CheckedMul, checked_mul, i16);
-checked_impl!(CheckedMul, checked_mul, i32);
-checked_impl!(CheckedMul, checked_mul, i64);
-checked_impl!(CheckedMul, checked_mul, isize);
-
-/// Performs division that returns `None` instead of panicking on division by zero and instead of
-/// wrapping around on underflow and overflow.
-pub trait CheckedDiv: Sized + Div<Self, Output=Self> {
-    /// Divides two numbers, checking for underflow, overflow and division by
-    /// zero. If any of that happens, `None` is returned.
-    fn checked_div(&self, v: &Self) -> Option<Self>;
-}
-
-checked_impl!(CheckedDiv, checked_div, u8);
-checked_impl!(CheckedDiv, checked_div, u16);
-checked_impl!(CheckedDiv, checked_div, u32);
-checked_impl!(CheckedDiv, checked_div, u64);
-checked_impl!(CheckedDiv, checked_div, usize);
-
-checked_impl!(CheckedDiv, checked_div, i8);
-checked_impl!(CheckedDiv, checked_div, i16);
-checked_impl!(CheckedDiv, checked_div, i32);
-checked_impl!(CheckedDiv, checked_div, i64);
-checked_impl!(CheckedDiv, checked_div, isize);
-
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/ops/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-pub mod saturating;
-pub mod checked;
-pub mod wrapping;
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/ops/saturating.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-/// Saturating math operations
-pub trait Saturating {
-    /// Saturating addition operator.
-    /// Returns a+b, saturating at the numeric bounds instead of overflowing.
-    fn saturating_add(self, v: Self) -> Self;
-
-    /// Saturating subtraction operator.
-    /// Returns a-b, saturating at the numeric bounds instead of overflowing.
-    fn saturating_sub(self, v: Self) -> Self;
-}
-
-macro_rules! saturating_impl {
-    ($trait_name:ident for $($t:ty)*) => {$(
-        impl $trait_name for $t {
-            #[inline]
-            fn saturating_add(self, v: Self) -> Self {
-                Self::saturating_add(self, v)
-            }
-
-            #[inline]
-            fn saturating_sub(self, v: Self) -> Self {
-                Self::saturating_sub(self, v)
-            }
-        }
-    )*}
-}
-
-saturating_impl!(Saturating for isize usize i8 u8 i16 u16 i32 u32 i64 u64);
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/ops/wrapping.rs
+++ /dev/null
@@ -1,127 +0,0 @@
-use std::ops::{Add, Sub, Mul};
-use std::num::Wrapping;
-
-macro_rules! wrapping_impl {
-    ($trait_name:ident, $method:ident, $t:ty) => {
-        impl $trait_name for $t {
-            #[inline]
-            fn $method(&self, v: &Self) -> Self {
-                <$t>::$method(*self, *v)
-            }
-        }
-    };
-    ($trait_name:ident, $method:ident, $t:ty, $rhs:ty) => {
-        impl $trait_name<$rhs> for $t {
-            #[inline]
-            fn $method(&self, v: &$rhs) -> Self {
-                <$t>::$method(*self, *v)
-            }
-        }
-    }
-}
-
-/// Performs addition that wraps around on overflow.
-pub trait WrappingAdd: Sized + Add<Self, Output=Self> {
-    /// Wrapping (modular) addition. Computes `self + other`, wrapping around at the boundary of
-    /// the type.
-    fn wrapping_add(&self, v: &Self) -> Self;
-}
-
-wrapping_impl!(WrappingAdd, wrapping_add, u8);
-wrapping_impl!(WrappingAdd, wrapping_add, u16);
-wrapping_impl!(WrappingAdd, wrapping_add, u32);
-wrapping_impl!(WrappingAdd, wrapping_add, u64);
-wrapping_impl!(WrappingAdd, wrapping_add, usize);
-
-wrapping_impl!(WrappingAdd, wrapping_add, i8);
-wrapping_impl!(WrappingAdd, wrapping_add, i16);
-wrapping_impl!(WrappingAdd, wrapping_add, i32);
-wrapping_impl!(WrappingAdd, wrapping_add, i64);
-wrapping_impl!(WrappingAdd, wrapping_add, isize);
-
-/// Performs subtraction that wraps around on overflow.
-pub trait WrappingSub: Sized + Sub<Self, Output=Self> {
-    /// Wrapping (modular) subtraction. Computes `self - other`, wrapping around at the boundary
-    /// of the type.
-    fn wrapping_sub(&self, v: &Self) -> Self;
-}
-
-wrapping_impl!(WrappingSub, wrapping_sub, u8);
-wrapping_impl!(WrappingSub, wrapping_sub, u16);
-wrapping_impl!(WrappingSub, wrapping_sub, u32);
-wrapping_impl!(WrappingSub, wrapping_sub, u64);
-wrapping_impl!(WrappingSub, wrapping_sub, usize);
-
-wrapping_impl!(WrappingSub, wrapping_sub, i8);
-wrapping_impl!(WrappingSub, wrapping_sub, i16);
-wrapping_impl!(WrappingSub, wrapping_sub, i32);
-wrapping_impl!(WrappingSub, wrapping_sub, i64);
-wrapping_impl!(WrappingSub, wrapping_sub, isize);
-
-/// Performs multiplication that wraps around on overflow.
-pub trait WrappingMul: Sized + Mul<Self, Output=Self> {
-    /// Wrapping (modular) multiplication. Computes `self * other`, wrapping around at the boundary
-    /// of the type.
-    fn wrapping_mul(&self, v: &Self) -> Self;
-}
-
-wrapping_impl!(WrappingMul, wrapping_mul, u8);
-wrapping_impl!(WrappingMul, wrapping_mul, u16);
-wrapping_impl!(WrappingMul, wrapping_mul, u32);
-wrapping_impl!(WrappingMul, wrapping_mul, u64);
-wrapping_impl!(WrappingMul, wrapping_mul, usize);
-
-wrapping_impl!(WrappingMul, wrapping_mul, i8);
-wrapping_impl!(WrappingMul, wrapping_mul, i16);
-wrapping_impl!(WrappingMul, wrapping_mul, i32);
-wrapping_impl!(WrappingMul, wrapping_mul, i64);
-wrapping_impl!(WrappingMul, wrapping_mul, isize);
-
-// Well this is a bit funny, but all the more appropriate.
-impl<T: WrappingAdd> WrappingAdd for Wrapping<T> where Wrapping<T>: Add<Output = Wrapping<T>> {
-    fn wrapping_add(&self, v: &Self) -> Self {
-        Wrapping(self.0.wrapping_add(&v.0))
-    }
-}
-impl<T: WrappingSub> WrappingSub for Wrapping<T> where Wrapping<T>: Sub<Output = Wrapping<T>> {
-    fn wrapping_sub(&self, v: &Self) -> Self {
-        Wrapping(self.0.wrapping_sub(&v.0))
-    }
-}
-impl<T: WrappingMul> WrappingMul for Wrapping<T> where Wrapping<T>: Mul<Output = Wrapping<T>> {
-    fn wrapping_mul(&self, v: &Self) -> Self {
-        Wrapping(self.0.wrapping_mul(&v.0))
-    }
-}
-
-
-#[test]
-fn test_wrapping_traits() {
-    fn wrapping_add<T: WrappingAdd>(a: T, b: T) -> T { a.wrapping_add(&b) }
-    fn wrapping_sub<T: WrappingSub>(a: T, b: T) -> T { a.wrapping_sub(&b) }
-    fn wrapping_mul<T: WrappingMul>(a: T, b: T) -> T { a.wrapping_mul(&b) }
-    assert_eq!(wrapping_add(255, 1), 0u8);
-    assert_eq!(wrapping_sub(0, 1), 255u8);
-    assert_eq!(wrapping_mul(255, 2), 254u8);
-    assert_eq!(wrapping_add(255, 1), (Wrapping(255u8) + Wrapping(1u8)).0);
-    assert_eq!(wrapping_sub(0, 1), (Wrapping(0u8) - Wrapping(1u8)).0);
-    assert_eq!(wrapping_mul(255, 2), (Wrapping(255u8) * Wrapping(2u8)).0);
-}
-
-#[test]
-fn wrapping_is_wrappingadd() {
-    fn require_wrappingadd<T: WrappingAdd>(_: &T) {}
-    require_wrappingadd(&Wrapping(42));
-}
-
-#[test]
-fn wrapping_is_wrappingsub() {
-    fn require_wrappingsub<T: WrappingSub>(_: &T) {}
-    require_wrappingsub(&Wrapping(42));
-}
-
-#[test]
-fn wrapping_is_wrappingmul() {
-    fn require_wrappingmul<T: WrappingMul>(_: &T) {}
-    require_wrappingmul(&Wrapping(42));
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/pow.rs
+++ /dev/null
@@ -1,73 +0,0 @@
-use std::ops::Mul;
-use {One, CheckedMul};
-
-/// Raises a value to the power of exp, using exponentiation by squaring.
-///
-/// # Example
-///
-/// ```rust
-/// use num_traits::pow;
-///
-/// assert_eq!(pow(2i8, 4), 16);
-/// assert_eq!(pow(6u8, 3), 216);
-/// ```
-#[inline]
-pub fn pow<T: Clone + One + Mul<T, Output = T>>(mut base: T, mut exp: usize) -> T {
-    if exp == 0 { return T::one() }
-
-    while exp & 1 == 0 {
-        base = base.clone() * base;
-        exp >>= 1;
-    }
-    if exp == 1 { return base }
-
-    let mut acc = base.clone();
-    while exp > 1 {
-        exp >>= 1;
-        base = base.clone() * base;
-        if exp & 1 == 1 {
-            acc = acc * base.clone();
-        }
-    }
-    acc
-}
-
-/// Raises a value to the power of exp, returning `None` if an overflow occurred.
-///
-/// Otherwise same as the `pow` function.
-///
-/// # Example
-///
-/// ```rust
-/// use num_traits::checked_pow;
-///
-/// assert_eq!(checked_pow(2i8, 4), Some(16));
-/// assert_eq!(checked_pow(7i8, 8), None);
-/// assert_eq!(checked_pow(7u32, 8), Some(5_764_801));
-/// ```
-#[inline]
-pub fn checked_pow<T: Clone + One + CheckedMul>(mut base: T, mut exp: usize) -> Option<T> {
-    if exp == 0 { return Some(T::one()) }
-
-    macro_rules! optry {
-        ( $ expr : expr ) => {
-            if let Some(val) = $expr { val } else { return None }
-        }
-    }
-
-    while exp & 1 == 0 {
-        base = optry!(base.checked_mul(&base));
-        exp >>= 1;
-    }
-    if exp == 1 { return Some(base) }
-
-    let mut acc = base.clone();
-    while exp > 1 {
-        exp >>= 1;
-        base = optry!(base.checked_mul(&base));
-        if exp & 1 == 1 {
-            acc = optry!(acc.checked_mul(&base));
-        }
-    }
-    Some(acc)
-}
deleted file mode 100644
--- a/third_party/rust/num-traits-0.1.39/src/sign.rs
+++ /dev/null
@@ -1,204 +0,0 @@
-use std::ops::Neg;
-use std::{f32, f64};
-use std::num::Wrapping;
-
-use Num;
-
-/// Useful functions for signed numbers (i.e. numbers that can be negative).
-pub trait Signed: Sized + Num + Neg<Output = Self> {
-    /// Computes the absolute value.
-    ///
-    /// For `f32` and `f64`, `NaN` will be returned if the number is `NaN`.
-    ///
-    /// For signed integers, `::MIN` will be returned if the number is `::MIN`.
-    fn abs(&self) -> Self;
-
-    /// The positive difference of two numbers.
-    ///
-    /// Returns `zero` if the number is less than or equal to `other`, otherwise the difference
-    /// between `self` and `other` is returned.
-    fn abs_sub(&self, other: &Self) -> Self;
-
-    /// Returns the sign of the number.
-    ///
-    /// For `f32` and `f64`:
-    ///
-    /// * `1.0` if the number is positive, `+0.0` or `INFINITY`
-    /// * `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
-    /// * `NaN` if the number is `NaN`
-    ///
-    /// For signed integers:
-    ///
-    /// * `0` if the number is zero
-    /// * `1` if the number is positive
-    /// * `-1` if the number is negative
-    fn signum(&self) -> Self;
-
-    /// Returns true if the number is positive and false if the number is zero or negative.
-    fn is_positive(&self) -> bool;
-
-    /// Returns true if the number is negative and false if the number is zero or positive.
-    fn is_negative(&self) -> bool;
-}
-
-macro_rules! signed_impl {
-    ($($t:ty)*) => ($(
-        impl Signed for $t {
-            #[inline]
-            fn abs(&self) -> $t {
-                if self.is_negative() { -*self } else { *self }
-            }
-
-            #[inline]
-            fn abs_sub(&self, other: &$t) -> $t {
-                if *self <= *other { 0 } else { *self - *other }
-            }
-
-            #[inline]
-            fn signum(&self) -> $t {
-                match *self {
-                    n if n > 0 => 1,
-                    0 => 0,
-                    _ => -1,
-                }
-            }
-
-            #[inline]
-            fn is_positive(&self) -> bool { *self > 0 }
-
-            #[inline]
-            fn is_negative(&self) -> bool { *self < 0 }
-        }
-    )*)
-}
-
-signed_impl!(isize i8 i16 i32 i64);
-
-impl<T: Signed> Signed for Wrapping<T> where Wrapping<T>: Num + Neg<Output=Wrapping<T>>
-{
-    #[inline]
-    fn abs(&self) -> Self {
-        Wrapping(self.0.abs())
-    }
-
-    #[inline]
-    fn abs_sub(&self, other: &Self) -> Self {
-        Wrapping(self.0.abs_sub(&other.0))
-    }
-
-    #[inline]
-    fn signum(&self) -> Self {
-        Wrapping(self.0.signum())
-    }
-
-    #[inline]
-    fn is_positive(&self) -> bool { self.0.is_positive() }
-
-    #[inline]
-    fn is_negative(&self) -> bool { self.0.is_negative() }
-}
-
-macro_rules! signed_float_impl {
-    ($t:ty, $nan:expr, $inf:expr, $neg_inf:expr) => {
-        impl Signed for $t {
-            /// Computes the absolute value. Returns `NAN` if the number is `NAN`.
-            #[inline]
-            fn abs(&self) -> $t {
-                <$t>::abs(*self)
-            }
-
-            /// The positive difference of two numbers. Returns `0.0` if the number is
-            /// less than or equal to `other`, otherwise the difference between`self`
-            /// and `other` is returned.
-            #[inline]
-            #[allow(deprecated)]
-            fn abs_sub(&self, other: &$t) -> $t {
-                <$t>::abs_sub(*self, *other)
-            }
-
-            /// # Returns
-            ///
-            /// - `1.0` if the number is positive, `+0.0` or `INFINITY`
-            /// - `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
-            /// - `NAN` if the number is NaN
-            #[inline]
-            fn signum(&self) -> $t {
-                <$t>::signum(*self)
-            }
-
-            /// Returns `true` if the number is positive, including `+0.0` and `INFINITY`
-            #[inline]
-            fn is_positive(&self) -> bool { *self > 0.0 || (1.0 / *self) == $inf }
-
-            /// Returns `true` if the number is negative, including `-0.0` and `NEG_INFINITY`
-            #[inline]
-            fn is_negative(&self) -> bool { *self < 0.0 || (1.0 / *self) == $neg_inf }
-        }
-    }
-}
-
-signed_float_impl!(f32, f32::NAN, f32::INFINITY, f32::NEG_INFINITY);
-signed_float_impl!(f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY);
-
-/// Computes the absolute value.
-///
-/// For `f32` and `f64`, `NaN` will be returned if the number is `NaN`
-///
-/// For signed integers, `::MIN` will be returned if the number is `::MIN`.
-#[inline(always)]
-pub fn abs<T: Signed>(value: T) -> T {
-    value.abs()
-}
-
-/// The positive difference of two numbers.
-///
-/// Returns zero if `x` is less than or equal to `y`, otherwise the difference
-/// between `x` and `y` is returned.
-#[inline(always)]
-pub fn abs_sub<T: Signed>(x: T, y: T) -> T {
-    x.abs_sub(&y)
-}
-
-/// Returns the sign of the number.
-///
-/// For `f32` and `f64`:
-///
-/// * `1.0` if the number is positive, `+0.0` or `INFINITY`
-/// * `-1.0` if the number is negative, `-0.0` or `NEG_INFINITY`
-/// * `NaN` if the number is `NaN`
-///
-/// For signed integers:
-///
-/// * `0` if the number is zero
-/// * `1` if the number is positive
-/// * `-1` if the number is negative
-#[inline(always)] pub fn signum<T: Signed>(value: T) -> T { value.signum() }
-
-/// A trait for values which cannot be negative
-pub trait Unsigned: Num {}
-
-macro_rules! empty_trait_impl {
-    ($name:ident for $($t:ty)*) => ($(
-        impl $name for $t {}
-    )*)
-}
-
-empty_trait_impl!(Unsigned for usize u8 u16 u32 u64);
-
-impl<T: Unsigned> Unsigned for Wrapping<T> where Wrapping<T>: Num {}
-
-#[test]
-fn unsigned_wrapping_is_unsigned() {
-    fn require_unsigned<T: Unsigned>(_: &T) {}
-    require_unsigned(&Wrapping(42_u32));
-}
-/*
-// Commenting this out since it doesn't compile on Rust 1.8,
-// because on this version Wrapping doesn't implement Neg and therefore can't
-// implement Signed.
-#[test]
-fn signed_wrapping_is_signed() {
-    fn require_signed<T: Signed>(_: &T) {}
-    require_signed(&Wrapping(-42));
-}
-*/
--- a/third_party/rust/num-traits/.cargo-checksum.json
+++ b/third_party/rust/num-traits/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"92adda23269f6c20f8a7ba6ff6afab4c0a3756dfade9ff9513ef0546864a2848","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/bounds.rs":"3666fbdf8b347fa1daad3ee92e3ac4a10df99d26bc340b877d5bbba914b61782","src/cast.rs":"c44c11863751810ef40763ac3470facdf0c3f0d16db9474d3e566a8c78eafdaa","src/float.rs":"fd768b5bb403cd5056d3b588074ed5571c40279d6a7da8c4f3c46ac4713f89fd","src/identities.rs":"c78281aa689c5f376a2cfbe1e81aefd54d634f410671ce1660a2c117b3ae6b04","src/int.rs":"b7b42dfa10423308f858216ac63fa52e26c49a7bc8900cd98de210992efc3f5f","src/lib.rs":"84c84706da4df88b87a0f5ed2e412dcfc644f9f849db2dc4302faa5d8b79379a","src/ops/checked.rs":"bc667779636f81c7eca138c6d57252a6bb6ca4cd1f0ff706a993067044d86f94","src/ops/mod.rs":"668ea4d117bc1fdf7eaf0fe16692fa40dfbdfcbc7a2010237fe395ce0086e02e","src/ops/saturating.rs":"46821d815c90c16b2f6bec0b94b4d7ebdbddf3ea42edc0467de738c56abf6436","src/ops/wrapping.rs":"a444c7eb3366f2ad4c3a9938f1158b1994b9da4bbf9097884b5e8e27a9b581dd","src/pow.rs":"73b611ad8d595ef917871ba859ff0c25efc2382220d30568e5fbb930bf6b4daa","src/sign.rs":"732736f44c3c410f43da98eb3c8887319d94ad2c4883d614a9c353659402b315"},"package":"99843c856d68d8b4313b03a17e33c4bb42ae8f6610ea81b28abe076ac721b9b0"}
\ No newline at end of file
+{"files":{"Cargo.toml":"3d24ace42f6604297f16fb6e9a8aecb11644083bcc14eccb5d04002146444cd4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","src/bounds.rs":"c744ca32dcb31447abc1132b2ef6f7c102d4ffa3dbc36a24a384520ec8702839","src/cast.rs":"a067d47329c30672ad9764e34a551cd566b5023f17a35673b35dbab6388043d2","src/float.rs":"fd768b5bb403cd5056d3b588074ed5571c40279d6a7da8c4f3c46ac4713f89fd","src/identities.rs":"ed67758e226fb78a14496776533a6d97d9f813294aadc73958e3005fd0e66599","src/int.rs":"b7b42dfa10423308f858216ac63fa52e26c49a7bc8900cd98de210992efc3f5f","src/lib.rs":"75b1b8b714b51f6169be13e8043bc0e9341a5aeb04e61c5446a5ce5cb241e101","src/ops/checked.rs":"bc667779636f81c7eca138c6d57252a6bb6ca4cd1f0ff706a993067044d86f94","src/ops/mod.rs":"668ea4d117bc1fdf7eaf0fe16692fa40dfbdfcbc7a2010237fe395ce0086e02e","src/ops/saturating.rs":"46821d815c90c16b2f6bec0b94b4d7ebdbddf3ea42edc0467de738c56abf6436","src/ops/wrapping.rs":"a444c7eb3366f2ad4c3a9938f1158b1994b9da4bbf9097884b5e8e27a9b581dd","src/pow.rs":"73b611ad8d595ef917871ba859ff0c25efc2382220d30568e5fbb930bf6b4daa","src/sign.rs":"732736f44c3c410f43da98eb3c8887319d94ad2c4883d614a9c353659402b315"},"package":"cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"}
\ No newline at end of file
--- a/third_party/rust/num-traits/Cargo.toml
+++ b/third_party/rust/num-traits/Cargo.toml
@@ -1,13 +1,25 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
 [package]
+name = "num-traits"
+version = "0.1.41"
 authors = ["The Rust Project Developers"]
 description = "Numeric traits for generic mathematics"
+homepage = "https://github.com/rust-num/num"
 documentation = "http://rust-num.github.io/num"
-homepage = "https://github.com/rust-num/num"
 keywords = ["mathematics", "numerics"]
-categories = [ "algorithms", "science" ]
+categories = ["algorithms", "science"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/rust-num/num"
-name = "num-traits"
-version = "0.1.40"
 
 [dependencies]
--- a/third_party/rust/num-traits/src/bounds.rs
+++ b/third_party/rust/num-traits/src/bounds.rs
@@ -72,27 +72,27 @@ macro_rules! bounded_tuple {
         }
     );
 }
 
 for_each_tuple!(bounded_tuple);
 bounded_impl!(f64, f64::MIN, f64::MAX);
 
 
-macro_rules! test_wrapping_bounded {
-    ($($t:ty)+) => {
-        $(
-            assert_eq!(Wrapping::<$t>::min_value().0, <$t>::min_value());
-            assert_eq!(Wrapping::<$t>::max_value().0, <$t>::max_value());
-        )+   
-    };
-}
-
 #[test]
 fn wrapping_bounded() {
+    macro_rules! test_wrapping_bounded {
+        ($($t:ty)+) => {
+            $(
+                assert_eq!(Wrapping::<$t>::min_value().0, <$t>::min_value());
+                assert_eq!(Wrapping::<$t>::max_value().0, <$t>::max_value());
+            )+
+        };
+    }
+
     test_wrapping_bounded!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
 }
 
 #[test]
 fn wrapping_is_bounded() {
     fn require_bounded<T: Bounded>(_: &T) {}
     require_bounded(&Wrapping(42_u32));
     require_bounded(&Wrapping(-42));
--- a/third_party/rust/num-traits/src/cast.rs
+++ b/third_party/rust/num-traits/src/cast.rs
@@ -461,39 +461,39 @@ fn to_primitive_float() {
     assert_eq!(f32_toolarge.to_f32(), None);
     assert_eq!((f32::MAX as f64).to_f32(), Some(f32::MAX));
     assert_eq!((-f32::MAX as f64).to_f32(), Some(-f32::MAX));
     assert_eq!(f64::INFINITY.to_f32(), Some(f32::INFINITY));
     assert_eq!((f64::NEG_INFINITY).to_f32(), Some(f32::NEG_INFINITY));
     assert!((f64::NAN).to_f32().map_or(false, |f| f.is_nan()));
 }
 
-macro_rules! test_wrapping_to_primitive {
-    ($($t:ty)+) => {
-        $({
-            let i: $t = 0;
-            let w = Wrapping(i);
-            assert_eq!(i.to_u8(),    w.to_u8());
-            assert_eq!(i.to_u16(),   w.to_u16());
-            assert_eq!(i.to_u32(),   w.to_u32());
-            assert_eq!(i.to_u64(),   w.to_u64());
-            assert_eq!(i.to_usize(), w.to_usize());
-            assert_eq!(i.to_i8(),    w.to_i8());
-            assert_eq!(i.to_i16(),   w.to_i16());
-            assert_eq!(i.to_i32(),   w.to_i32());
-            assert_eq!(i.to_i64(),   w.to_i64());
-            assert_eq!(i.to_isize(), w.to_isize());
-            assert_eq!(i.to_f32(),   w.to_f32());
-            assert_eq!(i.to_f64(),   w.to_f64());
-        })+   
-    };
-}
-
 #[test]
 fn wrapping_to_primitive() {
+    macro_rules! test_wrapping_to_primitive {
+        ($($t:ty)+) => {
+            $({
+                let i: $t = 0;
+                let w = Wrapping(i);
+                assert_eq!(i.to_u8(),    w.to_u8());
+                assert_eq!(i.to_u16(),   w.to_u16());
+                assert_eq!(i.to_u32(),   w.to_u32());
+                assert_eq!(i.to_u64(),   w.to_u64());
+                assert_eq!(i.to_usize(), w.to_usize());
+                assert_eq!(i.to_i8(),    w.to_i8());
+                assert_eq!(i.to_i16(),   w.to_i16());
+                assert_eq!(i.to_i32(),   w.to_i32());
+                assert_eq!(i.to_i64(),   w.to_i64());
+                assert_eq!(i.to_isize(), w.to_isize());
+                assert_eq!(i.to_f32(),   w.to_f32());
+                assert_eq!(i.to_f64(),   w.to_f64());
+            })+
+        };
+    }
+
     test_wrapping_to_primitive!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
 }
 
 #[test]
 fn wrapping_is_toprimitive() {
     fn require_toprimitive<T: ToPrimitive>(_: &T) {}
     require_toprimitive(&Wrapping(42));
 }
--- a/third_party/rust/num-traits/src/identities.rs
+++ b/third_party/rust/num-traits/src/identities.rs
@@ -115,29 +115,29 @@ impl<T: One> One for Wrapping<T> where W
 
 /// Returns the additive identity, `0`.
 #[inline(always)] pub fn zero<T: Zero>() -> T { Zero::zero() }
 
 /// Returns the multiplicative identity, `1`.
 #[inline(always)] pub fn one<T: One>() -> T { One::one() }
 
 
-macro_rules! test_wrapping_identities {
-    ($($t:ty)+) => {
-        $(
-            assert_eq!(zero::<$t>(), zero::<Wrapping<$t>>().0);
-            assert_eq!(one::<$t>(), one::<Wrapping<$t>>().0);
-            assert_eq!((0 as $t).is_zero(), Wrapping(0 as $t).is_zero());
-            assert_eq!((1 as $t).is_zero(), Wrapping(1 as $t).is_zero());
-        )+   
-    };
-}
-
 #[test]
 fn wrapping_identities() {
+    macro_rules! test_wrapping_identities {
+        ($($t:ty)+) => {
+            $(
+                assert_eq!(zero::<$t>(), zero::<Wrapping<$t>>().0);
+                assert_eq!(one::<$t>(), one::<Wrapping<$t>>().0);
+                assert_eq!((0 as $t).is_zero(), Wrapping(0 as $t).is_zero());
+                assert_eq!((1 as $t).is_zero(), Wrapping(1 as $t).is_zero());
+            )+
+        };
+    }
+
     test_wrapping_identities!(isize i8 i16 i32 i64 usize u8 u16 u32 u64);
 }
 
 #[test]
 fn wrapping_is_zero() {
     fn require_zero<T: Zero>(_: &T) {}
     require_zero(&Wrapping(42));
 }
--- a/third_party/rust/num-traits/src/lib.rs
+++ b/third_party/rust/num-traits/src/lib.rs
@@ -356,34 +356,36 @@ fn from_str_radix_unwrap() {
 
     let i: i32 = Num::from_str_radix("0", 10).unwrap();
     assert_eq!(i, 0);
 
     let f: f32 = Num::from_str_radix("0.0", 10).unwrap();
     assert_eq!(f, 0.0);
 }
 
-macro_rules! test_wrapping_from_str_radix {
-    ($($t:ty)+) => {
-        $(
-            for &(s, r) in &[("42", 10), ("42", 2), ("-13.0", 10), ("foo", 10)] {
-                let w = Wrapping::<$t>::from_str_radix(s, r).map(|w| w.0);
-                assert_eq!(w, <$t as Num>::from_str_radix(s, r));
-            } 
-        )+   
-    };
-}
 #[test]
 fn wrapping_is_num() {
     fn require_num<T: Num>(_: &T) {}
     require_num(&Wrapping(42_u32));
     require_num(&Wrapping(-42));
 }
+
 #[test]
 fn wrapping_from_str_radix() {
+    macro_rules! test_wrapping_from_str_radix {
+        ($($t:ty)+) => {
+            $(
+                for &(s, r) in &[("42", 10), ("42", 2), ("-13.0", 10), ("foo", 10)] {
+                    let w = Wrapping::<$t>::from_str_radix(s, r).map(|w| w.0);
+                    assert_eq!(w, <$t as Num>::from_str_radix(s, r));
+                }
+            )+
+        };
+    }
+
     test_wrapping_from_str_radix!(usize u8 u16 u32 u64 isize i8 i16 i32 i64);
 }
 
 #[test]
 fn check_num_ops() {
     fn compute<T: Num + Copy>(x: T, y: T) -> T {
         x * y / y % y + y - y
     }
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/.appveyor.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: x86_64-pc-windows-gnu
-  - TARGET: i686-pc-windows-gnu
-install:
-  - curl -sSf -o rustup-init.exe https://win.rustup.rs/
-  - rustup-init.exe -y --default-host %TARGET%
-  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
-  - rustc -vV
-  - cargo -vV
-build: false
-test_script:
-  - cargo build --verbose
-  - cargo test --verbose
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".appveyor.yml":"2f3f82a91e82a6c0b601048a5c9cd9b39fa78dfb7172ecfe7ff3d4d010af66d8",".travis.yml":"979eec484d5ceb95a6553860cafa053694613fbafda322e6d159cfab261d99a0","Cargo.toml":"06c4215944a3f040dd2d10a724c5926f30b186cb6835fba7b6dab6930c456d78","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0593d22d122d4bfec6407115e3907546312976f75473417aaa4c57ecd2095ae6","README.md":"4d586d8185ea43e6472db25ad748da265024869eabdcd62805c2bf3de06c4eb4","src/lib.rs":"295224974716d3ac2cd3d9f65764bae2ec92d94c01f939f62cf3b00974bb3e63"},"package":"83df569ffd47dbf87f36bead512632f89e90882b8e7a14286d0471daf6b72de9"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-
-sudo: false
-
-cache:
-  apt: true
-  directories:
-    - target/debug/deps
-    - target/debug/build
-
-script:
-  - cargo build --verbose
-  - cargo test --verbose
-
-notifications:
-  email: false
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/Cargo.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "num_cpus"
-version = "1.6.0"
-authors = ["Sean McArthur <sean.monstar@gmail.com>"]
-description = "Get the number of CPUs on a machine."
-documentation = "https://docs.rs/num_cpus"
-keywords = ["cpu", "cpus", "cores"]
-categories = ["hardware-support"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/seanmonstar/num_cpus"
-[dependencies.libc]
-version = "0.2.6"
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/LICENSE-MIT
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2015
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# num_cpus
-
-[![crates.io](http://meritbadge.herokuapp.com/num_cpus)](https://crates.io/crates/num_cpus)
-[![Travis CI Status](https://travis-ci.org/seanmonstar/num_cpus.svg?branch=master)](https://travis-ci.org/seanmonstar/num_cpus)
-[![AppVeyor status](https://ci.appveyor.com/api/projects/status/qn8t6grhko5jwno6?svg=true)](https://ci.appveyor.com/project/seanmonstar/num-cpus)
-
-[Documentation](https://docs.rs/num_cpus)
-
-Count the number of CPUs on the current machine.
-
-## Usage
-
-Add to Cargo.toml:
-
-```toml
-[dependencies]
-num_cpus = "1.0"
-```
-
-In your `main.rs` or `lib.rs`:
-
-```rust
-extern crate num_cpus;
-
-// elsewhere
-let num = num_cpus::get();
-```
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
-additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.0/src/lib.rs
+++ /dev/null
@@ -1,316 +0,0 @@
-//! # num_cpus
-//!
-//! A crate with utilities to determine the number of CPUs available on the
-//! current system.
-//!
-//! ## Example
-//!
-//! ```
-//! let cpus = num_cpus::get();
-//! ```
-#![cfg_attr(test, deny(warnings))]
-#![deny(missing_docs)]
-#![allow(non_snake_case)]
-
-#[cfg(not(windows))]
-extern crate libc;
-
-/// Returns the number of available CPUs of the current system.
-///
-/// # Note
-///
-/// This will check sched affinity on Linux.
-#[inline]
-pub fn get() -> usize {
-    get_num_cpus()
-}
-
-/// Returns the number of physical cores of the current system.
-///
-/// If not possible on the particular architecture, returns same as `get()`
-/// which is the logical CPUs.
-#[inline]
-pub fn get_physical() -> usize {
-    get_num_physical_cpus()
-}
-
-
-#[cfg(not(any(target_os = "linux", target_os = "windows")))]
-#[inline]
-fn get_num_physical_cpus() -> usize {
-    // Not implemented, fallback
-    get_num_cpus()
-}
-
-#[cfg(target_os = "windows")]
-fn get_num_physical_cpus() -> usize {
-    match get_num_physical_cpus_windows() {
-        Some(num) => num,
-        None => get_num_cpus()
-    }
-}
-
-#[cfg(target_os = "windows")]
-fn get_num_physical_cpus_windows() -> Option<usize> {
-    // Inspired by https://msdn.microsoft.com/en-us/library/ms683194
-
-    use std::ptr;
-    use std::mem;
-
-    #[allow(non_upper_case_globals)]
-    const RelationProcessorCore: u32 = 0;
-
-    #[repr(C)]
-    #[allow(non_camel_case_types)]
-    struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
-        mask: usize,
-        relationship: u32,
-        _unused: [u64; 2]
-    }
-
-    extern "system" {
-        fn GetLogicalProcessorInformation(
-            info: *mut SYSTEM_LOGICAL_PROCESSOR_INFORMATION,
-            length: &mut u32
-        ) -> u32;
-    }
-
-    // First we need to determine how much space to reserve.
-
-    // The required size of the buffer, in bytes.
-    let mut needed_size = 0;
-
-    unsafe {
-        GetLogicalProcessorInformation(ptr::null_mut(), &mut needed_size);
-    }
-
-    let struct_size = mem::size_of::<SYSTEM_LOGICAL_PROCESSOR_INFORMATION>() as u32;
-
-    // Could be 0, or some other bogus size.
-    if needed_size == 0 || needed_size < struct_size || needed_size % struct_size != 0 {
-        return None;
-    }
-
-    let count = needed_size / struct_size;
-
-    // Allocate some memory where we will store the processor info.
-    let mut buf = Vec::with_capacity(count as usize);
-
-    let result;
-
-    unsafe {
-        result = GetLogicalProcessorInformation(buf.as_mut_ptr(), &mut needed_size);
-    }
-
-    // Failed for any reason.
-    if result == 0 {
-        return None;
-    }
-
-    let count = needed_size / struct_size;
-
-    unsafe {
-        buf.set_len(count as usize);
-    }
-
-    let phys_proc_count = buf.iter()
-        // Only interested in processor packages (physical processors.)
-        .filter(|proc_info| proc_info.relationship == RelationProcessorCore)
-        .count();
-
-    if phys_proc_count == 0 {
-        None
-    } else {
-        Some(phys_proc_count)
-    }
-}
-
-#[cfg(target_os = "linux")]
-fn get_num_physical_cpus() -> usize {
-    use std::io::BufReader;
-    use std::io::BufRead;
-    use std::fs::File;
-    use std::collections::HashSet;
-
-    let file = match File::open("/proc/cpuinfo") {
-        Ok(val) => val,
-        Err(_) => {return get_num_cpus()},
-    };
-    let reader = BufReader::new(file);
-    let mut set = HashSet::new();
-    let mut coreid: u32 = 0;
-    let mut physid: u32 = 0;
-    let mut chgcount = 0;
-    for line in reader.lines().filter_map(|result| result.ok()) {
-        let parts: Vec<&str> = line.split(':').map(|s| s.trim()).collect();
-        if parts.len() != 2 {
-            continue
-        }
-        if parts[0] == "core id" || parts[0] == "physical id" {
-            let value = match parts[1].trim().parse() {
-              Ok(val) => val,
-              Err(_) => break,
-            };
-            match parts[0] {
-                "core id"     => coreid = value,
-                "physical id" => physid = value,
-                _ => {},
-            }
-            chgcount += 1;
-        }
-        if chgcount == 2 {
-            set.insert((physid, coreid));
-            chgcount = 0;
-        }
-    }
-    let count = set.len();
-    if count == 0 { get_num_cpus() } else { count }
-}
-
-#[cfg(windows)]
-fn get_num_cpus() -> usize {
-    #[repr(C)]
-    struct SYSTEM_INFO {
-        wProcessorArchitecture: u16,
-        wReserved: u16,
-        dwPageSize: u32,
-        lpMinimumApplicationAddress: *mut u8,
-        lpMaximumApplicationAddress: *mut u8,
-        dwActiveProcessorMask: *mut u8,
-        dwNumberOfProcessors: u32,
-        dwProcessorType: u32,
-        dwAllocationGranularity: u32,
-        wProcessorLevel: u16,
-        wProcessorRevision: u16,
-    }
-
-    extern "system" {
-        fn GetSystemInfo(lpSystemInfo: *mut SYSTEM_INFO);
-    }
-
-    unsafe {
-        let mut sysinfo: SYSTEM_INFO = std::mem::uninitialized();
-        GetSystemInfo(&mut sysinfo);
-        sysinfo.dwNumberOfProcessors as usize
-    }
-}
-
-#[cfg(any(target_os = "freebsd",
-          target_os = "dragonfly",
-          target_os = "bitrig",
-          target_os = "netbsd"))]
-fn get_num_cpus() -> usize {
-    let mut cpus: libc::c_uint = 0;
-    let mut cpus_size = std::mem::size_of_val(&cpus);
-
-    unsafe {
-        cpus = libc::sysconf(libc::_SC_NPROCESSORS_ONLN) as libc::c_uint;
-    }
-    if cpus < 1 {
-        let mut mib = [libc::CTL_HW, libc::HW_NCPU, 0, 0];
-        unsafe {
-            libc::sysctl(mib.as_mut_ptr(),
-                         2,
-                         &mut cpus as *mut _ as *mut _,
-                         &mut cpus_size as *mut _ as *mut _,
-                         0 as *mut _,
-                         0);
-        }
-        if cpus < 1 {
-            cpus = 1;
-        }
-    }
-    cpus as usize
-}
-
-#[cfg(target_os = "openbsd")]
-fn get_num_cpus() -> usize {
-    let mut cpus: libc::c_uint = 0;
-    let mut cpus_size = std::mem::size_of_val(&cpus);
-    let mut mib = [libc::CTL_HW, libc::HW_NCPU, 0, 0];
-
-    unsafe {
-        libc::sysctl(mib.as_mut_ptr(),
-                     2,
-                     &mut cpus as *mut _ as *mut _,
-                     &mut cpus_size as *mut _ as *mut _,
-                     0 as *mut _,
-                     0);
-    }
-    if cpus < 1 {
-        cpus = 1;
-    }
-    cpus as usize
-}
-
-#[cfg(target_os = "linux")]
-fn get_num_cpus() -> usize {
-    let mut set:  libc::cpu_set_t = unsafe { std::mem::zeroed() };
-    if unsafe { libc::sched_getaffinity(0, std::mem::size_of::<libc::cpu_set_t>(), &mut set) } == 0 {
-        let mut count: u32 = 0;
-        for i in 0..libc::CPU_SETSIZE as usize {
-            if unsafe { libc::CPU_ISSET(i, &set) } {
-                count += 1
-            }
-        }
-        count as usize
-    } else {
-        let cpus = unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) };
-        if cpus < 1 {
-            1
-        } else {
-            cpus as usize
-        }
-    }
-}
-
-#[cfg(any(
-    target_os = "nacl",
-    target_os = "macos",
-    target_os = "ios",
-    target_os = "android",
-    target_os = "solaris",
-    target_os = "fuchsia")
-)]
-fn get_num_cpus() -> usize {
-    let cpus = unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) };
-    if cpus < 1 {
-        1
-    } else {
-        cpus as usize
-    }
-}
-
-#[cfg(any(target_os = "emscripten", target_os = "redox", target_os = "haiku"))]
-fn get_num_cpus() -> usize {
-    1
-}
-
-#[cfg(test)]
-mod tests {
-    fn env_var(name: &'static str) -> Option<usize> {
-        ::std::env::var(name).ok().map(|val| val.parse().unwrap())
-    }
-
-    #[test]
-    fn test_get() {
-        let num = super::get();
-        if let Some(n) = env_var("NUM_CPUS_TEST_GET") {
-            assert_eq!(num, n);
-        } else {
-            assert!(num > 0);
-            assert!(num < 236_451);
-        }
-    }
-
-    #[test]
-    fn test_get_physical() {
-        let num = super::get_physical();
-        if let Some(n) = env_var("NUM_CPUS_TEST_GET_PHYSICAL") {
-            assert_eq!(num, n);
-        } else {
-            assert!(num > 0);
-            assert!(num < 236_451);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/.appveyor.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: x86_64-pc-windows-gnu
-  - TARGET: i686-pc-windows-gnu
-install:
-  - curl -sSf -o rustup-init.exe https://win.rustup.rs/
-  - rustup-init.exe -y --default-host %TARGET%
-  - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
-  - rustc -vV
-  - cargo -vV
-build: false
-test_script:
-  - cargo build --verbose
-  - cargo test --verbose
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".appveyor.yml":"2f3f82a91e82a6c0b601048a5c9cd9b39fa78dfb7172ecfe7ff3d4d010af66d8",".travis.yml":"979eec484d5ceb95a6553860cafa053694613fbafda322e6d159cfab261d99a0","Cargo.toml":"64af5f893e89e09be28f21857fb4238ddc63cf12f012a6f59c1a404db3f96284","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0593d22d122d4bfec6407115e3907546312976f75473417aaa4c57ecd2095ae6","README.md":"4d586d8185ea43e6472db25ad748da265024869eabdcd62805c2bf3de06c4eb4","src/lib.rs":"295224974716d3ac2cd3d9f65764bae2ec92d94c01f939f62cf3b00974bb3e63"},"package":"aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-
-sudo: false
-
-cache:
-  apt: true
-  directories:
-    - target/debug/deps
-    - target/debug/build
-
-script:
-  - cargo build --verbose
-  - cargo test --verbose
-
-notifications:
-  email: false
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/Cargo.toml
+++ /dev/null
@@ -1,24 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "num_cpus"
-version = "1.6.2"
-authors = ["Sean McArthur <sean.monstar@gmail.com>"]
-description = "Get the number of CPUs on a machine."
-documentation = "https://docs.rs/num_cpus"
-keywords = ["cpu", "cpus", "cores"]
-categories = ["hardware-support"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/seanmonstar/num_cpus"
-[dependencies.libc]
-version = "0.2.6"
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/LICENSE-MIT
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2015
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# num_cpus
-
-[![crates.io](http://meritbadge.herokuapp.com/num_cpus)](https://crates.io/crates/num_cpus)
-[![Travis CI Status](https://travis-ci.org/seanmonstar/num_cpus.svg?branch=master)](https://travis-ci.org/seanmonstar/num_cpus)
-[![AppVeyor status](https://ci.appveyor.com/api/projects/status/qn8t6grhko5jwno6?svg=true)](https://ci.appveyor.com/project/seanmonstar/num-cpus)
-
-[Documentation](https://docs.rs/num_cpus)
-
-Count the number of CPUs on the current machine.
-
-## Usage
-
-Add to Cargo.toml:
-
-```toml
-[dependencies]
-num_cpus = "1.0"
-```
-
-In your `main.rs` or `lib.rs`:
-
-```rust
-extern crate num_cpus;
-
-// elsewhere
-let num = num_cpus::get();
-```
-
-## License
-
-Licensed under either of
-
- * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
- * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-
-at your option.
-
-### Contribution
-
-Unless you explicitly state otherwise, any contribution intentionally submitted
-for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
-additional terms or conditions.
deleted file mode 100644
--- a/third_party/rust/num_cpus-1.6.2/src/lib.rs
+++ /dev/null
@@ -1,316 +0,0 @@
-//! # num_cpus
-//!
-//! A crate with utilities to determine the number of CPUs available on the
-//! current system.
-//!
-//! ## Example
-//!
-//! ```
-//! let cpus = num_cpus::get();
-//! ```
-#![cfg_attr(test, deny(warnings))]
-#![deny(missing_docs)]
-#![allow(non_snake_case)]
-
-#[cfg(not(windows))]
-extern crate libc;
-
-/// Returns the number of available CPUs of the current system.
-///
-/// # Note
-///
-/// This will check sched affinity on Linux.
-#[inline]
-pub fn get() -> usize {
-    get_num_cpus()
-}
-
-/// Returns the number of physical cores of the current system.
-///
-/// If not possible on the particular architecture, returns same as `get()`
-/// which is the logical CPUs.
-#[inline]
-pub fn get_physical() -> usize {
-    get_num_physical_cpus()
-}
-
-
-#[cfg(not(any(target_os = "linux", target_os = "windows")))]
-#[inline]
-fn get_num_physical_cpus() -> usize {
-    // Not implemented, fallback
-    get_num_cpus()
-}
-
-#[cfg(target_os = "windows")]
-fn get_num_physical_cpus() -> usize {
-    match get_num_physical_cpus_windows() {
-        Some(num) => num,
-        None => get_num_cpus()
-    }
-}
-
-#[cfg(target_os = "windows")]
-fn get_num_physical_cpus_windows() -> Option<usize> {
-    // Inspired by https://msdn.microsoft.com/en-us/library/ms683194
-
-    use std::ptr;
-    use std::mem;
-
-    #[allow(non_upper_case_globals)]
-    const RelationProcessorCore: u32 = 0;
-
-    #[repr(C)]
-    #[allow(non_camel_case_types)]
-    struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
-        mask: usize,
-        relationship: u32,
-        _unused: [u64; 2]
-    }
-
-    extern "system" {
-        fn GetLogicalProcessorInformation(
-            info: *mut SYSTEM_LOGICAL_PROCESSOR_INFORMATION,
-            length: &mut u32
-        ) -> u32;
-    }
-
-    // First we need to determine how much space to reserve.
-
-    // The required size of the buffer, in bytes.
-    let mut needed_size = 0;
-
-    unsafe {
-        GetLogicalProcessorInformation(ptr::null_mut(), &mut needed_size);
-    }
-
-    let struct_size = mem::size_of::<SYSTEM_LOGICAL_PROCESSOR_INFORMATION>() as u32;
-
-    // Could be 0, or some other bogus size.
-    if needed_size == 0 || needed_size < struct_size || needed_size % struct_size != 0 {
-        return None;
-    }
-
-    let count = needed_size / struct_size;
-
-    // Allocate some memory where we will store the processor info.
-    let mut buf = Vec::with_capacity(count as usize);
-
-    let result;
-
-    unsafe {
-        result = GetLogicalProcessorInformation(buf.as_mut_ptr(), &mut needed_size);
-    }
-
-    // Failed for any reason.
-    if result == 0 {
-        return None;
-    }
-
-    let count = needed_size / struct_size;
-
-    unsafe {
-        buf.set_len(count as usize);
-    }
-
-    let phys_proc_count = buf.iter()
-        // Only interested in processor packages (physical processors.)
-        .filter(|proc_info| proc_info.relationship == RelationProcessorCore)
-        .count();
-
-    if phys_proc_count == 0 {
-        None
-    } else {
-        Some(phys_proc_count)
-    }
-}
-
-#[cfg(target_os = "linux")]
-fn get_num_physical_cpus() -> usize {
-    use std::io::BufReader;
-    use std::io::BufRead;
-    use std::fs::File;
-    use std::collections::HashSet;
-
-    let file = match File::open("/proc/cpuinfo") {
-        Ok(val) => val,
-        Err(_) => {return get_num_cpus()},
-    };
-    let reader = BufReader::new(file);
-    let mut set = HashSet::new();
-    let mut coreid: u32 = 0;
-    let mut physid: u32 = 0;
-    let mut chgcount = 0;
-    for line in reader.lines().filter_map(|result| result.ok()) {
-        let parts: Vec<&str> = line.split(':').map(|s| s.trim()).collect();
-        if parts.len() != 2 {
-            continue
-        }
-        if parts[0] == "core id" || parts[0] == "physical id" {
-            let value = match parts[1].trim().parse() {
-              Ok(val) => val,
-              Err(_) => break,
-            };
-            match parts[0] {
-                "core id"     => coreid = value,
-                "physical id" => physid = value,
-                _ => {},
-            }
-            chgcount += 1;
-        }
-        if chgcount == 2 {
-            set.insert((physid, coreid));
-            chgcount = 0;
-        }
-    }
-    let count = set.len();
-    if count == 0 { get_num_cpus() } else { count }
-}
-
-#[cfg(windows)]
-fn get_num_cpus() -> usize {
-    #[repr(C)]
-    struct SYSTEM_INFO {
-        wProcessorArchitecture: u16,
-        wReserved: u16,
-        dwPageSize: u32,
-        lpMinimumApplicationAddress: *mut u8,
-        lpMaximumApplicationAddress: *mut u8,
-        dwActiveProcessorMask: *mut u8,
-        dwNumberOfProcessors: u32,
-        dwProcessorType: u32,
-        dwAllocationGranularity: u32,
-        wProcessorLevel: u16,
-        wProcessorRevision: u16,
-    }
-
-    extern "system" {
-        fn GetSystemInfo(lpSystemInfo: *mut SYSTEM_INFO);
-    }
-
-    unsafe {
-        let mut sysinfo: SYSTEM_INFO = std::mem::uninitialized();
-        GetSystemInfo(&mut sysinfo);
-        sysinfo.dwNumberOfProcessors as usize
-    }
-}
-
-#[cfg(any(target_os = "freebsd",
-          target_os = "dragonfly",
-          target_os = "bitrig",
-          target_os = "netbsd"))]
-fn get_num_cpus() -> usize {
-    let mut cpus: libc::c_uint = 0;
-    let mut cpus_size = std::mem::size_of_val(&cpus);
-
-    unsafe {
-        cpus = libc::sysconf(libc::_SC_NPROCESSORS_ONLN) as libc::c_uint;
-    }
-    if cpus < 1 {
-        let mut mib = [libc::CTL_HW, libc::HW_NCPU, 0, 0];
-        unsafe {
-            libc::sysctl(mib.as_mut_ptr(),
-                         2,
-                         &mut cpus as *mut _ as *mut _,
-                         &mut cpus_size as *mut _ as *mut _,
-                         0 as *mut _,
-                         0);
-        }
-        if cpus < 1 {
-            cpus = 1;
-        }
-    }
-    cpus as usize
-}
-
-#[cfg(target_os = "openbsd")]
-fn get_num_cpus() -> usize {
-    let mut cpus: libc::c_uint = 0;
-    let mut cpus_size = std::mem::size_of_val(&cpus);
-    let mut mib = [libc::CTL_HW, libc::HW_NCPU, 0, 0];
-
-    unsafe {
-        libc::sysctl(mib.as_mut_ptr(),
-                     2,
-                     &mut cpus as *mut _ as *mut _,
-                     &mut cpus_size as *mut _ as *mut _,
-                     0 as *mut _,
-                     0);
-    }
-    if cpus < 1 {
-        cpus = 1;
-    }
-    cpus as usize
-}
-
-#[cfg(target_os = "linux")]
-fn get_num_cpus() -> usize {
-    let mut set:  libc::cpu_set_t = unsafe { std::mem::zeroed() };
-    if unsafe { libc::sched_getaffinity(0, std::mem::size_of::<libc::cpu_set_t>(), &mut set) } == 0 {
-        let mut count: u32 = 0;
-        for i in 0..libc::CPU_SETSIZE as usize {
-            if unsafe { libc::CPU_ISSET(i, &set) } {
-                count += 1
-            }
-        }
-        count as usize
-    } else {
-        let cpus = unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) };
-        if cpus < 1 {
-            1
-        } else {
-            cpus as usize
-        }
-    }
-}
-
-#[cfg(any(
-    target_os = "nacl",
-    target_os = "macos",
-    target_os = "ios",
-    target_os = "android",
-    target_os = "solaris",
-    target_os = "fuchsia")
-)]
-fn get_num_cpus() -> usize {
-    let cpus = unsafe { libc::sysconf(libc::_SC_NPROCESSORS_ONLN) };
-    if cpus < 1 {
-        1
-    } else {
-        cpus as usize
-    }
-}
-
-#[cfg(any(target_os = "emscripten", target_os = "redox", target_os = "haiku"))]
-fn get_num_cpus() -> usize {
-    1
-}
-
-#[cfg(test)]
-mod tests {
-    fn env_var(name: &'static str) -> Option<usize> {
-        ::std::env::var(name).ok().map(|val| val.parse().unwrap())
-    }
-
-    #[test]
-    fn test_get() {
-        let num = super::get();
-        if let Some(n) = env_var("NUM_CPUS_TEST_GET") {
-            assert_eq!(num, n);
-        } else {
-            assert!(num > 0);
-            assert!(num < 236_451);
-        }
-    }
-
-    #[test]
-    fn test_get_physical() {
-        let num = super::get_physical();
-        if let Some(n) = env_var("NUM_CPUS_TEST_GET_PHYSICAL") {
-            assert_eq!(num, n);
-        } else {
-            assert!(num > 0);
-            assert!(num < 236_451);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"e1423d4f80dd1b358812a9993312cf6338df844c2b15e423ab779bf914cead14","src/arch/arm.rs":"0cd845b3790f7358b5290b58163ae2663b46b7ecf64eb8c6b0a29b33da6f143c","src/arch/x86.rs":"3fc9757cbb775bd08da9999ab39d95b62b3cb509e0ab309dd26c11c3fbdbc778","src/arch/x86_64.rs":"37bc2c6e74c009ff5f2896b249fac7ddf9f5e30e223a5122a28a93cef5ba33b1","src/call.rs":"7913da5b7d8b11e290d863d6cbca17be20c98bef420ddb964519a9c9cfeff366","src/data.rs":"c3406d581387828b6fb246bea2b57582cef890cedeb2c0e632e472cd3776d884","src/error.rs":"b23c12db8cafb64f3b909a95bdd47cf03f62f6fa1201b40892febf46ec56bcb4","src/flag.rs":"400c91c57b1ab1afd6ab06c0582b1b0817590688900882de31fc3a4aab27da49","src/io/dma.rs":"4ab65016b3bc9121f0844dc4b8de77608eba327c0e0d930900254242b2c204b0","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"bd475c815d483cc2b187348c32e10f94df0ca756ee8d14260b6ca3c660b2a73a","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"219fcd317d6c490a14794ec4db9de3e305c722dda720043c67076bda60632bb8","src/lib.rs":"988fb0b0bd3b396345f11ef46617072aeaf9307d3fa05a4d2a2ee9d590598bba","src/number.rs":"9043372ef517ecbbca776536efa3d7a822ba6f49d29c20d4c3648f0e3c85fe35","src/scheme.rs":"3281173d9a5d7d420f5dbdaed7562ba5adc1ce5753843a3bf3eecf4060eb09c2"},"package":"8dd35cc9a8bdec562c757e3d43c1526b5c6d2653e23e2315065bc25556550753"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/Cargo.toml
+++ /dev/null
@@ -1,9 +0,0 @@
-[package]
-name = "redox_syscall"
-version = "0.1.16"
-description = "A Rust library to access raw Redox system calls"
-license = "MIT"
-authors = ["Jeremy Soller <jackpot51@gmail.com>"]
-
-[lib]
-name = "syscall"
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/arch/arm.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use error::{Error, Result};
-
-pub unsafe fn syscall0(mut a: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall1(mut a: usize, b: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-// Clobbers all registers - special for clone
-pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b)
-        : "memory", "r0", "r1", "r2", "r3", "r4"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b), "{r1}"(c)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall3(mut a: usize, b: usize, c: usize, d: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b), "{r1}"(c), "{r2}"(d)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b), "{r1}"(c), "{r2}"(d), "{r3}"(e)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) -> Result<usize> {
-    asm!("swi $$0"
-        : "={r0}"(a)
-        : "{r7}"(a), "{r0}"(b), "{r1}"(c), "{r2}"(d), "{r3}"(e), "{r4}"(f)
-        : "memory"
-        : "volatile");
-
-    Error::demux(a)
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/arch/x86.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use error::{Error, Result};
-
-pub unsafe fn syscall0(mut a: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall1(mut a: usize, b: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-// Clobbers all registers - special for clone
-pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b)
-        : "memory", "ebx", "ecx", "edx", "esi", "edi"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b), "{ecx}"(c)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall3(mut a: usize, b: usize, c: usize, d: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b), "{ecx}"(c), "{edx}"(d)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b), "{ecx}"(c), "{edx}"(d), "{esi}"(e)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={eax}"(a)
-        : "{eax}"(a), "{ebx}"(b), "{ecx}"(c), "{edx}"(d), "{esi}"(e), "{edi}"(f)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/arch/x86_64.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-use error::{Error, Result};
-
-pub unsafe fn syscall0(mut a: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall1(mut a: usize, b: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-// Clobbers all registers - special for clone
-pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b)
-        : "memory", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b), "{rcx}"(c)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall3(mut a: usize, b: usize, c: usize, d: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d), "{rsi}"(e)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
-
-pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) -> Result<usize> {
-    asm!("int 0x80"
-        : "={rax}"(a)
-        : "{rax}"(a), "{rbx}"(b), "{rcx}"(c), "{rdx}"(d), "{rsi}"(e), "{rdi}"(f)
-        : "memory"
-        : "intel", "volatile");
-
-    Error::demux(a)
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/call.rs
+++ /dev/null
@@ -1,292 +0,0 @@
-use super::arch::*;
-use super::data::{Stat, StatVfs, TimeSpec};
-use super::error::Result;
-use super::number::*;
-
-use core::mem;
-
-/// Set the end of the process's heap
-///
-/// When `addr` is `0`, this function will return the current break.
-///
-/// When `addr` is nonzero, this function will attempt to set the end of the process's
-/// heap to `addr` and return the new program break. The new program break should be
-/// checked by the allocator, it may not be exactly `addr`, as it may be aligned to a page
-/// boundary.
-///
-/// On error, `Err(ENOMEM)` will be returned indicating that no memory is available
-pub unsafe fn brk(addr: usize) -> Result<usize> {
-    syscall1(SYS_BRK, addr)
-}
-
-/// Change the process's working directory
-///
-/// This function will attempt to set the process's working directory to `path`, which can be
-/// either a relative, scheme relative, or absolute path.
-///
-/// On success, `Ok(0)` will be returned. On error, one of the following errors will be returned.
-///
-/// # Errors
-///
-/// * `EACCES` - permission is denied for one of the components of `path`, or `path`
-/// * `EFAULT` - `path` does not point to the process's addressible memory
-/// * `EIO` - an I/O error occured
-/// * `ENOENT` - `path` does not exit
-/// * `ENOTDIR` - `path` is not a directory
-pub fn chdir(path: &str) -> Result<usize> {
-    unsafe { syscall2(SYS_CHDIR, path.as_ptr() as usize, path.len()) }
-}
-
-pub fn chmod(path: &str, mode: usize) -> Result<usize> {
-    unsafe { syscall3(SYS_CHMOD, path.as_ptr() as usize, path.len(), mode) }
-}
-
-/// Produce a fork of the current process, or a new process thread
-pub unsafe fn clone(flags: usize) -> Result<usize> {
-    syscall1_clobber(SYS_CLONE, flags)
-}
-
-/// Close a file
-pub fn close(fd: usize) -> Result<usize> {
-    unsafe { syscall1(SYS_CLOSE, fd) }
-}
-
-/// Get the current system time
-pub fn clock_gettime(clock: usize, tp: &mut TimeSpec) -> Result<usize> {
-    unsafe { syscall2(SYS_CLOCK_GETTIME, clock, tp as *mut TimeSpec as usize) }
-}
-
-/// Copy and transform a file descriptor
-pub fn dup(fd: usize, buf: &[u8]) -> Result<usize> {
-    unsafe { syscall3(SYS_DUP, fd, buf.as_ptr() as usize, buf.len()) }
-}
-
-/// Copy and transform a file descriptor
-pub fn dup2(fd: usize, newfd: usize, buf: &[u8]) -> Result<usize> {
-    unsafe { syscall4(SYS_DUP2, fd, newfd, buf.as_ptr() as usize, buf.len()) }
-}
-
-/// Replace the current process with a new executable
-pub fn execve(path: &str, args: &[[usize; 2]]) -> Result<usize> {
-    unsafe { syscall4(SYS_EXECVE, path.as_ptr() as usize, path.len(), args.as_ptr() as usize, args.len()) }
-}
-
-/// Exit the current process
-pub fn exit(status: usize) -> Result<usize> {
-    unsafe { syscall1(SYS_EXIT, status) }
-}
-
-/// Register a file for event-based I/O
-pub fn fcntl(fd: usize, cmd: usize, arg: usize) -> Result<usize> {
-    unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) }
-}
-
-/// Register a file for event-based I/O
-pub fn fevent(fd: usize, flags: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_FEVENT, fd, flags) }
-}
-
-/// Map a file into memory
-pub unsafe fn fmap(fd: usize, offset: usize, size: usize) -> Result<usize> {
-    syscall3(SYS_FMAP, fd, offset, size)
-}
-
-/// Unmap a memory-mapped file
-pub unsafe fn funmap(addr: usize) -> Result<usize> {
-    syscall1(SYS_FUNMAP, addr)
-}
-
-/// Retrieve the canonical path of a file
-pub fn fpath(fd: usize, buf: &mut [u8]) -> Result<usize> {
-    unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) }
-}
-
-/// Get metadata about a file
-pub fn fstat(fd: usize, stat: &mut Stat) -> Result<usize> {
-    unsafe { syscall3(SYS_FSTAT, fd, stat as *mut Stat as usize, mem::size_of::<Stat>()) }
-}
-
-/// Get metadata about a filesystem
-pub fn fstatvfs(fd: usize, stat: &mut StatVfs) -> Result<usize> {
-    unsafe { syscall3(SYS_FSTATVFS, fd, stat as *mut StatVfs as usize, mem::size_of::<StatVfs>()) }
-}
-
-/// Sync a file descriptor to its underlying medium
-pub fn fsync(fd: usize) -> Result<usize> {
-    unsafe { syscall1(SYS_FSYNC, fd) }
-}
-
-/// Truncate or extend a file to a specified length
-pub fn ftruncate(fd: usize, len: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_FTRUNCATE, fd, len) }
-}
-
-/// Fast userspace mutex - TODO: Document
-pub unsafe fn futex(addr: *mut i32, op: usize, val: i32, val2: usize, addr2: *mut i32) -> Result<usize> {
-    syscall5(SYS_FUTEX, addr as usize, op, (val as isize) as usize, val2, addr2 as usize)
-}
-
-/// Get the current working directory
-pub fn getcwd(buf: &mut [u8]) -> Result<usize> {
-    unsafe { syscall2(SYS_GETCWD, buf.as_mut_ptr() as usize, buf.len()) }
-}
-
-/// Get the effective group ID
-pub fn getegid() -> Result<usize> {
-    unsafe { syscall0(SYS_GETEGID) }
-}
-
-/// Get the effective namespace
-pub fn getens() -> Result<usize> {
-    unsafe { syscall0(SYS_GETENS) }
-}
-
-/// Get the effective user ID
-pub fn geteuid() -> Result<usize> {
-    unsafe { syscall0(SYS_GETEUID) }
-}
-
-/// Get the current group ID
-pub fn getgid() -> Result<usize> {
-    unsafe { syscall0(SYS_GETGID) }
-}
-
-/// Get the current namespace
-pub fn getns() -> Result<usize> {
-    unsafe { syscall0(SYS_GETNS) }
-}
-
-/// Get the current process ID
-pub fn getpid() -> Result<usize> {
-    unsafe { syscall0(SYS_GETPID) }
-}
-
-/// Get the current user ID
-pub fn getuid() -> Result<usize> {
-    unsafe { syscall0(SYS_GETUID) }
-}
-
-/// Set the I/O privilege level
-pub unsafe fn iopl(level: usize) -> Result<usize> {
-    syscall1(SYS_IOPL, level)
-}
-
-/// Send a signal `sig` to the process identified by `pid`
-pub fn kill(pid: usize, sig: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_KILL, pid, sig) }
-}
-
-/// Create a link to a file
-pub unsafe fn link(old: *const u8, new: *const u8) -> Result<usize> {
-    syscall2(SYS_LINK, old as usize, new as usize)
-}
-
-/// Seek to `offset` bytes in a file descriptor
-pub fn lseek(fd: usize, offset: isize, whence: usize) -> Result<usize> {
-    unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) }
-}
-
-/// Make a new scheme namespace
-pub fn mkns(schemes: &[[usize; 2]]) -> Result<usize> {
-    unsafe { syscall2(SYS_MKNS, schemes.as_ptr() as usize, schemes.len()) }
-}
-
-/// Sleep for the time specified in `req`
-pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result<usize> {
-    unsafe { syscall2(SYS_NANOSLEEP, req as *const TimeSpec as usize, rem as *mut TimeSpec as usize) }
-}
-
-/// Open a file
-pub fn open(path: &str, flags: usize) -> Result<usize> {
-    unsafe { syscall3(SYS_OPEN, path.as_ptr() as usize, path.len(), flags) }
-}
-
-/// Allocate pages, linearly in physical memory
-pub unsafe fn physalloc(size: usize) -> Result<usize> {
-    syscall1(SYS_PHYSALLOC, size)
-}
-
-/// Free physically allocated pages
-pub unsafe fn physfree(physical_address: usize, size: usize) -> Result<usize> {
-    syscall2(SYS_PHYSFREE, physical_address, size)
-}
-
-/// Map physical memory to virtual memory
-pub unsafe fn physmap(physical_address: usize, size: usize, flags: usize) -> Result<usize> {
-    syscall3(SYS_PHYSMAP, physical_address, size, flags)
-}
-
-/// Unmap previously mapped physical memory
-pub unsafe fn physunmap(virtual_address: usize) -> Result<usize> {
-    syscall1(SYS_PHYSUNMAP, virtual_address)
-}
-
-/// Create a pair of file descriptors referencing the read and write ends of a pipe
-pub fn pipe2(fds: &mut [usize; 2], flags: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_PIPE2, fds.as_ptr() as usize, flags) }
-}
-
-/// Read from a file descriptor into a buffer
-pub fn read(fd: usize, buf: &mut [u8]) -> Result<usize> {
-    unsafe { syscall3(SYS_READ, fd, buf.as_mut_ptr() as usize, buf.len()) }
-}
-
-/// Remove a directory
-pub fn rmdir(path: &str) -> Result<usize> {
-    unsafe { syscall2(SYS_RMDIR, path.as_ptr() as usize, path.len()) }
-}
-
-/// Set the current process group IDs
-pub fn setregid(rgid: usize, egid: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_SETREGID, rgid, egid) }
-}
-
-/// Make a new scheme namespace
-pub fn setrens(rns: usize, ens: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_SETRENS, rns, ens) }
-}
-
-/// Set the current process user IDs
-pub fn setreuid(ruid: usize, euid: usize) -> Result<usize> {
-    unsafe { syscall2(SYS_SETREUID, ruid, euid) }
-}
-
-/// Remove a file
-pub fn unlink(path: &str) -> Result<usize> {
-    unsafe { syscall2(SYS_UNLINK, path.as_ptr() as usize, path.len()) }
-}
-
-/// Convert a virtual address to a physical one
-pub unsafe fn virttophys(virtual_address: usize) -> Result<usize> {
-    syscall1(SYS_VIRTTOPHYS, virtual_address)
-}
-
-/// Check if a child process has exited or received a signal
-pub fn waitpid(pid: usize, status: &mut usize, options: usize) -> Result<usize> {
-    unsafe { syscall3(SYS_WAITPID, pid, status as *mut usize as usize, options) }
-}
-
-/// Write a buffer to a file descriptor
-///
-/// The kernel will attempt to write the bytes in `buf` to the file descriptor `fd`, returning
-/// either an `Err`, explained below, or `Ok(count)` where `count` is the number of bytes which
-/// were written.
-///
-/// # Errors
-///
-/// * `EAGAIN` - the file descriptor was opened with `O_NONBLOCK` and writing would block
-/// * `EBADF` - the file descriptor is not valid or is not open for writing
-/// * `EFAULT` - `buf` does not point to the process's addressible memory
-/// * `EIO` - an I/O error occured
-/// * `ENOSPC` - the device containing the file descriptor has no room for data
-/// * `EPIPE` - the file descriptor refers to a pipe or socket whose reading end is closed
-pub fn write(fd: usize, buf: &[u8]) -> Result<usize> {
-    unsafe { syscall3(SYS_WRITE, fd, buf.as_ptr() as usize, buf.len()) }
-}
-
-/// Yield the process's time slice to the kernel
-///
-/// This function will return Ok(0) on success
-pub fn sched_yield() -> Result<usize> {
-    unsafe { syscall0(SYS_YIELD) }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/data.rs
+++ /dev/null
@@ -1,146 +0,0 @@
-use core::ops::{Deref, DerefMut};
-use core::{mem, slice};
-
-#[derive(Copy, Clone, Debug, Default)]
-pub struct Event {
-    pub id: usize,
-    pub flags: usize,
-    pub data: usize
-}
-
-impl Deref for Event {
-    type Target = [u8];
-    fn deref(&self) -> &[u8] {
-        unsafe {
-            slice::from_raw_parts(self as *const Event as *const u8, mem::size_of::<Event>()) as &[u8]
-        }
-    }
-}
-
-impl DerefMut for Event {
-    fn deref_mut(&mut self) -> &mut [u8] {
-        unsafe {
-            slice::from_raw_parts_mut(self as *mut Event as *mut u8, mem::size_of::<Event>()) as &mut [u8]
-        }
-    }
-}
-
-#[derive(Copy, Clone, Debug, Default)]
-#[repr(packed)]
-pub struct Packet {
-    pub id: u64,
-    pub pid: usize,
-    pub uid: u32,
-    pub gid: u32,
-    pub a: usize,
-    pub b: usize,
-    pub c: usize,
-    pub d: usize
-}
-
-impl Deref for Packet {
-    type Target = [u8];
-    fn deref(&self) -> &[u8] {
-        unsafe {
-            slice::from_raw_parts(self as *const Packet as *const u8, mem::size_of::<Packet>()) as &[u8]
-        }
-    }
-}
-
-impl DerefMut for Packet {
-    fn deref_mut(&mut self) -> &mut [u8] {
-        unsafe {
-            slice::from_raw_parts_mut(self as *mut Packet as *mut u8, mem::size_of::<Packet>()) as &mut [u8]
-        }
-    }
-}
-
-#[derive(Copy, Clone, Debug, Default)]
-#[repr(packed)]
-pub struct Stat {
-    pub st_dev: u64,
-    pub st_ino: u64,
-    pub st_mode: u16,
-    pub st_nlink: u32,
-    pub st_uid: u32,
-    pub st_gid: u32,
-    pub st_size: u64,
-    pub st_blksize: u32,
-    pub st_blocks: u64,
-    pub st_mtime: u64,
-    pub st_mtime_nsec: u32,
-    pub st_atime: u64,
-    pub st_atime_nsec: u32,
-    pub st_ctime: u64,
-    pub st_ctime_nsec: u32,
-}
-
-impl Deref for Stat {
-    type Target = [u8];
-    fn deref(&self) -> &[u8] {
-        unsafe {
-            slice::from_raw_parts(self as *const Stat as *const u8, mem::size_of::<Stat>()) as &[u8]
-        }
-    }
-}
-
-impl DerefMut for Stat {
-    fn deref_mut(&mut self) -> &mut [u8] {
-        unsafe {
-            slice::from_raw_parts_mut(self as *mut Stat as *mut u8, mem::size_of::<Stat>()) as &mut [u8]
-        }
-    }
-}
-
-#[derive(Copy, Clone, Debug, Default)]
-#[repr(packed)]
-pub struct StatVfs {
-    pub f_bsize: u32,
-    pub f_blocks: u64,
-    pub f_bfree: u64,
-    pub f_bavail: u64,
-    //TODO: More fields https://linux.die.net/man/2/statvfs
-}
-
-impl Deref for StatVfs {
-    type Target = [u8];
-    fn deref(&self) -> &[u8] {
-        unsafe {
-            slice::from_raw_parts(self as *const StatVfs as *const u8, mem::size_of::<StatVfs>()) as &[u8]
-        }
-    }
-}
-
-impl DerefMut for StatVfs {
-    fn deref_mut(&mut self) -> &mut [u8] {
-        unsafe {
-            slice::from_raw_parts_mut(self as *mut StatVfs as *mut u8, mem::size_of::<StatVfs>()) as &mut [u8]
-        }
-    }
-}
-
-#[derive(Copy, Clone, Debug, Default)]
-#[repr(packed)]
-pub struct TimeSpec {
-    pub tv_sec: i64,
-    pub tv_nsec: i32,
-}
-
-impl Deref for TimeSpec {
-    type Target = [u8];
-    fn deref(&self) -> &[u8] {
-        unsafe {
-            slice::from_raw_parts(self as *const TimeSpec as *const u8,
-                                  mem::size_of::<TimeSpec>()) as &[u8]
-        }
-    }
-}
-
-impl DerefMut for TimeSpec {
-    fn deref_mut(&mut self) -> &mut [u8] {
-        unsafe {
-            slice::from_raw_parts_mut(self as *mut TimeSpec as *mut u8,
-                                      mem::size_of::<TimeSpec>()) as &mut [u8]
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/error.rs
+++ /dev/null
@@ -1,315 +0,0 @@
-use core::{fmt, result};
-
-#[derive(Eq, PartialEq)]
-pub struct Error {
-    pub errno: i32,
-}
-
-pub type Result<T> = result::Result<T, Error>;
-
-impl Error {
-    pub fn new(errno: i32) -> Error {
-        Error { errno: errno }
-    }
-
-    pub fn mux(result: Result<usize>) -> usize {
-        match result {
-            Ok(value) => value,
-            Err(error) => -error.errno as usize,
-        }
-    }
-
-    pub fn demux(value: usize) -> Result<usize> {
-        let errno = -(value as i32);
-        if errno >= 1 && errno < STR_ERROR.len() as i32 {
-            Err(Error::new(errno))
-        } else {
-            Ok(value)
-        }
-    }
-
-    pub fn text(&self) -> &str {
-        if let Some(description) = STR_ERROR.get(self.errno as usize) {
-            description
-        } else {
-            "Unknown Error"
-        }
-    }
-}
-
-impl fmt::Debug for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> {
-        f.write_str(self.text())
-    }
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> result::Result<(), fmt::Error> {
-        f.write_str(self.text())
-    }
-}
-
-pub const EPERM: i32 = 1;  /* Operation not permitted */
-pub const ENOENT: i32 = 2;  /* No such file or directory */
-pub const ESRCH: i32 = 3;  /* No such process */
-pub const EINTR: i32 = 4;  /* Interrupted system call */
-pub const EIO: i32 = 5;  /* I/O error */
-pub const ENXIO: i32 = 6;  /* No such device or address */
-pub const E2BIG: i32 = 7;  /* Argument list too long */
-pub const ENOEXEC: i32 = 8;  /* Exec format error */
-pub const EBADF: i32 = 9;  /* Bad file number */
-pub const ECHILD: i32 = 10;  /* No child processes */
-pub const EAGAIN: i32 = 11;  /* Try again */
-pub const ENOMEM: i32 = 12;  /* Out of memory */
-pub const EACCES: i32 = 13;  /* Permission denied */
-pub const EFAULT: i32 = 14;  /* Bad address */
-pub const ENOTBLK: i32 = 15;  /* Block device required */
-pub const EBUSY: i32 = 16;  /* Device or resource busy */
-pub const EEXIST: i32 = 17;  /* File exists */
-pub const EXDEV: i32 = 18;  /* Cross-device link */
-pub const ENODEV: i32 = 19;  /* No such device */
-pub const ENOTDIR: i32 = 20;  /* Not a directory */
-pub const EISDIR: i32 = 21;  /* Is a directory */
-pub const EINVAL: i32 = 22;  /* Invalid argument */
-pub const ENFILE: i32 = 23;  /* File table overflow */
-pub const EMFILE: i32 = 24;  /* Too many open files */
-pub const ENOTTY: i32 = 25;  /* Not a typewriter */
-pub const ETXTBSY: i32 = 26;  /* Text file busy */
-pub const EFBIG: i32 = 27;  /* File too large */
-pub const ENOSPC: i32 = 28;  /* No space left on device */
-pub const ESPIPE: i32 = 29;  /* Illegal seek */
-pub const EROFS: i32 = 30;  /* Read-only file system */
-pub const EMLINK: i32 = 31;  /* Too many links */
-pub const EPIPE: i32 = 32;  /* Broken pipe */
-pub const EDOM: i32 = 33;  /* Math argument out of domain of func */
-pub const ERANGE: i32 = 34;  /* Math result not representable */
-pub const EDEADLK: i32 = 35;  /* Resource deadlock would occur */
-pub const ENAMETOOLONG: i32 = 36;  /* File name too long */
-pub const ENOLCK: i32 = 37;  /* No record locks available */
-pub const ENOSYS: i32 = 38;  /* Function not implemented */
-pub const ENOTEMPTY: i32 = 39;  /* Directory not empty */
-pub const ELOOP: i32 = 40;  /* Too many symbolic links encountered */
-pub const EWOULDBLOCK: i32 = 41;  /* Operation would block */
-pub const ENOMSG: i32 = 42;  /* No message of desired type */
-pub const EIDRM: i32 = 43;  /* Identifier removed */
-pub const ECHRNG: i32 = 44;  /* Channel number out of range */
-pub const EL2NSYNC: i32 = 45;  /* Level 2 not synchronized */
-pub const EL3HLT: i32 = 46;  /* Level 3 halted */
-pub const EL3RST: i32 = 47;  /* Level 3 reset */
-pub const ELNRNG: i32 = 48;  /* Link number out of range */
-pub const EUNATCH: i32 = 49;  /* Protocol driver not attached */
-pub const ENOCSI: i32 = 50;  /* No CSI structure available */
-pub const EL2HLT: i32 = 51;  /* Level 2 halted */
-pub const EBADE: i32 = 52;  /* Invalid exchange */
-pub const EBADR: i32 = 53;  /* Invalid request descriptor */
-pub const EXFULL: i32 = 54;  /* Exchange full */
-pub const ENOANO: i32 = 55;  /* No anode */
-pub const EBADRQC: i32 = 56;  /* Invalid request code */
-pub const EBADSLT: i32 = 57;  /* Invalid slot */
-pub const EDEADLOCK: i32 = 58; /* Resource deadlock would occur */
-pub const EBFONT: i32 = 59;  /* Bad font file format */
-pub const ENOSTR: i32 = 60;  /* Device not a stream */
-pub const ENODATA: i32 = 61;  /* No data available */
-pub const ETIME: i32 = 62;  /* Timer expired */
-pub const ENOSR: i32 = 63;  /* Out of streams resources */
-pub const ENONET: i32 = 64;  /* Machine is not on the network */
-pub const ENOPKG: i32 = 65;  /* Package not installed */
-pub const EREMOTE: i32 = 66;  /* Object is remote */
-pub const ENOLINK: i32 = 67;  /* Link has been severed */
-pub const EADV: i32 = 68;  /* Advertise error */
-pub const ESRMNT: i32 = 69;  /* Srmount error */
-pub const ECOMM: i32 = 70;  /* Communication error on send */
-pub const EPROTO: i32 = 71;  /* Protocol error */
-pub const EMULTIHOP: i32 = 72;  /* Multihop attempted */
-pub const EDOTDOT: i32 = 73;  /* RFS specific error */
-pub const EBADMSG: i32 = 74;  /* Not a data message */
-pub const EOVERFLOW: i32 = 75;  /* Value too large for defined data type */
-pub const ENOTUNIQ: i32 = 76;  /* Name not unique on network */
-pub const EBADFD: i32 = 77;  /* File descriptor in bad state */
-pub const EREMCHG: i32 = 78;  /* Remote address changed */
-pub const ELIBACC: i32 = 79;  /* Can not access a needed shared library */
-pub const ELIBBAD: i32 = 80;  /* Accessing a corrupted shared library */
-pub const ELIBSCN: i32 = 81;  /* .lib section in a.out corrupted */
-pub const ELIBMAX: i32 = 82;  /* Attempting to link in too many shared libraries */
-pub const ELIBEXEC: i32 = 83;  /* Cannot exec a shared library directly */
-pub const EILSEQ: i32 = 84;  /* Illegal byte sequence */
-pub const ERESTART: i32 = 85;  /* Interrupted system call should be restarted */
-pub const ESTRPIPE: i32 = 86;  /* Streams pipe error */
-pub const EUSERS: i32 = 87;  /* Too many users */
-pub const ENOTSOCK: i32 = 88;  /* Socket operation on non-socket */
-pub const EDESTADDRREQ: i32 = 89;  /* Destination address required */
-pub const EMSGSIZE: i32 = 90;  /* Message too long */
-pub const EPROTOTYPE: i32 = 91;  /* Protocol wrong type for socket */
-pub const ENOPROTOOPT: i32 = 92;  /* Protocol not available */
-pub const EPROTONOSUPPORT: i32 = 93;  /* Protocol not supported */
-pub const ESOCKTNOSUPPORT: i32 = 94;  /* Socket type not supported */
-pub const EOPNOTSUPP: i32 = 95;  /* Operation not supported on transport endpoint */
-pub const EPFNOSUPPORT: i32 = 96;  /* Protocol family not supported */
-pub const EAFNOSUPPORT: i32 = 97;  /* Address family not supported by protocol */
-pub const EADDRINUSE: i32 = 98;  /* Address already in use */
-pub const EADDRNOTAVAIL: i32 = 99;  /* Cannot assign requested address */
-pub const ENETDOWN: i32 = 100; /* Network is down */
-pub const ENETUNREACH: i32 = 101; /* Network is unreachable */
-pub const ENETRESET: i32 = 102; /* Network dropped connection because of reset */
-pub const ECONNABORTED: i32 = 103; /* Software caused connection abort */
-pub const ECONNRESET: i32 = 104; /* Connection reset by peer */
-pub const ENOBUFS: i32 = 105; /* No buffer space available */
-pub const EISCONN: i32 = 106; /* Transport endpoint is already connected */
-pub const ENOTCONN: i32 = 107; /* Transport endpoint is not connected */
-pub const ESHUTDOWN: i32 = 108; /* Cannot send after transport endpoint shutdown */
-pub const ETOOMANYREFS: i32 = 109; /* Too many references: cannot splice */
-pub const ETIMEDOUT: i32 = 110; /* Connection timed out */
-pub const ECONNREFUSED: i32 = 111; /* Connection refused */
-pub const EHOSTDOWN: i32 = 112; /* Host is down */
-pub const EHOSTUNREACH: i32 = 113; /* No route to host */
-pub const EALREADY: i32 = 114; /* Operation already in progress */
-pub const EINPROGRESS: i32 = 115; /* Operation now in progress */
-pub const ESTALE: i32 = 116; /* Stale NFS file handle */
-pub const EUCLEAN: i32 = 117; /* Structure needs cleaning */
-pub const ENOTNAM: i32 = 118; /* Not a XENIX named type file */
-pub const ENAVAIL: i32 = 119; /* No XENIX semaphores available */
-pub const EISNAM: i32 = 120; /* Is a named type file */
-pub const EREMOTEIO: i32 = 121; /* Remote I/O error */
-pub const EDQUOT: i32 = 122; /* Quota exceeded */
-pub const ENOMEDIUM: i32 = 123; /* No medium found */
-pub const EMEDIUMTYPE: i32 = 124; /* Wrong medium type */
-pub const ECANCELED: i32 = 125; /* Operation Canceled */
-pub const ENOKEY: i32 = 126; /* Required key not available */
-pub const EKEYEXPIRED: i32 = 127; /* Key has expired */
-pub const EKEYREVOKED: i32 = 128; /* Key has been revoked */
-pub const EKEYREJECTED: i32 = 129; /* Key was rejected by service */
-pub const EOWNERDEAD: i32 = 130; /* Owner died */
-pub const ENOTRECOVERABLE: i32 = 131; /* State not recoverable */
-
-pub static STR_ERROR: [&'static str; 132] = ["Success",
-                                             "Operation not permitted",
-                                             "No such file or directory",
-                                             "No such process",
-                                             "Interrupted system call",
-                                             "I/O error",
-                                             "No such device or address",
-                                             "Argument list too long",
-                                             "Exec format error",
-                                             "Bad file number",
-                                             "No child processes",
-                                             "Try again",
-                                             "Out of memory",
-                                             "Permission denied",
-                                             "Bad address",
-                                             "Block device required",
-                                             "Device or resource busy",
-                                             "File exists",
-                                             "Cross-device link",
-                                             "No such device",
-                                             "Not a directory",
-                                             "Is a directory",
-                                             "Invalid argument",
-                                             "File table overflow",
-                                             "Too many open files",
-                                             "Not a typewriter",
-                                             "Text file busy",
-                                             "File too large",
-                                             "No space left on device",
-                                             "Illegal seek",
-                                             "Read-only file system",
-                                             "Too many links",
-                                             "Broken pipe",
-                                             "Math argument out of domain of func",
-                                             "Math result not representable",
-                                             "Resource deadlock would occur",
-                                             "File name too long",
-                                             "No record locks available",
-                                             "Function not implemented",
-                                             "Directory not empty",
-                                             "Too many symbolic links encountered",
-                                             "Operation would block",
-                                             "No message of desired type",
-                                             "Identifier removed",
-                                             "Channel number out of range",
-                                             "Level 2 not synchronized",
-                                             "Level 3 halted",
-                                             "Level 3 reset",
-                                             "Link number out of range",
-                                             "Protocol driver not attached",
-                                             "No CSI structure available",
-                                             "Level 2 halted",
-                                             "Invalid exchange",
-                                             "Invalid request descriptor",
-                                             "Exchange full",
-                                             "No anode",
-                                             "Invalid request code",
-                                             "Invalid slot",
-                                             "Resource deadlock would occur",
-                                             "Bad font file format",
-                                             "Device not a stream",
-                                             "No data available",
-                                             "Timer expired",
-                                             "Out of streams resources",
-                                             "Machine is not on the network",
-                                             "Package not installed",
-                                             "Object is remote",
-                                             "Link has been severed",
-                                             "Advertise error",
-                                             "Srmount error",
-                                             "Communication error on send",
-                                             "Protocol error",
-                                             "Multihop attempted",
-                                             "RFS specific error",
-                                             "Not a data message",
-                                             "Value too large for defined data type",
-                                             "Name not unique on network",
-                                             "File descriptor in bad state",
-                                             "Remote address changed",
-                                             "Can not access a needed shared library",
-                                             "Accessing a corrupted shared library",
-                                             ".lib section in a.out corrupted",
-                                             "Attempting to link in too many shared libraries",
-                                             "Cannot exec a shared library directly",
-                                             "Illegal byte sequence",
-                                             "Interrupted system call should be restarted",
-                                             "Streams pipe error",
-                                             "Too many users",
-                                             "Socket operation on non-socket",
-                                             "Destination address required",
-                                             "Message too long",
-                                             "Protocol wrong type for socket",
-                                             "Protocol not available",
-                                             "Protocol not supported",
-                                             "Socket type not supported",
-                                             "Operation not supported on transport endpoint",
-                                             "Protocol family not supported",
-                                             "Address family not supported by protocol",
-                                             "Address already in use",
-                                             "Cannot assign requested address",
-                                             "Network is down",
-                                             "Network is unreachable",
-                                             "Network dropped connection because of reset",
-                                             "Software caused connection abort",
-                                             "Connection reset by peer",
-                                             "No buffer space available",
-                                             "Transport endpoint is already connected",
-                                             "Transport endpoint is not connected",
-                                             "Cannot send after transport endpoint shutdown",
-                                             "Too many references: cannot splice",
-                                             "Connection timed out",
-                                             "Connection refused",
-                                             "Host is down",
-                                             "No route to host",
-                                             "Operation already in progress",
-                                             "Operation now in progress",
-                                             "Stale NFS file handle",
-                                             "Structure needs cleaning",
-                                             "Not a XENIX named type file",
-                                             "No XENIX semaphores available",
-                                             "Is a named type file",
-                                             "Remote I/O error",
-                                             "Quota exceeded",
-                                             "No medium found",
-                                             "Wrong medium type",
-                                             "Operation Canceled",
-                                             "Required key not available",
-                                             "Key has expired",
-                                             "Key has been revoked",
-                                             "Key was rejected by service",
-                                             "Owner died",
-                                             "State not recoverable"];
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/flag.rs
+++ /dev/null
@@ -1,84 +0,0 @@
-pub const CLONE_VM: usize = 0x100;
-pub const CLONE_FS: usize = 0x200;
-pub const CLONE_FILES: usize = 0x400;
-pub const CLONE_VFORK: usize = 0x4000;
-
-pub const CLOCK_REALTIME: usize = 1;
-pub const CLOCK_MONOTONIC: usize = 4;
-
-pub const EVENT_NONE: usize = 0;
-pub const EVENT_READ: usize = 1;
-pub const EVENT_WRITE: usize = 2;
-
-pub const F_GETFL: usize = 1;
-pub const F_SETFL: usize = 2;
-
-pub const FUTEX_WAIT: usize = 0;
-pub const FUTEX_WAKE: usize = 1;
-pub const FUTEX_REQUEUE: usize = 2;
-
-pub const MAP_WRITE: usize = 1;
-pub const MAP_WRITE_COMBINE: usize = 2;
-
-pub const MODE_TYPE: u16 = 0xF000;
-pub const MODE_DIR: u16 = 0x4000;
-pub const MODE_FILE: u16 = 0x8000;
-
-pub const MODE_PERM: u16 = 0x0FFF;
-pub const MODE_SETUID: u16 = 0o4000;
-pub const MODE_SETGID: u16 = 0o2000;
-
-pub const O_RDONLY: usize =     0x0001_0000;
-pub const O_WRONLY: usize =     0x0002_0000;
-pub const O_RDWR: usize =       0x0003_0000;
-pub const O_NONBLOCK: usize =   0x0004_0000;
-pub const O_APPEND: usize =     0x0008_0000;
-pub const O_SHLOCK: usize =     0x0010_0000;
-pub const O_EXLOCK: usize =     0x0020_0000;
-pub const O_ASYNC: usize =      0x0040_0000;
-pub const O_FSYNC: usize =      0x0080_0000;
-pub const O_CLOEXEC: usize =    0x0100_0000;
-pub const O_CREAT: usize =      0x0200_0000;
-pub const O_TRUNC: usize =      0x0400_0000;
-pub const O_EXCL: usize =       0x0800_0000;
-pub const O_DIRECTORY: usize =  0x1000_0000;
-pub const O_STAT: usize =       0x2000_0000;
-pub const O_ACCMODE: usize =    O_RDONLY | O_WRONLY | O_RDWR;
-
-pub const SEEK_SET: usize = 0;
-pub const SEEK_CUR: usize = 1;
-pub const SEEK_END: usize = 2;
-
-pub const SIGHUP: usize =   1;
-pub const SIGINT: usize =   2;
-pub const SIGQUIT: usize =  3;
-pub const SIGILL: usize =   4;
-pub const SIGTRAP: usize =  5;
-pub const SIGABRT: usize =  6;
-pub const SIGBUS: usize =   7;
-pub const SIGFPE: usize =   8;
-pub const SIGKILL: usize =  9;
-pub const SIGUSR1: usize =  10;
-pub const SIGSEGV: usize =  11;
-pub const SIGUSR2: usize =  12;
-pub const SIGPIPE: usize =  13;
-pub const SIGALRM: usize =  14;
-pub const SIGTERM: usize =  15;
-pub const SIGSTKFLT: usize= 16;
-pub const SIGCHLD: usize =  17;
-pub const SIGCONT: usize =  18;
-pub const SIGSTOP: usize =  19;
-pub const SIGTSTP: usize =  20;
-pub const SIGTTIN: usize =  21;
-pub const SIGTTOU: usize =  22;
-pub const SIGURG: usize =   23;
-pub const SIGXCPU: usize =  24;
-pub const SIGXFSZ: usize =  25;
-pub const SIGVTALRM: usize= 26;
-pub const SIGPROF: usize =  27;
-pub const SIGWINCH: usize = 28;
-pub const SIGIO: usize =    29;
-pub const SIGPWR: usize =   30;
-pub const SIGSYS: usize =   31;
-
-pub const WNOHANG: usize = 1;
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/io/dma.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-use core::{mem, ptr};
-use core::ops::{Deref, DerefMut};
-
-use Result;
-
-struct PhysBox {
-    address: usize,
-    size: usize
-}
-
-impl PhysBox {
-    fn new(size: usize) -> Result<PhysBox> {
-        let address = unsafe { ::physalloc(size)? };
-        Ok(PhysBox {
-            address: address,
-            size: size
-        })
-    }
-}
-
-impl Drop for PhysBox {
-    fn drop(&mut self) {
-        let _ = unsafe { ::physfree(self.address, self.size) };
-    }
-}
-
-pub struct Dma<T> {
-    phys: PhysBox,
-    virt: *mut T
-}
-
-impl<T> Dma<T> {
-    pub fn new(value: T) -> Result<Dma<T>> {
-        let phys = PhysBox::new(mem::size_of::<T>())?;
-        let virt = unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? } as *mut T;
-        unsafe { ptr::write(virt, value); }
-        Ok(Dma {
-            phys: phys,
-            virt: virt
-        })
-    }
-
-    pub fn zeroed() -> Result<Dma<T>> {
-        let phys = PhysBox::new(mem::size_of::<T>())?;
-        let virt = unsafe { ::physmap(phys.address, phys.size, ::MAP_WRITE)? } as *mut T;
-        unsafe { ptr::write_bytes(virt as *mut u8, 0, phys.size); }
-        Ok(Dma {
-            phys: phys,
-            virt: virt
-        })
-    }
-
-    pub fn physical(&self) -> usize {
-        self.phys.address
-    }
-}
-
-impl<T> Deref for Dma<T> {
-    type Target = T;
-    fn deref(&self) -> &T {
-        unsafe { &*self.virt }
-    }
-}
-
-impl<T> DerefMut for Dma<T> {
-    fn deref_mut(&mut self) -> &mut T {
-        unsafe { &mut *self.virt }
-    }
-}
-
-impl<T> Drop for Dma<T> {
-    fn drop(&mut self) {
-        unsafe { drop(ptr::read(self.virt)); }
-        let _ = unsafe { ::physunmap(self.virt as usize) };
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/io/io.rs
+++ /dev/null
@@ -1,67 +0,0 @@
-use core::cmp::PartialEq;
-use core::ops::{BitAnd, BitOr, Not};
-
-pub trait Io {
-    type Value: Copy + PartialEq + BitAnd<Output = Self::Value> + BitOr<Output = Self::Value> + Not<Output = Self::Value>;
-
-    fn read(&self) -> Self::Value;
-    fn write(&mut self, value: Self::Value);
-
-    #[inline(always)]
-    fn readf(&self, flags: Self::Value) -> bool  {
-        (self.read() & flags) as Self::Value == flags
-    }
-
-    #[inline(always)]
-    fn writef(&mut self, flags: Self::Value, value: bool) {
-        let tmp: Self::Value = match value {
-            true => self.read() | flags,
-            false => self.read() & !flags,
-        };
-        self.write(tmp);
-    }
-}
-
-pub struct ReadOnly<I: Io> {
-    inner: I
-}
-
-impl<I: Io> ReadOnly<I> {
-    pub const fn new(inner: I) -> ReadOnly<I> {
-        ReadOnly {
-            inner: inner
-        }
-    }
-
-    #[inline(always)]
-    pub fn read(&self) -> I::Value {
-        self.inner.read()
-    }
-
-    #[inline(always)]
-    pub fn readf(&self, flags: I::Value) -> bool {
-        self.inner.readf(flags)
-    }
-}
-
-pub struct WriteOnly<I: Io> {
-    inner: I
-}
-
-impl<I: Io> WriteOnly<I> {
-    pub const fn new(inner: I) -> WriteOnly<I> {
-        WriteOnly {
-            inner: inner
-        }
-    }
-
-    #[inline(always)]
-    pub fn write(&mut self, value: I::Value) {
-        self.inner.write(value)
-    }
-
-    #[inline(always)]
-    pub fn writef(&mut self, flags: I::Value, value: bool) {
-        self.inner.writef(flags, value)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/io/mmio.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-use core::intrinsics::{volatile_load, volatile_store};
-use core::mem::uninitialized;
-use core::ops::{BitAnd, BitOr, Not};
-
-use super::io::Io;
-
-#[repr(packed)]
-pub struct Mmio<T> {
-    value: T,
-}
-
-impl<T> Mmio<T> {
-    /// Create a new Mmio without initializing
-    pub fn new() -> Self {
-        Mmio {
-            value: unsafe { uninitialized() }
-        }
-    }
-}
-
-impl<T> Io for Mmio<T> where T: Copy + PartialEq + BitAnd<Output = T> + BitOr<Output = T> + Not<Output = T> {
-    type Value = T;
-
-    fn read(&self) -> T {
-        unsafe { volatile_load(&self.value) }
-    }
-
-    fn write(&mut self, value: T) {
-        unsafe { volatile_store(&mut self.value, value) };
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/io/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-//! I/O functions
-
-pub use self::dma::*;
-pub use self::io::*;
-pub use self::mmio::*;
-pub use self::pio::*;
-
-mod dma;
-mod io;
-mod mmio;
-mod pio;
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/io/pio.rs
+++ /dev/null
@@ -1,89 +0,0 @@
-use core::marker::PhantomData;
-
-use super::io::Io;
-
-/// Generic PIO
-#[derive(Copy, Clone)]
-pub struct Pio<T> {
-    port: u16,
-    value: PhantomData<T>,
-}
-
-impl<T> Pio<T> {
-    /// Create a PIO from a given port
-    pub const fn new(port: u16) -> Self {
-        Pio::<T> {
-            port: port,
-            value: PhantomData,
-        }
-    }
-}
-
-/// Read/Write for byte PIO
-impl Io for Pio<u8> {
-    type Value = u8;
-
-    /// Read
-    #[inline(always)]
-    fn read(&self) -> u8 {
-        let value: u8;
-        unsafe {
-            asm!("in $0, $1" : "={al}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-        value
-    }
-
-    /// Write
-    #[inline(always)]
-    fn write(&mut self, value: u8) {
-        unsafe {
-            asm!("out $1, $0" : : "{al}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-    }
-}
-
-/// Read/Write for word PIO
-impl Io for Pio<u16> {
-    type Value = u16;
-
-    /// Read
-    #[inline(always)]
-    fn read(&self) -> u16 {
-        let value: u16;
-        unsafe {
-            asm!("in $0, $1" : "={ax}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-        value
-    }
-
-    /// Write
-    #[inline(always)]
-    fn write(&mut self, value: u16) {
-        unsafe {
-            asm!("out $1, $0" : : "{ax}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-    }
-}
-
-/// Read/Write for doubleword PIO
-impl Io for Pio<u32> {
-    type Value = u32;
-
-    /// Read
-    #[inline(always)]
-    fn read(&self) -> u32 {
-        let value: u32;
-        unsafe {
-            asm!("in $0, $1" : "={eax}"(value) : "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-        value
-    }
-
-    /// Write
-    #[inline(always)]
-    fn write(&mut self, value: u32) {
-        unsafe {
-            asm!("out $1, $0" : : "{eax}"(value), "{dx}"(self.port) : "memory" : "intel", "volatile");
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/lib.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-#![deny(warnings)]
-#![feature(asm)]
-#![feature(const_fn)]
-#![feature(core_intrinsics)]
-#![no_std]
-
-pub use self::arch::*;
-pub use self::call::*;
-pub use self::data::*;
-pub use self::error::*;
-pub use self::flag::*;
-pub use self::io::*;
-pub use self::number::*;
-pub use self::scheme::*;
-
-#[cfg(target_arch = "arm")]
-#[path="arch/arm.rs"]
-mod arch;
-
-#[cfg(target_arch = "x86")]
-#[path="arch/x86.rs"]
-mod arch;
-
-#[cfg(target_arch = "x86_64")]
-#[path="arch/x86_64.rs"]
-mod arch;
-
-/// Function definitions
-pub mod call;
-
-/// Complex structures that are used for some system calls
-pub mod data;
-
-/// All errors that can be generated by a system call
-pub mod error;
-
-/// Flags used as an argument to many system calls
-pub mod flag;
-
-/// Functions for low level hardware control
-pub mod io;
-
-/// Call numbers used by each system call
-pub mod number;
-
-/// A trait useful for scheme handlers
-pub mod scheme;
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/number.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-pub const SYS_CLASS: usize =    0xF000_0000;
-pub const SYS_CLASS_PATH: usize=0x1000_0000;
-pub const SYS_CLASS_FILE: usize=0x2000_0000;
-
-pub const SYS_ARG: usize =      0x0F00_0000;
-pub const SYS_ARG_SLICE: usize =0x0100_0000;
-pub const SYS_ARG_MSLICE: usize=0x0200_0000;
-pub const SYS_ARG_PATH: usize = 0x0300_0000;
-
-pub const SYS_RET: usize =      0x00F0_0000;
-pub const SYS_RET_FILE: usize = 0x0010_0000;
-
-pub const SYS_LINK: usize =     SYS_CLASS_PATH | SYS_ARG_PATH | 9;
-pub const SYS_OPEN: usize =     SYS_CLASS_PATH | SYS_RET_FILE | 5;
-pub const SYS_CHMOD: usize =    SYS_CLASS_PATH | 15;
-pub const SYS_RMDIR: usize =    SYS_CLASS_PATH | 84;
-pub const SYS_UNLINK: usize =   SYS_CLASS_PATH | 10;
-
-pub const SYS_CLOSE: usize =    SYS_CLASS_FILE | 6;
-pub const SYS_DUP: usize =      SYS_CLASS_FILE | SYS_RET_FILE | 41;
-pub const SYS_DUP2: usize =      SYS_CLASS_FILE | SYS_RET_FILE | 63;
-pub const SYS_READ: usize =     SYS_CLASS_FILE | SYS_ARG_MSLICE | 3;
-pub const SYS_WRITE: usize =    SYS_CLASS_FILE | SYS_ARG_SLICE | 4;
-pub const SYS_LSEEK: usize =    SYS_CLASS_FILE | 19;
-pub const SYS_FCNTL: usize =    SYS_CLASS_FILE | 55;
-pub const SYS_FEVENT: usize =   SYS_CLASS_FILE | 927;
-pub const SYS_FMAP: usize =     SYS_CLASS_FILE | 90;
-pub const SYS_FUNMAP: usize =   SYS_CLASS_FILE | 91;
-pub const SYS_FPATH: usize =    SYS_CLASS_FILE | SYS_ARG_MSLICE | 928;
-pub const SYS_FSTAT: usize =    SYS_CLASS_FILE | SYS_ARG_MSLICE | 28;
-pub const SYS_FSTATVFS: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 100;
-pub const SYS_FSYNC: usize =    SYS_CLASS_FILE | 118;
-pub const SYS_FTRUNCATE: usize =SYS_CLASS_FILE | 93;
-
-pub const SYS_BRK: usize =      45;
-pub const SYS_CHDIR: usize =    12;
-pub const SYS_CLOCK_GETTIME: usize = 265;
-pub const SYS_CLONE: usize =    120;
-pub const SYS_EXECVE: usize =   11;
-pub const SYS_EXIT: usize =     1;
-pub const SYS_FUTEX: usize =    240;
-pub const SYS_GETCWD: usize =   183;
-pub const SYS_GETEGID: usize =  202;
-pub const SYS_GETENS: usize =   951;
-pub const SYS_GETEUID: usize =  201;
-pub const SYS_GETGID: usize =   200;
-pub const SYS_GETNS: usize =    950;
-pub const SYS_GETPID: usize =   20;
-pub const SYS_GETUID: usize =   199;
-pub const SYS_IOPL: usize =     110;
-pub const SYS_KILL: usize =     37;
-pub const SYS_MKNS: usize =     984;
-pub const SYS_NANOSLEEP: usize =162;
-pub const SYS_PHYSALLOC: usize =945;
-pub const SYS_PHYSFREE: usize = 946;
-pub const SYS_PHYSMAP: usize =  947;
-pub const SYS_PHYSUNMAP: usize =948;
-pub const SYS_VIRTTOPHYS: usize=949;
-pub const SYS_PIPE2: usize =    331;
-pub const SYS_SETREGID: usize = 204;
-pub const SYS_SETRENS: usize =  952;
-pub const SYS_SETREUID: usize = 203;
-pub const SYS_WAITPID: usize =  7;
-pub const SYS_YIELD: usize =    158;
deleted file mode 100644
--- a/third_party/rust/redox_syscall-0.1.16/src/scheme.rs
+++ /dev/null
@@ -1,232 +0,0 @@
-use core::{mem, slice};
-
-use super::*;
-
-pub trait Scheme {
-    fn handle(&self, packet: &mut Packet) {
-        packet.a = Error::mux(match packet.a {
-            SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid),
-            SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
-            SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
-            SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
-
-            SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
-            SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
-            SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
-            SYS_LSEEK => self.seek(packet.b, packet.c, packet.d),
-            SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
-            SYS_FEVENT => self.fevent(packet.b, packet.c),
-            SYS_FMAP => self.fmap(packet.b, packet.c, packet.d),
-            SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
-            SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { Err(Error::new(EFAULT)) },
-            SYS_FSTATVFS => if packet.d >= mem::size_of::<StatVfs>() { self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) } else { Err(Error::new(EFAULT)) },
-            SYS_FSYNC => self.fsync(packet.b),
-            SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c),
-            SYS_CLOSE => self.close(packet.b),
-
-            _ => Err(Error::new(ENOSYS))
-        });
-    }
-
-    /* Scheme operations */
-
-    #[allow(unused_variables)]
-    fn open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    /* Resource operations */
-    #[allow(unused_variables)]
-    fn dup(&self, old_id: usize, buf: &[u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn read(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn write(&self, id: usize, buf: &[u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fevent(&self, id: usize, flags: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fmap(&self, id: usize, offset: usize, size: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fstat(&self, id: usize, stat: &mut Stat) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fsync(&self, id: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn ftruncate(&self, id: usize, len: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn close(&self, id: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-}
-
-pub trait SchemeMut {
-    fn handle(&mut self, packet: &mut Packet) {
-        packet.a = Error::mux(match packet.a {
-            SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid),
-            SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
-            SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
-            SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
-
-            SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
-            SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
-            SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
-            SYS_LSEEK => self.seek(packet.b, packet.c, packet.d),
-            SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
-            SYS_FEVENT => self.fevent(packet.b, packet.c),
-            SYS_FMAP => self.fmap(packet.b, packet.c, packet.d),
-            SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
-            SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { Err(Error::new(EFAULT)) },
-            SYS_FSTATVFS => if packet.d >= mem::size_of::<StatVfs>() { self.fstatvfs(packet.b, unsafe { &mut *(packet.c as *mut StatVfs) }) } else { Err(Error::new(EFAULT)) },
-            SYS_FSYNC => self.fsync(packet.b),
-            SYS_FTRUNCATE => self.ftruncate(packet.b, packet.c),
-            SYS_CLOSE => self.close(packet.b),
-
-            _ => Err(Error::new(ENOSYS))
-        });
-    }
-
-    /* Scheme operations */
-    #[allow(unused_variables)]
-    fn open(&mut self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn rmdir(&mut self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    #[allow(unused_variables)]
-    fn unlink(&mut self, path: &[u8], uid: u32, gid: u32) -> Result<usize> {
-        Err(Error::new(ENOENT))
-    }
-
-    /* Resource operations */
-    #[allow(unused_variables)]
-    fn dup(&mut self, old_id: usize, buf: &[u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn read(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn seek(&mut self, id: usize, pos: usize, whence: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fcntl(&mut self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fevent(&mut self, id: usize, flags: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fmap(&mut self, id: usize, offset: usize, size: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fstat(&mut self, id: usize, stat: &mut Stat) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn fsync(&mut self, id: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn ftruncate(&mut self, id: usize, len: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-
-    #[allow(unused_variables)]
-    fn close(&mut self, id: usize) -> Result<usize> {
-        Err(Error::new(EBADF))
-    }
-}
--- a/third_party/rust/redox_syscall/.cargo-checksum.json
+++ b/third_party/rust/redox_syscall/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"c725f317bb27871da237c88ca08a137e2dbe1f2864d48ffd9fe65e545cd9207a","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"f2aabeb00e422ebe0f5ccdde1449fca7e8da5e563fb84024db83742ca12633fc","src/arch/arm.rs":"44ed9097879fce0ebe85d29e25ba378fb3ee7fcd649b569207495ed601c42a1c","src/arch/x86.rs":"e72a7f653c25b1ea5595af7ce991fe0e5c96547e127fc67e4967d60abbe1d3bd","src/arch/x86_64.rs":"499a0c997756c1cac5f4b4b98cff474a4e759695d3664712bd1a92d5d4a4a5f1","src/call.rs":"9b8517947298b82f0ccde0e97288856fee20d484470996d4bd19b725ecb7892b","src/data.rs":"8602d05b437216e6774658902f2d5fb030edc7510754ce7277fd299ab53a6b8b","src/error.rs":"b23c12db8cafb64f3b909a95bdd47cf03f62f6fa1201b40892febf46ec56bcb4","src/flag.rs":"4e10f5aeeba8406d50155332d59f7933c933dd7a03cc0a8316237e389c30e278","src/io/dma.rs":"4ab65016b3bc9121f0844dc4b8de77608eba327c0e0d930900254242b2c204b0","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"bd475c815d483cc2b187348c32e10f94df0ca756ee8d14260b6ca3c660b2a73a","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"219fcd317d6c490a14794ec4db9de3e305c722dda720043c67076bda60632bb8","src/lib.rs":"988fb0b0bd3b396345f11ef46617072aeaf9307d3fa05a4d2a2ee9d590598bba","src/number.rs":"f9779b8abf0473ffbc81614746eb6ef5648129984a69eb43e4890a5b4c0aaedf","src/scheme.rs":"fe4cfac446eb1951795f588648afa0f6014566a7e2aa423f5f6f1dad45fe8583"},"package":"8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509"}
\ No newline at end of file
+{"files":{"Cargo.toml":"4c637987488c71b124a5bee158d3752aef774bcf076b4d14fde9f5cf5b49796c","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"f2aabeb00e422ebe0f5ccdde1449fca7e8da5e563fb84024db83742ca12633fc","src/arch/arm.rs":"44ed9097879fce0ebe85d29e25ba378fb3ee7fcd649b569207495ed601c42a1c","src/arch/x86.rs":"e72a7f653c25b1ea5595af7ce991fe0e5c96547e127fc67e4967d60abbe1d3bd","src/arch/x86_64.rs":"499a0c997756c1cac5f4b4b98cff474a4e759695d3664712bd1a92d5d4a4a5f1","src/call.rs":"424bcb40b1a06c9a3d156dc7640395d4657b215c7bee5e27d521e8f830915484","src/data.rs":"8602d05b437216e6774658902f2d5fb030edc7510754ce7277fd299ab53a6b8b","src/error.rs":"b23c12db8cafb64f3b909a95bdd47cf03f62f6fa1201b40892febf46ec56bcb4","src/flag.rs":"4e10f5aeeba8406d50155332d59f7933c933dd7a03cc0a8316237e389c30e278","src/io/dma.rs":"4ab65016b3bc9121f0844dc4b8de77608eba327c0e0d930900254242b2c204b0","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"bd475c815d483cc2b187348c32e10f94df0ca756ee8d14260b6ca3c660b2a73a","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"219fcd317d6c490a14794ec4db9de3e305c722dda720043c67076bda60632bb8","src/lib.rs":"988fb0b0bd3b396345f11ef46617072aeaf9307d3fa05a4d2a2ee9d590598bba","src/number.rs":"ee28dc0f4fcd371a72eb633c539051e8d30ae8d03e9f312aa60c863e47a63232","src/scheme.rs":"479301bfbd25e7fedb35d2a0cfb06fed7cd366716d15785db09220e1db12adb9"},"package":"ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"}
\ No newline at end of file
--- a/third_party/rust/redox_syscall/Cargo.toml
+++ b/third_party/rust/redox_syscall/Cargo.toml
@@ -7,17 +7,17 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "redox_syscall"
-version = "0.1.31"
+version = "0.1.32"
 authors = ["Jeremy Soller <jackpot51@gmail.com>"]
 description = "A Rust library to access raw Redox system calls"
 documentation = "https://docs.rs/redox_syscall"
 license = "MIT"
 repository = "https://github.com/redox-os/syscall"
 
 [lib]
 name = "syscall"
--- a/third_party/rust/redox_syscall/src/call.rs
+++ b/third_party/rust/redox_syscall/src/call.rs
@@ -78,17 +78,29 @@ pub fn execve<T: AsRef<[u8]>>(path: T, a
                       path.as_ref().len(), args.as_ptr() as usize, args.len()) }
 }
 
 /// Exit the current process
 pub fn exit(status: usize) -> Result<usize> {
     unsafe { syscall1(SYS_EXIT, status) }
 }
 
-/// Register a file for event-based I/O
+/// Change file permissions
+pub fn fchmod(fd: usize, mode: u16) -> Result<usize> {
+    unsafe { syscall2(SYS_FCHMOD, fd, mode as usize) }
+
+}
+
+/// Change file ownership
+pub fn fchown(fd: usize, uid: u32, gid: u32) -> Result<usize> {
+    unsafe { syscall3(SYS_FCHOWN, fd, uid as usize, gid as usize) }
+
+}
+
+/// Change file descriptor flags
 pub fn fcntl(fd: usize, cmd: usize, arg: usize) -> Result<usize> {
     unsafe { syscall3(SYS_FCNTL, fd, cmd, arg) }
 }
 
 /// Register a file for event-based I/O
 pub fn fevent(fd: usize, flags: usize) -> Result<usize> {
     unsafe { syscall2(SYS_FEVENT, fd, flags) }
 }
--- a/third_party/rust/redox_syscall/src/number.rs
+++ b/third_party/rust/redox_syscall/src/number.rs
@@ -17,16 +17,18 @@ pub const SYS_RMDIR: usize =    SYS_CLAS
 pub const SYS_UNLINK: usize =   SYS_CLASS_PATH | 10;
 
 pub const SYS_CLOSE: usize =    SYS_CLASS_FILE | 6;
 pub const SYS_DUP: usize =      SYS_CLASS_FILE | SYS_RET_FILE | 41;
 pub const SYS_DUP2: usize =     SYS_CLASS_FILE | SYS_RET_FILE | 63;
 pub const SYS_READ: usize =     SYS_CLASS_FILE | SYS_ARG_MSLICE | 3;
 pub const SYS_WRITE: usize =    SYS_CLASS_FILE | SYS_ARG_SLICE | 4;
 pub const SYS_LSEEK: usize =    SYS_CLASS_FILE | 19;
+pub const SYS_FCHMOD: usize =   SYS_CLASS_FILE | 94;
+pub const SYS_FCHOWN: usize =   SYS_CLASS_FILE | 207;
 pub const SYS_FCNTL: usize =    SYS_CLASS_FILE | 55;
 pub const SYS_FEVENT: usize =   SYS_CLASS_FILE | 927;
 pub const SYS_FMAP: usize =     SYS_CLASS_FILE | 90;
 pub const SYS_FUNMAP: usize =   SYS_CLASS_FILE | 91;
 pub const SYS_FPATH: usize =    SYS_CLASS_FILE | SYS_ARG_MSLICE | 928;
 pub const SYS_FSTAT: usize =    SYS_CLASS_FILE | SYS_ARG_MSLICE | 28;
 pub const SYS_FSTATVFS: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 100;
 pub const SYS_FSYNC: usize =    SYS_CLASS_FILE | 118;
--- a/third_party/rust/redox_syscall/src/scheme.rs
+++ b/third_party/rust/redox_syscall/src/scheme.rs
@@ -9,16 +9,18 @@ pub trait Scheme {
             SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
             SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
             SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
 
             SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
             SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
             SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
             SYS_LSEEK => self.seek(packet.b, packet.c, packet.d),
+            SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
+            SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
             SYS_FEVENT => self.fevent(packet.b, packet.c),
             SYS_FMAP => self.fmap(packet.b, packet.c, packet.d),
             SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
             SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() {
                 self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) })
             } else {
                 Err(Error::new(EFAULT))
@@ -79,16 +81,26 @@ pub trait Scheme {
     }
 
     #[allow(unused_variables)]
     fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
 
     #[allow(unused_variables)]
+    fn fchmod(&self, id: usize, mode: u16) -> Result<usize> {
+        Err(Error::new(EBADF))
+    }
+
+    #[allow(unused_variables)]
+    fn fchown(&self, id: usize, uid: u32, gid: u32) -> Result<usize> {
+        Err(Error::new(EBADF))
+    }
+
+    #[allow(unused_variables)]
     fn fcntl(&self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
 
     #[allow(unused_variables)]
     fn fevent(&self, id: usize, flags: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
@@ -141,16 +153,18 @@ pub trait SchemeMut {
             SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid),
             SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
             SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid),
 
             SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
             SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
             SYS_WRITE => self.write(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }),
             SYS_LSEEK => self.seek(packet.b, packet.c, packet.d),
+            SYS_FCHMOD => self.fchmod(packet.b, packet.c as u16),
+            SYS_FCHOWN => self.fchown(packet.b, packet.c as u32, packet.d as u32),
             SYS_FCNTL => self.fcntl(packet.b, packet.c, packet.d),
             SYS_FEVENT => self.fevent(packet.b, packet.c),
             SYS_FMAP => self.fmap(packet.b, packet.c, packet.d),
             SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }),
             SYS_FSTAT => if packet.d >= mem::size_of::<Stat>() {
                 self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) })
             } else {
                 Err(Error::new(EFAULT))
@@ -210,16 +224,26 @@ pub trait SchemeMut {
     }
 
     #[allow(unused_variables)]
     fn seek(&mut self, id: usize, pos: usize, whence: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
 
     #[allow(unused_variables)]
+    fn fchmod(&mut self, id: usize, mode: u16) -> Result<usize> {
+        Err(Error::new(EBADF))
+    }
+
+    #[allow(unused_variables)]
+    fn fchown(&mut self, id: usize, uid: u32, gid: u32) -> Result<usize> {
+        Err(Error::new(EBADF))
+    }
+
+    #[allow(unused_variables)]
     fn fcntl(&mut self, id: usize, cmd: usize, arg: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
 
     #[allow(unused_variables)]
     fn fevent(&mut self, id: usize, flags: usize) -> Result<usize> {
         Err(Error::new(EBADF))
     }
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/.appveyor.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-environment:
-  matrix:
-  - TOOLCHAIN: 1.8.0
-    FEATURES: ""
-  - TOOLCHAIN: stable
-    FEATURES: ""
-  - TOOLCHAIN: beta
-    FEATURES: ""
-  - TOOLCHAIN: nightly
-    FEATURES: ""
-
-  - TOOLCHAIN: 1.13.0
-    FEATURES: "hyphenation"
-  - TOOLCHAIN: stable
-    FEATURES: "hyphenation"
-  - TOOLCHAIN: beta
-    FEATURES: "hyphenation"
-  - TOOLCHAIN: nightly
-    FEATURES: "hyphenation"
-
-matrix:
-  allow_failures:
-    - TOOLCHAIN: nightly
-
-install:
-  - ps: Start-FileDownload 'https://static.rust-lang.org/rustup/dist/i686-pc-windows-gnu/rustup-init.exe'
-  - rustup-init.exe -y --default-toolchain %TOOLCHAIN%
-  - set PATH=%PATH%;%USERPROFILE%\.cargo\bin
-
-build_script:
-  - cargo build --verbose --features "%FEATURES%"
-
-test_script:
-  - cargo test --verbose --features "%FEATURES%"
-
-cache:
-  - '%USERPROFILE%\.cargo'
-  - target
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".appveyor.yml":"c4f7300b7fbb4c0e02665b0bf8d55b94d331600e3626cd4b4b64e56067735bd8",".travis.yml":"afc3861d80dbffc431e723bd4be8a9065e176fb377d900db1db91957a2a47917","Cargo.toml":"ad4d2c450155a390799f0231bfc40531a9abb28069a0d308c3ecb75ec4447d15","LICENSE":"ce93600c49fbb3e14df32efe752264644f6a2f8e08a735ba981725799e5309ef","README.md":"67b7eca97cfa6438073316538a4e6442a01e7d811f33b93cbb9b54f795d5ea90","benches/linear.rs":"c53704dadf156847142a8a8f19860d310daa7bee5ed25da8203445620eb2284f","examples/layout.rs":"bff2fc9b51bb9e8fcf7e3305f2efcb293fc068817d190ab83e76a4bbd75d2111","examples/termwidth.rs":"91c6762d35c4a542432885f3949b8db1cf5b5e428a0bec23f780c7bbd31c7fe3","src/lib.rs":"671b02360dfbdfa7198717ed3cda0fc32251d2cb0864a17a02b227f83cf5a76e"},"package":"f86300c3e7416ee233abd7cda890c492007a3980f941f79185c753a701257167"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/.travis.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-language: rust
-
-rust:
-  - stable
-  - beta
-  - nightly
-
-cache: cargo
-
-script:
-  - cargo build --verbose --features "$FEATURES"
-  - cargo test --verbose --features "$FEATURES"
-
-env:
-  - FEATURES=""
-  - FEATURES="hyphenation"
-
-matrix:
-  include:
-    - rust: 1.8.0
-      env: FEATURES=""
-    - rust: 1.13.0
-      env: FEATURES="hyphenation"
-  allow_failures:
-    - rust: nightly
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/Cargo.toml
+++ /dev/null
@@ -1,27 +0,0 @@
-[package]
-name = "textwrap"
-version = "0.6.0"
-authors = ["Martin Geisler <martin@geisler.net>"]
-description = """
-Textwrap is a small library for word wrapping, indenting, and
-dedenting strings.
-
-You can use it to format strings (such as help and error messages) for
-display in commandline applications. It is designed to be efficient
-and handle Unicode characters correctly.
-"""
-documentation = "https://docs.rs/textwrap/"
-repository = "https://github.com/mgeisler/textwrap"
-readme = "README.md"
-keywords = ["text", "formatting", "wrap", "typesetting", "hyphenation"]
-categories = ["text-processing", "command-line-interface"]
-license = "MIT"
-
-[badges]
-travis-ci = { repository = "mgeisler/textwrap" }
-appveyor = { repository = "mgeisler/textwrap" }
-
-[dependencies]
-unicode-width = "0.1.3"
-term_size = "0.3.0"
-hyphenation = { version = "0.6.1", optional = true }
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016 Martin Geisler
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/README.md
+++ /dev/null
@@ -1,255 +0,0 @@
-# Textwrap
-
-[![](https://img.shields.io/crates/v/textwrap.svg)][crates-io]
-[![](https://docs.rs/textwrap/badge.svg)][api-docs]
-[![](https://travis-ci.org/mgeisler/textwrap.svg?branch=master)][travis-ci]
-[![](https://ci.appveyor.com/api/projects/status/yo6iak55nraupjw3/branch/master?svg=true)][appveyor]
-
-Textwrap is a small Rust crate for word wrapping text. You can use it
-to format strings for display in commandline applications. The crate
-name and interface is inspired by
-the [Python textwrap module][py-textwrap].
-
-## Usage
-
-Add this to your `Cargo.toml`:
-```toml
-[dependencies]
-textwrap = "0.6"
-```
-
-and this to your crate root:
-```rust
-extern crate textwrap;
-```
-
-If you would like to have automatic hyphenation, specify the
-dependency as:
-```toml
-[dependencies]
-textwrap = { version: "0.6", features: ["hyphenation"] }
-```
-
-## Documentation
-
-**[API documentation][api-docs]**
-
-## Getting Started
-
-Word wrapping single strings is easy using the `fill` function:
-```rust
-extern crate textwrap;
-use textwrap::fill;
-
-fn main() {
-    let text = "textwrap: a small library for wrapping text.";
-    println!("{}", fill(text, 18));
-}
-```
-The output is
-```
-textwrap: a small
-library for
-wrapping text.
-```
-
-With the `hyphenation` feature, you can get automatic hyphenation
-for [about 70 languages][patterns]. Your program must load and
-configure the hyphenation patterns to use:
-```rust
-extern crate hyphenation;
-extern crate textwrap;
-
-use hyphenation::Language;
-use textwrap::Wrapper;
-
-fn main() {
-    let corpus = hyphenation::load(Language::English_US).unwrap();
-    let wrapper = Wrapper::new(18).word_splitter(Box::new(corpus));
-    let text = "textwrap: a small library for wrapping text.";
-    println!("{}", wrapper.fill(text))
-}
-```
-
-The output now looks like this:
-```
-textwrap: a small
-library for wrap-
-ping text.
-```
-
-The hyphenation uses high-quality TeX hyphenation patterns.
-
-## Examples
-
-The library comes with a small example programs that shows various
-features.
-
-### Layout Example
-
-The `layout` example shows how a fixed example string is wrapped at
-different widths. Run the example with:
-
-```shell
-$ cargo run --features hyphenation --example layout
-```
-
-The program will use the following string:
-
-> Memory safety without garbage collection. Concurrency without data
-> races. Zero-cost abstractions.
-
-The string is wrapped at all widths between 15 and 60 columns. With
-narrow columns the output looks like this:
-
-```
-.--- Width: 15 ---.
-| Memory safety   |
-| without garbage |
-| collection.     |
-| Concurrency     |
-| without data    |
-| races. Zero-    |
-| cost abstrac-   |
-| tions.          |
-.--- Width: 16 ----.
-| Memory safety    |
-| without garbage  |
-| collection. Con- |
-| currency without |
-| data races. Ze-  |
-| ro-cost abstrac- |
-| tions.           |
-```
-
-Later, longer lines are used and the output now looks like this:
-
-```
-.-------------------- Width: 49 --------------------.
-| Memory safety without garbage collection. Concur- |
-| rency without data races. Zero-cost abstractions. |
-.---------------------- Width: 53 ----------------------.
-| Memory safety without garbage collection. Concurrency |
-| without data races. Zero-cost abstractions.           |
-.------------------------- Width: 59 -------------------------.
-| Memory safety without garbage collection. Concurrency with- |
-| out data races. Zero-cost abstractions.                     |
-```
-
-Notice how words are split at hyphens (such as "zero-cost") but also
-how words are hyphenated using automatic/machine hyphenation.
-
-### Terminal Width Example
-
-The `termwidth` example simply shows how the width can be set
-automatically to the current terminal width. Run it with this command:
-
-```
-$ cargo run --example termwidth
-```
-
-If you run it in a narrow terminal, you'll see output like this:
-```
-Formatted in within 60 columns:
-----
-Memory safety without garbage collection. Concurrency
-without data races. Zero-cost abstractions.
-----
-```
-
-If `stdout` is not connected to the terminal, the program will use a
-default of 80 columns for the width:
-
-```
-$ cargo run --example termwidth | cat
-Formatted in within 80 columns:
-----
-Memory safety without garbage collection. Concurrency without data races. Zero-
-cost abstractions.
-----
-```
-
-## Release History
-
-This section lists the largest changes per release.
-
-### Version 0.6.0 — May 22nd, 2017
-
-Version 0.6.0 adds builder methods to `Wrapper` for easy one-line
-initialization and configuration:
-
-```rust
-let wrapper = Wrapper::new(60).break_words(false);
-```
-
-It also add a new `NoHyphenation` word splitter that will never split
-words, not even at existing hyphens.
-
-Issues closed:
-
-* Fixed [#28][issue-28]: Support not squeezing whitespace
-
-### Version 0.5.0 — May 15th, 2017
-
-Version 0.5.0 has *breaking API changes*. However, this only affects
-code using the hyphenation feature. The feature is now optional, so
-you will first need to enable the `hyphenation` feature as described
-above. Afterwards, please change your code from
-```rust
-wrapper.corpus = Some(&corpus);
-```
-to
-```rust
-wrapper.splitter = corpus;
-```
-
-Other changes include optimizations, so version 0.5.0 is roughly
-10-15% faster than version 0.4.0.
-
-Issues closed:
-
-* Fixed [#19][issue-19]: Add support for finding terminal size
-* Fixed [#25][issue-25]: Handle words longer than `self.width`
-* Fixed [#26][issue-26]: Support custom indentation
-* Fixed [#36][issue-36]: Support building without `hyphenation`
-* Fixed [#39][issue-39]: Respect non-breaking spaces
-
-### Version 0.4.0 — January 24th, 2017
-
-Documented complexities and tested these via `cargo bench`.
-
-* Fixed [#13][issue-13]: Immediatedly add word if it fits
-* Fixed [#14][issue-14]: Avoid splitting on initial hyphens in `--foo-bar`
-
-### Version 0.3.0 — January 7th, 2017
-
-Added support for automatic hyphenation.
-
-### Version 0.2.0 — December 28th, 2016
-
-Introduced `Wrapper` struct. Added support for wrapping on hyphens.
-
-### Version 0.1.0 — December 17th, 2016
-
-First public release with support for wrapping strings on whitespace.
-
-## License
-
-Textwrap can be distributed according to the [MIT license][mit].
-Contributions will be accepted under the same license.
-
-[crates-io]: https://crates.io/crates/textwrap
-[travis-ci]: https://travis-ci.org/mgeisler/textwrap
-[appveyor]: https://ci.appveyor.com/project/mgeisler/textwrap
-[py-textwrap]: https://docs.python.org/library/textwrap
-[patterns]: https://github.com/tapeinosyne/hyphenation/tree/master/patterns-tex
-[api-docs]: https://docs.rs/textwrap/
-[issue-13]: ../../issues/13
-[issue-14]: ../../issues/14
-[issue-19]: ../../issues/19
-[issue-25]: ../../issues/25
-[issue-26]: ../../issues/26
-[issue-28]: ../../issues/28
-[issue-36]: ../../issues/36
-[issue-39]: ../../issues/39
-[mit]: LICENSE
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/benches/linear.rs
+++ /dev/null
@@ -1,92 +0,0 @@
-#![feature(test)]
-
-// The benchmarks here verify that the complexity grows as O(*n*)
-// where *n* is the size of the text to be wrapped.
-
-extern crate test;
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-extern crate textwrap;
-
-use test::Bencher;
-#[cfg(feature = "hyphenation")]
-use hyphenation::Language;
-#[cfg(feature = "hyphenation")]
-use textwrap::Wrapper;
-
-const LINE_LENGTH: usize = 60;
-
-fn lorem_ipsum(length: usize) -> &'static str {
-    let text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas feugiat non mi \
-                rutrum consectetur. Nulla iaculis luctus ex suscipit posuere. Sed et tellus quis \
-                elit volutpat pretium. Sed faucibus purus vitae feugiat tincidunt. Nulla \
-                malesuada interdum tempus. Proin consectetur malesuada magna, id suscipit enim \
-                tempus in. Sed sollicitudin velit tortor, quis condimentum nisl vulputate \
-                lobortis. Curabitur id lectus arcu. Nullam quis aliquam nisi. Vestibulum quam \
-                enim, elementum vel urna scelerisque, ultricies cursus urna. Mauris vestibulum, \
-                augue non posuere viverra, risus tortor iaculis augue, eget convallis metus nisl \
-                vestibulum nisi. Aenean auctor dui vel aliquet sagittis. Aliquam quis enim \
-                mauris. Nunc eu leo et orci euismod bibendum vel eu tortor. Nam egestas volutpat \
-                ex, a turpis duis.";
-    text.split_at(length).0
-}
-
-#[bench]
-fn lorem_100(b: &mut Bencher) {
-    let text = lorem_ipsum(100);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn lorem_200(b: &mut Bencher) {
-    let text = lorem_ipsum(200);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn lorem_400(b: &mut Bencher) {
-    let text = lorem_ipsum(400);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn lorem_800(b: &mut Bencher) {
-    let text = lorem_ipsum(800);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_lorem_100(b: &mut Bencher) {
-    let text = lorem_ipsum(100);
-    let corpus = hyphenation::load(Language::Latin).unwrap();
-    let wrapper = Wrapper::new(LINE_LENGTH).word_splitter(Box::new(corpus));
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_lorem_200(b: &mut Bencher) {
-    let text = lorem_ipsum(200);
-    let corpus = hyphenation::load(Language::Latin).unwrap();
-    let wrapper = Wrapper::new(LINE_LENGTH).word_splitter(Box::new(corpus));
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_lorem_400(b: &mut Bencher) {
-    let text = lorem_ipsum(400);
-    let corpus = hyphenation::load(Language::Latin).unwrap();
-    let wrapper = Wrapper::new(LINE_LENGTH).word_splitter(Box::new(corpus));
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_lorem_800(b: &mut Bencher) {
-    let text = lorem_ipsum(800);
-    let corpus = hyphenation::load(Language::Latin).unwrap();
-    let wrapper = Wrapper::new(LINE_LENGTH).word_splitter(Box::new(corpus));
-    b.iter(|| wrapper.fill(text))
-}
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/examples/layout.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-extern crate textwrap;
-
-#[cfg(feature = "hyphenation")]
-use hyphenation::Language;
-use textwrap::Wrapper;
-
-
-#[cfg(not(feature = "hyphenation"))]
-fn new_wrapper<'a>() -> Wrapper<'a> {
-    Wrapper::new(0)
-}
-
-#[cfg(feature = "hyphenation")]
-fn new_wrapper<'a>() -> Wrapper<'a> {
-    let corpus = hyphenation::load(Language::English_US).unwrap();
-    Wrapper::new(0).word_splitter(Box::new(corpus))
-}
-
-fn main() {
-    let example = "
-Memory safety without garbage collection.
-Concurrency without data races.
-Zero-cost abstractions.
-";
-    let mut prev_lines = vec![];
-    let mut wrapper = new_wrapper();
-    for width in 15..60 {
-        wrapper.width = width;
-        let lines = wrapper.wrap(example);
-        if lines != prev_lines {
-            let title = format!(" Width: {} ", width);
-            println!(".{:-^1$}.", title, width + 2);
-            for line in &lines {
-                println!("| {:1$} |", line, width);
-            }
-            prev_lines = lines;
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/examples/termwidth.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-extern crate textwrap;
-
-use textwrap::Wrapper;
-
-fn main() {
-    let example = "
-Memory safety without garbage collection.
-Concurrency without data races.
-Zero-cost abstractions.
-";
-    // Create a new Wrapper -- automatically set the width to the
-    // current terminal width.
-    let wrapper = Wrapper::with_termwidth();
-    println!("Formatted in within {} columns:", wrapper.width);
-    println!("----");
-    println!("{}", wrapper.fill(example));
-    println!("----");
-}
deleted file mode 100644
--- a/third_party/rust/textwrap-0.6.0/src/lib.rs
+++ /dev/null
@@ -1,891 +0,0 @@
-//! `textwrap` provides functions for word wrapping and filling text.
-//!
-//! Wrapping text can be very useful in commandline programs where you
-//! want to format dynamic output nicely so it looks good in a
-//! terminal. A quick example:
-//!
-//! ```
-//! extern crate textwrap;
-//! use textwrap::fill;
-//!
-//! fn main() {
-//!    let text = "textwrap: a small library for wrapping text.";
-//!    println!("{}", fill(text, 18));
-//! }
-//! ```
-//!
-//! This will display the following output:
-//! ```text
-//! textwrap: a small
-//! library for
-//! wrapping text.
-//! ```
-//!
-//! # Displayed Width vs Byte Size
-//!
-//! To word wrap text, one must know the width of each word so one can
-//! know when to break lines. This library measures the width of text
-//! using the [displayed width][unicode-width], not the size in bytes.
-//!
-//! This is important for non-ASCII text. ASCII characters such as `a`
-//! and `!` are simple and take up one column each. This means that
-//! the displayed width is equal to the string length in bytes.
-//! However, non-ASCII characters and symbols take up more than one
-//! byte when UTF-8 encoded: `é` is `0xc3 0xa9` (two bytes) and `⚙` is
-//! `0xe2 0x9a 0x99` (three bytes) in UTF-8, respectively.
-//!
-//! This is why we take care to use the displayed width instead of the
-//! byte count when computing line lengths. All functions in this
-//! library handle Unicode characters like this.
-//!
-//! [unicode-width]: https://docs.rs/unicode-width/
-
-
-extern crate unicode_width;
-extern crate term_size;
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-
-use unicode_width::UnicodeWidthStr;
-use unicode_width::UnicodeWidthChar;
-#[cfg(feature = "hyphenation")]
-use hyphenation::{Hyphenation, Corpus};
-
-/// An interface for splitting words.
-///
-/// When the [`wrap`] method will try to fit text into a line, it will
-/// eventually find a word that it too large the current text width.
-/// It will then call the currently configured `WordSplitter` to have
-/// it attempt to split the word into smaller parts. This trait
-/// describes that functionality via the [`split`] method.
-///
-/// If the `textwrap` crate has been compiled with the `hyphenation`
-/// feature enabled, you will find an implementation of `WordSplitter`
-/// by the `hyphenation::language::Corpus` struct. Use this struct for
-/// language-aware hyphenation. See the [`hyphenation` documentation]
-/// for details.
-///
-/// [`wrap`]: struct.Wrapper.html#method.wrap
-/// [`split`]: #tymethod.split
-/// [`hyphenation` documentation]: https://docs.rs/hyphenation/
-pub trait WordSplitter {
-    /// Return all possible splits of word. Each split is a triple
-    /// with a head, a hyphen, and a tail where `head + &hyphen +
-    /// &tail == word`. The hyphen can be empty if there is already a
-    /// hyphen in the head.
-    ///
-    /// The splits should go from smallest to longest and should
-    /// include no split at all. So the word "technology" could be
-    /// split into
-    ///
-    /// ```
-    /// vec![("tech", "-", "nology"),
-    ///      ("technol", "-", "ogy"),
-    ///      ("technolo", "-", "gy"),
-    ///      ("technology", "", "")];
-    /// ```
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)>;
-}
-
-/// Use this as a [`Wrapper.splitter`] to avoid any kind of
-/// hyphenation:
-/// ```
-/// use textwrap::{Wrapper, NoHyphenation};
-///
-/// let wrapper = Wrapper::new(8).word_splitter(Box::new(NoHyphenation));
-/// assert_eq!(wrapper.wrap("foo bar-baz"), vec!["foo", "bar-baz"]);
-/// ```
-///
-/// [`Wrapper.splitter`]: struct.Wrapper.html#structfield.splitter
-pub struct NoHyphenation;
-
-/// `NoHyphenation` implements `WordSplitter` by not splitting the
-/// word at all.
-impl WordSplitter for NoHyphenation {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        vec![(word, "", "")]
-    }
-}
-
-/// Simple and default way to split words: splitting on existing
-/// hyphens only.
-///
-/// You probably don't need to use this type since it's already used
-/// by default by `Wrapper::new`.
-pub struct HyphenSplitter;
-
-/// HyphenSplitter is the default WordSplitter used by `Wrapper::new`.
-/// It will split words on any existing hyphens in the word.
-///
-/// It will only use hyphens that are surrounded by alphanumeric
-/// characters, which prevents a word like "--foo-bar" from being
-/// split on the first or second hyphen.
-impl WordSplitter for HyphenSplitter {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        let mut triples = Vec::new();
-        // Split on hyphens, smallest split first. We only use hyphens
-        // that are surrounded by alphanumeric characters. This is to
-        // avoid splitting on repeated hyphens, such as those found in
-        // --foo-bar.
-        let char_indices = word.char_indices().collect::<Vec<_>>();
-        for w in char_indices.windows(3) {
-            let ((_, prev), (n, c), (_, next)) = (w[0], w[1], w[2]);
-            if prev.is_alphanumeric() && c == '-' && next.is_alphanumeric() {
-                let (head, tail) = word.split_at(n + 1);
-                triples.push((head, "", tail));
-            }
-        }
-
-        // Finally option is no split at all.
-        triples.push((word, "", ""));
-
-        triples
-    }
-}
-
-/// A hyphenation Corpus can be used to do language-specific
-/// hyphenation using patterns from the hyphenation crate.
-#[cfg(feature = "hyphenation")]
-impl WordSplitter for Corpus {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        // Find splits based on language corpus.
-        let mut triples = Vec::new();
-        for n in word.opportunities(&self) {
-            let (head, tail) = word.split_at(n);
-            let hyphen = if head.ends_with('-') { "" } else { "-" };
-            triples.push((head, hyphen, tail));
-        }
-        // Finally option is no split at all.
-        triples.push((word, "", ""));
-
-        triples
-    }
-}
-
-struct IndentedString {
-    value: String,
-    empty_len: usize,
-}
-
-impl IndentedString {
-    /// Create a new indented string. The string will initially have
-    /// the content `indent` and the given capacity.
-    #[inline]
-    fn new(indent: &str, capacity: usize) -> IndentedString {
-        let mut value = String::with_capacity(capacity);
-        value.push_str(indent);
-        IndentedString {
-            value: value,
-            empty_len: indent.len(),
-        }
-    }
-
-    /// Returns `true` if the string has no other content apart from
-    /// the indentation.
-    #[inline]
-    fn is_empty(&self) -> bool {
-        self.value.len() == self.empty_len
-    }
-
-    /// Appends the given `char` to the end of this string.
-    #[inline]
-    fn push(&mut self, ch: char) {
-        self.value.push(ch);
-    }
-
-    /// Appends the given string slice to the end of this string.
-    #[inline]
-    fn push_str(&mut self, s: &str) {
-        self.value.push_str(s);
-    }
-
-    /// Return the inner `String`.
-    fn into_string(self) -> String {
-        self.value
-    }
-}
-
-/// A Wrapper holds settings for wrapping and filling text. Use it
-/// when the convenience [`wrap`] and [`fill`] functions are not
-/// flexible enough.
-///
-/// [`wrap`]: fn.wrap.html
-/// [`fill`]: fn.fill.html
-///
-/// The algorithm used by the `wrap` method works by doing a single
-/// scan over words in the input string and splitting them into one or
-/// more lines. The time and memory complexity is O(*n*) where *n* is
-/// the length of the input string.
-pub struct Wrapper<'a> {
-    /// The width in columns at which the text will be wrapped.
-    pub width: usize,
-    /// Indentation used for the first line of output.
-    pub initial_indent: &'a str,
-    /// Indentation used for subsequent lines of output.
-    pub subsequent_indent: &'a str,
-    /// Allow long words to be broken if they cannot fit on a line.
-    /// When set to `false`, some lines be being longer than
-    /// `self.width`.
-    pub break_words: bool,
-    /// This crate treats every whitespace character (space, newline,
-    /// TAB, ...) as a space character. When this option is set to
-    /// `true`, the whitespace between words will be squeezed into a
-    /// single space character. Otherwise, the whitespace is
-    /// significant and will be kept in the output. Whitespace
-    /// characters such as TAB will still be turned into a single
-    /// space -- consider expanding TABs manually if this is a
-    /// concern.
-    pub squeeze_whitespace: bool,
-    /// The method for splitting words. If the `hyphenation` feature
-    /// is enabled, you can use a `hyphenation::language::Corpus` here
-    /// to get language-aware hyphenation.
-    pub splitter: Box<WordSplitter>,
-}
-
-impl<'a> Wrapper<'a> {
-    /// Create a new Wrapper for wrapping at the specified width. By
-    /// default, we allow words longer than `width` to be broken. A
-    /// [`HyphenSplitter`] will be used by default for splitting
-    /// words. See the [`WordSplitter`] trait for other options.
-    ///
-    /// [`HyphenSplitter`]: struct.HyphenSplitter.html
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    pub fn new(width: usize) -> Wrapper<'a> {
-        Wrapper {
-            width: width,
-            initial_indent: "",
-            subsequent_indent: "",
-            break_words: true,
-            squeeze_whitespace: false,
-            splitter: Box::new(HyphenSplitter),
-        }
-    }
-
-    /// Crate a new Wrapper for wrapping text at the current terminal
-    /// width. If the terminal width cannot be determined (typically
-    /// because the standard input and output is not connected to a
-    /// terminal), a width of 80 characters will be used. Other
-    /// settings use the same defaults as `Wrapper::new`.
-    pub fn with_termwidth() -> Wrapper<'a> {
-        Wrapper::new(term_size::dimensions_stdout().map_or(80, |(w, _)| w))
-    }
-
-    /// Change [`self.initial_indent`]. The initial indentation is
-    /// used on the very first line of output. Setting it to something
-    /// like `"* "` can be useful if you are formatting an item in a
-    /// bulleted list. You will then probably want to set
-    /// `self.subsequent_indent` to `"  "`.
-    ///
-    /// [`self.initial_indent`]: #structfield.initial_indent
-    pub fn initial_indent(self, indent: &'a str) -> Wrapper<'a> {
-        Wrapper { initial_indent: indent, ..self }
-    }
-
-    /// Change [`self.subsequent_indent`]. The subsequent indentation
-    /// is used on lines following the first line of output. Setting
-    /// it to something like `"  "` can be useful if you are
-    /// formatting an item in a bulleted list.
-    ///
-    /// [`self.subsequent_indent`]: #structfield.subsequent_indent
-    pub fn subsequent_indent(self, indent: &'a str) -> Wrapper<'a> {
-        Wrapper { subsequent_indent: indent, ..self }
-    }
-
-    /// Change [`self.break_words`]. This controls if words longer
-    /// than `self.width` can be broken, or if they will be left
-    /// sticking out into the right margin.
-    ///
-    /// [`self.break_words`]: #structfield.break_words
-    pub fn break_words(self, setting: bool) -> Wrapper<'a> {
-        Wrapper { break_words: setting, ..self }
-    }
-
-    /// Change [`self.squeeze_whitespace`]. This controls if
-    /// whitespace betweee words is squeezed together to a single
-    /// space. Regardless of this setting, all whitespace characters
-    /// are converted to space (`' '`) characters.
-    ///
-    /// [`self.squeeze_whitespace`]: #structfield.squeeze_whitespace
-    pub fn squeeze_whitespace(self, setting: bool) -> Wrapper<'a> {
-        Wrapper { squeeze_whitespace: setting, ..self }
-    }
-
-    /// Change [`self.splitter`]. The word splitter is consulted when
-    /// a word is too wide to fit the current line. By changing this,
-    /// you can decide if such words should be hyphenated or left
-    /// alone. Hyphenation can be done using existing hyphens (see
-    /// [`HyphenSplitter`]) or it can be based on TeX hyphenation
-    /// patterns, if the `hyphenation` feature is enabled.
-    ///
-    /// [`self.splitter`]: #structfield.splitter
-    pub fn word_splitter(self, splitter: Box<WordSplitter>) -> Wrapper<'a> {
-        Wrapper { splitter: splitter, ..self }
-    }
-
-    /// Fill a line of text at `self.width` characters. Strings are
-    /// wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// The result is a string with newlines between each line. Use
-    /// the `wrap` method if you need access to the individual lines.
-    ///
-    /// ```
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrapper = Wrapper::new(15);
-    /// assert_eq!(wrapper.fill("Memory safety without garbage collection."),
-    ///            "Memory safety\nwithout garbage\ncollection.");
-    /// ```
-    ///
-    /// This method simply joins the lines produced by `wrap`. As
-    /// such, it inherits the O(*n*) time and memory complexity where
-    /// *n* is the input string length.
-    pub fn fill(&self, s: &str) -> String {
-        self.wrap(s).join("\n")
-    }
-
-    /// Wrap a line of text at `self.width` characters. Strings are
-    /// wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// ```
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrap15 = Wrapper::new(15);
-    /// assert_eq!(wrap15.wrap("Concurrency without data races."),
-    ///            vec!["Concurrency",
-    ///                 "without data",
-    ///                 "races."]);
-    ///
-    /// let wrap20 = Wrapper::new(20);
-    /// assert_eq!(wrap20.wrap("Concurrency without data races."),
-    ///            vec!["Concurrency without",
-    ///                 "data races."]);
-    /// ```
-    ///
-    /// The [`WordSplitter`] stored in [`self.splitter`] is used
-    /// whenever when a word is too large to fit on the current line.
-    /// By changing the field, different hyphenation strategies can be
-    /// implemented.
-    ///
-    /// This method does a single scan over the input string, it has
-    /// an O(*n*) time and memory complexity where *n* is the input
-    /// string length.
-    ///
-    /// [`self.splitter`]: #structfield.splitter
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    ///
-    pub fn wrap(&self, s: &str) -> Vec<String> {
-        let mut lines = Vec::with_capacity(s.len() / (self.width + 1));
-        let mut line = IndentedString::new(self.initial_indent, self.width);
-        let mut remaining = self.width - self.initial_indent.width();
-        const NBSP: char = '\u{a0}'; // non-breaking space
-
-        for mut word in s.split(|c: char| c.is_whitespace() && c != NBSP) {
-            // Skip over adjacent whitespace characters.
-            if self.squeeze_whitespace && word.is_empty() {
-                continue;
-            }
-
-            // Attempt to fit the word without any splitting.
-            if self.fit_part(word, "", &mut remaining, &mut line) {
-                continue;
-            }
-
-            // If that failed, loop until nothing remains to be added.
-            while !word.is_empty() {
-                let splits = self.splitter.split(word);
-                let (smallest, hyphen, longest) = splits[0];
-                let min_width = smallest.width() + hyphen.len();
-
-                // Add a new line if even the smallest split doesn't
-                // fit.
-                if !line.is_empty() && 1 + min_width > remaining {
-                    lines.push(line.into_string());
-                    line = IndentedString::new(self.subsequent_indent, self.width);
-                    remaining = self.width - self.subsequent_indent.width();
-                }
-
-                // Find a split that fits on the current line.
-                for &(head, hyphen, tail) in splits.iter().rev() {
-                    if self.fit_part(head, hyphen, &mut remaining, &mut line) {
-                        word = tail;
-                        break;
-                    }
-                }
-
-                // If even the smallest split doesn't fit on the line,
-                // we might have to break the word.
-                if line.is_empty() {
-                    if self.break_words && self.width > 1 {
-                        // Break word on a character boundary as close
-                        // to self.width as possible. Characters are
-                        // at most 2 columns wide, so we will chop off
-                        // at least one character.
-                        let mut head_width = 0;
-                        for (idx, c) in word.char_indices() {
-                            head_width += c.width().unwrap_or(0);
-                            if head_width > remaining {
-                                let (head, tail) = word.split_at(idx);
-                                line.push_str(head);
-                                lines.push(line.into_string());
-                                line = IndentedString::new(self.subsequent_indent, self.width);
-                                word = tail;
-                                break;
-                            }
-                        }
-                    } else {
-                        // We forcibly add the smallest split and
-                        // continue with the longest tail. This will
-                        // result in a line longer than self.width.
-                        lines.push(String::from(smallest) + hyphen);
-                        remaining = self.width;
-                        word = longest;
-                    }
-                }
-            }
-        }
-        if !line.is_empty() {
-            lines.push(line.into_string());
-        }
-        lines
-    }
-
-    /// Try to fit a word (or part of a word) onto a line. The line
-    /// and the remaining width is updated as appropriate if the word
-    /// or part fits.
-    fn fit_part<'b>(&self,
-                    part: &'b str,
-                    hyphen: &'b str,
-                    remaining: &mut usize,
-                    line: &mut IndentedString)
-                    -> bool {
-        let space = if line.is_empty() { 0 } else { 1 };
-        let space_needed = space + part.width() + hyphen.len();
-        let fits_in_line = space_needed <= *remaining;
-        if fits_in_line {
-            if !line.is_empty() {
-                line.push(' ');
-            }
-            line.push_str(part);
-            line.push_str(hyphen);
-            *remaining -= space_needed;
-        }
-
-        fits_in_line
-    }
-}
-
-/// Fill a line of text at `width` characters. Strings are wrapped
-/// based on their displayed width, not their size in bytes.
-///
-/// The result is a string with newlines between each line. Use `wrap`
-/// if you need access to the individual lines.
-///
-/// ```
-/// use textwrap::fill;
-///
-/// assert_eq!(fill("Memory safety without garbage collection.", 15),
-///            "Memory safety\nwithout garbage\ncollection.");
-/// ```
-///
-/// This function creates a Wrapper on the fly with default settings.
-/// If you need to set a language corpus for automatic hyphenation, or
-/// need to fill many strings, then it is suggested to create Wrapper
-/// and call its [`fill` method](struct.Wrapper.html#method.fill).
-pub fn fill(s: &str, width: usize) -> String {
-    wrap(s, width).join("\n")
-}
-
-/// Wrap a line of text at `width` characters. Strings are wrapped
-/// based on their displayed width, not their size in bytes.
-///
-/// ```
-/// use textwrap::wrap;
-///
-/// assert_eq!(wrap("Concurrency without data races.", 15),
-///            vec!["Concurrency",
-///                 "without data",
-///                 "races."]);
-///
-/// assert_eq!(wrap("Concurrency without data races.", 20),
-///            vec!["Concurrency without",
-///                 "data races."]);
-/// ```
-///
-/// This function creates a Wrapper on the fly with default settings.
-/// If you need to set a language corpus for automatic hyphenation, or
-/// need to wrap many strings, then it is suggested to create Wrapper
-/// and call its [`wrap` method](struct.Wrapper.html#method.wrap).
-pub fn wrap(s: &str, width: usize) -> Vec<String> {
-    Wrapper::new(width).wrap(s)
-}
-
-/// Add prefix to each non-empty line.
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent("Foo\nBar\n", "  "), "  Foo\n  Bar\n");
-/// ```
-///
-/// Empty lines (lines consisting only of whitespace) are not indented
-/// and the whitespace is replaced by a single newline (`\n`):
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent("Foo\n\nBar\n  \t  \nBaz\n", "  "),
-///            "  Foo\n\n  Bar\n\n  Baz\n");
-/// ```
-///
-/// Leading and trailing whitespace on non-empty lines is kept
-/// unchanged:
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent(" \t  Foo   ", "  "), "   \t  Foo   \n");
-/// ```
-pub fn indent(s: &str, prefix: &str) -> String {
-    let mut result = String::new();
-    for line in s.lines() {
-        if line.chars().any(|c| !c.is_whitespace()) {
-            result.push_str(prefix);
-            result.push_str(line);
-        }
-        result.push('\n');
-    }
-    result
-}
-
-/// Removes common leading whitespace from each line.
-///
-/// This will look at each non-empty line and determine the maximum
-/// amount of whitespace that can be removed from the line.
-///
-/// ```
-/// use textwrap::dedent;
-///
-/// assert_eq!(dedent("  1st line\n  2nd line\n"),
-///            "1st line\n2nd line\n");
-/// ```
-pub fn dedent(s: &str) -> String {
-    let mut prefix = String::new();
-    let mut lines = s.lines();
-
-    // We first search for a non-empty line to find a prefix.
-    for line in &mut lines {
-        let whitespace = line.chars()
-            .take_while(|c| c.is_whitespace())
-            .collect::<String>();
-        // Check if the line had anything but whitespace
-        if whitespace.len() < line.len() {
-            prefix = whitespace;
-            break;
-        }
-    }
-
-    // We then continue looking through the remaining lines to
-    // possibly shorten the prefix.
-    for line in &mut lines {
-        let whitespace = line.chars()
-            .zip(prefix.chars())
-            .take_while(|&(a, b)| a == b)
-            .map(|(_, b)| b)
-            .collect::<String>();
-        // Check if we have found a shorter prefix
-        if whitespace.len() < prefix.len() {
-            prefix = whitespace;
-        }
-    }
-
-    // We now go over the lines a second time to build the result.
-    let mut result = String::new();
-    for line in s.lines() {
-        if line.starts_with(&prefix) && line.chars().any(|c| !c.is_whitespace()) {
-            let (_, tail) = line.split_at(prefix.len());
-            result.push_str(tail);
-        }
-        result.push('\n');
-    }
-    result
-}
-
-#[cfg(test)]
-mod tests {
-    #[cfg(feature = "hyphenation")]
-    extern crate hyphenation;
-
-    #[cfg(feature = "hyphenation")]
-    use hyphenation::Language;
-    use super::*;
-
-    /// Add newlines. Ensures that the final line in the vector also
-    /// has a newline.
-    fn add_nl(lines: &Vec<&str>) -> String {
-        lines.join("\n") + "\n"
-    }
-
-    #[test]
-    fn no_wrap() {
-        assert_eq!(wrap("foo", 10), vec!["foo"]);
-    }
-
-    #[test]
-    fn simple() {
-        assert_eq!(wrap("foo bar baz", 5), vec!["foo", "bar", "baz"]);
-    }
-
-    #[test]
-    fn multi_word_on_line() {
-        assert_eq!(wrap("foo bar baz", 10), vec!["foo bar", "baz"]);
-    }
-
-    #[test]
-    fn long_word() {
-        assert_eq!(wrap("foo", 0), vec!["foo"]);
-    }
-
-    #[test]
-    fn long_words() {
-        assert_eq!(wrap("foo bar", 0), vec!["foo", "bar"]);
-    }
-
-    #[test]
-    fn whitespace_is_significant() {
-        assert_eq!(wrap("foo:   bar baz", 10), vec!["foo:   bar", "baz"]);
-    }
-
-    #[test]
-    fn extra_whitespace_start_of_line() {
-        // Whitespace is only significant inside a line. After a line
-        // gets too long and is broken, the first word starts in
-        // column zero and is not indented. The line before might end
-        // up with trailing whitespace.
-        assert_eq!(wrap("foo               bar", 5), vec!["foo  ", "bar"]);
-    }
-
-    #[test]
-    fn whitespace_is_squeezed() {
-        let wrapper = Wrapper::new(10).squeeze_whitespace(true);
-        assert_eq!(wrapper.wrap(" foo \t  bar  "), vec!["foo bar"]);
-    }
-
-    #[test]
-    fn wide_character_handling() {
-        assert_eq!(wrap("Hello, World!", 15), vec!["Hello, World!"]);
-        assert_eq!(wrap("Hello, World!", 15),
-                   vec!["Hello,", "World!"]);
-    }
-
-    #[test]
-    fn indent_empty() {
-        let wrapper = Wrapper::new(10).initial_indent("!!!");
-        assert_eq!(wrapper.fill(""), "");
-    }
-
-    #[test]
-    fn indent_single_line() {
-        let wrapper = Wrapper::new(10).initial_indent(">>>"); // No trailing space
-        assert_eq!(wrapper.fill("foo"), ">>>foo");
-    }
-
-    #[test]
-    fn indent_multiple_lines() {
-        let wrapper = Wrapper::new(6).initial_indent("* ").subsequent_indent("  ");
-        assert_eq!(wrapper.wrap("foo bar baz"), vec!["* foo", "  bar", "  baz"]);
-    }
-
-    #[test]
-    fn indent_break_words() {
-        let wrapper = Wrapper::new(5).initial_indent("* ").subsequent_indent("  ");
-        assert_eq!(wrapper.wrap("foobarbaz"), vec!["* foo", "  bar", "  baz"]);
-    }
-
-    #[test]
-    fn hyphens() {
-        assert_eq!(wrap("foo-bar", 5), vec!["foo-", "bar"]);
-    }
-
-    #[test]
-    fn trailing_hyphen() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foobar-"), vec!["foobar-"]);
-    }
-
-    #[test]
-    fn multiple_hyphens() {
-        assert_eq!(wrap("foo-bar-baz", 5), vec!["foo-", "bar-", "baz"]);
-    }
-
-    #[test]
-    fn hyphens_flag() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("The --foo-bar flag."),
-                   vec!["The", "--foo-", "bar", "flag."]);
-    }
-
-    #[test]
-    fn repeated_hyphens() {
-        let wrapper = Wrapper::new(4).break_words(false);
-        assert_eq!(wrapper.wrap("foo--bar"), vec!["foo--bar"]);
-    }
-
-    #[test]
-    fn hyphens_alphanumeric() {
-        assert_eq!(wrap("Na2-CH4", 5), vec!["Na2-", "CH4"]);
-    }
-
-    #[test]
-    fn hyphens_non_alphanumeric() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foo(-)bar"), vec!["foo(-)bar"]);
-    }
-
-    #[test]
-    fn multiple_splits() {
-        assert_eq!(wrap("foo-bar-baz", 9), vec!["foo-bar-", "baz"]);
-    }
-
-    #[test]
-    fn forced_split() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foobar-baz"), vec!["foobar-", "baz"]);
-    }
-
-    #[test]
-    fn no_hyphenation() {
-        let wrapper = Wrapper::new(8).word_splitter(Box::new(NoHyphenation));
-        assert_eq!(wrapper.wrap("foo bar-baz"), vec!["foo", "bar-baz"]);
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn auto_hyphenation() {
-        let corpus = hyphenation::load(Language::English_US).unwrap();
-        let wrapper = Wrapper::new(10);
-        assert_eq!(wrapper.wrap("Internationalization"),
-                   vec!["Internatio", "nalization"]);
-
-        let wrapper = wrapper.word_splitter(Box::new(corpus));
-        assert_eq!(wrapper.wrap("Internationalization"),
-                   vec!["Interna-", "tionaliza-", "tion"]);
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn auto_hyphenation_with_hyphen() {
-        let corpus = hyphenation::load(Language::English_US).unwrap();
-        let wrapper = Wrapper::new(8).break_words(false);
-        assert_eq!(wrapper.wrap("over-caffinated"), vec!["over-", "caffinated"]);
-
-        let wrapper = wrapper.word_splitter(Box::new(corpus));
-        assert_eq!(wrapper.wrap("over-caffinated"),
-                   vec!["over-", "caffi-", "nated"]);
-    }
-
-    #[test]
-    fn break_words() {
-        assert_eq!(wrap("foobarbaz", 3), vec!["foo", "bar", "baz"]);
-    }
-
-    #[test]
-    fn break_words_wide_characters() {
-        assert_eq!(wrap("Hello", 5), vec!["He", "ll", "o"]);
-    }
-
-    #[test]
-    fn break_words_zero_width() {
-        assert_eq!(wrap("foobar", 0), vec!["foobar"]);
-    }
-
-    #[test]
-    fn test_non_breaking_space() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.fill("foo bar baz"), "foo bar baz");
-    }
-
-    #[test]
-    fn test_non_breaking_hyphen() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.fill("foo‑bar‑baz"), "foo‑bar‑baz");
-    }
-
-    #[test]
-    fn test_fill() {
-        assert_eq!(fill("foo bar baz", 10), "foo bar\nbaz");
-    }
-
-    #[test]
-    fn test_indent_empty() {
-        assert_eq!(indent("\n", "  "), "\n");
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn test_indent_nonempty() {
-        let x = vec!["  foo",
-                     "bar",
-                     "  baz"];
-        let y = vec!["//  foo",
-                     "//bar",
-                     "//  baz"];
-        assert_eq!(indent(&add_nl(&x), "//"), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn test_indent_empty_line() {
-        let x = vec!["  foo",
-                     "bar",
-                     "",
-                     "  baz"];
-        let y = vec!["//  foo",
-                     "//bar",
-                     "",
-                     "//  baz"];
-        assert_eq!(indent(&add_nl(&x), "//"), add_nl(&y));
-    }
-
-    #[test]
-    fn test_dedent_empty() {
-        assert_eq!(dedent(""), "");
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn test_dedent_multi_line() {
-        let x = vec!["    foo",
-                     "  bar",
-                     "    baz"];
-        let y = vec!["  foo",
-                     "bar",
-                     "  baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn test_dedent_empty_line() {
-        let x = vec!["    foo",
-                     "  bar",
-                     "   ",
-                     "    baz"];
-        let y = vec!["  foo",
-                     "bar",
-                     "",
-                     "  baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn test_dedent_mixed_whitespace() {
-        let x = vec!["\tfoo",
-                     "  bar"];
-        let y = vec!["\tfoo",
-                     "  bar"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"9555a092ed1f87de52b07a90c614a30c6fa8f307eb4b05229253d06df363ce7a","Cargo.toml":"9369a5798a85c467578e9be04ffdb220d1d7457950373bd3b0662a62ca58520b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"2c17f942c4a797f6f491c6d40570f904f35047531884ded3244438832b3d6f0a","appveyor.yml":"da991211b72fa6f231af7adb84c9fb72f5a9131d1c0a3d47b8ceffe5a82c8542","benches/precise_time_ns.rs":"f331c85489a05ea3bb83df9d57131a6e651ce852ca881417f328c4e8f53503c6","src/display.rs":"b79a81b4f068e44934ad3398ba0259120cc30cf0855ac5108c4569e320fd7f1d","src/duration.rs":"032f2ced8ea4dddaf6ed111f345e99217bad17edb7ed9fc4c511e405c8e02b87","src/lib.rs":"d01631b2340e30673e4c809678a5bdd3f8c18debb25ada21805a990254cb7caf","src/parse.rs":"717ae5735dfdaaba513f2a54a179e73bb2a48f8d4fb8787740d4662d6ff3389c","src/sys.rs":"a6bf379947da5ed16063a9bfcdf877c84e38e006a9cbc45ee0558cba4cf5c295"},"package":"211b63c112206356ef1ff9b19355f43740fc3f85960c598a93d3a3d3ba7beade"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/.travis.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-language: rust
-rust:
-  - stable
-  - beta
-  - nightly
-sudo: false
-before_script:
-  - pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH
-script:
-  - cargo build --verbose
-  - cargo test --verbose
-  - cargo test --verbose --features rustc-serialize
-  - cargo doc --no-deps
-after_success:
-  - travis-cargo --only nightly doc-upload
-env:
-  global:
-    secure: "NlXnNaUBf2MgV2gPJyIQU+JM814e29itvvb8o5BvN4YB60rseu16yLbzKpO4FzuOFBc/Uc+1veDcKyzZYsdV6FIwQk4jfdUkNZ3i56InVCzXcaaHCe78cpg/IxK+/48fGy/EIJkWYdtQsoVCGunaf5NdF360Lzb6G/B1vheC34E="
-
-
-
-notifications:
-  email:
-    on_success: never
-os:
-  - linux
-  - osx
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/Cargo.toml
+++ /dev/null
@@ -1,27 +0,0 @@
-[package]
-
-name = "time"
-version = "0.1.36"
-authors = ["The Rust Project Developers"]
-license = "MIT/Apache-2.0"
-homepage = "https://github.com/rust-lang/time"
-repository = "https://github.com/rust-lang/time"
-documentation = "https://doc.rust-lang.org/time"
-description = """
-Utilities for working with time-related functions in Rust.
-"""
-
-[dependencies]
-libc = "0.2.1"
-rustc-serialize = { version = "0.3", optional = true }
-
-[target.'cfg(target_os = "redox")'.dependencies]
-redox_syscall = "0.1"
-
-[target.'cfg(windows)'.dependencies]
-winapi = "0.2.0"
-kernel32-sys = "0.2.0"
-
-[dev-dependencies]
-log = "0.3"
-advapi32-sys = "0.1.2"
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2014 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-time
-====
-
-Utilities for working with time-related functions in Rust
-
-[![Build Status](https://travis-ci.org/rust-lang-deprecated/time.svg?branch=master)](https://travis-ci.org/rust-lang-deprecated/time)
-[![Build status](https://ci.appveyor.com/api/projects/status/55m7rbaj9a5v3ad7?svg=true)](https://ci.appveyor.com/project/alexcrichton/time)
-
-[Documentation](https://doc.rust-lang.org/time)
-
-## Notes
-
-This library is no longer actively maintained, but bugfixes will be added ([details](https://github.com/rust-lang-deprecated/time/issues/136)).
-
-In case you're looking for something a little fresher and more actively maintained have a look at the [`chrono`](https://github.com/lifthrasiir/rust-chrono) crate.
-
-## Usage
-
-Put this in your `Cargo.toml`:
-
-```toml
-[dependencies]
-time = "0.1"
-```
-
-And this in your crate root:
-
-```rust
-extern crate time;
-```
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/appveyor.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-environment:
-  matrix:
-  - TARGET: x86_64-pc-windows-msvc
-  - TARGET: i686-pc-windows-msvc
-  - TARGET: i686-pc-windows-gnu
-install:
-  - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-nightly-${env:TARGET}.exe"
-  - rust-nightly-%TARGET%.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - SET PATH=%PATH%;C:\MinGW\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo test --verbose
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/benches/precise_time_ns.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-#![feature(test)]
-
-extern crate test;
-extern crate time;
-
-use test::Bencher;
-
-#[bench]
-fn bench_precise_time_ns(b: &mut Bencher) {
-    b.iter(|| time::precise_time_ns())
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/src/display.rs
+++ /dev/null
@@ -1,260 +0,0 @@
-use std::fmt::{self, Write};
-
-use super::{TmFmt, Tm, Fmt};
-
-impl<'a> fmt::Display for TmFmt<'a> {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-        match self.format {
-            Fmt::Str(ref s) => {
-                let mut chars = s.chars();
-                while let Some(ch) = chars.next() {
-                    if ch == '%' {
-                        // we've already validated that % always precedes
-                        // another char
-                        try!(parse_type(fmt, chars.next().unwrap(), self.tm));
-                    } else {
-                        try!(fmt.write_char(ch));
-                    }
-                }
-
-                Ok(())
-            }
-            Fmt::Ctime => self.tm.to_local().asctime().fmt(fmt),
-            Fmt::Rfc3339 => {
-                if self.tm.tm_utcoff == 0 {
-                    TmFmt {
-                        tm: self.tm,
-                        format: Fmt::Str("%Y-%m-%dT%H:%M:%SZ"),
-                    }.fmt(fmt)
-                } else {
-                    let s = TmFmt {
-                        tm: self.tm,
-                        format: Fmt::Str("%Y-%m-%dT%H:%M:%S"),
-                    };
-                    let sign = if self.tm.tm_utcoff > 0 { '+' } else { '-' };
-                    let mut m = abs(self.tm.tm_utcoff) / 60;
-                    let h = m / 60;
-                    m -= h * 60;
-                    write!(fmt, "{}{}{:02}:{:02}", s, sign, h, m)
-                }
-            }
-        }
-    }
-}
-
-fn is_leap_year(year: i32) -> bool {
-    (year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))
-}
-
-fn days_in_year(year: i32) -> i32 {
-    if is_leap_year(year) { 366 }
-    else                  { 365 }
-}
-
-fn iso_week_days(yday: i32, wday: i32) -> i32 {
-    /* The number of days from the first day of the first ISO week of this
-    * year to the year day YDAY with week day WDAY.
-    * ISO weeks start on Monday. The first ISO week has the year's first
-    * Thursday.
-    * YDAY may be as small as yday_minimum.
-    */
-    let iso_week_start_wday: i32 = 1;                     /* Monday */
-    let iso_week1_wday: i32 = 4;                          /* Thursday */
-    let yday_minimum: i32 = 366;
-    /* Add enough to the first operand of % to make it nonnegative. */
-    let big_enough_multiple_of_7: i32 = (yday_minimum / 7 + 2) * 7;
-
-    yday - (yday - wday + iso_week1_wday + big_enough_multiple_of_7) % 7
-        + iso_week1_wday - iso_week_start_wday
-}
-
-fn iso_week(fmt: &mut fmt::Formatter, ch:char, tm: &Tm) -> fmt::Result {
-    let mut year = tm.tm_year + 1900;
-    let mut days = iso_week_days(tm.tm_yday, tm.tm_wday);
-
-    if days < 0 {
-        /* This ISO week belongs to the previous year. */
-        year -= 1;
-        days = iso_week_days(tm.tm_yday + (days_in_year(year)), tm.tm_wday);
-    } else {
-        let d = iso_week_days(tm.tm_yday - (days_in_year(year)),
-                              tm.tm_wday);
-        if 0 <= d {
-            /* This ISO week belongs to the next year. */
-            year += 1;
-            days = d;
-        }
-    }
-
-    match ch {
-        'G' => write!(fmt, "{}", year),
-        'g' => write!(fmt, "{:02}", (year % 100 + 100) % 100),
-        'V' => write!(fmt, "{:02}", days / 7 + 1),
-        _ => Ok(())
-    }
-}
-
-fn parse_type(fmt: &mut fmt::Formatter, ch: char, tm: &Tm) -> fmt::Result {
-    match ch {
-        'A' => fmt.write_str(match tm.tm_wday {
-            0 => "Sunday",
-            1 => "Monday",
-            2 => "Tuesday",
-            3 => "Wednesday",
-            4 => "Thursday",
-            5 => "Friday",
-            6 => "Saturday",
-            _ => unreachable!(),
-        }),
-        'a' => fmt.write_str(match tm.tm_wday {
-            0 => "Sun",
-            1 => "Mon",
-            2 => "Tue",
-            3 => "Wed",
-            4 => "Thu",
-            5 => "Fri",
-            6 => "Sat",
-            _ => unreachable!(),
-        }),
-        'B' => fmt.write_str(match tm.tm_mon {
-            0 => "January",
-            1 => "February",
-            2 => "March",
-            3 => "April",
-            4 => "May",
-            5 => "June",
-            6 => "July",
-            7 => "August",
-            8 => "September",
-            9 => "October",
-            10 => "November",
-            11 => "December",
-            _ => unreachable!(),
-        }),
-        'b' | 'h' => fmt.write_str(match tm.tm_mon {
-            0 => "Jan",
-            1 => "Feb",
-            2 => "Mar",
-            3 => "Apr",
-            4 => "May",
-            5 => "Jun",
-            6 => "Jul",
-            7 => "Aug",
-            8 => "Sep",
-            9 => "Oct",
-            10 => "Nov",
-            11 => "Dec",
-            _  => unreachable!(),
-        }),
-        'C' => write!(fmt, "{:02}", (tm.tm_year + 1900) / 100),
-        'c' => {
-            try!(parse_type(fmt, 'a', tm));
-            try!(fmt.write_str(" "));
-            try!(parse_type(fmt, 'b', tm));
-            try!(fmt.write_str(" "));
-            try!(parse_type(fmt, 'e', tm));
-            try!(fmt.write_str(" "));
-            try!(parse_type(fmt, 'T', tm));
-            try!(fmt.write_str(" "));
-            parse_type(fmt, 'Y', tm)
-        }
-        'D' | 'x' => {
-            try!(parse_type(fmt, 'm', tm));
-            try!(fmt.write_str("/"));
-            try!(parse_type(fmt, 'd', tm));
-            try!(fmt.write_str("/"));
-            parse_type(fmt, 'y', tm)
-        }
-        'd' => write!(fmt, "{:02}", tm.tm_mday),
-        'e' => write!(fmt, "{:2}", tm.tm_mday),
-        'f' => write!(fmt, "{:09}", tm.tm_nsec),
-        'F' => {
-            try!(parse_type(fmt, 'Y', tm));
-            try!(fmt.write_str("-"));
-            try!(parse_type(fmt, 'm', tm));
-            try!(fmt.write_str("-"));
-            parse_type(fmt, 'd', tm)
-        }
-        'G' => iso_week(fmt, 'G', tm),
-        'g' => iso_week(fmt, 'g', tm),
-        'H' => write!(fmt, "{:02}", tm.tm_hour),
-        'I' => {
-            let mut h = tm.tm_hour;
-            if h == 0 { h = 12 }
-            if h > 12 { h -= 12 }
-            write!(fmt, "{:02}", h)
-        }
-        'j' => write!(fmt, "{:03}", tm.tm_yday + 1),
-        'k' => write!(fmt, "{:2}", tm.tm_hour),
-        'l' => {
-            let mut h = tm.tm_hour;
-            if h == 0 { h = 12 }
-            if h > 12 { h -= 12 }
-            write!(fmt, "{:2}", h)
-        }
-        'M' => write!(fmt, "{:02}", tm.tm_min),
-        'm' => write!(fmt, "{:02}", tm.tm_mon + 1),
-        'n' => fmt.write_str("\n"),
-        'P' => fmt.write_str(if tm.tm_hour < 12 { "am" } else { "pm" }),
-        'p' => fmt.write_str(if (tm.tm_hour) < 12 { "AM" } else { "PM" }),
-        'R' => {
-            try!(parse_type(fmt, 'H', tm));
-            try!(fmt.write_str(":"));
-            parse_type(fmt, 'M', tm)
-        }
-        'r' => {
-            try!(parse_type(fmt, 'I', tm));
-            try!(fmt.write_str(":"));
-            try!(parse_type(fmt, 'M', tm));
-            try!(fmt.write_str(":"));
-            try!(parse_type(fmt, 'S', tm));
-            try!(fmt.write_str(" "));
-            parse_type(fmt, 'p', tm)
-        }
-        'S' => write!(fmt, "{:02}", tm.tm_sec),
-        's' => write!(fmt, "{}", tm.to_timespec().sec),
-        'T' | 'X' => {
-            try!(parse_type(fmt, 'H', tm));
-            try!(fmt.write_str(":"));
-            try!(parse_type(fmt, 'M', tm));
-            try!(fmt.write_str(":"));
-            parse_type(fmt, 'S', tm)
-        }
-        't' => fmt.write_str("\t"),
-        'U' => write!(fmt, "{:02}", (tm.tm_yday - tm.tm_wday + 7) / 7),
-        'u' => {
-            let i = tm.tm_wday;
-            write!(fmt, "{}", (if i == 0 { 7 } else { i }))
-        }
-        'V' => iso_week(fmt, 'V', tm),
-        'v' => {
-            try!(parse_type(fmt, 'e', tm));
-            try!(fmt.write_str("-"));
-            try!(parse_type(fmt, 'b', tm));
-            try!(fmt.write_str("-"));
-            parse_type(fmt, 'Y', tm)
-        }
-        'W' => {
-            write!(fmt, "{:02}", (tm.tm_yday - (tm.tm_wday - 1 + 7) % 7 + 7) / 7)
-        }
-        'w' => write!(fmt, "{}", tm.tm_wday),
-        'Y' => write!(fmt, "{}", tm.tm_year + 1900),
-        'y' => write!(fmt, "{:02}", (tm.tm_year + 1900) % 100),
-        // FIXME (#2350): support locale
-        'Z' => fmt.write_str(if tm.tm_utcoff == 0 { "UTC"} else { "" }),
-        'z' => {
-            let sign = if tm.tm_utcoff > 0 { '+' } else { '-' };
-            let mut m = abs(tm.tm_utcoff) / 60;
-            let h = m / 60;
-            m -= h * 60;
-            write!(fmt, "{}{:02}{:02}", sign, h, m)
-        }
-        '+' => write!(fmt, "{}", tm.rfc3339()),
-        '%' => fmt.write_str("%"),
-        _   => unreachable!(),
-    }
-}
-
-fn abs(i: i32) -> i32 {
-    if i < 0 {-i} else {i}
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/src/duration.rs
+++ /dev/null
@@ -1,648 +0,0 @@
-// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Temporal quantification
-
-use std::{fmt, i64};
-use std::error::Error;
-use std::ops::{Add, Sub, Mul, Div, Neg, FnOnce};
-use std::time::Duration as StdDuration;
-
-/// The number of nanoseconds in a microsecond.
-const NANOS_PER_MICRO: i32 = 1000;
-/// The number of nanoseconds in a millisecond.
-const NANOS_PER_MILLI: i32 = 1000_000;
-/// The number of nanoseconds in seconds.
-const NANOS_PER_SEC: i32 = 1_000_000_000;
-/// The number of microseconds per second.
-const MICROS_PER_SEC: i64 = 1000_000;
-/// The number of milliseconds per second.
-const MILLIS_PER_SEC: i64 = 1000;
-/// The number of seconds in a minute.
-const SECS_PER_MINUTE: i64 = 60;
-/// The number of seconds in an hour.
-const SECS_PER_HOUR: i64 = 3600;
-/// The number of (non-leap) seconds in days.
-const SECS_PER_DAY: i64 = 86400;
-/// The number of (non-leap) seconds in a week.
-const SECS_PER_WEEK: i64 = 604800;
-
-macro_rules! try_opt {
-    ($e:expr) => (match $e { Some(v) => v, None => return None })
-}
-
-
-/// ISO 8601 time duration with nanosecond precision.
-/// This also allows for the negative duration; see individual methods for details.
-#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)]
-pub struct Duration {
-    secs: i64,
-    nanos: i32, // Always 0 <= nanos < NANOS_PER_SEC
-}
-
-/// The minimum possible `Duration`: `i64::MIN` milliseconds.
-pub const MIN: Duration = Duration {
-    secs: i64::MIN / MILLIS_PER_SEC - 1,
-    nanos: NANOS_PER_SEC + (i64::MIN % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI
-};
-
-/// The maximum possible `Duration`: `i64::MAX` milliseconds.
-pub const MAX: Duration = Duration {
-    secs: i64::MAX / MILLIS_PER_SEC,
-    nanos: (i64::MAX % MILLIS_PER_SEC) as i32 * NANOS_PER_MILLI
-};
-
-impl Duration {
-    /// Makes a new `Duration` with given number of weeks.
-    /// Equivalent to `Duration::seconds(weeks * 7 * 24 * 60 * 60)` with overflow checks.
-    /// Panics when the duration is out of bounds.
-    #[inline]
-    pub fn weeks(weeks: i64) -> Duration {
-        let secs = weeks.checked_mul(SECS_PER_WEEK).expect("Duration::weeks out of bounds");
-        Duration::seconds(secs)
-    }
-
-    /// Makes a new `Duration` with given number of days.
-    /// Equivalent to `Duration::seconds(days * 24 * 60 * 60)` with overflow checks.
-    /// Panics when the duration is out of bounds.
-    #[inline]
-    pub fn days(days: i64) -> Duration {
-        let secs = days.checked_mul(SECS_PER_DAY).expect("Duration::days out of bounds");
-        Duration::seconds(secs)
-    }
-
-    /// Makes a new `Duration` with given number of hours.
-    /// Equivalent to `Duration::seconds(hours * 60 * 60)` with overflow checks.
-    /// Panics when the duration is out of bounds.
-    #[inline]
-    pub fn hours(hours: i64) -> Duration {
-        let secs = hours.checked_mul(SECS_PER_HOUR).expect("Duration::hours ouf of bounds");
-        Duration::seconds(secs)
-    }
-
-    /// Makes a new `Duration` with given number of minutes.
-    /// Equivalent to `Duration::seconds(minutes * 60)` with overflow checks.
-    /// Panics when the duration is out of bounds.
-    #[inline]
-    pub fn minutes(minutes: i64) -> Duration {
-        let secs = minutes.checked_mul(SECS_PER_MINUTE).expect("Duration::minutes out of bounds");
-        Duration::seconds(secs)
-    }
-
-    /// Makes a new `Duration` with given number of seconds.
-    /// Panics when the duration is more than `i64::MAX` milliseconds
-    /// or less than `i64::MIN` milliseconds.
-    #[inline]
-    pub fn seconds(seconds: i64) -> Duration {
-        let d = Duration { secs: seconds, nanos: 0 };
-        if d < MIN || d > MAX {
-            panic!("Duration::seconds out of bounds");
-        }
-        d
-    }
-
-    /// Makes a new `Duration` with given number of milliseconds.
-    #[inline]
-    pub fn milliseconds(milliseconds: i64) -> Duration {
-        let (secs, millis) = div_mod_floor_64(milliseconds, MILLIS_PER_SEC);
-        let nanos = millis as i32 * NANOS_PER_MILLI;
-        Duration { secs: secs, nanos: nanos }
-    }
-
-    /// Makes a new `Duration` with given number of microseconds.
-    #[inline]
-    pub fn microseconds(microseconds: i64) -> Duration {
-        let (secs, micros) = div_mod_floor_64(microseconds, MICROS_PER_SEC);
-        let nanos = micros as i32 * NANOS_PER_MICRO;
-        Duration { secs: secs, nanos: nanos }
-    }
-
-    /// Makes a new `Duration` with given number of nanoseconds.
-    #[inline]
-    pub fn nanoseconds(nanos: i64) -> Duration {
-        let (secs, nanos) = div_mod_floor_64(nanos, NANOS_PER_SEC as i64);
-        Duration { secs: secs, nanos: nanos as i32 }
-    }
-
-    /// Runs a closure, returning the duration of time it took to run the
-    /// closure.
-    pub fn span<F>(f: F) -> Duration where F: FnOnce() {
-        let before = super::precise_time_ns();
-        f();
-        Duration::nanoseconds((super::precise_time_ns() - before) as i64)
-    }
-
-    /// Returns the total number of whole weeks in the duration.
-    #[inline]
-    pub fn num_weeks(&self) -> i64 {
-        self.num_days() / 7
-    }
-
-    /// Returns the total number of whole days in the duration.
-    pub fn num_days(&self) -> i64 {
-        self.num_seconds() / SECS_PER_DAY
-    }
-
-    /// Returns the total number of whole hours in the duration.
-    #[inline]
-    pub fn num_hours(&self) -> i64 {
-        self.num_seconds() / SECS_PER_HOUR
-    }
-
-    /// Returns the total number of whole minutes in the duration.
-    #[inline]
-    pub fn num_minutes(&self) -> i64 {
-        self.num_seconds() / SECS_PER_MINUTE
-    }
-
-    /// Returns the total number of whole seconds in the duration.
-    pub fn num_seconds(&self) -> i64 {
-        // If secs is negative, nanos should be subtracted from the duration.
-        if self.secs < 0 && self.nanos > 0 {
-            self.secs + 1
-        } else {
-            self.secs
-        }
-    }
-
-    /// Returns the number of nanoseconds such that
-    /// `nanos_mod_sec() + num_seconds() * NANOS_PER_SEC` is the total number of
-    /// nanoseconds in the duration.
-    fn nanos_mod_sec(&self) -> i32 {
-        if self.secs < 0 && self.nanos > 0 {
-            self.nanos - NANOS_PER_SEC
-        } else {
-            self.nanos
-        }
-    }
-
-    /// Returns the total number of whole milliseconds in the duration,
-    pub fn num_milliseconds(&self) -> i64 {
-        // A proper Duration will not overflow, because MIN and MAX are defined
-        // such that the range is exactly i64 milliseconds.
-        let secs_part = self.num_seconds() * MILLIS_PER_SEC;
-        let nanos_part = self.nanos_mod_sec() / NANOS_PER_MILLI;
-        secs_part + nanos_part as i64
-    }
-
-    /// Returns the total number of whole microseconds in the duration,
-    /// or `None` on overflow (exceeding 2^63 microseconds in either direction).
-    pub fn num_microseconds(&self) -> Option<i64> {
-        let secs_part = try_opt!(self.num_seconds().checked_mul(MICROS_PER_SEC));
-        let nanos_part = self.nanos_mod_sec() / NANOS_PER_MICRO;
-        secs_part.checked_add(nanos_part as i64)
-    }
-
-    /// Returns the total number of whole nanoseconds in the duration,
-    /// or `None` on overflow (exceeding 2^63 nanoseconds in either direction).
-    pub fn num_nanoseconds(&self) -> Option<i64> {
-        let secs_part = try_opt!(self.num_seconds().checked_mul(NANOS_PER_SEC as i64));
-        let nanos_part = self.nanos_mod_sec();
-        secs_part.checked_add(nanos_part as i64)
-    }
-
-    /// Add two durations, returning `None` if overflow occurred.
-    pub fn checked_add(&self, rhs: &Duration) -> Option<Duration> {
-        let mut secs = try_opt!(self.secs.checked_add(rhs.secs));
-        let mut nanos = self.nanos + rhs.nanos;
-        if nanos >= NANOS_PER_SEC {
-            nanos -= NANOS_PER_SEC;
-            secs = try_opt!(secs.checked_add(1));
-        }
-        let d = Duration { secs: secs, nanos: nanos };
-        // Even if d is within the bounds of i64 seconds,
-        // it might still overflow i64 milliseconds.
-        if d < MIN || d > MAX { None } else { Some(d) }
-    }
-
-    /// Subtract two durations, returning `None` if overflow occurred.
-    pub fn checked_sub(&self, rhs: &Duration) -> Option<Duration> {
-        let mut secs = try_opt!(self.secs.checked_sub(rhs.secs));
-        let mut nanos = self.nanos - rhs.nanos;
-        if nanos < 0 {
-            nanos += NANOS_PER_SEC;
-            secs = try_opt!(secs.checked_sub(1));
-        }
-        let d = Duration { secs: secs, nanos: nanos };
-        // Even if d is within the bounds of i64 seconds,
-        // it might still overflow i64 milliseconds.
-        if d < MIN || d > MAX { None } else { Some(d) }
-    }
-
-    /// The minimum possible `Duration`: `i64::MIN` milliseconds.
-    #[inline]
-    pub fn min_value() -> Duration { MIN }
-
-    /// The maximum possible `Duration`: `i64::MAX` milliseconds.
-    #[inline]
-    pub fn max_value() -> Duration { MAX }
-
-    /// A duration where the stored seconds and nanoseconds are equal to zero.
-    #[inline]
-    pub fn zero() -> Duration {
-        Duration { secs: 0, nanos: 0 }
-    }
-
-    /// Returns `true` if the duration equals `Duration::zero()`.
-    #[inline]
-    pub fn is_zero(&self) -> bool {
-        self.secs == 0 && self.nanos == 0
-    }
-
-    /// Creates a `time::Duration` object from `std::time::Duration`
-    ///
-    /// This function errors when original duration is larger than the maximum
-    /// value supported for this type.
-    pub fn from_std(duration: StdDuration) -> Result<Duration, OutOfRangeError> {
-        // We need to check secs as u64 before coercing to i64
-        if duration.as_secs() > MAX.secs as u64 {
-            return Err(OutOfRangeError(()));
-        }
-        let d = Duration {
-            secs: duration.as_secs() as i64,
-            nanos: duration.subsec_nanos() as i32,
-        };
-        if d > MAX {
-            return Err(OutOfRangeError(()));
-        }
-        Ok(d)
-    }
-
-    /// Creates a `std::time::Duration` object from `time::Duration`
-    ///
-    /// This function errors when duration is less than zero. As standard
-    /// library implementation is limited to non-negative values.
-    pub fn to_std(&self) -> Result<StdDuration, OutOfRangeError> {
-        if self.secs < 0 {
-            return Err(OutOfRangeError(()));
-        }
-        Ok(StdDuration::new(self.secs as u64, self.nanos as u32))
-    }
-}
-
-impl Neg for Duration {
-    type Output = Duration;
-
-    #[inline]
-    fn neg(self) -> Duration {
-        if self.nanos == 0 {
-            Duration { secs: -self.secs, nanos: 0 }
-        } else {
-            Duration { secs: -self.secs - 1, nanos: NANOS_PER_SEC - self.nanos }
-        }
-    }
-}
-
-impl Add for Duration {
-    type Output = Duration;
-
-    fn add(self, rhs: Duration) -> Duration {
-        let mut secs = self.secs + rhs.secs;
-        let mut nanos = self.nanos + rhs.nanos;
-        if nanos >= NANOS_PER_SEC {
-            nanos -= NANOS_PER_SEC;
-            secs += 1;
-        }
-        Duration { secs: secs, nanos: nanos }
-    }
-}
-
-impl Sub for Duration {
-    type Output = Duration;
-
-    fn sub(self, rhs: Duration) -> Duration {
-        let mut secs = self.secs - rhs.secs;
-        let mut nanos = self.nanos - rhs.nanos;
-        if nanos < 0 {
-            nanos += NANOS_PER_SEC;
-            secs -= 1;
-        }
-        Duration { secs: secs, nanos: nanos }
-    }
-}
-
-impl Mul<i32> for Duration {
-    type Output = Duration;
-
-    fn mul(self, rhs: i32) -> Duration {
-        // Multiply nanoseconds as i64, because it cannot overflow that way.
-        let total_nanos = self.nanos as i64 * rhs as i64;
-        let (extra_secs, nanos) = div_mod_floor_64(total_nanos, NANOS_PER_SEC as i64);
-        let secs = self.secs * rhs as i64 + extra_secs;
-        Duration { secs: secs, nanos: nanos as i32 }
-    }
-}
-
-impl Div<i32> for Duration {
-    type Output = Duration;
-
-    fn div(self, rhs: i32) -> Duration {
-        let mut secs = self.secs / rhs as i64;
-        let carry = self.secs - secs * rhs as i64;
-        let extra_nanos = carry * NANOS_PER_SEC as i64 / rhs as i64;
-        let mut nanos = self.nanos / rhs + extra_nanos as i32;
-        if nanos >= NANOS_PER_SEC {
-            nanos -= NANOS_PER_SEC;
-            secs += 1;
-        }
-        if nanos < 0 {
-            nanos += NANOS_PER_SEC;
-            secs -= 1;
-        }
-        Duration { secs: secs, nanos: nanos }
-    }
-}
-
-impl fmt::Display for Duration {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        // technically speaking, negative duration is not valid ISO 8601,
-        // but we need to print it anyway.
-        let (abs, sign) = if self.secs < 0 { (-*self, "-") } else { (*self, "") };
-
-        let days = abs.secs / SECS_PER_DAY;
-        let secs = abs.secs - days * SECS_PER_DAY;
-        let hasdate = days != 0;
-        let hastime = (secs != 0 || abs.nanos != 0) || !hasdate;
-
-        try!(write!(f, "{}P", sign));
-
-        if hasdate {
-            try!(write!(f, "{}D", days));
-        }
-        if hastime {
-            if abs.nanos == 0 {
-                try!(write!(f, "T{}S", secs));
-            } else if abs.nanos % NANOS_PER_MILLI == 0 {
-                try!(write!(f, "T{}.{:03}S", secs, abs.nanos / NANOS_PER_MILLI));
-            } else if abs.nanos % NANOS_PER_MICRO == 0 {
-                try!(write!(f, "T{}.{:06}S", secs, abs.nanos / NANOS_PER_MICRO));
-            } else {
-                try!(write!(f, "T{}.{:09}S", secs, abs.nanos));
-            }
-        }
-        Ok(())
-    }
-}
-
-/// Represents error when converting `Duration` to/from a standard library
-/// implementation
-///
-/// The `std::time::Duration` supports a range from zero to `u64::MAX`
-/// *seconds*, while this module supports signed range of up to
-/// `i64::MAX` of *milliseconds*.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub struct OutOfRangeError(());
-
-impl fmt::Display for OutOfRangeError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.description())
-    }
-}
-
-impl Error for OutOfRangeError {
-    fn description(&self) -> &str {
-        "Source duration value is out of range for the target type"
-    }
-}
-
-// Copied from libnum
-#[inline]
-fn div_mod_floor_64(this: i64, other: i64) -> (i64, i64) {
-    (div_floor_64(this, other), mod_floor_64(this, other))
-}
-
-#[inline]
-fn div_floor_64(this: i64, other: i64) -> i64 {
-    match div_rem_64(this, other) {
-        (d, r) if (r > 0 && other < 0)
-               || (r < 0 && other > 0) => d - 1,
-        (d, _)                         => d,
-    }
-}
-
-#[inline]
-fn mod_floor_64(this: i64, other: i64) -> i64 {
-    match this % other {
-        r if (r > 0 && other < 0)
-          || (r < 0 && other > 0) => r + other,
-        r                         => r,
-    }
-}
-
-#[inline]
-fn div_rem_64(this: i64, other: i64) -> (i64, i64) {
-    (this / other, this % other)
-}
-
-#[cfg(test)]
-mod tests {
-    use super::{Duration, MIN, MAX, OutOfRangeError};
-    use std::{i32, i64};
-    use std::time::Duration as StdDuration;
-
-    #[test]
-    fn test_duration() {
-        assert!(Duration::seconds(1) != Duration::zero());
-        assert_eq!(Duration::seconds(1) + Duration::seconds(2), Duration::seconds(3));
-        assert_eq!(Duration::seconds(86399) + Duration::seconds(4),
-                   Duration::days(1) + Duration::seconds(3));
-        assert_eq!(Duration::days(10) - Duration::seconds(1000), Duration::seconds(863000));
-        assert_eq!(Duration::days(10) - Duration::seconds(1000000), Duration::seconds(-136000));
-        assert_eq!(Duration::days(2) + Duration::seconds(86399) +
-                   Duration::nanoseconds(1234567890),
-                   Duration::days(3) + Duration::nanoseconds(234567890));
-        assert_eq!(-Duration::days(3), Duration::days(-3));
-        assert_eq!(-(Duration::days(3) + Duration::seconds(70)),
-                   Duration::days(-4) + Duration::seconds(86400-70));
-    }
-
-    #[test]
-    fn test_duration_num_days() {
-        assert_eq!(Duration::zero().num_days(), 0);
-        assert_eq!(Duration::days(1).num_days(), 1);
-        assert_eq!(Duration::days(-1).num_days(), -1);
-        assert_eq!(Duration::seconds(86399).num_days(), 0);
-        assert_eq!(Duration::seconds(86401).num_days(), 1);
-        assert_eq!(Duration::seconds(-86399).num_days(), 0);
-        assert_eq!(Duration::seconds(-86401).num_days(), -1);
-        assert_eq!(Duration::days(i32::MAX as i64).num_days(), i32::MAX as i64);
-        assert_eq!(Duration::days(i32::MIN as i64).num_days(), i32::MIN as i64);
-    }
-
-    #[test]
-    fn test_duration_num_seconds() {
-        assert_eq!(Duration::zero().num_seconds(), 0);
-        assert_eq!(Duration::seconds(1).num_seconds(), 1);
-        assert_eq!(Duration::seconds(-1).num_seconds(), -1);
-        assert_eq!(Duration::milliseconds(999).num_seconds(), 0);
-        assert_eq!(Duration::milliseconds(1001).num_seconds(), 1);
-        assert_eq!(Duration::milliseconds(-999).num_seconds(), 0);
-        assert_eq!(Duration::milliseconds(-1001).num_seconds(), -1);
-    }
-
-    #[test]
-    fn test_duration_num_milliseconds() {
-        assert_eq!(Duration::zero().num_milliseconds(), 0);
-        assert_eq!(Duration::milliseconds(1).num_milliseconds(), 1);
-        assert_eq!(Duration::milliseconds(-1).num_milliseconds(), -1);
-        assert_eq!(Duration::microseconds(999).num_milliseconds(), 0);
-        assert_eq!(Duration::microseconds(1001).num_milliseconds(), 1);
-        assert_eq!(Duration::microseconds(-999).num_milliseconds(), 0);
-        assert_eq!(Duration::microseconds(-1001).num_milliseconds(), -1);
-        assert_eq!(Duration::milliseconds(i64::MAX).num_milliseconds(), i64::MAX);
-        assert_eq!(Duration::milliseconds(i64::MIN).num_milliseconds(), i64::MIN);
-        assert_eq!(MAX.num_milliseconds(), i64::MAX);
-        assert_eq!(MIN.num_milliseconds(), i64::MIN);
-    }
-
-    #[test]
-    fn test_duration_num_microseconds() {
-        assert_eq!(Duration::zero().num_microseconds(), Some(0));
-        assert_eq!(Duration::microseconds(1).num_microseconds(), Some(1));
-        assert_eq!(Duration::microseconds(-1).num_microseconds(), Some(-1));
-        assert_eq!(Duration::nanoseconds(999).num_microseconds(), Some(0));
-        assert_eq!(Duration::nanoseconds(1001).num_microseconds(), Some(1));
-        assert_eq!(Duration::nanoseconds(-999).num_microseconds(), Some(0));
-        assert_eq!(Duration::nanoseconds(-1001).num_microseconds(), Some(-1));
-        assert_eq!(Duration::microseconds(i64::MAX).num_microseconds(), Some(i64::MAX));
-        assert_eq!(Duration::microseconds(i64::MIN).num_microseconds(), Some(i64::MIN));
-        assert_eq!(MAX.num_microseconds(), None);
-        assert_eq!(MIN.num_microseconds(), None);
-
-        // overflow checks
-        const MICROS_PER_DAY: i64 = 86400_000_000;
-        assert_eq!(Duration::days(i64::MAX / MICROS_PER_DAY).num_microseconds(),
-                   Some(i64::MAX / MICROS_PER_DAY * MICROS_PER_DAY));
-        assert_eq!(Duration::days(i64::MIN / MICROS_PER_DAY).num_microseconds(),
-                   Some(i64::MIN / MICROS_PER_DAY * MICROS_PER_DAY));
-        assert_eq!(Duration::days(i64::MAX / MICROS_PER_DAY + 1).num_microseconds(), None);
-        assert_eq!(Duration::days(i64::MIN / MICROS_PER_DAY - 1).num_microseconds(), None);
-    }
-
-    #[test]
-    fn test_duration_num_nanoseconds() {
-        assert_eq!(Duration::zero().num_nanoseconds(), Some(0));
-        assert_eq!(Duration::nanoseconds(1).num_nanoseconds(), Some(1));
-        assert_eq!(Duration::nanoseconds(-1).num_nanoseconds(), Some(-1));
-        assert_eq!(Duration::nanoseconds(i64::MAX).num_nanoseconds(), Some(i64::MAX));
-        assert_eq!(Duration::nanoseconds(i64::MIN).num_nanoseconds(), Some(i64::MIN));
-        assert_eq!(MAX.num_nanoseconds(), None);
-        assert_eq!(MIN.num_nanoseconds(), None);
-
-        // overflow checks
-        const NANOS_PER_DAY: i64 = 86400_000_000_000;
-        assert_eq!(Duration::days(i64::MAX / NANOS_PER_DAY).num_nanoseconds(),
-                   Some(i64::MAX / NANOS_PER_DAY * NANOS_PER_DAY));
-        assert_eq!(Duration::days(i64::MIN / NANOS_PER_DAY).num_nanoseconds(),
-                   Some(i64::MIN / NANOS_PER_DAY * NANOS_PER_DAY));
-        assert_eq!(Duration::days(i64::MAX / NANOS_PER_DAY + 1).num_nanoseconds(), None);
-        assert_eq!(Duration::days(i64::MIN / NANOS_PER_DAY - 1).num_nanoseconds(), None);
-    }
-
-    #[test]
-    fn test_duration_checked_ops() {
-        assert_eq!(Duration::milliseconds(i64::MAX - 1).checked_add(&Duration::microseconds(999)),
-                   Some(Duration::milliseconds(i64::MAX - 2) + Duration::microseconds(1999)));
-        assert!(Duration::milliseconds(i64::MAX).checked_add(&Duration::microseconds(1000))
-                                                .is_none());
-
-        assert_eq!(Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(0)),
-                   Some(Duration::milliseconds(i64::MIN)));
-        assert!(Duration::milliseconds(i64::MIN).checked_sub(&Duration::milliseconds(1))
-                                                .is_none());
-    }
-
-    #[test]
-    fn test_duration_mul() {
-        assert_eq!(Duration::zero() * i32::MAX, Duration::zero());
-        assert_eq!(Duration::zero() * i32::MIN, Duration::zero());
-        assert_eq!(Duration::nanoseconds(1) * 0, Duration::zero());
-        assert_eq!(Duration::nanoseconds(1) * 1, Duration::nanoseconds(1));
-        assert_eq!(Duration::nanoseconds(1) * 1_000_000_000, Duration::seconds(1));
-        assert_eq!(Duration::nanoseconds(1) * -1_000_000_000, -Duration::seconds(1));
-        assert_eq!(-Duration::nanoseconds(1) * 1_000_000_000, -Duration::seconds(1));
-        assert_eq!(Duration::nanoseconds(30) * 333_333_333,
-                   Duration::seconds(10) - Duration::nanoseconds(10));
-        assert_eq!((Duration::nanoseconds(1) + Duration::seconds(1) + Duration::days(1)) * 3,
-                   Duration::nanoseconds(3) + Duration::seconds(3) + Duration::days(3));
-        assert_eq!(Duration::milliseconds(1500) * -2, Duration::seconds(-3));
-        assert_eq!(Duration::milliseconds(-1500) * 2, Duration::seconds(-3));
-    }
-
-    #[test]
-    fn test_duration_div() {
-        assert_eq!(Duration::zero() / i32::MAX, Duration::zero());
-        assert_eq!(Duration::zero() / i32::MIN, Duration::zero());
-        assert_eq!(Duration::nanoseconds(123_456_789) / 1, Duration::nanoseconds(123_456_789));
-        assert_eq!(Duration::nanoseconds(123_456_789) / -1, -Duration::nanoseconds(123_456_789));
-        assert_eq!(-Duration::nanoseconds(123_456_789) / -1, Duration::nanoseconds(123_456_789));
-        assert_eq!(-Duration::nanoseconds(123_456_789) / 1, -Duration::nanoseconds(123_456_789));
-        assert_eq!(Duration::seconds(1) / 3, Duration::nanoseconds(333_333_333));
-        assert_eq!(Duration::seconds(4) / 3, Duration::nanoseconds(1_333_333_333));
-        assert_eq!(Duration::seconds(-1) / 2, Duration::milliseconds(-500));
-        assert_eq!(Duration::seconds(1) / -2, Duration::milliseconds(-500));
-        assert_eq!(Duration::seconds(-1) / -2, Duration::milliseconds(500));
-        assert_eq!(Duration::seconds(-4) / 3, Duration::nanoseconds(-1_333_333_333));
-        assert_eq!(Duration::seconds(-4) / -3, Duration::nanoseconds(1_333_333_333));
-    }
-
-    #[test]
-    fn test_duration_fmt() {
-        assert_eq!(Duration::zero().to_string(), "PT0S");
-        assert_eq!(Duration::days(42).to_string(), "P42D");
-        assert_eq!(Duration::days(-42).to_string(), "-P42D");
-        assert_eq!(Duration::seconds(42).to_string(), "PT42S");
-        assert_eq!(Duration::milliseconds(42).to_string(), "PT0.042S");
-        assert_eq!(Duration::microseconds(42).to_string(), "PT0.000042S");
-        assert_eq!(Duration::nanoseconds(42).to_string(), "PT0.000000042S");
-        assert_eq!((Duration::days(7) + Duration::milliseconds(6543)).to_string(),
-                   "P7DT6.543S");
-        assert_eq!(Duration::seconds(-86401).to_string(), "-P1DT1S");
-        assert_eq!(Duration::nanoseconds(-1).to_string(), "-PT0.000000001S");
-
-        // the format specifier should have no effect on `Duration`
-        assert_eq!(format!("{:30}", Duration::days(1) + Duration::milliseconds(2345)),
-                   "P1DT2.345S");
-    }
-
-    #[test]
-    fn test_to_std() {
-        assert_eq!(Duration::seconds(1).to_std(), Ok(StdDuration::new(1, 0)));
-        assert_eq!(Duration::seconds(86401).to_std(), Ok(StdDuration::new(86401, 0)));
-        assert_eq!(Duration::milliseconds(123).to_std(), Ok(StdDuration::new(0, 123000000)));
-        assert_eq!(Duration::milliseconds(123765).to_std(), Ok(StdDuration::new(123, 765000000)));
-        assert_eq!(Duration::nanoseconds(777).to_std(), Ok(StdDuration::new(0, 777)));
-        assert_eq!(MAX.to_std(), Ok(StdDuration::new(9223372036854775, 807000000)));
-        assert_eq!(Duration::seconds(-1).to_std(),
-                   Err(OutOfRangeError(())));
-        assert_eq!(Duration::milliseconds(-1).to_std(),
-                   Err(OutOfRangeError(())));
-    }
-
-    #[test]
-    fn test_from_std() {
-        assert_eq!(Ok(Duration::seconds(1)),
-                   Duration::from_std(StdDuration::new(1, 0)));
-        assert_eq!(Ok(Duration::seconds(86401)),
-                   Duration::from_std(StdDuration::new(86401, 0)));
-        assert_eq!(Ok(Duration::milliseconds(123)),
-                   Duration::from_std(StdDuration::new(0, 123000000)));
-        assert_eq!(Ok(Duration::milliseconds(123765)),
-                   Duration::from_std(StdDuration::new(123, 765000000)));
-        assert_eq!(Ok(Duration::nanoseconds(777)),
-                   Duration::from_std(StdDuration::new(0, 777)));
-        assert_eq!(Ok(MAX),
-                   Duration::from_std(StdDuration::new(9223372036854775, 807000000)));
-        assert_eq!(Duration::from_std(StdDuration::new(9223372036854776, 0)),
-                   Err(OutOfRangeError(())));
-        assert_eq!(Duration::from_std(StdDuration::new(9223372036854775, 807000001)),
-                   Err(OutOfRangeError(())));
-    }
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/src/lib.rs
+++ /dev/null
@@ -1,1277 +0,0 @@
-// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Simple time handling.
-//!
-//! # Usage
-//!
-//! This crate is [on crates.io](https://crates.io/crates/time) and can be
-//! used by adding `time` to the dependencies in your project's `Cargo.toml`.
-//!
-//! ```toml
-//! [dependencies]
-//! time = "0.1"
-//! ```
-//!
-//! And this in your crate root:
-//!
-//! ```rust
-//! extern crate time;
-//! ```
-//!
-//! This crate uses the same syntax for format strings as the [strftime()]
-//! (http://man7.org/linux/man-pages/man3/strftime.3.html) function from the C
-//! standard library.
-
-#![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
-       html_favicon_url = "https://www.rust-lang.org/favicon.ico",
-       html_root_url = "https://doc.rust-lang.org/time/")]
-#![allow(trivial_numeric_casts)]
-#![cfg_attr(test, deny(warnings))]
-
-#[cfg(target_os = "redox")] extern crate syscall;
-#[cfg(unix)] extern crate libc;
-#[cfg(windows)] extern crate kernel32;
-#[cfg(windows)] extern crate winapi;
-#[cfg(feature = "rustc-serialize")] extern crate rustc_serialize;
-
-#[cfg(test)] #[macro_use] extern crate log;
-#[cfg(all(windows, test))] extern crate advapi32;
-
-use std::cmp::Ordering;
-use std::error::Error;
-use std::fmt;
-use std::ops::{Add, Sub};
-
-pub use duration::{Duration, OutOfRangeError};
-
-use self::ParseError::{InvalidDay, InvalidDayOfMonth, InvalidDayOfWeek,
-                       InvalidDayOfYear, InvalidFormatSpecifier, InvalidHour,
-                       InvalidMinute, InvalidMonth, InvalidSecond, InvalidTime,
-                       InvalidYear, InvalidZoneOffset, InvalidSecondsSinceEpoch,
-                       MissingFormatConverter, UnexpectedCharacter};
-
-pub use parse::strptime;
-
-mod display;
-mod duration;
-mod parse;
-mod sys;
-
-static NSEC_PER_SEC: i32 = 1_000_000_000;
-
-/// A record specifying a time value in seconds and nanoseconds, where
-/// nanoseconds represent the offset from the given second.
-///
-/// For example a timespec of 1.2 seconds after the beginning of the epoch would
-/// be represented as {sec: 1, nsec: 200000000}.
-#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
-#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
-pub struct Timespec { pub sec: i64, pub nsec: i32 }
-/*
- * Timespec assumes that pre-epoch Timespecs have negative sec and positive
- * nsec fields. Darwin's and Linux's struct timespec functions handle pre-
- * epoch timestamps using a "two steps back, one step forward" representation,
- * though the man pages do not actually document this. For example, the time
- * -1.2 seconds before the epoch is represented by `Timespec { sec: -2_i64,
- * nsec: 800_000_000 }`.
- */
-impl Timespec {
-    pub fn new(sec: i64, nsec: i32) -> Timespec {
-        assert!(nsec >= 0 && nsec < NSEC_PER_SEC);
-        Timespec { sec: sec, nsec: nsec }
-    }
-}
-
-impl Add<Duration> for Timespec {
-    type Output = Timespec;
-
-    fn add(self, other: Duration) -> Timespec {
-        let d_sec = other.num_seconds();
-        // It is safe to unwrap the nanoseconds, because there cannot be
-        // more than one second left, which fits in i64 and in i32.
-        let d_nsec = (other - Duration::seconds(d_sec))
-                     .num_nanoseconds().unwrap() as i32;
-        let mut sec = self.sec + d_sec;
-        let mut nsec = self.nsec + d_nsec;
-        if nsec >= NSEC_PER_SEC {
-            nsec -= NSEC_PER_SEC;
-            sec += 1;
-        } else if nsec < 0 {
-            nsec += NSEC_PER_SEC;
-            sec -= 1;
-        }
-        Timespec::new(sec, nsec)
-    }
-}
-
-impl Sub<Duration> for Timespec {
-    type Output = Timespec;
-
-    fn sub(self, other: Duration) -> Timespec {
-        let d_sec = other.num_seconds();
-        // It is safe to unwrap the nanoseconds, because there cannot be
-        // more than one second left, which fits in i64 and in i32.
-        let d_nsec = (other - Duration::seconds(d_sec))
-                     .num_nanoseconds().unwrap() as i32;
-        let mut sec = self.sec - d_sec;
-        let mut nsec = self.nsec - d_nsec;
-        if nsec >= NSEC_PER_SEC {
-            nsec -= NSEC_PER_SEC;
-            sec += 1;
-        } else if nsec < 0 {
-            nsec += NSEC_PER_SEC;
-            sec -= 1;
-        }
-        Timespec::new(sec, nsec)
-    }
-}
-
-impl Sub<Timespec> for Timespec {
-    type Output = Duration;
-
-    fn sub(self, other: Timespec) -> Duration {
-        let sec = self.sec - other.sec;
-        let nsec = self.nsec - other.nsec;
-        Duration::seconds(sec) + Duration::nanoseconds(nsec as i64)
-    }
-}
-
-/**
- * Returns the current time as a `timespec` containing the seconds and
- * nanoseconds since 1970-01-01T00:00:00Z.
- */
-pub fn get_time() -> Timespec {
-    let (sec, nsec) = sys::get_time();
-    Timespec::new(sec, nsec)
-}
-
-
-/**
- * Returns the current value of a high-resolution performance counter
- * in nanoseconds since an unspecified epoch.
- */
-pub fn precise_time_ns() -> u64 {
-    sys::get_precise_ns()
-}
-
-
-/**
- * Returns the current value of a high-resolution performance counter
- * in seconds since an unspecified epoch.
- */
-pub fn precise_time_s() -> f64 {
-    return (precise_time_ns() as f64) / 1000000000.;
-}
-
-/// An opaque structure representing a moment in time.
-///
-/// The only operation that can be performed on a `PreciseTime` is the
-/// calculation of the `Duration` of time that lies between them.
-///
-/// # Examples
-///
-/// Repeatedly call a function for 1 second:
-///
-/// ```rust
-/// use time::{Duration, PreciseTime};
-/// # fn do_some_work() {}
-///
-/// let start = PreciseTime::now();
-///
-/// while start.to(PreciseTime::now()) < Duration::seconds(1) {
-///     do_some_work();
-/// }
-/// ```
-#[derive(Copy, Clone)]
-pub struct PreciseTime(u64);
-
-impl PreciseTime {
-    /// Returns a `PreciseTime` representing the current moment in time.
-    pub fn now() -> PreciseTime {
-        PreciseTime(precise_time_ns())
-    }
-
-    /// Returns a `Duration` representing the span of time from the value of
-    /// `self` to the value of `later`.
-    ///
-    /// # Notes
-    ///
-    /// If `later` represents a time before `self`, the result of this method
-    /// is unspecified.
-    ///
-    /// If `later` represents a time more than 293 years after `self`, the
-    /// result of this method is unspecified.
-    #[inline]
-    pub fn to(&self, later: PreciseTime) -> Duration {
-        // NB: even if later is less than self due to overflow, this will work
-        // since the subtraction will underflow properly as well.
-        //
-        // We could deal with the overflow when casting to an i64, but all that
-        // gets us is the ability to handle intervals of up to 584 years, which
-        // seems not very useful :)
-        Duration::nanoseconds((later.0 - self.0) as i64)
-    }
-}
-
-/// A structure representing a moment in time.
-///
-/// `SteadyTime`s are generated by a "steady" clock, that is, a clock which
-/// never experiences discontinuous jumps and for which time always flows at
-/// the same rate.
-///
-/// # Examples
-///
-/// Repeatedly call a function for 1 second:
-///
-/// ```rust
-/// # use time::{Duration, SteadyTime};
-/// # fn do_some_work() {}
-/// let start = SteadyTime::now();
-///
-/// while SteadyTime::now() - start < Duration::seconds(1) {
-///     do_some_work();
-/// }
-/// ```
-#[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Debug)]
-pub struct SteadyTime(sys::SteadyTime);
-
-impl SteadyTime {
-    /// Returns a `SteadyTime` representing the current moment in time.
-    pub fn now() -> SteadyTime {
-        SteadyTime(sys::SteadyTime::now())
-    }
-}
-
-impl fmt::Display for SteadyTime {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-        // TODO: needs a display customization
-        fmt::Debug::fmt(self, fmt)
-    }
-}
-
-impl Sub for SteadyTime {
-    type Output = Duration;
-
-    fn sub(self, other: SteadyTime) -> Duration {
-        self.0 - other.0
-    }
-}
-
-impl Sub<Duration> for SteadyTime {
-    type Output = SteadyTime;
-
-    fn sub(self, other: Duration) -> SteadyTime {
-        SteadyTime(self.0 - other)
-    }
-}
-
-impl Add<Duration> for SteadyTime {
-    type Output = SteadyTime;
-
-    fn add(self, other: Duration) -> SteadyTime {
-        SteadyTime(self.0 + other)
-    }
-}
-
-#[cfg(not(windows))]
-pub fn tzset() {
-    extern { fn tzset(); }
-    unsafe { tzset() }
-}
-
-
-#[cfg(windows)]
-pub fn tzset() {}
-
-/// Holds a calendar date and time broken down into its components (year, month,
-/// day, and so on), also called a broken-down time value.
-// FIXME: use c_int instead of i32?
-#[repr(C)]
-#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)]
-#[cfg_attr(feature = "rustc-serialize", derive(RustcEncodable, RustcDecodable))]
-pub struct Tm {
-    /// Seconds after the minute - [0, 60]
-    pub tm_sec: i32,
-
-    /// Minutes after the hour - [0, 59]
-    pub tm_min: i32,
-
-    /// Hours after midnight - [0, 23]
-    pub tm_hour: i32,
-
-    /// Day of the month - [1, 31]
-    pub tm_mday: i32,
-
-    /// Months since January - [0, 11]
-    pub tm_mon: i32,
-
-    /// Years since 1900
-    pub tm_year: i32,
-
-    /// Days since Sunday - [0, 6]. 0 = Sunday, 1 = Monday, ..., 6 = Saturday.
-    pub tm_wday: i32,
-
-    /// Days since January 1 - [0, 365]
-    pub tm_yday: i32,
-
-    /// Daylight Saving Time flag.
-    ///
-    /// This value is positive if Daylight Saving Time is in effect, zero if
-    /// Daylight Saving Time is not in effect, and negative if this information
-    /// is not available.
-    pub tm_isdst: i32,
-
-    /// Identifies the time zone that was used to compute this broken-down time
-    /// value, including any adjustment for Daylight Saving Time. This is the
-    /// number of seconds east of UTC. For example, for U.S. Pacific Daylight
-    /// Time, the value is -7*60*60 = -25200.
-    pub tm_utcoff: i32,
-
-    /// Nanoseconds after the second - [0, 10<sup>9</sup> - 1]
-    pub tm_nsec: i32,
-}
-
-impl Add<Duration> for Tm {
-    type Output = Tm;
-
-    /// The resulting Tm is in UTC.
-    // FIXME:  The resulting Tm should have the same timezone as `self`;
-    // however, we need a function such as `at_tm(clock: Timespec, offset: i32)`
-    // for this.
-    fn add(self, other: Duration) -> Tm {
-        at_utc(self.to_timespec() + other)
-    }
-}
-
-impl Sub<Duration> for Tm {
-    type Output = Tm;
-
-    /// The resulting Tm is in UTC.
-    // FIXME:  The resulting Tm should have the same timezone as `self`;
-    // however, we need a function such as `at_tm(clock: Timespec, offset: i32)`
-    // for this.
-    fn sub(self, other: Duration) -> Tm {
-        at_utc(self.to_timespec() - other)
-    }
-}
-
-impl Sub<Tm> for Tm {
-    type Output = Duration;
-
-    fn sub(self, other: Tm) -> Duration {
-        self.to_timespec() - other.to_timespec()
-    }
-}
-
-impl PartialOrd for Tm {
-    fn partial_cmp(&self, other: &Tm) -> Option<Ordering> {
-        self.to_timespec().partial_cmp(&other.to_timespec())
-    }
-}
-
-impl Ord for Tm {
-    fn cmp(&self, other: &Tm) -> Ordering {
-        self.to_timespec().cmp(&other.to_timespec())
-    }
-}
-
-pub fn empty_tm() -> Tm {
-    Tm {
-        tm_sec: 0,
-        tm_min: 0,
-        tm_hour: 0,
-        tm_mday: 0,
-        tm_mon: 0,
-        tm_year: 0,
-        tm_wday: 0,
-        tm_yday: 0,
-        tm_isdst: 0,
-        tm_utcoff: 0,
-        tm_nsec: 0,
-    }
-}
-
-/// Returns the specified time in UTC
-pub fn at_utc(clock: Timespec) -> Tm {
-    let Timespec { sec, nsec } = clock;
-    let mut tm = empty_tm();
-    sys::time_to_utc_tm(sec, &mut tm);
-    tm.tm_nsec = nsec;
-    tm
-}
-
-/// Returns the current time in UTC
-pub fn now_utc() -> Tm {
-    at_utc(get_time())
-}
-
-/// Returns the specified time in the local timezone
-pub fn at(clock: Timespec) -> Tm {
-    let Timespec { sec, nsec } = clock;
-    let mut tm = empty_tm();
-    sys::time_to_local_tm(sec, &mut tm);
-    tm.tm_nsec = nsec;
-    tm
-}
-
-/// Returns the current time in the local timezone
-pub fn now() -> Tm {
-    at(get_time())
-}
-
-impl Tm {
-    /// Convert time to the seconds from January 1, 1970
-    pub fn to_timespec(&self) -> Timespec {
-        let sec = match self.tm_utcoff {
-            0 => sys::utc_tm_to_time(self),
-            _ => sys::local_tm_to_time(self)
-        };
-
-        Timespec::new(sec, self.tm_nsec)
-    }
-
-    /// Convert time to the local timezone
-    pub fn to_local(&self) -> Tm {
-        at(self.to_timespec())
-    }
-
-    /// Convert time to the UTC
-    pub fn to_utc(&self) -> Tm {
-        match self.tm_utcoff {
-            0 => *self,
-            _ => at_utc(self.to_timespec())
-        }
-    }
-
-    /**
-     * Returns a TmFmt that outputs according to the `asctime` format in ISO
-     * C, in the local timezone.
-     *
-     * Example: "Thu Jan  1 00:00:00 1970"
-     */
-    pub fn ctime(&self) -> TmFmt {
-        TmFmt {
-            tm: self,
-            format: Fmt::Ctime,
-        }
-    }
-
-    /**
-     * Returns a TmFmt that outputs according to the `asctime` format in ISO
-     * C.
-     *
-     * Example: "Thu Jan  1 00:00:00 1970"
-     */
-    pub fn asctime(&self) -> TmFmt {
-        TmFmt {
-            tm: self,
-            format: Fmt::Str("%c"),
-        }
-    }
-
-    /// Formats the time according to the format string.
-    pub fn strftime<'a>(&'a self, format: &'a str) -> Result<TmFmt<'a>, ParseError> {
-        validate_format(TmFmt {
-            tm: self,
-            format: Fmt::Str(format),
-        })
-    }
-
-    /**
-     * Returns a TmFmt that outputs according to RFC 822.
-     *
-     * local: "Thu, 22 Mar 2012 07:53:18 PST"
-     * utc:   "Thu, 22 Mar 2012 14:53:18 GMT"
-     */
-    pub fn rfc822(&self) -> TmFmt {
-        let fmt = if self.tm_utcoff == 0 {
-            "%a, %d %b %Y %T GMT"
-        } else {
-            "%a, %d %b %Y %T %Z"
-        };
-        TmFmt {
-            tm: self,
-            format: Fmt::Str(fmt),
-        }
-    }
-
-    /**
-     * Returns a TmFmt that outputs according to RFC 822 with Zulu time.
-     *
-     * local: "Thu, 22 Mar 2012 07:53:18 -0700"
-     * utc:   "Thu, 22 Mar 2012 14:53:18 -0000"
-     */
-    pub fn rfc822z(&self) -> TmFmt {
-        TmFmt {
-            tm: self,
-            format: Fmt::Str("%a, %d %b %Y %T %z"),
-        }
-    }
-
-    /**
-     * Returns a TmFmt that outputs according to RFC 3339. RFC 3339 is
-     * compatible with ISO 8601.
-     *
-     * local: "2012-02-22T07:53:18-07:00"
-     * utc:   "2012-02-22T14:53:18Z"
-     */
-    pub fn rfc3339<'a>(&'a self) -> TmFmt {
-        TmFmt {
-            tm: self,
-            format: Fmt::Rfc3339,
-        }
-    }
-}
-
-#[derive(Copy, PartialEq, Debug, Clone)]
-pub enum ParseError {
-    InvalidSecond,
-    InvalidMinute,
-    InvalidHour,
-    InvalidDay,
-    InvalidMonth,
-    InvalidYear,
-    InvalidDayOfWeek,
-    InvalidDayOfMonth,
-    InvalidDayOfYear,
-    InvalidZoneOffset,
-    InvalidTime,
-    InvalidSecondsSinceEpoch,
-    MissingFormatConverter,
-    InvalidFormatSpecifier(char),
-    UnexpectedCharacter(char, char),
-}
-
-impl fmt::Display for ParseError {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            InvalidFormatSpecifier(ch) => {
-                write!(f, "{}: %{}", self.description(), ch)
-            }
-            UnexpectedCharacter(a, b) => {
-                write!(f, "expected: `{}`, found: `{}`", a, b)
-            }
-            _ => write!(f, "{}", self.description())
-        }
-    }
-}
-
-impl Error for ParseError {
-    fn description(&self) -> &str {
-        match *self {
-            InvalidSecond => "Invalid second.",
-            InvalidMinute => "Invalid minute.",
-            InvalidHour => "Invalid hour.",
-            InvalidDay => "Invalid day.",
-            InvalidMonth => "Invalid month.",
-            InvalidYear => "Invalid year.",
-            InvalidDayOfWeek => "Invalid day of the week.",
-            InvalidDayOfMonth => "Invalid day of the month.",
-            InvalidDayOfYear => "Invalid day of the year.",
-            InvalidZoneOffset => "Invalid zone offset.",
-            InvalidTime => "Invalid time.",
-            InvalidSecondsSinceEpoch => "Invalid seconds since epoch.",
-            MissingFormatConverter => "missing format converter after `%`",
-            InvalidFormatSpecifier(..) => "invalid format specifier",
-            UnexpectedCharacter(..) => "Unexpected character.",
-        }
-    }
-}
-
-/// A wrapper around a `Tm` and format string that implements Display.
-#[derive(Debug)]
-pub struct TmFmt<'a> {
-    tm: &'a Tm,
-    format: Fmt<'a>
-}
-
-#[derive(Debug)]
-enum Fmt<'a> {
-    Str(&'a str),
-    Rfc3339,
-    Ctime,
-}
-
-fn validate_format<'a>(fmt: TmFmt<'a>) -> Result<TmFmt<'a>, ParseError> {
-
-    match (fmt.tm.tm_wday, fmt.tm.tm_mon) {
-        (0...6, 0...11) => (),
-        (_wday, 0...11) => return Err(InvalidDayOfWeek),
-        (0...6, _mon) => return Err(InvalidMonth),
-        _ => return Err(InvalidDay)
-    }
-    match fmt.format {
-        Fmt::Str(ref s) => {
-            let mut chars = s.chars();
-            loop {
-                match chars.next() {
-                    Some('%') => {
-                        match chars.next() {
-                            Some('A') | Some('a') | Some('B') | Some('b') |
-                            Some('C') | Some('c') | Some('D') | Some('d') |
-                            Some('e') | Some('F') | Some('f') | Some('G') |
-                            Some('g') | Some('H') | Some('h') | Some('I') |
-                            Some('j') | Some('k') | Some('l') | Some('M') |
-                            Some('m') | Some('n') | Some('P') | Some('p') |
-                            Some('R') | Some('r') | Some('S') | Some('s') |
-                            Some('T') | Some('t') | Some('U') | Some('u') |
-                            Some('V') | Some('v') | Some('W') | Some('w') |
-                            Some('X') | Some('x') | Some('Y') | Some('y') |
-                            Some('Z') | Some('z') | Some('+') | Some('%') => (),
-
-                            Some(c) => return Err(InvalidFormatSpecifier(c)),
-                            None => return Err(MissingFormatConverter),
-                        }
-                    },
-                    None => break,
-                    _ => ()
-                }
-            }
-        },
-        _ => ()
-    }
-    Ok(fmt)
-}
-
-/// Formats the time according to the format string.
-pub fn strftime(format: &str, tm: &Tm) -> Result<String, ParseError> {
-    tm.strftime(format).map(|fmt| fmt.to_string())
-}
-
-#[cfg(test)]
-mod tests {
-    use super::{Timespec, get_time, precise_time_ns, precise_time_s,
-                at_utc, at, strptime, PreciseTime, SteadyTime, ParseError, Duration};
-    use super::ParseError::{InvalidTime, InvalidYear, MissingFormatConverter,
-                            InvalidFormatSpecifier};
-
-    use std::sync::{Once, ONCE_INIT, Mutex, MutexGuard, LockResult};
-    use std::mem;
-
-    struct TzReset {
-        _tzreset: ::sys::TzReset,
-        _lock: LockResult<MutexGuard<'static, ()>>,
-    }
-
-    fn set_time_zone_la_or_london(london: bool) -> TzReset {
-        // Lock manages current timezone because some tests require LA some
-        // London
-        static mut LOCK: *mut Mutex<()> = 0 as *mut _;
-        static INIT: Once = ONCE_INIT;
-
-        unsafe {
-            INIT.call_once(|| {
-                LOCK = mem::transmute(Box::new(Mutex::new(())));
-            });
-
-            let timezone_lock = (*LOCK).lock();
-            let reset_func = if london {
-                ::sys::set_london_with_dst_time_zone()
-            } else {
-                ::sys::set_los_angeles_time_zone()
-            };
-            TzReset {
-                _lock: timezone_lock,
-                _tzreset: reset_func,
-            }
-        }
-    }
-
-    fn set_time_zone() -> TzReset {
-        set_time_zone_la_or_london(false)
-    }
-
-    fn set_time_zone_london_dst() -> TzReset {
-        set_time_zone_la_or_london(true)
-    }
-
-    #[test]
-    fn test_get_time() {
-        static SOME_RECENT_DATE: i64 = 1325376000i64; // 2012-01-01T00:00:00Z
-        static SOME_FUTURE_DATE: i64 = 1577836800i64; // 2020-01-01T00:00:00Z
-
-        let tv1 = get_time();
-        debug!("tv1={} sec + {} nsec", tv1.sec, tv1.nsec);
-
-        assert!(tv1.sec > SOME_RECENT_DATE);
-        assert!(tv1.nsec < 1000000000i32);
-
-        let tv2 = get_time();
-        debug!("tv2={} sec + {} nsec", tv2.sec, tv2.nsec);
-
-        assert!(tv2.sec >= tv1.sec);
-        assert!(tv2.sec < SOME_FUTURE_DATE);
-        assert!(tv2.nsec < 1000000000i32);
-        if tv2.sec == tv1.sec {
-            assert!(tv2.nsec >= tv1.nsec);
-        }
-    }
-
-    #[test]
-    fn test_precise_time() {
-        let s0 = precise_time_s();
-        debug!("s0={} sec", s0);
-        assert!(s0 > 0.);
-
-        let ns0 = precise_time_ns();
-        let ns1 = precise_time_ns();
-        debug!("ns0={} ns", ns0);
-        debug!("ns1={} ns", ns1);
-        assert!(ns1 >= ns0);
-
-        let ns2 = precise_time_ns();
-        debug!("ns2={} ns", ns2);
-        assert!(ns2 >= ns1);
-    }
-
-    #[test]
-    fn test_precise_time_to() {
-        let t0 = PreciseTime(1000);
-        let t1 = PreciseTime(1023);
-        assert_eq!(Duration::nanoseconds(23), t0.to(t1));
-    }
-
-    #[test]
-    fn test_at_utc() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc = at_utc(time);
-
-        assert_eq!(utc.tm_sec, 30);
-        assert_eq!(utc.tm_min, 31);
-        assert_eq!(utc.tm_hour, 23);
-        assert_eq!(utc.tm_mday, 13);
-        assert_eq!(utc.tm_mon, 1);
-        assert_eq!(utc.tm_year, 109);
-        assert_eq!(utc.tm_wday, 5);
-        assert_eq!(utc.tm_yday, 43);
-        assert_eq!(utc.tm_isdst, 0);
-        assert_eq!(utc.tm_utcoff, 0);
-        assert_eq!(utc.tm_nsec, 54321);
-    }
-
-    #[test]
-    fn test_at() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let local = at(time);
-
-        debug!("time_at: {:?}", local);
-
-        assert_eq!(local.tm_sec, 30);
-        assert_eq!(local.tm_min, 31);
-        assert_eq!(local.tm_hour, 15);
-        assert_eq!(local.tm_mday, 13);
-        assert_eq!(local.tm_mon, 1);
-        assert_eq!(local.tm_year, 109);
-        assert_eq!(local.tm_wday, 5);
-        assert_eq!(local.tm_yday, 43);
-        assert_eq!(local.tm_isdst, 0);
-        assert_eq!(local.tm_utcoff, -28800);
-        assert_eq!(local.tm_nsec, 54321);
-    }
-
-    #[test]
-    fn test_to_timespec() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc = at_utc(time);
-
-        assert_eq!(utc.to_timespec(), time);
-        assert_eq!(utc.to_local().to_timespec(), time);
-    }
-
-    #[test]
-    fn test_conversions() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc = at_utc(time);
-        let local = at(time);
-
-        assert!(local.to_local() == local);
-        assert!(local.to_utc() == utc);
-        assert!(local.to_utc().to_local() == local);
-        assert!(utc.to_utc() == utc);
-        assert!(utc.to_local() == local);
-        assert!(utc.to_local().to_utc() == utc);
-    }
-
-    #[test]
-    fn test_strptime() {
-        let _reset = set_time_zone();
-
-        match strptime("", "") {
-            Ok(ref tm) => {
-                assert!(tm.tm_sec == 0);
-                assert!(tm.tm_min == 0);
-                assert!(tm.tm_hour == 0);
-                assert!(tm.tm_mday == 0);
-                assert!(tm.tm_mon == 0);
-                assert!(tm.tm_year == 0);
-                assert!(tm.tm_wday == 0);
-                assert!(tm.tm_isdst == 0);
-                assert!(tm.tm_utcoff == 0);
-                assert!(tm.tm_nsec == 0);
-            }
-            Err(_) => ()
-        }
-
-        let format = "%a %b %e %T.%f %Y";
-        assert_eq!(strptime("", format), Err(ParseError::InvalidDay));
-        assert_eq!(strptime("Fri Feb 13 15:31:30", format),
-                   Err(InvalidTime));
-
-        match strptime("Fri Feb 13 15:31:30.01234 2009", format) {
-            Err(e) => panic!("{}", e),
-            Ok(ref tm) => {
-                assert_eq!(tm.tm_sec, 30);
-                assert_eq!(tm.tm_min, 31);
-                assert_eq!(tm.tm_hour, 15);
-                assert_eq!(tm.tm_mday, 13);
-                assert_eq!(tm.tm_mon, 1);
-                assert_eq!(tm.tm_year, 109);
-                assert_eq!(tm.tm_wday, 5);
-                assert_eq!(tm.tm_yday, 0);
-                assert_eq!(tm.tm_isdst, 0);
-                assert_eq!(tm.tm_utcoff, 0);
-                assert_eq!(tm.tm_nsec, 12340000);
-            }
-        }
-
-        fn test(s: &str, format: &str) -> bool {
-            match strptime(s, format) {
-              Ok(tm) => {
-                tm.strftime(format).unwrap().to_string() == s.to_string()
-              },
-              Err(e) => panic!("{:?},  s={:?}, format={:?}", e, s, format)
-            }
-        }
-
-        fn test_oneway(s : &str, format : &str) -> bool {
-            match strptime(s, format) {
-              Ok(_) => {
-                // oneway tests are used when reformatting the parsed Tm
-                // back into a string can generate a different string
-                // from the original (i.e. leading zeroes)
-                true
-              },
-              Err(e) => panic!("{:?},  s={:?}, format={:?}", e, s, format)
-            }
-        }
-
-        let days = [
-            "Sunday".to_string(),
-            "Monday".to_string(),
-            "Tuesday".to_string(),
-            "Wednesday".to_string(),
-            "Thursday".to_string(),
-            "Friday".to_string(),
-            "Saturday".to_string()
-        ];
-        for day in days.iter() {
-            assert!(test(&day, "%A"));
-        }
-
-        let days = [
-            "Sun".to_string(),
-            "Mon".to_string(),
-            "Tue".to_string(),
-            "Wed".to_string(),
-            "Thu".to_string(),
-            "Fri".to_string(),
-            "Sat".to_string()
-        ];
-        for day in days.iter() {
-            assert!(test(&day, "%a"));
-        }
-
-        let months = [
-            "January".to_string(),
-            "February".to_string(),
-            "March".to_string(),
-            "April".to_string(),
-            "May".to_string(),
-            "June".to_string(),
-            "July".to_string(),
-            "August".to_string(),
-            "September".to_string(),
-            "October".to_string(),
-            "November".to_string(),
-            "December".to_string()
-        ];
-        for day in months.iter() {
-            assert!(test(&day, "%B"));
-        }
-
-        let months = [
-            "Jan".to_string(),
-            "Feb".to_string(),
-            "Mar".to_string(),
-            "Apr".to_string(),
-            "May".to_string(),
-            "Jun".to_string(),
-            "Jul".to_string(),
-            "Aug".to_string(),
-            "Sep".to_string(),
-            "Oct".to_string(),
-            "Nov".to_string(),
-            "Dec".to_string()
-        ];
-        for day in months.iter() {
-            assert!(test(&day, "%b"));
-        }
-
-        assert!(test("19", "%C"));
-        assert!(test("Fri Feb  3 23:31:30 2009", "%c"));
-        assert!(test("Fri Feb 13 23:31:30 2009", "%c"));
-        assert!(test("02/13/09", "%D"));
-        assert!(test("03", "%d"));
-        assert!(test("13", "%d"));
-        assert!(test(" 3", "%e"));
-        assert!(test("13", "%e"));
-        assert!(test("2009-02-13", "%F"));
-        assert!(test("03", "%H"));
-        assert!(test("13", "%H"));
-        assert!(test("03", "%I")); // FIXME (#2350): flesh out
-        assert!(test("11", "%I")); // FIXME (#2350): flesh out
-        assert!(test("044", "%j"));
-        assert!(test(" 3", "%k"));
-        assert!(test("13", "%k"));
-        assert!(test(" 1", "%l"));
-        assert!(test("11", "%l"));
-        assert!(test("03", "%M"));
-        assert!(test("13", "%M"));
-        assert!(test("\n", "%n"));
-        assert!(test("am", "%P"));
-        assert!(test("pm", "%P"));
-        assert!(test("AM", "%p"));
-        assert!(test("PM", "%p"));
-        assert!(test("23:31", "%R"));
-        assert!(test("11:31:30 AM", "%r"));
-        assert!(test("11:31:30 PM", "%r"));
-        assert!(test("03", "%S"));
-        assert!(test("13", "%S"));
-        assert!(test("15:31:30", "%T"));
-        assert!(test("\t", "%t"));
-        assert!(test("1", "%u"));
-        assert!(test("7", "%u"));
-        assert!(test("13-Feb-2009", "%v"));
-        assert!(test("0", "%w"));
-        assert!(test("6", "%w"));
-        assert!(test("2009", "%Y"));
-        assert!(test("09", "%y"));
-
-        assert!(test_oneway("3",  "%d"));
-        assert!(test_oneway("3",  "%H"));
-        assert!(test_oneway("3",  "%e"));
-        assert!(test_oneway("3",  "%M"));
-        assert!(test_oneway("3",  "%S"));
-
-        assert!(strptime("-0000", "%z").unwrap().tm_utcoff == 0);
-        assert!(strptime("-00:00", "%z").unwrap().tm_utcoff == 0);
-        assert!(strptime("Z", "%z").unwrap().tm_utcoff == 0);
-        assert_eq!(-28800, strptime("-0800", "%z").unwrap().tm_utcoff);
-        assert_eq!(-28800, strptime("-08:00", "%z").unwrap().tm_utcoff);
-        assert_eq!(28800, strptime("+0800", "%z").unwrap().tm_utcoff);
-        assert_eq!(28800, strptime("+08:00", "%z").unwrap().tm_utcoff);
-        assert_eq!(5400, strptime("+0130", "%z").unwrap().tm_utcoff);
-        assert_eq!(5400, strptime("+01:30", "%z").unwrap().tm_utcoff);
-        assert!(test("%", "%%"));
-
-        // Test for #7256
-        assert_eq!(strptime("360", "%Y-%m-%d"), Err(InvalidYear));
-
-        // Test for epoch seconds parsing
-        {
-            assert!(test("1428035610", "%s"));
-            let tm = strptime("1428035610", "%s").unwrap();
-            assert_eq!(tm.tm_utcoff, 0);
-            assert_eq!(tm.tm_isdst, 0);
-            assert_eq!(tm.tm_yday, 92);
-            assert_eq!(tm.tm_wday, 5);
-            assert_eq!(tm.tm_year, 115);
-            assert_eq!(tm.tm_mon, 3);
-            assert_eq!(tm.tm_mday, 3);
-            assert_eq!(tm.tm_hour, 4);
-        }
-    }
-
-    #[test]
-    fn test_asctime() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc   = at_utc(time);
-        let local = at(time);
-
-        debug!("test_ctime: {} {}", utc.asctime(), local.asctime());
-
-        assert_eq!(utc.asctime().to_string(), "Fri Feb 13 23:31:30 2009".to_string());
-        assert_eq!(local.asctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-    }
-
-    #[test]
-    fn test_ctime() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc   = at_utc(time);
-        let local = at(time);
-
-        debug!("test_ctime: {} {}", utc.ctime(), local.ctime());
-
-        assert_eq!(utc.ctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-        assert_eq!(local.ctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-    }
-
-    #[test]
-    fn test_strftime() {
-        let _reset = set_time_zone();
-
-        let time = Timespec::new(1234567890, 54321);
-        let utc = at_utc(time);
-        let local = at(time);
-
-        assert_eq!(local.strftime("").unwrap().to_string(), "".to_string());
-        assert_eq!(local.strftime("%A").unwrap().to_string(), "Friday".to_string());
-        assert_eq!(local.strftime("%a").unwrap().to_string(), "Fri".to_string());
-        assert_eq!(local.strftime("%B").unwrap().to_string(), "February".to_string());
-        assert_eq!(local.strftime("%b").unwrap().to_string(), "Feb".to_string());
-        assert_eq!(local.strftime("%C").unwrap().to_string(), "20".to_string());
-        assert_eq!(local.strftime("%c").unwrap().to_string(),
-                   "Fri Feb 13 15:31:30 2009".to_string());
-        assert_eq!(local.strftime("%D").unwrap().to_string(), "02/13/09".to_string());
-        assert_eq!(local.strftime("%d").unwrap().to_string(), "13".to_string());
-        assert_eq!(local.strftime("%e").unwrap().to_string(), "13".to_string());
-        assert_eq!(local.strftime("%F").unwrap().to_string(), "2009-02-13".to_string());
-        assert_eq!(local.strftime("%f").unwrap().to_string(), "000054321".to_string());
-        assert_eq!(local.strftime("%G").unwrap().to_string(), "2009".to_string());
-        assert_eq!(local.strftime("%g").unwrap().to_string(), "09".to_string());
-        assert_eq!(local.strftime("%H").unwrap().to_string(), "15".to_string());
-        assert_eq!(local.strftime("%h").unwrap().to_string(), "Feb".to_string());
-        assert_eq!(local.strftime("%I").unwrap().to_string(), "03".to_string());
-        assert_eq!(local.strftime("%j").unwrap().to_string(), "044".to_string());
-        assert_eq!(local.strftime("%k").unwrap().to_string(), "15".to_string());
-        assert_eq!(local.strftime("%l").unwrap().to_string(), " 3".to_string());
-        assert_eq!(local.strftime("%M").unwrap().to_string(), "31".to_string());
-        assert_eq!(local.strftime("%m").unwrap().to_string(), "02".to_string());
-        assert_eq!(local.strftime("%n").unwrap().to_string(), "\n".to_string());
-        assert_eq!(local.strftime("%P").unwrap().to_string(), "pm".to_string());
-        assert_eq!(local.strftime("%p").unwrap().to_string(), "PM".to_string());
-        assert_eq!(local.strftime("%R").unwrap().to_string(), "15:31".to_string());
-        assert_eq!(local.strftime("%r").unwrap().to_string(), "03:31:30 PM".to_string());
-        assert_eq!(local.strftime("%S").unwrap().to_string(), "30".to_string());
-        assert_eq!(local.strftime("%s").unwrap().to_string(), "1234567890".to_string());
-        assert_eq!(local.strftime("%T").unwrap().to_string(), "15:31:30".to_string());
-        assert_eq!(local.strftime("%t").unwrap().to_string(), "\t".to_string());
-        assert_eq!(local.strftime("%U").unwrap().to_string(), "06".to_string());
-        assert_eq!(local.strftime("%u").unwrap().to_string(), "5".to_string());
-        assert_eq!(local.strftime("%V").unwrap().to_string(), "07".to_string());
-        assert_eq!(local.strftime("%v").unwrap().to_string(), "13-Feb-2009".to_string());
-        assert_eq!(local.strftime("%W").unwrap().to_string(), "06".to_string());
-        assert_eq!(local.strftime("%w").unwrap().to_string(), "5".to_string());
-        // FIXME (#2350): support locale
-        assert_eq!(local.strftime("%X").unwrap().to_string(), "15:31:30".to_string());
-        // FIXME (#2350): support locale
-        assert_eq!(local.strftime("%x").unwrap().to_string(), "02/13/09".to_string());
-        assert_eq!(local.strftime("%Y").unwrap().to_string(), "2009".to_string());
-        assert_eq!(local.strftime("%y").unwrap().to_string(), "09".to_string());
-        // FIXME (#2350): support locale
-        assert_eq!(local.strftime("%Z").unwrap().to_string(), "".to_string());
-        assert_eq!(local.strftime("%z").unwrap().to_string(), "-0800".to_string());
-        assert_eq!(local.strftime("%+").unwrap().to_string(),
-                   "2009-02-13T15:31:30-08:00".to_string());
-        assert_eq!(local.strftime("%%").unwrap().to_string(), "%".to_string());
-
-         let invalid_specifiers = ["%E", "%J", "%K", "%L", "%N", "%O", "%o", "%Q", "%q"];
-        for &sp in invalid_specifiers.iter() {
-            assert_eq!(local.strftime(sp).unwrap_err(),
-                       InvalidFormatSpecifier(sp[1..].chars().next().unwrap()));
-        }
-        assert_eq!(local.strftime("%").unwrap_err(), MissingFormatConverter);
-        assert_eq!(local.strftime("%A %").unwrap_err(), MissingFormatConverter);
-
-        assert_eq!(local.asctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-        assert_eq!(local.ctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-        assert_eq!(local.rfc822z().to_string(), "Fri, 13 Feb 2009 15:31:30 -0800".to_string());
-        assert_eq!(local.rfc3339().to_string(), "2009-02-13T15:31:30-08:00".to_string());
-
-        assert_eq!(utc.asctime().to_string(), "Fri Feb 13 23:31:30 2009".to_string());
-        assert_eq!(utc.ctime().to_string(), "Fri Feb 13 15:31:30 2009".to_string());
-        assert_eq!(utc.rfc822().to_string(), "Fri, 13 Feb 2009 23:31:30 GMT".to_string());
-        assert_eq!(utc.rfc822z().to_string(), "Fri, 13 Feb 2009 23:31:30 -0000".to_string());
-        assert_eq!(utc.rfc3339().to_string(), "2009-02-13T23:31:30Z".to_string());
-    }
-
-    #[test]
-    fn test_timespec_eq_ord() {
-        let a = &Timespec::new(-2, 1);
-        let b = &Timespec::new(-1, 2);
-        let c = &Timespec::new(1, 2);
-        let d = &Timespec::new(2, 1);
-        let e = &Timespec::new(2, 1);
-
-        assert!(d.eq(e));
-        assert!(c.ne(e));
-
-        assert!(a.lt(b));
-        assert!(b.lt(c));
-        assert!(c.lt(d));
-
-        assert!(a.le(b));
-        assert!(b.le(c));
-        assert!(c.le(d));
-        assert!(d.le(e));
-        assert!(e.le(d));
-
-        assert!(b.ge(a));
-        assert!(c.ge(b));
-        assert!(d.ge(c));
-        assert!(e.ge(d));
-        assert!(d.ge(e));
-
-        assert!(b.gt(a));
-        assert!(c.gt(b));
-        assert!(d.gt(c));
-    }
-
-    #[test]
-    #[allow(deprecated)]
-    fn test_timespec_hash() {
-        use std::hash::{Hash, Hasher};
-
-        let c = &Timespec::new(3, 2);
-        let d = &Timespec::new(2, 1);
-        let e = &Timespec::new(2, 1);
-
-        let mut hasher = ::std::hash::SipHasher::new();
-
-        let d_hash:u64 = {
-          d.hash(&mut hasher);
-          hasher.finish()
-        };
-
-        hasher = ::std::hash::SipHasher::new();
-
-        let e_hash:u64 = {
-          e.hash(&mut hasher);
-          hasher.finish()
-        };
-
-        hasher = ::std::hash::SipHasher::new();
-
-        let c_hash:u64 = {
-          c.hash(&mut hasher);
-          hasher.finish()
-        };
-
-        assert_eq!(d_hash, e_hash);
-        assert!(c_hash != e_hash);
-    }
-
-    #[test]
-    fn test_timespec_add() {
-        let a = Timespec::new(1, 2);
-        let b = Duration::seconds(2) + Duration::nanoseconds(3);
-        let c = a + b;
-        assert_eq!(c.sec, 3);
-        assert_eq!(c.nsec, 5);
-
-        let p = Timespec::new(1, super::NSEC_PER_SEC - 2);
-        let q = Duration::seconds(2) + Duration::nanoseconds(2);
-        let r = p + q;
-        assert_eq!(r.sec, 4);
-        assert_eq!(r.nsec, 0);
-
-        let u = Timespec::new(1, super::NSEC_PER_SEC - 2);
-        let v = Duration::seconds(2) + Duration::nanoseconds(3);
-        let w = u + v;
-        assert_eq!(w.sec, 4);
-        assert_eq!(w.nsec, 1);
-
-        let k = Timespec::new(1, 0);
-        let l = Duration::nanoseconds(-1);
-        let m = k + l;
-        assert_eq!(m.sec, 0);
-        assert_eq!(m.nsec, 999_999_999);
-    }
-
-    #[test]
-    fn test_timespec_sub() {
-        let a = Timespec::new(2, 3);
-        let b = Timespec::new(1, 2);
-        let c = a - b;
-        assert_eq!(c.num_nanoseconds(), Some(super::NSEC_PER_SEC as i64 + 1));
-
-        let p = Timespec::new(2, 0);
-        let q = Timespec::new(1, 2);
-        let r = p - q;
-        assert_eq!(r.num_nanoseconds(), Some(super::NSEC_PER_SEC as i64 - 2));
-
-        let u = Timespec::new(1, 2);
-        let v = Timespec::new(2, 3);
-        let w = u - v;
-        assert_eq!(w.num_nanoseconds(), Some(-super::NSEC_PER_SEC as i64 - 1));
-    }
-
-    #[test]
-    fn test_time_sub() {
-        let a = ::now();
-        let b = at(a.to_timespec() + Duration::seconds(5));
-        let c = b - a;
-        assert_eq!(c.num_nanoseconds(), Some(super::NSEC_PER_SEC as i64 * 5));
-    }
-
-    #[test]
-    fn test_steadytime_sub() {
-        let a = SteadyTime::now();
-        let b = a + Duration::seconds(1);
-        assert_eq!(b - a, Duration::seconds(1));
-        assert_eq!(a - b, Duration::seconds(-1));
-    }
-
-    #[test]
-    fn test_date_before_1970() {
-        let early = strptime("1901-01-06", "%F").unwrap();
-        let late = strptime("2000-01-01", "%F").unwrap();
-        assert!(early < late);
-    }
-
-    #[test]
-    fn test_dst() {
-        let _reset = set_time_zone_london_dst();
-        let utc_in_feb = strptime("2015-02-01Z", "%F%z").unwrap();
-        let utc_in_jun = strptime("2015-06-01Z", "%F%z").unwrap();
-        let utc_in_nov = strptime("2015-11-01Z", "%F%z").unwrap();
-        let local_in_feb = utc_in_feb.to_local();
-        let local_in_jun = utc_in_jun.to_local();
-        let local_in_nov = utc_in_nov.to_local();
-
-        assert_eq!(local_in_feb.tm_mon, 1);
-        assert_eq!(local_in_feb.tm_hour, 0);
-        assert_eq!(local_in_feb.tm_utcoff, 0);
-        assert_eq!(local_in_feb.tm_isdst, 0);
-
-        assert_eq!(local_in_jun.tm_mon, 5);
-        assert_eq!(local_in_jun.tm_hour, 1);
-        assert_eq!(local_in_jun.tm_utcoff, 3600);
-        assert_eq!(local_in_jun.tm_isdst, 1);
-
-        assert_eq!(local_in_nov.tm_mon, 10);
-        assert_eq!(local_in_nov.tm_hour, 0);
-        assert_eq!(local_in_nov.tm_utcoff, 0);
-        assert_eq!(local_in_nov.tm_isdst, 0)
-    }
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/src/parse.rs
+++ /dev/null
@@ -1,394 +0,0 @@
-use super::{Timespec, Tm, at_utc, ParseError, NSEC_PER_SEC};
-
-/// Parses the time from the string according to the format string.
-pub fn strptime(mut s: &str, format: &str) -> Result<Tm, ParseError> {
-    let mut tm = Tm {
-        tm_sec: 0,
-        tm_min: 0,
-        tm_hour: 0,
-        tm_mday: 0,
-        tm_mon: 0,
-        tm_year: 0,
-        tm_wday: 0,
-        tm_yday: 0,
-        tm_isdst: 0,
-        tm_utcoff: 0,
-        tm_nsec: 0,
-    };
-    let mut chars = format.chars();
-
-    while let Some(ch) = chars.next() {
-        if ch == '%' {
-            if let Some(ch) = chars.next() {
-                try!(parse_type(&mut s, ch, &mut tm));
-            }
-        } else {
-            try!(parse_char(&mut s, ch));
-        }
-    }
-
-    Ok(tm)
-}
-
-fn parse_type(s: &mut &str, ch: char, tm: &mut Tm) -> Result<(), ParseError> {
-    match ch {
-        'A' => match match_strs(s, &[("Sunday", 0),
-                                     ("Monday", 1),
-                                     ("Tuesday", 2),
-                                     ("Wednesday", 3),
-                                     ("Thursday", 4),
-                                     ("Friday", 5),
-                                     ("Saturday", 6)]) {
-            Some(v) => { tm.tm_wday = v; Ok(()) }
-            None => Err(ParseError::InvalidDay)
-        },
-        'a' => match match_strs(s, &[("Sun", 0),
-                                     ("Mon", 1),
-                                     ("Tue", 2),
-                                     ("Wed", 3),
-                                     ("Thu", 4),
-                                     ("Fri", 5),
-                                     ("Sat", 6)]) {
-            Some(v) => { tm.tm_wday = v; Ok(()) }
-            None => Err(ParseError::InvalidDay)
-        },
-        'B' => match match_strs(s, &[("January", 0),
-                                     ("February", 1),
-                                     ("March", 2),
-                                     ("April", 3),
-                                     ("May", 4),
-                                     ("June", 5),
-                                     ("July", 6),
-                                     ("August", 7),
-                                     ("September", 8),
-                                     ("October", 9),
-                                     ("November", 10),
-                                     ("December", 11)]) {
-            Some(v) => { tm.tm_mon = v; Ok(()) }
-            None => Err(ParseError::InvalidMonth)
-        },
-        'b' | 'h' => match match_strs(s, &[("Jan", 0),
-                                           ("Feb", 1),
-                                           ("Mar", 2),
-                                           ("Apr", 3),
-                                           ("May", 4),
-                                           ("Jun", 5),
-                                           ("Jul", 6),
-                                           ("Aug", 7),
-                                           ("Sep", 8),
-                                           ("Oct", 9),
-                                           ("Nov", 10),
-                                           ("Dec", 11)]) {
-            Some(v) => { tm.tm_mon = v; Ok(()) }
-            None => Err(ParseError::InvalidMonth)
-        },
-        'C' => match match_digits_in_range(s, 1, 2, false, 0, 99) {
-            Some(v) => { tm.tm_year += (v * 100) - 1900; Ok(()) }
-            None => Err(ParseError::InvalidYear)
-        },
-        'c' => {
-            parse_type(s, 'a', tm)
-                .and_then(|()| parse_char(s, ' '))
-                .and_then(|()| parse_type(s, 'b', tm))
-                .and_then(|()| parse_char(s, ' '))
-                .and_then(|()| parse_type(s, 'e', tm))
-                .and_then(|()| parse_char(s, ' '))
-                .and_then(|()| parse_type(s, 'T', tm))
-                .and_then(|()| parse_char(s, ' '))
-                .and_then(|()| parse_type(s, 'Y', tm))
-        }
-        'D' | 'x' => {
-            parse_type(s, 'm', tm)
-                .and_then(|()| parse_char(s, '/'))
-                .and_then(|()| parse_type(s, 'd', tm))
-                .and_then(|()| parse_char(s, '/'))
-                .and_then(|()| parse_type(s, 'y', tm))
-        }
-        'd' => match match_digits_in_range(s, 1, 2, false, 1, 31) {
-            Some(v) => { tm.tm_mday = v; Ok(()) }
-            None => Err(ParseError::InvalidDayOfMonth)
-        },
-        'e' => match match_digits_in_range(s, 1, 2, true, 1, 31) {
-            Some(v) => { tm.tm_mday = v; Ok(()) }
-            None => Err(ParseError::InvalidDayOfMonth)
-        },
-        'f' => {
-            tm.tm_nsec = match_fractional_seconds(s);
-            Ok(())
-        }
-        'F' => {
-            parse_type(s, 'Y', tm)
-                .and_then(|()| parse_char(s, '-'))
-                .and_then(|()| parse_type(s, 'm', tm))
-                .and_then(|()| parse_char(s, '-'))
-                .and_then(|()| parse_type(s, 'd', tm))
-        }
-        'H' => {
-            match match_digits_in_range(s, 1, 2, false, 0, 23) {
-                Some(v) => { tm.tm_hour = v; Ok(()) }
-                None => Err(ParseError::InvalidHour)
-            }
-        }
-        'I' => {
-            match match_digits_in_range(s, 1, 2, false, 1, 12) {
-                Some(v) => { tm.tm_hour = if v == 12 { 0 } else { v }; Ok(()) }
-                None => Err(ParseError::InvalidHour)
-            }
-        }
-        'j' => {
-            match match_digits_in_range(s, 1, 3, false, 1, 366) {
-                Some(v) => { tm.tm_yday = v - 1; Ok(()) }
-                None => Err(ParseError::InvalidDayOfYear)
-            }
-        }
-        'k' => {
-            match match_digits_in_range(s, 1, 2, true, 0, 23) {
-                Some(v) => { tm.tm_hour = v; Ok(()) }
-                None => Err(ParseError::InvalidHour)
-            }
-        }
-        'l' => {
-            match match_digits_in_range(s, 1, 2, true, 1, 12) {
-                Some(v) => { tm.tm_hour = if v == 12 { 0 } else { v }; Ok(()) }
-                None => Err(ParseError::InvalidHour)
-            }
-        }
-        'M' => {
-            match match_digits_in_range(s, 1, 2, false, 0, 59) {
-                Some(v) => { tm.tm_min = v; Ok(()) }
-                None => Err(ParseError::InvalidMinute)
-            }
-        }
-        'm' => {
-            match match_digits_in_range(s, 1, 2, false, 1, 12) {
-                Some(v) => { tm.tm_mon = v - 1; Ok(()) }
-                None => Err(ParseError::InvalidMonth)
-            }
-        }
-        'n' => parse_char(s, '\n'),
-        'P' => match match_strs(s, &[("am", 0), ("pm", 12)]) {
-            Some(v) => { tm.tm_hour += v; Ok(()) }
-            None => Err(ParseError::InvalidHour)
-        },
-        'p' => match match_strs(s, &[("AM", 0), ("PM", 12)]) {
-            Some(v) => { tm.tm_hour += v; Ok(()) }
-            None => Err(ParseError::InvalidHour)
-        },
-        'R' => {
-            parse_type(s, 'H', tm)
-                .and_then(|()| parse_char(s, ':'))
-                .and_then(|()| parse_type(s, 'M', tm))
-        }
-        'r' => {
-            parse_type(s, 'I', tm)
-                .and_then(|()| parse_char(s, ':'))
-                .and_then(|()| parse_type(s, 'M', tm))
-                .and_then(|()| parse_char(s, ':'))
-                .and_then(|()| parse_type(s, 'S', tm))
-                .and_then(|()| parse_char(s, ' '))
-                .and_then(|()| parse_type(s, 'p', tm))
-        }
-        's' => {
-            match match_digits_i64(s, 1, 18, false) {
-                Some(v) => {
-                    *tm = at_utc(Timespec::new(v, 0));
-                    Ok(())
-                },
-                None => Err(ParseError::InvalidSecondsSinceEpoch)
-            }
-        }
-        'S' => {
-            match match_digits_in_range(s, 1, 2, false, 0, 60) {
-                Some(v) => { tm.tm_sec = v; Ok(()) }
-                None => Err(ParseError::InvalidSecond)
-            }
-        }
-        //'s' {}
-        'T' | 'X' => {
-            parse_type(s, 'H', tm)
-                .and_then(|()| parse_char(s, ':'))
-                .and_then(|()| parse_type(s, 'M', tm))
-                .and_then(|()| parse_char(s, ':'))
-                .and_then(|()| parse_type(s, 'S', tm))
-        }
-        't' => parse_char(s, '\t'),
-        'u' => {
-            match match_digits_in_range(s, 1, 1, false, 1, 7) {
-                Some(v) => { tm.tm_wday = if v == 7 { 0 } else { v }; Ok(()) }
-                None => Err(ParseError::InvalidDayOfWeek)
-            }
-        }
-        'v' => {
-            parse_type(s, 'e', tm)
-                .and_then(|()| parse_char(s, '-'))
-                .and_then(|()| parse_type(s, 'b', tm))
-                .and_then(|()| parse_char(s, '-'))
-                .and_then(|()| parse_type(s, 'Y', tm))
-        }
-        //'W' {}
-        'w' => {
-            match match_digits_in_range(s, 1, 1, false, 0, 6) {
-                Some(v) => { tm.tm_wday = v; Ok(()) }
-                None => Err(ParseError::InvalidDayOfWeek)
-            }
-        }
-        'Y' => {
-            match match_digits(s, 4, 4, false) {
-                Some(v) => { tm.tm_year = v - 1900; Ok(()) }
-                None => Err(ParseError::InvalidYear)
-            }
-        }
-        'y' => {
-            match match_digits_in_range(s, 1, 2, false, 0, 99) {
-                Some(v) => { tm.tm_year = v; Ok(()) }
-                None => Err(ParseError::InvalidYear)
-            }
-        }
-        'Z' => {
-            if match_str(s, "UTC") || match_str(s, "GMT") {
-                tm.tm_utcoff = 0;
-                Ok(())
-            } else {
-                // It's odd, but to maintain compatibility with c's
-                // strptime we ignore the timezone.
-                for (i, ch) in s.char_indices() {
-                    if ch == ' ' {
-                        *s = &s[i..];
-                        return Ok(())
-                    }
-                }
-                *s = "";
-                Ok(())
-            }
-        }
-        'z' => {
-            if parse_char(s, 'Z').is_ok() {
-                tm.tm_utcoff = 0;
-                Ok(())
-            } else {
-                let sign = if parse_char(s, '+').is_ok() {1}
-                           else if parse_char(s, '-').is_ok() {-1}
-                           else { return Err(ParseError::InvalidZoneOffset) };
-
-                let hours;
-                let minutes;
-
-                match match_digits(s, 2, 2, false) {
-                    Some(h) => hours = h,
-                    None => return Err(ParseError::InvalidZoneOffset)
-                }
-
-                // consume the colon if its present,
-                // just ignore it otherwise
-                let _ = parse_char(s, ':');
-
-                match match_digits(s, 2, 2, false) {
-                    Some(m) => minutes = m,
-                    None => return Err(ParseError::InvalidZoneOffset)
-                }
-
-                tm.tm_utcoff = sign * (hours * 60 * 60 + minutes * 60);
-                Ok(())
-            }
-        }
-        '%' => parse_char(s, '%'),
-        ch => Err(ParseError::InvalidFormatSpecifier(ch))
-    }
-}
-
-
-fn match_str(s: &mut &str, needle: &str) -> bool {
-    if s.starts_with(needle) {
-        *s = &s[needle.len()..];
-        true
-    } else {
-        false
-    }
-}
-
-fn match_strs(ss: &mut &str, strs: &[(&str, i32)]) -> Option<i32> {
-    for &(needle, value) in strs.iter() {
-        if match_str(ss, needle) {
-            return Some(value)
-        }
-    }
-    None
-}
-
-fn match_digits(ss: &mut &str, min_digits : usize, max_digits: usize, ws: bool) -> Option<i32> {
-    match match_digits_i64(ss, min_digits, max_digits, ws) {
-        Some(v) => Some(v as i32),
-        None => None
-    }
-}
-
-fn match_digits_i64(ss: &mut &str, min_digits : usize, max_digits: usize, ws: bool) -> Option<i64> {
-    let mut value : i64 = 0;
-    let mut n = 0;
-    if ws {
-        let s2 = ss.trim_left_matches(" ");
-        n = ss.len() - s2.len();
-        if n > max_digits { return None }
-    }
-    let chars = ss[n..].char_indices();
-    for (_, ch) in chars.take(max_digits - n) {
-        match ch {
-            '0' ... '9' => value = value * 10 + (ch as i64 - '0' as i64),
-            _ => break,
-        }
-        n += 1;
-    }
-
-    if n >= min_digits && n <= max_digits {
-        *ss = &ss[n..];
-        Some(value)
-    } else {
-        None
-    }
-}
-
-fn match_fractional_seconds(ss: &mut &str) -> i32 {
-    let mut value = 0;
-    let mut multiplier = NSEC_PER_SEC / 10;
-
-    let mut chars = ss.char_indices();
-    let orig = *ss;
-    for (i, ch) in &mut chars {
-        *ss = &orig[i..];
-        match ch {
-            '0' ... '9' => {
-                // This will drop digits after the nanoseconds place
-                let digit = ch as i32 - '0' as i32;
-                value += digit * multiplier;
-                multiplier /= 10;
-            }
-            _ => break
-        }
-    }
-
-    value
-}
-
-fn match_digits_in_range(ss: &mut &str,
-                         min_digits : usize, max_digits : usize,
-                         ws: bool, min: i32, max: i32) -> Option<i32> {
-    let before = *ss;
-    match match_digits(ss, min_digits, max_digits, ws) {
-        Some(val) if val >= min && val <= max => Some(val),
-        _ => { *ss = before; None }
-    }
-}
-
-fn parse_char(s: &mut &str, c: char) -> Result<(), ParseError> {
-    match s.char_indices().next() {
-        Some((i, c2)) => {
-            if c == c2 {
-                *s = &s[i + c2.len_utf8()..];
-                Ok(())
-            } else {
-                Err(ParseError::UnexpectedCharacter(c, c2))
-            }
-        }
-        None => Err(ParseError::InvalidTime),
-    }
-}
deleted file mode 100644
--- a/third_party/rust/time-0.1.36/src/sys.rs
+++ /dev/null
@@ -1,841 +0,0 @@
-#![allow(bad_style)]
-
-pub use self::inner::*;
-
-#[cfg(target_os = "redox")]
-mod inner {
-    use std::fmt;
-    use std::cmp::Ordering;
-    use std::ops::{Add, Sub};
-    use syscall;
-
-    use Duration;
-    use Tm;
-
-    fn time_to_tm(ts: i64, tm: &mut Tm) {
-        let leapyear = |year| -> bool {
-            year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
-        };
-
-        static _ytab: [[i64; 12]; 2] = [
-            [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ],
-            [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
-        ];
-
-        let mut year = 1970;
-
-        let dayclock = ts % 86400;
-        let mut dayno = ts / 86400;
-
-        tm.tm_sec = (dayclock % 60) as i32;
-        tm.tm_min = ((dayclock % 3600) / 60) as i32;
-        tm.tm_hour = (dayclock / 3600) as i32;
-        tm.tm_wday = ((dayno + 4) % 7) as i32;
-        loop {
-            let yearsize = if leapyear(year) {
-                366
-            } else {
-                365
-            };
-            if dayno >= yearsize {
-                    dayno -= yearsize;
-                    year += 1;
-            } else {
-                break;
-            }
-        }
-        tm.tm_year = (year - 1900) as i32;
-        tm.tm_yday = dayno as i32;
-        let mut mon = 0;
-        while dayno >= _ytab[if leapyear(year) { 1 } else { 0 }][mon] {
-                dayno -= _ytab[if leapyear(year) { 1 } else { 0 }][mon];
-                mon += 1;
-        }
-        tm.tm_mon = mon as i32;
-        tm.tm_mday = dayno as i32 + 1;
-        tm.tm_isdst = 0;
-    }
-
-    fn tm_to_time(tm: &Tm) -> i64 {
-        let mut y = tm.tm_year as i64 + 1900;
-        let mut m = tm.tm_mon as i64 + 1;
-        if m <= 2 {
-            y -= 1;
-            m += 12;
-        }
-        let d = tm.tm_mday as i64;
-        let h = tm.tm_hour as i64;
-        let mi = tm.tm_min as i64;
-        let s = tm.tm_sec as i64;
-        (365*y + y/4 - y/100 + y/400 + 3*(m+1)/5 + 30*m + d - 719561)
-            * 86400 + 3600 * h + 60 * mi + s
-    }
-
-    pub fn time_to_utc_tm(sec: i64, tm: &mut Tm) {
-        time_to_tm(sec, tm);
-    }
-
-    pub fn time_to_local_tm(sec: i64, tm: &mut Tm) {
-        // FIXME: Add timezone logic
-        time_to_tm(sec, tm);
-    }
-
-    pub fn utc_tm_to_time(tm: &Tm) -> i64 {
-        tm_to_time(tm)
-    }
-
-    pub fn local_tm_to_time(tm: &Tm) -> i64 {
-        // FIXME: Add timezone logic
-        tm_to_time(tm)
-    }
-
-    pub fn get_time() -> (i64, i32) {
-        let mut tv = syscall::TimeSpec { tv_sec: 0, tv_nsec: 0 };
-        syscall::clock_gettime(syscall::CLOCK_REALTIME, &mut tv).unwrap();
-        (tv.tv_sec as i64, tv.tv_nsec as i32)
-    }
-
-    pub fn get_precise_ns() -> u64 {
-        let mut ts = syscall::TimeSpec { tv_sec: 0, tv_nsec: 0 };
-        syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut ts).unwrap();
-        (ts.tv_sec as u64) * 1000000000 + (ts.tv_nsec as u64)
-    }
-
-    #[derive(Copy)]
-    pub struct SteadyTime {
-        t: syscall::TimeSpec,
-    }
-
-    impl fmt::Debug for SteadyTime {
-        fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-            write!(fmt, "SteadyTime {{ tv_sec: {:?}, tv_nsec: {:?} }}",
-                   self.t.tv_sec, self.t.tv_nsec)
-        }
-    }
-
-    impl Clone for SteadyTime {
-        fn clone(&self) -> SteadyTime {
-            SteadyTime { t: self.t }
-        }
-    }
-
-    impl SteadyTime {
-        pub fn now() -> SteadyTime {
-            let mut t = SteadyTime {
-                t: syscall::TimeSpec {
-                    tv_sec: 0,
-                    tv_nsec: 0,
-                }
-            };
-            syscall::clock_gettime(syscall::CLOCK_MONOTONIC, &mut t.t).unwrap();
-            t
-        }
-    }
-
-    impl Sub for SteadyTime {
-        type Output = Duration;
-        fn sub(self, other: SteadyTime) -> Duration {
-            if self.t.tv_nsec >= other.t.tv_nsec {
-                Duration::seconds(self.t.tv_sec as i64 - other.t.tv_sec as i64) +
-                    Duration::nanoseconds(self.t.tv_nsec as i64 - other.t.tv_nsec as i64)
-            } else {
-                Duration::seconds(self.t.tv_sec as i64 - 1 - other.t.tv_sec as i64) +
-                    Duration::nanoseconds(self.t.tv_nsec as i64 + ::NSEC_PER_SEC as i64 -
-                                          other.t.tv_nsec as i64)
-            }
-        }
-    }
-
-    impl Sub<Duration> for SteadyTime {
-        type Output = SteadyTime;
-        fn sub(self, other: Duration) -> SteadyTime {
-            self + -other
-        }
-    }
-
-    impl Add<Duration> for SteadyTime {
-        type Output = SteadyTime;
-        fn add(mut self, other: Duration) -> SteadyTime {
-            let seconds = other.num_seconds();
-            let nanoseconds = other - Duration::seconds(seconds);
-            let nanoseconds = nanoseconds.num_nanoseconds().unwrap();
-            self.t.tv_sec += seconds;
-            self.t.tv_nsec += nanoseconds as i32;
-            if self.t.tv_nsec >= ::NSEC_PER_SEC {
-                self.t.tv_nsec -= ::NSEC_PER_SEC;
-                self.t.tv_sec += 1;
-            } else if self.t.tv_nsec < 0 {
-                self.t.tv_sec -= 1;
-                self.t.tv_nsec += ::NSEC_PER_SEC;
-            }
-            self
-        }
-    }
-
-    impl PartialOrd for SteadyTime {
-        fn partial_cmp(&self, other: &SteadyTime) -> Option<Ordering> {
-            Some(self.cmp(other))
-        }
-    }
-
-    impl Ord for SteadyTime {
-        fn cmp(&self, other: &SteadyTime) -> Ordering {
-            match self.t.tv_sec.cmp(&other.t.tv_sec) {
-                Ordering::Equal => self.t.tv_nsec.cmp(&other.t.tv_nsec),
-                ord => ord
-            }
-        }
-    }
-
-    impl PartialEq for SteadyTime {
-        fn eq(&self, other: &SteadyTime) -> bool {
-            self.t.tv_sec == other.t.tv_sec &&
-                self.t.tv_nsec == other.t.tv_nsec
-        }
-    }
-
-    impl Eq for SteadyTime {}
-}
-
-#[cfg(unix)]
-mod inner {
-    use libc::{self, time_t};
-    use std::mem;
-    use std::io;
-    use Tm;
-
-    #[cfg(any(target_os = "macos", target_os = "ios"))]
-    pub use self::mac::*;
-    #[cfg(all(not(target_os = "macos"), not(target_os = "ios")))]
-    pub use self::unix::*;
-
-    fn rust_tm_to_tm(rust_tm: &Tm, tm: &mut libc::tm) {
-        tm.tm_sec = rust_tm.tm_sec;
-        tm.tm_min = rust_tm.tm_min;
-        tm.tm_hour = rust_tm.tm_hour;
-        tm.tm_mday = rust_tm.tm_mday;
-        tm.tm_mon = rust_tm.tm_mon;
-        tm.tm_year = rust_tm.tm_year;
-        tm.tm_wday = rust_tm.tm_wday;
-        tm.tm_yday = rust_tm.tm_yday;
-        tm.tm_isdst = rust_tm.tm_isdst;
-    }
-
-    fn tm_to_rust_tm(tm: &libc::tm, utcoff: i32, rust_tm: &mut Tm) {
-        rust_tm.tm_sec = tm.tm_sec;
-        rust_tm.tm_min = tm.tm_min;
-        rust_tm.tm_hour = tm.tm_hour;
-        rust_tm.tm_mday = tm.tm_mday;
-        rust_tm.tm_mon = tm.tm_mon;
-        rust_tm.tm_year = tm.tm_year;
-        rust_tm.tm_wday = tm.tm_wday;
-        rust_tm.tm_yday = tm.tm_yday;
-        rust_tm.tm_isdst = tm.tm_isdst;
-        rust_tm.tm_utcoff = utcoff;
-    }
-
-    #[cfg(target_os = "nacl")]
-    unsafe fn timegm(tm: *const libc::tm) -> time_t {
-        use std::env::{set_var, var_os, remove_var};
-        extern {
-            fn tzset();
-        }
-
-        let ret;
-
-        let current_tz = var_os("TZ");
-        set_var("TZ", "UTC");
-        tzset();
-
-        ret = libc::mktime(tm);
-
-        if let Some(tz) = current_tz {
-            set_var("TZ", tz);
-        } else {
-            remove_var("TZ");
-        }
-        tzset();
-
-        ret
-    }
-
-    pub fn time_to_utc_tm(sec: i64, tm: &mut Tm) {
-        unsafe {
-            let sec = sec as time_t;
-            let mut out = mem::zeroed();
-            if libc::gmtime_r(&sec, &mut out).is_null() {
-                panic!("gmtime_r failed: {}", io::Error::last_os_error());
-            }
-            tm_to_rust_tm(&out, 0, tm);
-        }
-    }
-
-    pub fn time_to_local_tm(sec: i64, tm: &mut Tm) {
-        unsafe {
-            let sec = sec as time_t;
-            let mut out = mem::zeroed();
-            if libc::localtime_r(&sec, &mut out).is_null() {
-                panic!("localtime_r failed: {}", io::Error::last_os_error());
-            }
-            tm_to_rust_tm(&out, out.tm_gmtoff as i32, tm);
-        }
-    }
-
-    pub fn utc_tm_to_time(rust_tm: &Tm) -> i64 {
-        #[cfg(all(target_os = "android", not(target_arch = "aarch64")))]
-        use libc::timegm64 as timegm;
-        #[cfg(not(all(target_os = "android", not(target_arch = "aarch64"))))]
-        use libc::timegm;
-
-        let mut tm = unsafe { mem::zeroed() };
-        rust_tm_to_tm(rust_tm, &mut tm);
-        unsafe { timegm(&mut tm) as i64 }
-    }
-
-    pub fn local_tm_to_time(rust_tm: &Tm) -> i64 {
-        let mut tm = unsafe { mem::zeroed() };
-        rust_tm_to_tm(rust_tm, &mut tm);
-        unsafe { libc::mktime(&mut tm) as i64 }
-    }
-
-    #[cfg(any(target_os = "macos", target_os = "ios"))]
-    mod mac {
-        use libc::{self, timeval, mach_timebase_info};
-        use std::sync::{Once, ONCE_INIT};
-        use std::ops::{Add, Sub};
-        use Duration;
-
-        fn info() -> &'static mach_timebase_info {
-            static mut INFO: mach_timebase_info = mach_timebase_info {
-                numer: 0,
-                denom: 0,
-            };
-            static ONCE: Once = ONCE_INIT;
-
-            unsafe {
-                ONCE.call_once(|| {
-                    mach_timebase_info(&mut INFO);
-                });
-                &INFO
-            }
-        }
-
-        pub fn get_time() -> (i64, i32) {
-            use std::ptr;
-            let mut tv = timeval { tv_sec: 0, tv_usec: 0 };
-            unsafe { libc::gettimeofday(&mut tv, ptr::null_mut()); }
-            (tv.tv_sec as i64, tv.tv_usec * 1000)
-        }
-
-        pub fn get_precise_ns() -> u64 {
-            unsafe {
-                let time = libc::mach_absolute_time();
-                let info = info();
-                time * info.numer as u64 / info.denom as u64
-            }
-        }
-
-        #[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Debug)]
-        pub struct SteadyTime { t: u64 }
-
-        impl SteadyTime {
-            pub fn now() -> SteadyTime {
-                SteadyTime { t: get_precise_ns() }
-            }
-        }
-        impl Sub for SteadyTime {
-            type Output = Duration;
-            fn sub(self, other: SteadyTime) -> Duration {
-                Duration::nanoseconds(self.t as i64 - other.t as i64)
-            }
-        }
-        impl Sub<Duration> for SteadyTime {
-            type Output = SteadyTime;
-            fn sub(self, other: Duration) -> SteadyTime {
-                self + -other
-            }
-        }
-        impl Add<Duration> for SteadyTime {
-            type Output = SteadyTime;
-            fn add(self, other: Duration) -> SteadyTime {
-                let delta = other.num_nanoseconds().unwrap();
-                SteadyTime {
-                    t: (self.t as i64 + delta) as u64
-                }
-            }
-        }
-    }
-
-    #[cfg(test)]
-    pub struct TzReset;
-
-    #[cfg(test)]
-    pub fn set_los_angeles_time_zone() -> TzReset {
-        use std::env;
-        env::set_var("TZ", "America/Los_Angeles");
-        ::tzset();
-        TzReset
-    }
-
-    #[cfg(test)]
-    pub fn set_london_with_dst_time_zone() -> TzReset {
-        use std::env;
-        env::set_var("TZ", "Europe/London");
-        ::tzset();
-        TzReset
-    }
-
-    #[cfg(all(not(target_os = "macos"), not(target_os = "ios")))]
-    mod unix {
-        use std::fmt;
-        use std::cmp::Ordering;
-        use std::ops::{Add, Sub};
-        use libc;
-
-        use Duration;
-
-        pub fn get_time() -> (i64, i32) {
-            let mut tv = libc::timespec { tv_sec: 0, tv_nsec: 0 };
-            unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, &mut tv); }
-            (tv.tv_sec as i64, tv.tv_nsec as i32)
-        }
-
-        pub fn get_precise_ns() -> u64 {
-            let mut ts = libc::timespec { tv_sec: 0, tv_nsec: 0 };
-            unsafe {
-                libc::clock_gettime(libc::CLOCK_MONOTONIC, &mut ts);
-            }
-            (ts.tv_sec as u64) * 1000000000 + (ts.tv_nsec as u64)
-        }
-
-        #[derive(Copy)]
-        pub struct SteadyTime {
-            t: libc::timespec,
-        }
-
-        impl fmt::Debug for SteadyTime {
-            fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-                write!(fmt, "SteadyTime {{ tv_sec: {:?}, tv_nsec: {:?} }}",
-                       self.t.tv_sec, self.t.tv_nsec)
-            }
-        }
-
-        impl Clone for SteadyTime {
-            fn clone(&self) -> SteadyTime {
-                SteadyTime { t: self.t }
-            }
-        }
-
-        impl SteadyTime {
-            pub fn now() -> SteadyTime {
-                let mut t = SteadyTime {
-                    t: libc::timespec {
-                        tv_sec: 0,
-                        tv_nsec: 0,
-                    }
-                };
-                unsafe {
-                    assert_eq!(0, libc::clock_gettime(libc::CLOCK_MONOTONIC,
-                                                      &mut t.t));
-                }
-                t
-            }
-        }
-
-        impl Sub for SteadyTime {
-            type Output = Duration;
-            fn sub(self, other: SteadyTime) -> Duration {
-                if self.t.tv_nsec >= other.t.tv_nsec {
-                    Duration::seconds(self.t.tv_sec as i64 - other.t.tv_sec as i64) +
-                        Duration::nanoseconds(self.t.tv_nsec as i64 - other.t.tv_nsec as i64)
-                } else {
-                    Duration::seconds(self.t.tv_sec as i64 - 1 - other.t.tv_sec as i64) +
-                        Duration::nanoseconds(self.t.tv_nsec as i64 + ::NSEC_PER_SEC as i64 -
-                                              other.t.tv_nsec as i64)
-                }
-            }
-        }
-
-        impl Sub<Duration> for SteadyTime {
-            type Output = SteadyTime;
-            fn sub(self, other: Duration) -> SteadyTime {
-                self + -other
-            }
-        }
-
-        impl Add<Duration> for SteadyTime {
-            type Output = SteadyTime;
-            fn add(mut self, other: Duration) -> SteadyTime {
-                let seconds = other.num_seconds();
-                let nanoseconds = other - Duration::seconds(seconds);
-                let nanoseconds = nanoseconds.num_nanoseconds().unwrap();
-                self.t.tv_sec += seconds as libc::time_t;
-                self.t.tv_nsec += nanoseconds as libc::c_long;
-                if self.t.tv_nsec >= ::NSEC_PER_SEC as libc::c_long {
-                    self.t.tv_nsec -= ::NSEC_PER_SEC as libc::c_long;
-                    self.t.tv_sec += 1;
-                } else if self.t.tv_nsec < 0 {
-                    self.t.tv_sec -= 1;
-                    self.t.tv_nsec += ::NSEC_PER_SEC as libc::c_long;
-                }
-                self
-            }
-        }
-
-        impl PartialOrd for SteadyTime {
-            fn partial_cmp(&self, other: &SteadyTime) -> Option<Ordering> {
-                Some(self.cmp(other))
-            }
-        }
-
-        impl Ord for SteadyTime {
-            fn cmp(&self, other: &SteadyTime) -> Ordering {
-                match self.t.tv_sec.cmp(&other.t.tv_sec) {
-                    Ordering::Equal => self.t.tv_nsec.cmp(&other.t.tv_nsec),
-                    ord => ord
-                }
-            }
-        }
-
-        impl PartialEq for SteadyTime {
-            fn eq(&self, other: &SteadyTime) -> bool {
-                self.t.tv_sec == other.t.tv_sec &&
-                    self.t.tv_nsec == other.t.tv_nsec
-            }
-        }
-
-        impl Eq for SteadyTime {}
-
-    }
-}
-
-#[cfg(windows)]
-#[allow(non_snake_case)]
-mod inner {
-    use std::io;
-    use std::mem;
-    use std::sync::{Once, ONCE_INIT};
-    use std::ops::{Add, Sub};
-    use {Tm, Duration};
-
-    use kernel32::*;
-    use winapi::*;
-
-    fn frequency() -> LARGE_INTEGER {
-        static mut FREQUENCY: LARGE_INTEGER = 0;
-        static ONCE: Once = ONCE_INIT;
-
-        unsafe {
-            ONCE.call_once(|| {
-                QueryPerformanceFrequency(&mut FREQUENCY);
-            });
-            FREQUENCY
-        }
-    }
-
-    const HECTONANOSECS_IN_SEC: i64 = 10_000_000;
-    const HECTONANOSEC_TO_UNIX_EPOCH: i64 = 11_644_473_600 * HECTONANOSECS_IN_SEC;
-
-    fn time_to_file_time(sec: i64) -> FILETIME {
-        let t = (((sec * HECTONANOSECS_IN_SEC) + HECTONANOSEC_TO_UNIX_EPOCH)) as u64;
-        FILETIME {
-            dwLowDateTime: t as DWORD,
-            dwHighDateTime: (t >> 32) as DWORD
-        }
-    }
-
-    fn file_time_as_u64(ft: &FILETIME) -> u64 {
-        ((ft.dwHighDateTime as u64) << 32) | (ft.dwLowDateTime as u64)
-    }
-
-    fn file_time_to_nsec(ft: &FILETIME) -> i32 {
-        let t = file_time_as_u64(ft) as i64;
-        ((t % HECTONANOSECS_IN_SEC) * 100) as i32
-    }
-
-    fn file_time_to_unix_seconds(ft: &FILETIME) -> i64 {
-        let t = file_time_as_u64(ft) as i64;
-        ((t - HECTONANOSEC_TO_UNIX_EPOCH) / HECTONANOSECS_IN_SEC) as i64
-    }
-
-    fn system_time_to_file_time(sys: &SYSTEMTIME) -> FILETIME {
-        unsafe {
-            let mut ft = mem::zeroed();
-            SystemTimeToFileTime(sys, &mut ft);
-            ft
-        }
-    }
-
-    fn tm_to_system_time(tm: &Tm) -> SYSTEMTIME {
-        let mut sys: SYSTEMTIME = unsafe { mem::zeroed() };
-        sys.wSecond = tm.tm_sec as WORD;
-        sys.wMinute = tm.tm_min as WORD;
-        sys.wHour = tm.tm_hour as WORD;
-        sys.wDay = tm.tm_mday as WORD;
-        sys.wDayOfWeek = tm.tm_wday as WORD;
-        sys.wMonth = (tm.tm_mon + 1) as WORD;
-        sys.wYear = (tm.tm_year + 1900) as WORD;
-        sys
-    }
-
-    fn system_time_to_tm(sys: &SYSTEMTIME, tm: &mut Tm) {
-        tm.tm_sec = sys.wSecond as i32;
-        tm.tm_min = sys.wMinute as i32;
-        tm.tm_hour = sys.wHour as i32;
-        tm.tm_mday = sys.wDay as i32;
-        tm.tm_wday = sys.wDayOfWeek as i32;
-        tm.tm_mon = (sys.wMonth - 1) as i32;
-        tm.tm_year = (sys.wYear - 1900) as i32;
-        tm.tm_yday = yday(tm.tm_year, tm.tm_mon + 1, tm.tm_mday);
-
-        fn yday(year: i32, month: i32, day: i32) -> i32 {
-            let leap = if month > 2 {
-                if year % 4 == 0 { 1 } else { 2 }
-            } else {
-                0
-            };
-            let july = if month > 7 { 1 } else { 0 };
-
-            (month - 1) * 30 + month / 2 + (day - 1) - leap + july
-        }
-    }
-
-    macro_rules! call {
-        ($name:ident($($arg:expr),*)) => {
-            if $name($($arg),*) == 0 {
-                panic!(concat!(stringify!($name), " failed with: {}"),
-                       io::Error::last_os_error());
-            }
-        }
-    }
-
-    pub fn time_to_utc_tm(sec: i64, tm: &mut Tm) {
-        let mut out = unsafe { mem::zeroed() };
-        let ft = time_to_file_time(sec);
-        unsafe {
-            call!(FileTimeToSystemTime(&ft, &mut out));
-        }
-        system_time_to_tm(&out, tm);
-        tm.tm_utcoff = 0;
-    }
-
-    pub fn time_to_local_tm(sec: i64, tm: &mut Tm) {
-        let ft = time_to_file_time(sec);
-        unsafe {
-            let mut utc = mem::zeroed();
-            let mut local = mem::zeroed();
-            call!(FileTimeToSystemTime(&ft, &mut utc));
-            call!(SystemTimeToTzSpecificLocalTime(0 as *const _,
-                                                  &mut utc, &mut local));
-            system_time_to_tm(&local, tm);
-
-            let local = system_time_to_file_time(&local);
-            let local_sec = file_time_to_unix_seconds(&local);
-
-            let mut tz = mem::zeroed();
-            GetTimeZoneInformation(&mut tz);
-
-            // SystemTimeToTzSpecificLocalTime already applied the biases so
-            // check if it non standard
-            tm.tm_utcoff = (local_sec - sec) as i32;
-            tm.tm_isdst = if tm.tm_utcoff == -60 * (tz.Bias + tz.StandardBias) {
-                0
-            } else {
-                1
-            };
-        }
-    }
-
-    pub fn utc_tm_to_time(tm: &Tm) -> i64 {
-        unsafe {
-            let mut ft = mem::zeroed();
-            let sys_time = tm_to_system_time(tm);
-            call!(SystemTimeToFileTime(&sys_time, &mut ft));
-            file_time_to_unix_seconds(&ft)
-        }
-    }
-
-    pub fn local_tm_to_time(tm: &Tm) -> i64 {
-        unsafe {
-            let mut ft = mem::zeroed();
-            let mut utc = mem::zeroed();
-            let mut sys_time = tm_to_system_time(tm);
-            call!(TzSpecificLocalTimeToSystemTime(0 as *mut _,
-                                                  &mut sys_time, &mut utc));
-            call!(SystemTimeToFileTime(&utc, &mut ft));
-            file_time_to_unix_seconds(&ft)
-        }
-    }
-
-    pub fn get_time() -> (i64, i32) {
-        unsafe {
-            let mut ft = mem::zeroed();
-            GetSystemTimeAsFileTime(&mut ft);
-            (file_time_to_unix_seconds(&ft), file_time_to_nsec(&ft))
-        }
-    }
-
-    pub fn get_precise_ns() -> u64 {
-        let mut ticks = 0;
-        unsafe {
-            assert!(QueryPerformanceCounter(&mut ticks) == 1);
-        }
-        mul_div_i64(ticks as i64, 1000000000, frequency() as i64) as u64
-
-    }
-
-    #[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Debug)]
-    pub struct SteadyTime {
-        t: LARGE_INTEGER,
-    }
-
-    impl SteadyTime {
-        pub fn now() -> SteadyTime {
-            let mut t = SteadyTime { t: 0 };
-            unsafe { QueryPerformanceCounter(&mut t.t); }
-            t
-        }
-    }
-
-    impl Sub for SteadyTime {
-        type Output = Duration;
-        fn sub(self, other: SteadyTime) -> Duration {
-            let diff = self.t as i64 - other.t as i64;
-            Duration::nanoseconds(mul_div_i64(diff, 1000000000,
-                                              frequency() as i64))
-        }
-    }
-
-    impl Sub<Duration> for SteadyTime {
-        type Output = SteadyTime;
-        fn sub(self, other: Duration) -> SteadyTime {
-            self + -other
-        }
-    }
-
-    impl Add<Duration> for SteadyTime {
-        type Output = SteadyTime;
-        fn add(mut self, other: Duration) -> SteadyTime {
-            self.t += (other.num_microseconds().unwrap() * frequency() as i64 /
-                       1_000_000) as LARGE_INTEGER;
-            self
-        }
-    }
-
-    #[cfg(test)]
-    pub struct TzReset {
-        old: TIME_ZONE_INFORMATION,
-    }
-
-    #[cfg(test)]
-    impl Drop for TzReset {
-        fn drop(&mut self) {
-            unsafe {
-                call!(SetTimeZoneInformation(&self.old));
-            }
-        }
-    }
-
-    #[cfg(test)]
-    pub fn set_los_angeles_time_zone() -> TzReset {
-        acquire_privileges();
-
-        unsafe {
-            let mut tz = mem::zeroed::<TIME_ZONE_INFORMATION>();
-            GetTimeZoneInformation(&mut tz);
-            let ret = TzReset { old: tz };
-            tz.Bias = 60 * 8;
-            call!(SetTimeZoneInformation(&tz));
-            return ret
-        }
-    }
-
-    #[cfg(test)]
-    pub fn set_london_with_dst_time_zone() -> TzReset {
-        acquire_privileges();
-
-        unsafe {
-            let mut tz = mem::zeroed::<TIME_ZONE_INFORMATION>();
-            GetTimeZoneInformation(&mut tz);
-            let ret = TzReset { old: tz };
-            // Since date set precisely this is 2015's dates
-            tz.Bias = 0;
-            tz.DaylightBias = -60;
-            tz.DaylightDate.wYear = 0;
-            tz.DaylightDate.wMonth = 3;
-            tz.DaylightDate.wDayOfWeek = 0;
-            tz.DaylightDate.wDay = 5;
-            tz.DaylightDate.wHour = 2;
-            tz.StandardBias = 0;
-            tz.StandardDate.wYear = 0;
-            tz.StandardDate.wMonth = 10;
-            tz.StandardDate.wDayOfWeek = 0;
-            tz.StandardDate.wDay = 5;
-            tz.StandardDate.wHour = 2;
-            call!(SetTimeZoneInformation(&tz));
-            return ret
-        }
-    }
-
-    // Ensures that this process has the necessary privileges to set a new time
-    // zone, and this is all transcribed from:
-    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724944%28v=vs.85%29.aspx
-    #[cfg(test)]
-    fn acquire_privileges() {
-        use std::sync::{ONCE_INIT, Once};
-        use advapi32::*;
-        const SE_PRIVILEGE_ENABLED: DWORD = 2;
-        static INIT: Once = ONCE_INIT;
-
-        #[repr(C)]
-        struct TKP {
-            tkp: TOKEN_PRIVILEGES,
-            laa: LUID_AND_ATTRIBUTES,
-        }
-
-        INIT.call_once(|| unsafe {
-            let mut hToken = 0 as *mut _;
-            call!(OpenProcessToken(GetCurrentProcess(),
-                                   TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
-                                   &mut hToken));
-
-            let mut tkp = mem::zeroed::<TKP>();
-            assert_eq!(tkp.tkp.Privileges.len(), 0);
-            let c = ::std::ffi::CString::new("SeTimeZonePrivilege").unwrap();
-            call!(LookupPrivilegeValueA(0 as *const _, c.as_ptr(),
-                                        &mut tkp.laa.Luid));
-            tkp.tkp.PrivilegeCount = 1;
-            tkp.laa.Attributes = SE_PRIVILEGE_ENABLED;
-            call!(AdjustTokenPrivileges(hToken, FALSE, &mut tkp.tkp, 0,
-                                        0 as *mut _, 0 as *mut _));
-        });
-    }
-
-
-
-    // Computes (value*numer)/denom without overflow, as long as both
-    // (numer*denom) and the overall result fit into i64 (which is the case
-    // for our time conversions).
-    fn mul_div_i64(value: i64, numer: i64, denom: i64) -> i64 {
-        let q = value / denom;
-        let r = value % denom;
-        // Decompose value as (value/denom*denom + value%denom),
-        // substitute into (value*numer)/denom and simplify.
-        // r < denom, so (denom*numer) is the upper bound of (r*numer)
-        q * numer + r * numer / denom
-    }
-
-    #[test]
-    fn test_muldiv() {
-        assert_eq!(mul_div_i64( 1_000_000_000_001, 1_000_000_000, 1_000_000),
-                   1_000_000_000_001_000);
-        assert_eq!(mul_div_i64(-1_000_000_000_001, 1_000_000_000, 1_000_000),
-                   -1_000_000_000_001_000);
-        assert_eq!(mul_div_i64(-1_000_000_000_001,-1_000_000_000, 1_000_000),
-                   1_000_000_000_001_000);
-        assert_eq!(mul_div_i64( 1_000_000_000_001, 1_000_000_000,-1_000_000),
-                   -1_000_000_000_001_000);
-        assert_eq!(mul_div_i64( 1_000_000_000_001,-1_000_000_000,-1_000_000),
-                   1_000_000_000_001_000);
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".rustfmt.toml":"4587a30e695dc4afdd3b5d33370cf712c90a716de06ab0c5a2c023b0f269ab1a",".travis.yml":"e340419604a35e795fc3afdab237eb0ea3a31e71c98fb98fa88626d61b8a50f7","AUTHORS":"1ff3a7c8519b29544bb28ba9b1e7502df0cb764051fb9a1172e60006aa2b8dcc","COPYRIGHT":"edb20b474f6cbd4f4db066b54a9e0f687d0009d309412a63431189b59b8e2a07","Cargo.toml":"dc21922a66df3876268bc4c187aeaf8db875aee8a1869c7f78e2c67b2e572680","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"e764abd9a6abbe9517dd9dedc003dd64594351282437a509fec9362ef136686d","benches/basic.rs":"e1538acb2de8b0c510d663d5ba0b6877f148955774c713a7aa2374b62ceb6e6a","benches/udhr.rs":"7869911021fc0f0a71246d2535183a4610a0b9efd14fc8fc58daf121a02acd21","benches/udhr_data/README.md":"103dd98f2777082f73dd90ce441245370169a6e889b329da81ee4b9c236c0e05","src/char_data/mod.rs":"6fa055d2c81061bcc15854eb91f897998ed9109725827932266a0dc4d4051166","src/char_data/tables.rs":"3742ed00360d3955b10ba690b1446e69ddf04f2cee13e86dd185ba6641bc6198","src/deprecated.rs":"ce1b62ac47d0d7ea547a1e03d17cd86b6b850e4e095642ba2e9c29130f13fa72","src/explicit.rs":"273c56d064891a9b2f1ef61f81845c0467c81db4e3ce756a9f2ac58f7e6e3e14","src/format_chars.rs":"0b60e26adfff7f61abfbaf63bc5e37896f12f9d420a6df630c4f71e0acb4222a","src/implicit.rs":"ab583bd9f0e9ecff8bd5e26253912c1f40598d0212a6bc78664774149c38dccb","src/level.rs":"b8739d4dd84d9270140047972167d9e72db8637c769228eec17d12e07c5ab55f","src/lib.rs":"f264fe18c7ae5d4c4b100f9304be0466a138384cbcc9b08cb7b5185c5aac6bd4","src/prepare.rs":"cacf4ff9f7b0adf700b9f5cd82165c67eec93fd8e4d05cb6c7fe54111d9bbe40","tests/conformance_tests.rs":"777c74cbb3946d5b4495d4f8abe1f8edd0169a38bb724c44eea82eff5ca9581d","tools/generate.py":"12f94bdf2226f306d993fe2a0fa623b8dc9b1db1ac038a17ab44892ccdc8feeb"},"package":"a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/.rustfmt.toml
+++ /dev/null
@@ -1,6 +0,0 @@
-array_layout = "Block"
-array_width = 80
-fn_args_layout = "Block"
-fn_brace_style = "SameLineWhere"
-fn_call_style = "Block"
-generics_indent = "Block"
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-sudo: false
-language: rust
-
-rust:
-  - nightly
-  - beta
-  - stable
-  - 1.15.0
-
-matrix:
-  fast_finish: true
-
-notifications:
-  webhooks: http://build.servo.org:54856/travis
-
-before_script:
-    - pip install git+https://github.com/euclio/travis-cargo@kcov --user && export PATH=$HOME/.local/bin:$PATH
-
-script:
-  - cargo build --verbose
-  - cargo test  --verbose
-  - cargo test  --verbose --features with_serde
-  - cargo doc   --verbose --no-deps
-  - travis-cargo bench
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/AUTHORS
+++ /dev/null
@@ -1,4 +0,0 @@
-This software was written by the following people:
-
-Matt Brubeck <mbrubeck@limpet.net>
-Behnam Esfahbod <behnam@zwnj.org>
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/COPYRIGHT
+++ /dev/null
@@ -1,8 +0,0 @@
-This project is copyright 2015, The Servo Project Developers (given in the
-file AUTHORS).
-
-Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-http://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
-http://opensource.org/licenses/MIT>, at your option. All files in the project
-carrying such notice may not be copied, modified, or distributed except
-according to those terms.
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/Cargo.toml
+++ /dev/null
@@ -1,27 +0,0 @@
-[package]
-name = "unicode-bidi"
-version = "0.3.3"
-authors = ["The Servo Project Developers"]
-license = "MIT / Apache-2.0"
-description = "Implementation of the Unicode Bidirectional Algorithm"
-repository = "https://github.com/servo/unicode-bidi"
-documentation = "http://doc.servo.org/unicode_bidi/"
-keywords = ["rtl", "unicode", "text", "layout", "bidi"]
-
-exclude = ["*.txt"]
-
-[lib]
-name = "unicode_bidi"
-
-[dependencies]
-matches = "0.1"
-serde = {version = ">=0.8, <2.0", optional = true}
-serde_derive = {version = ">=0.8, <2.0", optional = true}
-
-[dev-dependencies]
-serde_test = ">=0.8, <2.0"
-
-[features]
-default = []
-unstable = []  # Use in benches/
-with_serde = ["serde", "serde_derive"]
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2015 The Rust Project Developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# unicode-bidi
-
-This crate implements the [Unicode Bidirectional Algorithm][tr9] for display
-of mixed right-to-left and left-to-right text.  It is written in safe Rust,
-compatible with the current stable release.
-
-[Documentation](http://doc.servo.org/unicode_bidi/)
-
-[![Build Status](https://travis-ci.org/servo/unicode-bidi.svg?branch=master)](https://travis-ci.org/servo/unicode-bidi)
-
-[tr9]: http://www.unicode.org/reports/tr9/
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/benches/basic.rs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2014 The html5ever Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![cfg(all(test, feature = "unstable"))]
-#![feature(test)]
-
-extern crate test;
-extern crate unicode_bidi;
-
-use test::Bencher;
-
-use unicode_bidi::BidiInfo;
-
-
-const LTR_TEXTS: &[&str] = &["abc\ndef\nghi", "abc 123\ndef 456\nghi 789"];
-
-const BIDI_TEXTS: &[&str] =
-    &["ابجد\nهوز\nحتی", "ابجد ۱۲۳\nهوز ۴۵۶\nحتی ۷۸۹"];
-
-
-fn bench_bidi_info_new(b: &mut Bencher, texts: &[&str]) {
-    for text in texts {
-        b.iter(|| { BidiInfo::new(text, None); });
-    }
-}
-
-fn bench_reorder_line(b: &mut Bencher, texts: &[&str]) {
-    for text in texts {
-        let bidi_info = BidiInfo::new(text, None);
-        b.iter(
-            || for para in &bidi_info.paragraphs {
-                let line = para.range.clone();
-                bidi_info.reorder_line(para, line);
-            }
-        );
-    }
-}
-
-
-#[bench]
-fn bench_1_bidi_info_new_for_ltr_texts(b: &mut Bencher) {
-    bench_bidi_info_new(b, LTR_TEXTS);
-}
-
-#[bench]
-fn bench_2_bidi_info_new_for_bidi_texts(b: &mut Bencher) {
-    bench_bidi_info_new(b, BIDI_TEXTS);
-}
-
-#[bench]
-fn bench_3_reorder_line_for_ltr_texts(b: &mut Bencher) {
-    bench_reorder_line(b, LTR_TEXTS);
-}
-
-#[bench]
-fn bench_4_reorder_line_for_bidi_texts(b: &mut Bencher) {
-    bench_reorder_line(b, BIDI_TEXTS);
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/benches/udhr.rs
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2014 The html5ever Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![cfg(all(test, feature = "unstable"))]
-#![feature(test)]
-
-extern crate test;
-extern crate unicode_bidi;
-
-use test::Bencher;
-
-use unicode_bidi::BidiInfo;
-
-
-const LTR_TEXTS: &[&str] = &[
-    include_str!("udhr_data/ltr/udhr_acu_1.txt"),
-    include_str!("udhr_data/ltr/udhr_auc.txt"),
-    include_str!("udhr_data/ltr/udhr_eng.txt"),
-    include_str!("udhr_data/ltr/udhr_knc.txt"),
-    include_str!("udhr_data/ltr/udhr_krl.txt"),
-    include_str!("udhr_data/ltr/udhr_kwi.txt"),
-    include_str!("udhr_data/ltr/udhr_lot.txt"),
-    include_str!("udhr_data/ltr/udhr_mly_latn.txt"),
-    include_str!("udhr_data/ltr/udhr_piu.txt"),
-    include_str!("udhr_data/ltr/udhr_qug.txt"),
-    include_str!("udhr_data/ltr/udhr_snn.txt"),
-    include_str!("udhr_data/ltr/udhr_tiv.txt"),
-    include_str!("udhr_data/ltr/udhr_uig_latn.txt"),
-];
-
-const BIDI_TEXTS: &[&str] = &[
-    include_str!("udhr_data/bidi/udhr_aii.txt"),
-    include_str!("udhr_data/bidi/udhr_arb.txt"),
-    include_str!("udhr_data/bidi/udhr_mly_arab.txt"),
-    include_str!("udhr_data/bidi/udhr_pes_1.txt"),
-    include_str!("udhr_data/bidi/udhr_skr.txt"),
-    include_str!("udhr_data/bidi/udhr_urd.txt"),
-    include_str!("udhr_data/bidi/udhr_pes_2.txt"),
-    include_str!("udhr_data/bidi/udhr_uig_arab.txt"),
-    include_str!("udhr_data/bidi/udhr_urd_2.txt"),
-    include_str!("udhr_data/bidi/udhr_heb.txt"),
-    include_str!("udhr_data/bidi/udhr_pbu.txt"),
-    include_str!("udhr_data/bidi/udhr_pnb.txt"),
-    include_str!("udhr_data/bidi/udhr_ydd.txt"),
-];
-
-
-fn bench_bidi_info_new(b: &mut Bencher, texts: &[&str]) {
-    for text in texts {
-        b.iter(|| { BidiInfo::new(text, None); });
-    }
-}
-
-fn bench_reorder_line(b: &mut Bencher, texts: &[&str]) {
-    for text in texts {
-        let bidi_info = BidiInfo::new(text, None);
-        b.iter(
-            || for para in &bidi_info.paragraphs {
-                let line = para.range.clone();
-                bidi_info.reorder_line(para, line);
-            }
-        );
-    }
-}
-
-
-#[bench]
-fn bench_1_bidi_info_new_for_ltr_texts(b: &mut Bencher) {
-    bench_bidi_info_new(b, LTR_TEXTS);
-}
-
-#[bench]
-fn bench_2_bidi_info_new_for_bidi_texts(b: &mut Bencher) {
-    bench_bidi_info_new(b, BIDI_TEXTS);
-}
-
-#[bench]
-fn bench_3_reorder_line_for_ltr_texts(b: &mut Bencher) {
-    bench_reorder_line(b, LTR_TEXTS);
-}
-
-#[bench]
-fn bench_4_reorder_line_for_bidi_texts(b: &mut Bencher) {
-    bench_reorder_line(b, BIDI_TEXTS);
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/benches/udhr_data/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# A collection of UDHR in Unicode text files
-
-Source: http://unicode.org/udhr/
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/char_data/mod.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Accessor for `Bidi_Class` property from Unicode Character Database (UCD)
-
-mod tables;
-
-pub use self::tables::{BidiClass, UNICODE_VERSION};
-
-use std::cmp::Ordering::{Equal, Less, Greater};
-use std::char;
-
-use self::tables::bidi_class_table;
-use BidiClass::*;
-
-/// Find the BidiClass of a single char.
-pub fn bidi_class(c: char) -> BidiClass {
-    bsearch_range_value_table(c, bidi_class_table)
-}
-
-pub fn is_rtl(bidi_class: BidiClass) -> bool {
-    match bidi_class {
-        RLE | RLO | RLI => true,
-        _ => false,
-    }
-}
-
-fn bsearch_range_value_table(c: char, r: &'static [(char, char, BidiClass)]) -> BidiClass {
-    match r.binary_search_by(
-        |&(lo, hi, _)| if lo <= c && c <= hi {
-            Equal
-        } else if hi < c {
-            Less
-        } else {
-            Greater
-        }
-    ) {
-        Ok(idx) => {
-            let (_, _, cat) = r[idx];
-            cat
-        }
-        // UCD/extracted/DerivedBidiClass.txt: "All code points not explicitly listed
-        // for Bidi_Class have the value Left_To_Right (L)."
-        Err(_) => L,
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_bidi_class() {
-        for (input, expected) in
-            vec![
-                (0x0000, BN),
-                (0x0040, ON),
-                (0x0041, L),
-                (0x0062, L),
-                (0x007F, BN),
-
-                // Hebrew
-                (0x0590, R),
-                (0x05D0, R),
-                (0x05D1, R),
-                (0x05FF, R),
-
-                // Arabic
-                (0x0600, AN),
-                (0x0627, AL),
-                (0x07BF, AL),
-
-                // Default R + Arabic Extras
-                (0x07C0, R),
-                (0x085F, R),
-                (0x0860, R),
-                (0x089F, R),
-                (0x08A0, AL),
-                (0x089F, R),
-                (0x08FF, NSM),
-
-                // Default ET
-                (0x20A0, ET),
-                (0x20CF, ET),
-
-                // Arabic Presentation Forms
-                (0xFB1D, R),
-                (0xFB4F, R),
-                (0xFB50, AL),
-                (0xFDCF, AL),
-                (0xFDF0, AL),
-                (0xFDFF, AL),
-                (0xFE70, AL),
-                (0xFEFE, AL),
-                (0xFEFF, BN),
-
-                // Default AL + R
-                (0x10800, R),
-                (0x10FFF, R),
-                (0x1E800, R),
-                (0x1EDFF, R),
-                (0x1EE00, AL),
-                (0x1EEFF, AL),
-                (0x1EF00, R),
-                (0x1EFFF, R),
-            ] {
-            assert_eq!(bidi_class(char::from_u32(input).unwrap()), expected);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/char_data/tables.rs
+++ /dev/null
@@ -1,452 +0,0 @@
-// NOTE:
-// The following code was generated by "tools/generate.py". do not edit directly
-
-#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
-#![cfg_attr(rustfmt, rustfmt_skip)]
-
-/// The [Unicode version](http://www.unicode.org/versions/) of data
-pub const UNICODE_VERSION: (u64, u64, u64) = (9, 0, 0);
-
-#[allow(non_camel_case_types)]
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-/// Represents values of the Unicode character property
-/// [Bidi_Class](http://www.unicode.org/reports/tr44/#Bidi_Class), also
-/// known as the *bidirectional character type*.
-///
-/// * http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types
-/// * http://www.unicode.org/reports/tr44/#Bidi_Class_Values
-pub enum BidiClass {
-    AL,
-    AN,
-    B,
-    BN,
-    CS,
-    EN,
-    ES,
-    ET,
-    FSI,
-    L,
-    LRE,
-    LRI,
-    LRO,
-    NSM,
-    ON,
-    PDF,
-    PDI,
-    R,
-    RLE,
-    RLI,
-    RLO,
-    S,
-    WS,
-}
-
-use self::BidiClass::*;
-pub const bidi_class_table: &'static [(char, char, BidiClass)] = &[
-    ('\u{0}', '\u{8}', BN), ('\u{9}', '\u{9}', S), ('\u{a}', '\u{a}', B), ('\u{b}', '\u{b}', S),
-    ('\u{c}', '\u{c}', WS), ('\u{d}', '\u{d}', B), ('\u{e}', '\u{1b}', BN), ('\u{1c}', '\u{1e}', B),
-    ('\u{1f}', '\u{1f}', S), ('\u{20}', '\u{20}', WS), ('\u{21}', '\u{22}', ON), ('\u{23}',
-    '\u{25}', ET), ('\u{26}', '\u{2a}', ON), ('\u{2b}', '\u{2b}', ES), ('\u{2c}', '\u{2c}', CS),
-    ('\u{2d}', '\u{2d}', ES), ('\u{2e}', '\u{2f}', CS), ('\u{30}', '\u{39}', EN), ('\u{3a}',
-    '\u{3a}', CS), ('\u{3b}', '\u{40}', ON), ('\u{41}', '\u{5a}', L), ('\u{5b}', '\u{60}', ON),
-    ('\u{61}', '\u{7a}', L), ('\u{7b}', '\u{7e}', ON), ('\u{7f}', '\u{84}', BN), ('\u{85}',
-    '\u{85}', B), ('\u{86}', '\u{9f}', BN), ('\u{a0}', '\u{a0}', CS), ('\u{a1}', '\u{a1}', ON),
-    ('\u{a2}', '\u{a5}', ET), ('\u{a6}', '\u{a9}', ON), ('\u{aa}', '\u{aa}', L), ('\u{ab}',
-    '\u{ac}', ON), ('\u{ad}', '\u{ad}', BN), ('\u{ae}', '\u{af}', ON), ('\u{b0}', '\u{b1}', ET),
-    ('\u{b2}', '\u{b3}', EN), ('\u{b4}', '\u{b4}', ON), ('\u{b5}', '\u{b5}', L), ('\u{b6}',
-    '\u{b8}', ON), ('\u{b9}', '\u{b9}', EN), ('\u{ba}', '\u{ba}', L), ('\u{bb}', '\u{bf}', ON),
-    ('\u{c0}', '\u{d6}', L), ('\u{d7}', '\u{d7}', ON), ('\u{d8}', '\u{f6}', L), ('\u{f7}', '\u{f7}',
-    ON), ('\u{f8}', '\u{2b8}', L), ('\u{2b9}', '\u{2ba}', ON), ('\u{2bb}', '\u{2c1}', L),
-    ('\u{2c2}', '\u{2cf}', ON), ('\u{2d0}', '\u{2d1}', L), ('\u{2d2}', '\u{2df}', ON), ('\u{2e0}',
-    '\u{2e4}', L), ('\u{2e5}', '\u{2ed}', ON), ('\u{2ee}', '\u{2ee}', L), ('\u{2ef}', '\u{2ff}',
-    ON), ('\u{300}', '\u{36f}', NSM), ('\u{370}', '\u{373}', L), ('\u{374}', '\u{375}', ON),
-    ('\u{376}', '\u{377}', L), ('\u{37a}', '\u{37d}', L), ('\u{37e}', '\u{37e}', ON), ('\u{37f}',
-    '\u{37f}', L), ('\u{384}', '\u{385}', ON), ('\u{386}', '\u{386}', L), ('\u{387}', '\u{387}',
-    ON), ('\u{388}', '\u{38a}', L), ('\u{38c}', '\u{38c}', L), ('\u{38e}', '\u{3a1}', L),
-    ('\u{3a3}', '\u{3f5}', L), ('\u{3f6}', '\u{3f6}', ON), ('\u{3f7}', '\u{482}', L), ('\u{483}',
-    '\u{489}', NSM), ('\u{48a}', '\u{52f}', L), ('\u{531}', '\u{556}', L), ('\u{559}', '\u{55f}',
-    L), ('\u{561}', '\u{587}', L), ('\u{589}', '\u{589}', L), ('\u{58a}', '\u{58a}', ON),
-    ('\u{58d}', '\u{58e}', ON), ('\u{58f}', '\u{58f}', ET), ('\u{590}', '\u{590}', R), ('\u{591}',
-    '\u{5bd}', NSM), ('\u{5be}', '\u{5be}', R), ('\u{5bf}', '\u{5bf}', NSM), ('\u{5c0}', '\u{5c0}',
-    R), ('\u{5c1}', '\u{5c2}', NSM), ('\u{5c3}', '\u{5c3}', R), ('\u{5c4}', '\u{5c5}', NSM),
-    ('\u{5c6}', '\u{5c6}', R), ('\u{5c7}', '\u{5c7}', NSM), ('\u{5c8}', '\u{5ff}', R), ('\u{600}',
-    '\u{605}', AN), ('\u{606}', '\u{607}', ON), ('\u{608}', '\u{608}', AL), ('\u{609}', '\u{60a}',
-    ET), ('\u{60b}', '\u{60b}', AL), ('\u{60c}', '\u{60c}', CS), ('\u{60d}', '\u{60d}', AL),
-    ('\u{60e}', '\u{60f}', ON), ('\u{610}', '\u{61a}', NSM), ('\u{61b}', '\u{64a}', AL), ('\u{64b}',
-    '\u{65f}', NSM), ('\u{660}', '\u{669}', AN), ('\u{66a}', '\u{66a}', ET), ('\u{66b}', '\u{66c}',
-    AN), ('\u{66d}', '\u{66f}', AL), ('\u{670}', '\u{670}', NSM), ('\u{671}', '\u{6d5}', AL),
-    ('\u{6d6}', '\u{6dc}', NSM), ('\u{6dd}', '\u{6dd}', AN), ('\u{6de}', '\u{6de}', ON), ('\u{6df}',
-    '\u{6e4}', NSM), ('\u{6e5}', '\u{6e6}', AL), ('\u{6e7}', '\u{6e8}', NSM), ('\u{6e9}', '\u{6e9}',
-    ON), ('\u{6ea}', '\u{6ed}', NSM), ('\u{6ee}', '\u{6ef}', AL), ('\u{6f0}', '\u{6f9}', EN),
-    ('\u{6fa}', '\u{710}', AL), ('\u{711}', '\u{711}', NSM), ('\u{712}', '\u{72f}', AL), ('\u{730}',
-    '\u{74a}', NSM), ('\u{74b}', '\u{7a5}', AL), ('\u{7a6}', '\u{7b0}', NSM), ('\u{7b1}', '\u{7bf}',
-    AL), ('\u{7c0}', '\u{7ea}', R), ('\u{7eb}', '\u{7f3}', NSM), ('\u{7f4}', '\u{7f5}', R),
-    ('\u{7f6}', '\u{7f9}', ON), ('\u{7fa}', '\u{815}', R), ('\u{816}', '\u{819}', NSM), ('\u{81a}',
-    '\u{81a}', R), ('\u{81b}', '\u{823}', NSM), ('\u{824}', '\u{824}', R), ('\u{825}', '\u{827}',
-    NSM), ('\u{828}', '\u{828}', R), ('\u{829}', '\u{82d}', NSM), ('\u{82e}', '\u{858}', R),
-    ('\u{859}', '\u{85b}', NSM), ('\u{85c}', '\u{89f}', R), ('\u{8a0}', '\u{8d3}', AL), ('\u{8d4}',
-    '\u{8e1}', NSM), ('\u{8e2}', '\u{8e2}', AN), ('\u{8e3}', '\u{902}', NSM), ('\u{903}', '\u{939}',
-    L), ('\u{93a}', '\u{93a}', NSM), ('\u{93b}', '\u{93b}', L), ('\u{93c}', '\u{93c}', NSM),
-    ('\u{93d}', '\u{940}', L), ('\u{941}', '\u{948}', NSM), ('\u{949}', '\u{94c}', L), ('\u{94d}',
-    '\u{94d}', NSM), ('\u{94e}', '\u{950}', L), ('\u{951}', '\u{957}', NSM), ('\u{958}', '\u{961}',
-    L), ('\u{962}', '\u{963}', NSM), ('\u{964}', '\u{980}', L), ('\u{981}', '\u{981}', NSM),
-    ('\u{982}', '\u{983}', L), ('\u{985}', '\u{98c}', L), ('\u{98f}', '\u{990}', L), ('\u{993}',
-    '\u{9a8}', L), ('\u{9aa}', '\u{9b0}', L), ('\u{9b2}', '\u{9b2}', L), ('\u{9b6}', '\u{9b9}', L),
-    ('\u{9bc}', '\u{9bc}', NSM), ('\u{9bd}', '\u{9c0}', L), ('\u{9c1}', '\u{9c4}', NSM), ('\u{9c7}',
-    '\u{9c8}', L), ('\u{9cb}', '\u{9cc}', L), ('\u{9cd}', '\u{9cd}', NSM), ('\u{9ce}', '\u{9ce}',
-    L), ('\u{9d7}', '\u{9d7}', L), ('\u{9dc}', '\u{9dd}', L), ('\u{9df}', '\u{9e1}', L), ('\u{9e2}',
-    '\u{9e3}', NSM), ('\u{9e6}', '\u{9f1}', L), ('\u{9f2}', '\u{9f3}', ET), ('\u{9f4}', '\u{9fa}',
-    L), ('\u{9fb}', '\u{9fb}', ET), ('\u{a01}', '\u{a02}', NSM), ('\u{a03}', '\u{a03}', L),
-    ('\u{a05}', '\u{a0a}', L), ('\u{a0f}', '\u{a10}', L), ('\u{a13}', '\u{a28}', L), ('\u{a2a}',
-    '\u{a30}', L), ('\u{a32}', '\u{a33}', L), ('\u{a35}', '\u{a36}', L), ('\u{a38}', '\u{a39}', L),
-    ('\u{a3c}', '\u{a3c}', NSM), ('\u{a3e}', '\u{a40}', L), ('\u{a41}', '\u{a42}', NSM), ('\u{a47}',
-    '\u{a48}', NSM), ('\u{a4b}', '\u{a4d}', NSM), ('\u{a51}', '\u{a51}', NSM), ('\u{a59}',
-    '\u{a5c}', L), ('\u{a5e}', '\u{a5e}', L), ('\u{a66}', '\u{a6f}', L), ('\u{a70}', '\u{a71}',
-    NSM), ('\u{a72}', '\u{a74}', L), ('\u{a75}', '\u{a75}', NSM), ('\u{a81}', '\u{a82}', NSM),
-    ('\u{a83}', '\u{a83}', L), ('\u{a85}', '\u{a8d}', L), ('\u{a8f}', '\u{a91}', L), ('\u{a93}',
-    '\u{aa8}', L), ('\u{aaa}', '\u{ab0}', L), ('\u{ab2}', '\u{ab3}', L), ('\u{ab5}', '\u{ab9}', L),
-    ('\u{abc}', '\u{abc}', NSM), ('\u{abd}', '\u{ac0}', L), ('\u{ac1}', '\u{ac5}', NSM), ('\u{ac7}',
-    '\u{ac8}', NSM), ('\u{ac9}', '\u{ac9}', L), ('\u{acb}', '\u{acc}', L), ('\u{acd}', '\u{acd}',
-    NSM), ('\u{ad0}', '\u{ad0}', L), ('\u{ae0}', '\u{ae1}', L), ('\u{ae2}', '\u{ae3}', NSM),
-    ('\u{ae6}', '\u{af0}', L), ('\u{af1}', '\u{af1}', ET), ('\u{af9}', '\u{af9}', L), ('\u{b01}',
-    '\u{b01}', NSM), ('\u{b02}', '\u{b03}', L), ('\u{b05}', '\u{b0c}', L), ('\u{b0f}', '\u{b10}',
-    L), ('\u{b13}', '\u{b28}', L), ('\u{b2a}', '\u{b30}', L), ('\u{b32}', '\u{b33}', L), ('\u{b35}',
-    '\u{b39}', L), ('\u{b3c}', '\u{b3c}', NSM), ('\u{b3d}', '\u{b3e}', L), ('\u{b3f}', '\u{b3f}',
-    NSM), ('\u{b40}', '\u{b40}', L), ('\u{b41}', '\u{b44}', NSM), ('\u{b47}', '\u{b48}', L),
-    ('\u{b4b}', '\u{b4c}', L), ('\u{b4d}', '\u{b4d}', NSM), ('\u{b56}', '\u{b56}', NSM), ('\u{b57}',
-    '\u{b57}', L), ('\u{b5c}', '\u{b5d}', L), ('\u{b5f}', '\u{b61}', L), ('\u{b62}', '\u{b63}',
-    NSM), ('\u{b66}', '\u{b77}', L), ('\u{b82}', '\u{b82}', NSM), ('\u{b83}', '\u{b83}', L),
-    ('\u{b85}', '\u{b8a}', L), ('\u{b8e}', '\u{b90}', L), ('\u{b92}', '\u{b95}', L), ('\u{b99}',
-    '\u{b9a}', L), ('\u{b9c}', '\u{b9c}', L), ('\u{b9e}', '\u{b9f}', L), ('\u{ba3}', '\u{ba4}', L),
-    ('\u{ba8}', '\u{baa}', L), ('\u{bae}', '\u{bb9}', L), ('\u{bbe}', '\u{bbf}', L), ('\u{bc0}',
-    '\u{bc0}', NSM), ('\u{bc1}', '\u{bc2}', L), ('\u{bc6}', '\u{bc8}', L), ('\u{bca}', '\u{bcc}',
-    L), ('\u{bcd}', '\u{bcd}', NSM), ('\u{bd0}', '\u{bd0}', L), ('\u{bd7}', '\u{bd7}', L),
-    ('\u{be6}', '\u{bf2}', L), ('\u{bf3}', '\u{bf8}', ON), ('\u{bf9}', '\u{bf9}', ET), ('\u{bfa}',
-    '\u{bfa}', ON), ('\u{c00}', '\u{c00}', NSM), ('\u{c01}', '\u{c03}', L), ('\u{c05}', '\u{c0c}',
-    L), ('\u{c0e}', '\u{c10}', L), ('\u{c12}', '\u{c28}', L), ('\u{c2a}', '\u{c39}', L), ('\u{c3d}',
-    '\u{c3d}', L), ('\u{c3e}', '\u{c40}', NSM), ('\u{c41}', '\u{c44}', L), ('\u{c46}', '\u{c48}',
-    NSM), ('\u{c4a}', '\u{c4d}', NSM), ('\u{c55}', '\u{c56}', NSM), ('\u{c58}', '\u{c5a}', L),
-    ('\u{c60}', '\u{c61}', L), ('\u{c62}', '\u{c63}', NSM), ('\u{c66}', '\u{c6f}', L), ('\u{c78}',
-    '\u{c7e}', ON), ('\u{c7f}', '\u{c80}', L), ('\u{c81}', '\u{c81}', NSM), ('\u{c82}', '\u{c83}',
-    L), ('\u{c85}', '\u{c8c}', L), ('\u{c8e}', '\u{c90}', L), ('\u{c92}', '\u{ca8}', L), ('\u{caa}',
-    '\u{cb3}', L), ('\u{cb5}', '\u{cb9}', L), ('\u{cbc}', '\u{cbc}', NSM), ('\u{cbd}', '\u{cc4}',
-    L), ('\u{cc6}', '\u{cc8}', L), ('\u{cca}', '\u{ccb}', L), ('\u{ccc}', '\u{ccd}', NSM),
-    ('\u{cd5}', '\u{cd6}', L), ('\u{cde}', '\u{cde}', L), ('\u{ce0}', '\u{ce1}', L), ('\u{ce2}',
-    '\u{ce3}', NSM), ('\u{ce6}', '\u{cef}', L), ('\u{cf1}', '\u{cf2}', L), ('\u{d01}', '\u{d01}',
-    NSM), ('\u{d02}', '\u{d03}', L), ('\u{d05}', '\u{d0c}', L), ('\u{d0e}', '\u{d10}', L),
-    ('\u{d12}', '\u{d3a}', L), ('\u{d3d}', '\u{d40}', L), ('\u{d41}', '\u{d44}', NSM), ('\u{d46}',
-    '\u{d48}', L), ('\u{d4a}', '\u{d4c}', L), ('\u{d4d}', '\u{d4d}', NSM), ('\u{d4e}', '\u{d4f}',
-    L), ('\u{d54}', '\u{d61}', L), ('\u{d62}', '\u{d63}', NSM), ('\u{d66}', '\u{d7f}', L),
-    ('\u{d82}', '\u{d83}', L), ('\u{d85}', '\u{d96}', L), ('\u{d9a}', '\u{db1}', L), ('\u{db3}',
-    '\u{dbb}', L), ('\u{dbd}', '\u{dbd}', L), ('\u{dc0}', '\u{dc6}', L), ('\u{dca}', '\u{dca}',
-    NSM), ('\u{dcf}', '\u{dd1}', L), ('\u{dd2}', '\u{dd4}', NSM), ('\u{dd6}', '\u{dd6}', NSM),
-    ('\u{dd8}', '\u{ddf}', L), ('\u{de6}', '\u{def}', L), ('\u{df2}', '\u{df4}', L), ('\u{e01}',
-    '\u{e30}', L), ('\u{e31}', '\u{e31}', NSM), ('\u{e32}', '\u{e33}', L), ('\u{e34}', '\u{e3a}',
-    NSM), ('\u{e3f}', '\u{e3f}', ET), ('\u{e40}', '\u{e46}', L), ('\u{e47}', '\u{e4e}', NSM),
-    ('\u{e4f}', '\u{e5b}', L), ('\u{e81}', '\u{e82}', L), ('\u{e84}', '\u{e84}', L), ('\u{e87}',
-    '\u{e88}', L), ('\u{e8a}', '\u{e8a}', L), ('\u{e8d}', '\u{e8d}', L), ('\u{e94}', '\u{e97}', L),
-    ('\u{e99}', '\u{e9f}', L), ('\u{ea1}', '\u{ea3}', L), ('\u{ea5}', '\u{ea5}', L), ('\u{ea7}',
-    '\u{ea7}', L), ('\u{eaa}', '\u{eab}', L), ('\u{ead}', '\u{eb0}', L), ('\u{eb1}', '\u{eb1}',
-    NSM), ('\u{eb2}', '\u{eb3}', L), ('\u{eb4}', '\u{eb9}', NSM), ('\u{ebb}', '\u{ebc}', NSM),
-    ('\u{ebd}', '\u{ebd}', L), ('\u{ec0}', '\u{ec4}', L), ('\u{ec6}', '\u{ec6}', L), ('\u{ec8}',
-    '\u{ecd}', NSM), ('\u{ed0}', '\u{ed9}', L), ('\u{edc}', '\u{edf}', L), ('\u{f00}', '\u{f17}',
-    L), ('\u{f18}', '\u{f19}', NSM), ('\u{f1a}', '\u{f34}', L), ('\u{f35}', '\u{f35}', NSM),
-    ('\u{f36}', '\u{f36}', L), ('\u{f37}', '\u{f37}', NSM), ('\u{f38}', '\u{f38}', L), ('\u{f39}',
-    '\u{f39}', NSM), ('\u{f3a}', '\u{f3d}', ON), ('\u{f3e}', '\u{f47}', L), ('\u{f49}', '\u{f6c}',
-    L), ('\u{f71}', '\u{f7e}', NSM), ('\u{f7f}', '\u{f7f}', L), ('\u{f80}', '\u{f84}', NSM),
-    ('\u{f85}', '\u{f85}', L), ('\u{f86}', '\u{f87}', NSM), ('\u{f88}', '\u{f8c}', L), ('\u{f8d}',
-    '\u{f97}', NSM), ('\u{f99}', '\u{fbc}', NSM), ('\u{fbe}', '\u{fc5}', L), ('\u{fc6}', '\u{fc6}',
-    NSM), ('\u{fc7}', '\u{fcc}', L), ('\u{fce}', '\u{fda}', L), ('\u{1000}', '\u{102c}', L),
-    ('\u{102d}', '\u{1030}', NSM), ('\u{1031}', '\u{1031}', L), ('\u{1032}', '\u{1037}', NSM),
-    ('\u{1038}', '\u{1038}', L), ('\u{1039}', '\u{103a}', NSM), ('\u{103b}', '\u{103c}', L),
-    ('\u{103d}', '\u{103e}', NSM), ('\u{103f}', '\u{1057}', L), ('\u{1058}', '\u{1059}', NSM),
-    ('\u{105a}', '\u{105d}', L), ('\u{105e}', '\u{1060}', NSM), ('\u{1061}', '\u{1070}', L),
-    ('\u{1071}', '\u{1074}', NSM), ('\u{1075}', '\u{1081}', L), ('\u{1082}', '\u{1082}', NSM),
-    ('\u{1083}', '\u{1084}', L), ('\u{1085}', '\u{1086}', NSM), ('\u{1087}', '\u{108c}', L),
-    ('\u{108d}', '\u{108d}', NSM), ('\u{108e}', '\u{109c}', L), ('\u{109d}', '\u{109d}', NSM),
-    ('\u{109e}', '\u{10c5}', L), ('\u{10c7}', '\u{10c7}', L), ('\u{10cd}', '\u{10cd}', L),
-    ('\u{10d0}', '\u{1248}', L), ('\u{124a}', '\u{124d}', L), ('\u{1250}', '\u{1256}', L),
-    ('\u{1258}', '\u{1258}', L), ('\u{125a}', '\u{125d}', L), ('\u{1260}', '\u{1288}', L),
-    ('\u{128a}', '\u{128d}', L), ('\u{1290}', '\u{12b0}', L), ('\u{12b2}', '\u{12b5}', L),
-    ('\u{12b8}', '\u{12be}', L), ('\u{12c0}', '\u{12c0}', L), ('\u{12c2}', '\u{12c5}', L),
-    ('\u{12c8}', '\u{12d6}', L), ('\u{12d8}', '\u{1310}', L), ('\u{1312}', '\u{1315}', L),
-    ('\u{1318}', '\u{135a}', L), ('\u{135d}', '\u{135f}', NSM), ('\u{1360}', '\u{137c}', L),
-    ('\u{1380}', '\u{138f}', L), ('\u{1390}', '\u{1399}', ON), ('\u{13a0}', '\u{13f5}', L),
-    ('\u{13f8}', '\u{13fd}', L), ('\u{1400}', '\u{1400}', ON), ('\u{1401}', '\u{167f}', L),
-    ('\u{1680}', '\u{1680}', WS), ('\u{1681}', '\u{169a}', L), ('\u{169b}', '\u{169c}', ON),
-    ('\u{16a0}', '\u{16f8}', L), ('\u{1700}', '\u{170c}', L), ('\u{170e}', '\u{1711}', L),
-    ('\u{1712}', '\u{1714}', NSM), ('\u{1720}', '\u{1731}', L), ('\u{1732}', '\u{1734}', NSM),
-    ('\u{1735}', '\u{1736}', L), ('\u{1740}', '\u{1751}', L), ('\u{1752}', '\u{1753}', NSM),
-    ('\u{1760}', '\u{176c}', L), ('\u{176e}', '\u{1770}', L), ('\u{1772}', '\u{1773}', NSM),
-    ('\u{1780}', '\u{17b3}', L), ('\u{17b4}', '\u{17b5}', NSM), ('\u{17b6}', '\u{17b6}', L),
-    ('\u{17b7}', '\u{17bd}', NSM), ('\u{17be}', '\u{17c5}', L), ('\u{17c6}', '\u{17c6}', NSM),
-    ('\u{17c7}', '\u{17c8}', L), ('\u{17c9}', '\u{17d3}', NSM), ('\u{17d4}', '\u{17da}', L),
-    ('\u{17db}', '\u{17db}', ET), ('\u{17dc}', '\u{17dc}', L), ('\u{17dd}', '\u{17dd}', NSM),
-    ('\u{17e0}', '\u{17e9}', L), ('\u{17f0}', '\u{17f9}', ON), ('\u{1800}', '\u{180a}', ON),
-    ('\u{180b}', '\u{180d}', NSM), ('\u{180e}', '\u{180e}', BN), ('\u{1810}', '\u{1819}', L),
-    ('\u{1820}', '\u{1877}', L), ('\u{1880}', '\u{1884}', L), ('\u{1885}', '\u{1886}', NSM),
-    ('\u{1887}', '\u{18a8}', L), ('\u{18a9}', '\u{18a9}', NSM), ('\u{18aa}', '\u{18aa}', L),
-    ('\u{18b0}', '\u{18f5}', L), ('\u{1900}', '\u{191e}', L), ('\u{1920}', '\u{1922}', NSM),
-    ('\u{1923}', '\u{1926}', L), ('\u{1927}', '\u{1928}', NSM), ('\u{1929}', '\u{192b}', L),
-    ('\u{1930}', '\u{1931}', L), ('\u{1932}', '\u{1932}', NSM), ('\u{1933}', '\u{1938}', L),
-    ('\u{1939}', '\u{193b}', NSM), ('\u{1940}', '\u{1940}', ON), ('\u{1944}', '\u{1945}', ON),
-    ('\u{1946}', '\u{196d}', L), ('\u{1970}', '\u{1974}', L), ('\u{1980}', '\u{19ab}', L),
-    ('\u{19b0}', '\u{19c9}', L), ('\u{19d0}', '\u{19da}', L), ('\u{19de}', '\u{19ff}', ON),
-    ('\u{1a00}', '\u{1a16}', L), ('\u{1a17}', '\u{1a18}', NSM), ('\u{1a19}', '\u{1a1a}', L),
-    ('\u{1a1b}', '\u{1a1b}', NSM), ('\u{1a1e}', '\u{1a55}', L), ('\u{1a56}', '\u{1a56}', NSM),
-    ('\u{1a57}', '\u{1a57}', L), ('\u{1a58}', '\u{1a5e}', NSM), ('\u{1a60}', '\u{1a60}', NSM),
-    ('\u{1a61}', '\u{1a61}', L), ('\u{1a62}', '\u{1a62}', NSM), ('\u{1a63}', '\u{1a64}', L),
-    ('\u{1a65}', '\u{1a6c}', NSM), ('\u{1a6d}', '\u{1a72}', L), ('\u{1a73}', '\u{1a7c}', NSM),
-    ('\u{1a7f}', '\u{1a7f}', NSM), ('\u{1a80}', '\u{1a89}', L), ('\u{1a90}', '\u{1a99}', L),
-    ('\u{1aa0}', '\u{1aad}', L), ('\u{1ab0}', '\u{1abe}', NSM), ('\u{1b00}', '\u{1b03}', NSM),
-    ('\u{1b04}', '\u{1b33}', L), ('\u{1b34}', '\u{1b34}', NSM), ('\u{1b35}', '\u{1b35}', L),
-    ('\u{1b36}', '\u{1b3a}', NSM), ('\u{1b3b}', '\u{1b3b}', L), ('\u{1b3c}', '\u{1b3c}', NSM),
-    ('\u{1b3d}', '\u{1b41}', L), ('\u{1b42}', '\u{1b42}', NSM), ('\u{1b43}', '\u{1b4b}', L),
-    ('\u{1b50}', '\u{1b6a}', L), ('\u{1b6b}', '\u{1b73}', NSM), ('\u{1b74}', '\u{1b7c}', L),
-    ('\u{1b80}', '\u{1b81}', NSM), ('\u{1b82}', '\u{1ba1}', L), ('\u{1ba2}', '\u{1ba5}', NSM),
-    ('\u{1ba6}', '\u{1ba7}', L), ('\u{1ba8}', '\u{1ba9}', NSM), ('\u{1baa}', '\u{1baa}', L),
-    ('\u{1bab}', '\u{1bad}', NSM), ('\u{1bae}', '\u{1be5}', L), ('\u{1be6}', '\u{1be6}', NSM),
-    ('\u{1be7}', '\u{1be7}', L), ('\u{1be8}', '\u{1be9}', NSM), ('\u{1bea}', '\u{1bec}', L),
-    ('\u{1bed}', '\u{1bed}', NSM), ('\u{1bee}', '\u{1bee}', L), ('\u{1bef}', '\u{1bf1}', NSM),
-    ('\u{1bf2}', '\u{1bf3}', L), ('\u{1bfc}', '\u{1c2b}', L), ('\u{1c2c}', '\u{1c33}', NSM),
-    ('\u{1c34}', '\u{1c35}', L), ('\u{1c36}', '\u{1c37}', NSM), ('\u{1c3b}', '\u{1c49}', L),
-    ('\u{1c4d}', '\u{1c88}', L), ('\u{1cc0}', '\u{1cc7}', L), ('\u{1cd0}', '\u{1cd2}', NSM),
-    ('\u{1cd3}', '\u{1cd3}', L), ('\u{1cd4}', '\u{1ce0}', NSM), ('\u{1ce1}', '\u{1ce1}', L),
-    ('\u{1ce2}', '\u{1ce8}', NSM), ('\u{1ce9}', '\u{1cec}', L), ('\u{1ced}', '\u{1ced}', NSM),
-    ('\u{1cee}', '\u{1cf3}', L), ('\u{1cf4}', '\u{1cf4}', NSM), ('\u{1cf5}', '\u{1cf6}', L),
-    ('\u{1cf8}', '\u{1cf9}', NSM), ('\u{1d00}', '\u{1dbf}', L), ('\u{1dc0}', '\u{1df5}', NSM),
-    ('\u{1dfb}', '\u{1dff}', NSM), ('\u{1e00}', '\u{1f15}', L), ('\u{1f18}', '\u{1f1d}', L),
-    ('\u{1f20}', '\u{1f45}', L), ('\u{1f48}', '\u{1f4d}', L), ('\u{1f50}', '\u{1f57}', L),
-    ('\u{1f59}', '\u{1f59}', L), ('\u{1f5b}', '\u{1f5b}', L), ('\u{1f5d}', '\u{1f5d}', L),
-    ('\u{1f5f}', '\u{1f7d}', L), ('\u{1f80}', '\u{1fb4}', L), ('\u{1fb6}', '\u{1fbc}', L),
-    ('\u{1fbd}', '\u{1fbd}', ON), ('\u{1fbe}', '\u{1fbe}', L), ('\u{1fbf}', '\u{1fc1}', ON),
-    ('\u{1fc2}', '\u{1fc4}', L), ('\u{1fc6}', '\u{1fcc}', L), ('\u{1fcd}', '\u{1fcf}', ON),
-    ('\u{1fd0}', '\u{1fd3}', L), ('\u{1fd6}', '\u{1fdb}', L), ('\u{1fdd}', '\u{1fdf}', ON),
-    ('\u{1fe0}', '\u{1fec}', L), ('\u{1fed}', '\u{1fef}', ON), ('\u{1ff2}', '\u{1ff4}', L),
-    ('\u{1ff6}', '\u{1ffc}', L), ('\u{1ffd}', '\u{1ffe}', ON), ('\u{2000}', '\u{200a}', WS),
-    ('\u{200b}', '\u{200d}', BN), ('\u{200e}', '\u{200e}', L), ('\u{200f}', '\u{200f}', R),
-    ('\u{2010}', '\u{2027}', ON), ('\u{2028}', '\u{2028}', WS), ('\u{2029}', '\u{2029}', B),
-    ('\u{202a}', '\u{202a}', LRE), ('\u{202b}', '\u{202b}', RLE), ('\u{202c}', '\u{202c}', PDF),
-    ('\u{202d}', '\u{202d}', LRO), ('\u{202e}', '\u{202e}', RLO), ('\u{202f}', '\u{202f}', CS),
-    ('\u{2030}', '\u{2034}', ET), ('\u{2035}', '\u{2043}', ON), ('\u{2044}', '\u{2044}', CS),
-    ('\u{2045}', '\u{205e}', ON), ('\u{205f}', '\u{205f}', WS), ('\u{2060}', '\u{2064}', BN),
-    ('\u{2066}', '\u{2066}', LRI), ('\u{2067}', '\u{2067}', RLI), ('\u{2068}', '\u{2068}', FSI),
-    ('\u{2069}', '\u{2069}', PDI), ('\u{206a}', '\u{206f}', BN), ('\u{2070}', '\u{2070}', EN),
-    ('\u{2071}', '\u{2071}', L), ('\u{2074}', '\u{2079}', EN), ('\u{207a}', '\u{207b}', ES),
-    ('\u{207c}', '\u{207e}', ON), ('\u{207f}', '\u{207f}', L), ('\u{2080}', '\u{2089}', EN),
-    ('\u{208a}', '\u{208b}', ES), ('\u{208c}', '\u{208e}', ON), ('\u{2090}', '\u{209c}', L),
-    ('\u{20a0}', '\u{20cf}', ET), ('\u{20d0}', '\u{20f0}', NSM), ('\u{2100}', '\u{2101}', ON),
-    ('\u{2102}', '\u{2102}', L), ('\u{2103}', '\u{2106}', ON), ('\u{2107}', '\u{2107}', L),
-    ('\u{2108}', '\u{2109}', ON), ('\u{210a}', '\u{2113}', L), ('\u{2114}', '\u{2114}', ON),
-    ('\u{2115}', '\u{2115}', L), ('\u{2116}', '\u{2118}', ON), ('\u{2119}', '\u{211d}', L),
-    ('\u{211e}', '\u{2123}', ON), ('\u{2124}', '\u{2124}', L), ('\u{2125}', '\u{2125}', ON),
-    ('\u{2126}', '\u{2126}', L), ('\u{2127}', '\u{2127}', ON), ('\u{2128}', '\u{2128}', L),
-    ('\u{2129}', '\u{2129}', ON), ('\u{212a}', '\u{212d}', L), ('\u{212e}', '\u{212e}', ET),
-    ('\u{212f}', '\u{2139}', L), ('\u{213a}', '\u{213b}', ON), ('\u{213c}', '\u{213f}', L),
-    ('\u{2140}', '\u{2144}', ON), ('\u{2145}', '\u{2149}', L), ('\u{214a}', '\u{214d}', ON),
-    ('\u{214e}', '\u{214f}', L), ('\u{2150}', '\u{215f}', ON), ('\u{2160}', '\u{2188}', L),
-    ('\u{2189}', '\u{218b}', ON), ('\u{2190}', '\u{2211}', ON), ('\u{2212}', '\u{2212}', ES),
-    ('\u{2213}', '\u{2213}', ET), ('\u{2214}', '\u{2335}', ON), ('\u{2336}', '\u{237a}', L),
-    ('\u{237b}', '\u{2394}', ON), ('\u{2395}', '\u{2395}', L), ('\u{2396}', '\u{23fe}', ON),
-    ('\u{2400}', '\u{2426}', ON), ('\u{2440}', '\u{244a}', ON), ('\u{2460}', '\u{2487}', ON),
-    ('\u{2488}', '\u{249b}', EN), ('\u{249c}', '\u{24e9}', L), ('\u{24ea}', '\u{26ab}', ON),
-    ('\u{26ac}', '\u{26ac}', L), ('\u{26ad}', '\u{27ff}', ON), ('\u{2800}', '\u{28ff}', L),
-    ('\u{2900}', '\u{2b73}', ON), ('\u{2b76}', '\u{2b95}', ON), ('\u{2b98}', '\u{2bb9}', ON),
-    ('\u{2bbd}', '\u{2bc8}', ON), ('\u{2bca}', '\u{2bd1}', ON), ('\u{2bec}', '\u{2bef}', ON),
-    ('\u{2c00}', '\u{2c2e}', L), ('\u{2c30}', '\u{2c5e}', L), ('\u{2c60}', '\u{2ce4}', L),
-    ('\u{2ce5}', '\u{2cea}', ON), ('\u{2ceb}', '\u{2cee}', L), ('\u{2cef}', '\u{2cf1}', NSM),
-    ('\u{2cf2}', '\u{2cf3}', L), ('\u{2cf9}', '\u{2cff}', ON), ('\u{2d00}', '\u{2d25}', L),
-    ('\u{2d27}', '\u{2d27}', L), ('\u{2d2d}', '\u{2d2d}', L), ('\u{2d30}', '\u{2d67}', L),
-    ('\u{2d6f}', '\u{2d70}', L), ('\u{2d7f}', '\u{2d7f}', NSM), ('\u{2d80}', '\u{2d96}', L),
-    ('\u{2da0}', '\u{2da6}', L), ('\u{2da8}', '\u{2dae}', L), ('\u{2db0}', '\u{2db6}', L),
-    ('\u{2db8}', '\u{2dbe}', L), ('\u{2dc0}', '\u{2dc6}', L), ('\u{2dc8}', '\u{2dce}', L),
-    ('\u{2dd0}', '\u{2dd6}', L), ('\u{2dd8}', '\u{2dde}', L), ('\u{2de0}', '\u{2dff}', NSM),
-    ('\u{2e00}', '\u{2e44}', ON), ('\u{2e80}', '\u{2e99}', ON), ('\u{2e9b}', '\u{2ef3}', ON),
-    ('\u{2f00}', '\u{2fd5}', ON), ('\u{2ff0}', '\u{2ffb}', ON), ('\u{3000}', '\u{3000}', WS),
-    ('\u{3001}', '\u{3004}', ON), ('\u{3005}', '\u{3007}', L), ('\u{3008}', '\u{3020}', ON),
-    ('\u{3021}', '\u{3029}', L), ('\u{302a}', '\u{302d}', NSM), ('\u{302e}', '\u{302f}', L),
-    ('\u{3030}', '\u{3030}', ON), ('\u{3031}', '\u{3035}', L), ('\u{3036}', '\u{3037}', ON),
-    ('\u{3038}', '\u{303c}', L), ('\u{303d}', '\u{303f}', ON), ('\u{3041}', '\u{3096}', L),
-    ('\u{3099}', '\u{309a}', NSM), ('\u{309b}', '\u{309c}', ON), ('\u{309d}', '\u{309f}', L),
-    ('\u{30a0}', '\u{30a0}', ON), ('\u{30a1}', '\u{30fa}', L), ('\u{30fb}', '\u{30fb}', ON),
-    ('\u{30fc}', '\u{30ff}', L), ('\u{3105}', '\u{312d}', L), ('\u{3131}', '\u{318e}', L),
-    ('\u{3190}', '\u{31ba}', L), ('\u{31c0}', '\u{31e3}', ON), ('\u{31f0}', '\u{321c}', L),
-    ('\u{321d}', '\u{321e}', ON), ('\u{3220}', '\u{324f}', L), ('\u{3250}', '\u{325f}', ON),
-    ('\u{3260}', '\u{327b}', L), ('\u{327c}', '\u{327e}', ON), ('\u{327f}', '\u{32b0}', L),
-    ('\u{32b1}', '\u{32bf}', ON), ('\u{32c0}', '\u{32cb}', L), ('\u{32cc}', '\u{32cf}', ON),
-    ('\u{32d0}', '\u{32fe}', L), ('\u{3300}', '\u{3376}', L), ('\u{3377}', '\u{337a}', ON),
-    ('\u{337b}', '\u{33dd}', L), ('\u{33de}', '\u{33df}', ON), ('\u{33e0}', '\u{33fe}', L),
-    ('\u{33ff}', '\u{33ff}', ON), ('\u{3400}', '\u{4db5}', L), ('\u{4dc0}', '\u{4dff}', ON),
-    ('\u{4e00}', '\u{9fd5}', L), ('\u{a000}', '\u{a48c}', L), ('\u{a490}', '\u{a4c6}', ON),
-    ('\u{a4d0}', '\u{a60c}', L), ('\u{a60d}', '\u{a60f}', ON), ('\u{a610}', '\u{a62b}', L),
-    ('\u{a640}', '\u{a66e}', L), ('\u{a66f}', '\u{a672}', NSM), ('\u{a673}', '\u{a673}', ON),
-    ('\u{a674}', '\u{a67d}', NSM), ('\u{a67e}', '\u{a67f}', ON), ('\u{a680}', '\u{a69d}', L),
-    ('\u{a69e}', '\u{a69f}', NSM), ('\u{a6a0}', '\u{a6ef}', L), ('\u{a6f0}', '\u{a6f1}', NSM),
-    ('\u{a6f2}', '\u{a6f7}', L), ('\u{a700}', '\u{a721}', ON), ('\u{a722}', '\u{a787}', L),
-    ('\u{a788}', '\u{a788}', ON), ('\u{a789}', '\u{a7ae}', L), ('\u{a7b0}', '\u{a7b7}', L),
-    ('\u{a7f7}', '\u{a801}', L), ('\u{a802}', '\u{a802}', NSM), ('\u{a803}', '\u{a805}', L),
-    ('\u{a806}', '\u{a806}', NSM), ('\u{a807}', '\u{a80a}', L), ('\u{a80b}', '\u{a80b}', NSM),
-    ('\u{a80c}', '\u{a824}', L), ('\u{a825}', '\u{a826}', NSM), ('\u{a827}', '\u{a827}', L),
-    ('\u{a828}', '\u{a82b}', ON), ('\u{a830}', '\u{a837}', L), ('\u{a838}', '\u{a839}', ET),
-    ('\u{a840}', '\u{a873}', L), ('\u{a874}', '\u{a877}', ON), ('\u{a880}', '\u{a8c3}', L),
-    ('\u{a8c4}', '\u{a8c5}', NSM), ('\u{a8ce}', '\u{a8d9}', L), ('\u{a8e0}', '\u{a8f1}', NSM),
-    ('\u{a8f2}', '\u{a8fd}', L), ('\u{a900}', '\u{a925}', L), ('\u{a926}', '\u{a92d}', NSM),
-    ('\u{a92e}', '\u{a946}', L), ('\u{a947}', '\u{a951}', NSM), ('\u{a952}', '\u{a953}', L),
-    ('\u{a95f}', '\u{a97c}', L), ('\u{a980}', '\u{a982}', NSM), ('\u{a983}', '\u{a9b2}', L),
-    ('\u{a9b3}', '\u{a9b3}', NSM), ('\u{a9b4}', '\u{a9b5}', L), ('\u{a9b6}', '\u{a9b9}', NSM),
-    ('\u{a9ba}', '\u{a9bb}', L), ('\u{a9bc}', '\u{a9bc}', NSM), ('\u{a9bd}', '\u{a9cd}', L),
-    ('\u{a9cf}', '\u{a9d9}', L), ('\u{a9de}', '\u{a9e4}', L), ('\u{a9e5}', '\u{a9e5}', NSM),
-    ('\u{a9e6}', '\u{a9fe}', L), ('\u{aa00}', '\u{aa28}', L), ('\u{aa29}', '\u{aa2e}', NSM),
-    ('\u{aa2f}', '\u{aa30}', L), ('\u{aa31}', '\u{aa32}', NSM), ('\u{aa33}', '\u{aa34}', L),
-    ('\u{aa35}', '\u{aa36}', NSM), ('\u{aa40}', '\u{aa42}', L), ('\u{aa43}', '\u{aa43}', NSM),
-    ('\u{aa44}', '\u{aa4b}', L), ('\u{aa4c}', '\u{aa4c}', NSM), ('\u{aa4d}', '\u{aa4d}', L),
-    ('\u{aa50}', '\u{aa59}', L), ('\u{aa5c}', '\u{aa7b}', L), ('\u{aa7c}', '\u{aa7c}', NSM),
-    ('\u{aa7d}', '\u{aaaf}', L), ('\u{aab0}', '\u{aab0}', NSM), ('\u{aab1}', '\u{aab1}', L),
-    ('\u{aab2}', '\u{aab4}', NSM), ('\u{aab5}', '\u{aab6}', L), ('\u{aab7}', '\u{aab8}', NSM),
-    ('\u{aab9}', '\u{aabd}', L), ('\u{aabe}', '\u{aabf}', NSM), ('\u{aac0}', '\u{aac0}', L),
-    ('\u{aac1}', '\u{aac1}', NSM), ('\u{aac2}', '\u{aac2}', L), ('\u{aadb}', '\u{aaeb}', L),
-    ('\u{aaec}', '\u{aaed}', NSM), ('\u{aaee}', '\u{aaf5}', L), ('\u{aaf6}', '\u{aaf6}', NSM),
-    ('\u{ab01}', '\u{ab06}', L), ('\u{ab09}', '\u{ab0e}', L), ('\u{ab11}', '\u{ab16}', L),
-    ('\u{ab20}', '\u{ab26}', L), ('\u{ab28}', '\u{ab2e}', L), ('\u{ab30}', '\u{ab65}', L),
-    ('\u{ab70}', '\u{abe4}', L), ('\u{abe5}', '\u{abe5}', NSM), ('\u{abe6}', '\u{abe7}', L),
-    ('\u{abe8}', '\u{abe8}', NSM), ('\u{abe9}', '\u{abec}', L), ('\u{abed}', '\u{abed}', NSM),
-    ('\u{abf0}', '\u{abf9}', L), ('\u{ac00}', '\u{d7a3}', L), ('\u{d7b0}', '\u{d7c6}', L),
-    ('\u{d7cb}', '\u{d7fb}', L), ('\u{e000}', '\u{fa6d}', L), ('\u{fa70}', '\u{fad9}', L),
-    ('\u{fb00}', '\u{fb06}', L), ('\u{fb13}', '\u{fb17}', L), ('\u{fb1d}', '\u{fb1d}', R),
-    ('\u{fb1e}', '\u{fb1e}', NSM), ('\u{fb1f}', '\u{fb28}', R), ('\u{fb29}', '\u{fb29}', ES),
-    ('\u{fb2a}', '\u{fb4f}', R), ('\u{fb50}', '\u{fd3d}', AL), ('\u{fd3e}', '\u{fd3f}', ON),
-    ('\u{fd40}', '\u{fdcf}', AL), ('\u{fdf0}', '\u{fdfc}', AL), ('\u{fdfd}', '\u{fdfd}', ON),
-    ('\u{fdfe}', '\u{fdff}', AL), ('\u{fe00}', '\u{fe0f}', NSM), ('\u{fe10}', '\u{fe19}', ON),
-    ('\u{fe20}', '\u{fe2f}', NSM), ('\u{fe30}', '\u{fe4f}', ON), ('\u{fe50}', '\u{fe50}', CS),
-    ('\u{fe51}', '\u{fe51}', ON), ('\u{fe52}', '\u{fe52}', CS), ('\u{fe54}', '\u{fe54}', ON),
-    ('\u{fe55}', '\u{fe55}', CS), ('\u{fe56}', '\u{fe5e}', ON), ('\u{fe5f}', '\u{fe5f}', ET),
-    ('\u{fe60}', '\u{fe61}', ON), ('\u{fe62}', '\u{fe63}', ES), ('\u{fe64}', '\u{fe66}', ON),
-    ('\u{fe68}', '\u{fe68}', ON), ('\u{fe69}', '\u{fe6a}', ET), ('\u{fe6b}', '\u{fe6b}', ON),
-    ('\u{fe70}', '\u{fefe}', AL), ('\u{feff}', '\u{feff}', BN), ('\u{ff01}', '\u{ff02}', ON),
-    ('\u{ff03}', '\u{ff05}', ET), ('\u{ff06}', '\u{ff0a}', ON), ('\u{ff0b}', '\u{ff0b}', ES),
-    ('\u{ff0c}', '\u{ff0c}', CS), ('\u{ff0d}', '\u{ff0d}', ES), ('\u{ff0e}', '\u{ff0f}', CS),
-    ('\u{ff10}', '\u{ff19}', EN), ('\u{ff1a}', '\u{ff1a}', CS), ('\u{ff1b}', '\u{ff20}', ON),
-    ('\u{ff21}', '\u{ff3a}', L), ('\u{ff3b}', '\u{ff40}', ON), ('\u{ff41}', '\u{ff5a}', L),
-    ('\u{ff5b}', '\u{ff65}', ON), ('\u{ff66}', '\u{ffbe}', L), ('\u{ffc2}', '\u{ffc7}', L),
-    ('\u{ffca}', '\u{ffcf}', L), ('\u{ffd2}', '\u{ffd7}', L), ('\u{ffda}', '\u{ffdc}', L),
-    ('\u{ffe0}', '\u{ffe1}', ET), ('\u{ffe2}', '\u{ffe4}', ON), ('\u{ffe5}', '\u{ffe6}', ET),
-    ('\u{ffe8}', '\u{ffee}', ON), ('\u{fff9}', '\u{fffd}', ON), ('\u{10000}', '\u{1000b}', L),
-    ('\u{1000d}', '\u{10026}', L), ('\u{10028}', '\u{1003a}', L), ('\u{1003c}', '\u{1003d}', L),
-    ('\u{1003f}', '\u{1004d}', L), ('\u{10050}', '\u{1005d}', L), ('\u{10080}', '\u{100fa}', L),
-    ('\u{10100}', '\u{10100}', L), ('\u{10101}', '\u{10101}', ON), ('\u{10102}', '\u{10102}', L),
-    ('\u{10107}', '\u{10133}', L), ('\u{10137}', '\u{1013f}', L), ('\u{10140}', '\u{1018c}', ON),
-    ('\u{1018d}', '\u{1018e}', L), ('\u{10190}', '\u{1019b}', ON), ('\u{101a0}', '\u{101a0}', ON),
-    ('\u{101d0}', '\u{101fc}', L), ('\u{101fd}', '\u{101fd}', NSM), ('\u{10280}', '\u{1029c}', L),
-    ('\u{102a0}', '\u{102d0}', L), ('\u{102e0}', '\u{102e0}', NSM), ('\u{102e1}', '\u{102fb}', EN),
-    ('\u{10300}', '\u{10323}', L), ('\u{10330}', '\u{1034a}', L), ('\u{10350}', '\u{10375}', L),
-    ('\u{10376}', '\u{1037a}', NSM), ('\u{10380}', '\u{1039d}', L), ('\u{1039f}', '\u{103c3}', L),
-    ('\u{103c8}', '\u{103d5}', L), ('\u{10400}', '\u{1049d}', L), ('\u{104a0}', '\u{104a9}', L),
-    ('\u{104b0}', '\u{104d3}', L), ('\u{104d8}', '\u{104fb}', L), ('\u{10500}', '\u{10527}', L),
-    ('\u{10530}', '\u{10563}', L), ('\u{1056f}', '\u{1056f}', L), ('\u{10600}', '\u{10736}', L),
-    ('\u{10740}', '\u{10755}', L), ('\u{10760}', '\u{10767}', L), ('\u{10800}', '\u{1091e}', R),
-    ('\u{1091f}', '\u{1091f}', ON), ('\u{10920}', '\u{10a00}', R), ('\u{10a01}', '\u{10a03}', NSM),
-    ('\u{10a04}', '\u{10a04}', R), ('\u{10a05}', '\u{10a06}', NSM), ('\u{10a07}', '\u{10a0b}', R),
-    ('\u{10a0c}', '\u{10a0f}', NSM), ('\u{10a10}', '\u{10a37}', R), ('\u{10a38}', '\u{10a3a}', NSM),
-    ('\u{10a3b}', '\u{10a3e}', R), ('\u{10a3f}', '\u{10a3f}', NSM), ('\u{10a40}', '\u{10ae4}', R),
-    ('\u{10ae5}', '\u{10ae6}', NSM), ('\u{10ae7}', '\u{10b38}', R), ('\u{10b39}', '\u{10b3f}', ON),
-    ('\u{10b40}', '\u{10e5f}', R), ('\u{10e60}', '\u{10e7e}', AN), ('\u{10e7f}', '\u{10fff}', R),
-    ('\u{11000}', '\u{11000}', L), ('\u{11001}', '\u{11001}', NSM), ('\u{11002}', '\u{11037}', L),
-    ('\u{11038}', '\u{11046}', NSM), ('\u{11047}', '\u{1104d}', L), ('\u{11052}', '\u{11065}', ON),
-    ('\u{11066}', '\u{1106f}', L), ('\u{1107f}', '\u{11081}', NSM), ('\u{11082}', '\u{110b2}', L),
-    ('\u{110b3}', '\u{110b6}', NSM), ('\u{110b7}', '\u{110b8}', L), ('\u{110b9}', '\u{110ba}', NSM),
-    ('\u{110bb}', '\u{110c1}', L), ('\u{110d0}', '\u{110e8}', L), ('\u{110f0}', '\u{110f9}', L),
-    ('\u{11100}', '\u{11102}', NSM), ('\u{11103}', '\u{11126}', L), ('\u{11127}', '\u{1112b}', NSM),
-    ('\u{1112c}', '\u{1112c}', L), ('\u{1112d}', '\u{11134}', NSM), ('\u{11136}', '\u{11143}', L),
-    ('\u{11150}', '\u{11172}', L), ('\u{11173}', '\u{11173}', NSM), ('\u{11174}', '\u{11176}', L),
-    ('\u{11180}', '\u{11181}', NSM), ('\u{11182}', '\u{111b5}', L), ('\u{111b6}', '\u{111be}', NSM),
-    ('\u{111bf}', '\u{111c9}', L), ('\u{111ca}', '\u{111cc}', NSM), ('\u{111cd}', '\u{111cd}', L),
-    ('\u{111d0}', '\u{111df}', L), ('\u{111e1}', '\u{111f4}', L), ('\u{11200}', '\u{11211}', L),
-    ('\u{11213}', '\u{1122e}', L), ('\u{1122f}', '\u{11231}', NSM), ('\u{11232}', '\u{11233}', L),
-    ('\u{11234}', '\u{11234}', NSM), ('\u{11235}', '\u{11235}', L), ('\u{11236}', '\u{11237}', NSM),
-    ('\u{11238}', '\u{1123d}', L), ('\u{1123e}', '\u{1123e}', NSM), ('\u{11280}', '\u{11286}', L),
-    ('\u{11288}', '\u{11288}', L), ('\u{1128a}', '\u{1128d}', L), ('\u{1128f}', '\u{1129d}', L),
-    ('\u{1129f}', '\u{112a9}', L), ('\u{112b0}', '\u{112de}', L), ('\u{112df}', '\u{112df}', NSM),
-    ('\u{112e0}', '\u{112e2}', L), ('\u{112e3}', '\u{112ea}', NSM), ('\u{112f0}', '\u{112f9}', L),
-    ('\u{11300}', '\u{11301}', NSM), ('\u{11302}', '\u{11303}', L), ('\u{11305}', '\u{1130c}', L),
-    ('\u{1130f}', '\u{11310}', L), ('\u{11313}', '\u{11328}', L), ('\u{1132a}', '\u{11330}', L),
-    ('\u{11332}', '\u{11333}', L), ('\u{11335}', '\u{11339}', L), ('\u{1133c}', '\u{1133c}', NSM),
-    ('\u{1133d}', '\u{1133f}', L), ('\u{11340}', '\u{11340}', NSM), ('\u{11341}', '\u{11344}', L),
-    ('\u{11347}', '\u{11348}', L), ('\u{1134b}', '\u{1134d}', L), ('\u{11350}', '\u{11350}', L),
-    ('\u{11357}', '\u{11357}', L), ('\u{1135d}', '\u{11363}', L), ('\u{11366}', '\u{1136c}', NSM),
-    ('\u{11370}', '\u{11374}', NSM), ('\u{11400}', '\u{11437}', L), ('\u{11438}', '\u{1143f}', NSM),
-    ('\u{11440}', '\u{11441}', L), ('\u{11442}', '\u{11444}', NSM), ('\u{11445}', '\u{11445}', L),
-    ('\u{11446}', '\u{11446}', NSM), ('\u{11447}', '\u{11459}', L), ('\u{1145b}', '\u{1145b}', L),
-    ('\u{1145d}', '\u{1145d}', L), ('\u{11480}', '\u{114b2}', L), ('\u{114b3}', '\u{114b8}', NSM),
-    ('\u{114b9}', '\u{114b9}', L), ('\u{114ba}', '\u{114ba}', NSM), ('\u{114bb}', '\u{114be}', L),
-    ('\u{114bf}', '\u{114c0}', NSM), ('\u{114c1}', '\u{114c1}', L), ('\u{114c2}', '\u{114c3}', NSM),
-    ('\u{114c4}', '\u{114c7}', L), ('\u{114d0}', '\u{114d9}', L), ('\u{11580}', '\u{115b1}', L),
-    ('\u{115b2}', '\u{115b5}', NSM), ('\u{115b8}', '\u{115bb}', L), ('\u{115bc}', '\u{115bd}', NSM),
-    ('\u{115be}', '\u{115be}', L), ('\u{115bf}', '\u{115c0}', NSM), ('\u{115c1}', '\u{115db}', L),
-    ('\u{115dc}', '\u{115dd}', NSM), ('\u{11600}', '\u{11632}', L), ('\u{11633}', '\u{1163a}', NSM),
-    ('\u{1163b}', '\u{1163c}', L), ('\u{1163d}', '\u{1163d}', NSM), ('\u{1163e}', '\u{1163e}', L),
-    ('\u{1163f}', '\u{11640}', NSM), ('\u{11641}', '\u{11644}', L), ('\u{11650}', '\u{11659}', L),
-    ('\u{11660}', '\u{1166c}', ON), ('\u{11680}', '\u{116aa}', L), ('\u{116ab}', '\u{116ab}', NSM),
-    ('\u{116ac}', '\u{116ac}', L), ('\u{116ad}', '\u{116ad}', NSM), ('\u{116ae}', '\u{116af}', L),
-    ('\u{116b0}', '\u{116b5}', NSM), ('\u{116b6}', '\u{116b6}', L), ('\u{116b7}', '\u{116b7}', NSM),
-    ('\u{116c0}', '\u{116c9}', L), ('\u{11700}', '\u{11719}', L), ('\u{1171d}', '\u{1171f}', NSM),
-    ('\u{11720}', '\u{11721}', L), ('\u{11722}', '\u{11725}', NSM), ('\u{11726}', '\u{11726}', L),
-    ('\u{11727}', '\u{1172b}', NSM), ('\u{11730}', '\u{1173f}', L), ('\u{118a0}', '\u{118f2}', L),
-    ('\u{118ff}', '\u{118ff}', L), ('\u{11ac0}', '\u{11af8}', L), ('\u{11c00}', '\u{11c08}', L),
-    ('\u{11c0a}', '\u{11c2f}', L), ('\u{11c30}', '\u{11c36}', NSM), ('\u{11c38}', '\u{11c3d}', NSM),
-    ('\u{11c3e}', '\u{11c45}', L), ('\u{11c50}', '\u{11c6c}', L), ('\u{11c70}', '\u{11c8f}', L),
-    ('\u{11c92}', '\u{11ca7}', NSM), ('\u{11ca9}', '\u{11ca9}', L), ('\u{11caa}', '\u{11cb0}', NSM),
-    ('\u{11cb1}', '\u{11cb1}', L), ('\u{11cb2}', '\u{11cb3}', NSM), ('\u{11cb4}', '\u{11cb4}', L),
-    ('\u{11cb5}', '\u{11cb6}', NSM), ('\u{12000}', '\u{12399}', L), ('\u{12400}', '\u{1246e}', L),
-    ('\u{12470}', '\u{12474}', L), ('\u{12480}', '\u{12543}', L), ('\u{13000}', '\u{1342e}', L),
-    ('\u{14400}', '\u{14646}', L), ('\u{16800}', '\u{16a38}', L), ('\u{16a40}', '\u{16a5e}', L),
-    ('\u{16a60}', '\u{16a69}', L), ('\u{16a6e}', '\u{16a6f}', L), ('\u{16ad0}', '\u{16aed}', L),
-    ('\u{16af0}', '\u{16af4}', NSM), ('\u{16af5}', '\u{16af5}', L), ('\u{16b00}', '\u{16b2f}', L),
-    ('\u{16b30}', '\u{16b36}', NSM), ('\u{16b37}', '\u{16b45}', L), ('\u{16b50}', '\u{16b59}', L),
-    ('\u{16b5b}', '\u{16b61}', L), ('\u{16b63}', '\u{16b77}', L), ('\u{16b7d}', '\u{16b8f}', L),
-    ('\u{16f00}', '\u{16f44}', L), ('\u{16f50}', '\u{16f7e}', L), ('\u{16f8f}', '\u{16f92}', NSM),
-    ('\u{16f93}', '\u{16f9f}', L), ('\u{16fe0}', '\u{16fe0}', L), ('\u{17000}', '\u{187ec}', L),
-    ('\u{18800}', '\u{18af2}', L), ('\u{1b000}', '\u{1b001}', L), ('\u{1bc00}', '\u{1bc6a}', L),
-    ('\u{1bc70}', '\u{1bc7c}', L), ('\u{1bc80}', '\u{1bc88}', L), ('\u{1bc90}', '\u{1bc99}', L),
-    ('\u{1bc9c}', '\u{1bc9c}', L), ('\u{1bc9d}', '\u{1bc9e}', NSM), ('\u{1bc9f}', '\u{1bc9f}', L),
-    ('\u{1bca0}', '\u{1bca3}', BN), ('\u{1d000}', '\u{1d0f5}', L), ('\u{1d100}', '\u{1d126}', L),
-    ('\u{1d129}', '\u{1d166}', L), ('\u{1d167}', '\u{1d169}', NSM), ('\u{1d16a}', '\u{1d172}', L),
-    ('\u{1d173}', '\u{1d17a}', BN), ('\u{1d17b}', '\u{1d182}', NSM), ('\u{1d183}', '\u{1d184}', L),
-    ('\u{1d185}', '\u{1d18b}', NSM), ('\u{1d18c}', '\u{1d1a9}', L), ('\u{1d1aa}', '\u{1d1ad}', NSM),
-    ('\u{1d1ae}', '\u{1d1e8}', L), ('\u{1d200}', '\u{1d241}', ON), ('\u{1d242}', '\u{1d244}', NSM),
-    ('\u{1d245}', '\u{1d245}', ON), ('\u{1d300}', '\u{1d356}', ON), ('\u{1d360}', '\u{1d371}', L),
-    ('\u{1d400}', '\u{1d454}', L), ('\u{1d456}', '\u{1d49c}', L), ('\u{1d49e}', '\u{1d49f}', L),
-    ('\u{1d4a2}', '\u{1d4a2}', L), ('\u{1d4a5}', '\u{1d4a6}', L), ('\u{1d4a9}', '\u{1d4ac}', L),
-    ('\u{1d4ae}', '\u{1d4b9}', L), ('\u{1d4bb}', '\u{1d4bb}', L), ('\u{1d4bd}', '\u{1d4c3}', L),
-    ('\u{1d4c5}', '\u{1d505}', L), ('\u{1d507}', '\u{1d50a}', L), ('\u{1d50d}', '\u{1d514}', L),
-    ('\u{1d516}', '\u{1d51c}', L), ('\u{1d51e}', '\u{1d539}', L), ('\u{1d53b}', '\u{1d53e}', L),
-    ('\u{1d540}', '\u{1d544}', L), ('\u{1d546}', '\u{1d546}', L), ('\u{1d54a}', '\u{1d550}', L),
-    ('\u{1d552}', '\u{1d6a5}', L), ('\u{1d6a8}', '\u{1d6da}', L), ('\u{1d6db}', '\u{1d6db}', ON),
-    ('\u{1d6dc}', '\u{1d714}', L), ('\u{1d715}', '\u{1d715}', ON), ('\u{1d716}', '\u{1d74e}', L),
-    ('\u{1d74f}', '\u{1d74f}', ON), ('\u{1d750}', '\u{1d788}', L), ('\u{1d789}', '\u{1d789}', ON),
-    ('\u{1d78a}', '\u{1d7c2}', L), ('\u{1d7c3}', '\u{1d7c3}', ON), ('\u{1d7c4}', '\u{1d7cb}', L),
-    ('\u{1d7ce}', '\u{1d7ff}', EN), ('\u{1d800}', '\u{1d9ff}', L), ('\u{1da00}', '\u{1da36}', NSM),
-    ('\u{1da37}', '\u{1da3a}', L), ('\u{1da3b}', '\u{1da6c}', NSM), ('\u{1da6d}', '\u{1da74}', L),
-    ('\u{1da75}', '\u{1da75}', NSM), ('\u{1da76}', '\u{1da83}', L), ('\u{1da84}', '\u{1da84}', NSM),
-    ('\u{1da85}', '\u{1da8b}', L), ('\u{1da9b}', '\u{1da9f}', NSM), ('\u{1daa1}', '\u{1daaf}', NSM),
-    ('\u{1e000}', '\u{1e006}', NSM), ('\u{1e008}', '\u{1e018}', NSM), ('\u{1e01b}', '\u{1e021}',
-    NSM), ('\u{1e023}', '\u{1e024}', NSM), ('\u{1e026}', '\u{1e02a}', NSM), ('\u{1e800}',
-    '\u{1e8cf}', R), ('\u{1e8d0}', '\u{1e8d6}', NSM), ('\u{1e8d7}', '\u{1e943}', R), ('\u{1e944}',
-    '\u{1e94a}', NSM), ('\u{1e94b}', '\u{1edff}', R), ('\u{1ee00}', '\u{1eeef}', AL), ('\u{1eef0}',
-    '\u{1eef1}', ON), ('\u{1eef2}', '\u{1eeff}', AL), ('\u{1ef00}', '\u{1efff}', R), ('\u{1f000}',
-    '\u{1f02b}', ON), ('\u{1f030}', '\u{1f093}', ON), ('\u{1f0a0}', '\u{1f0ae}', ON), ('\u{1f0b1}',
-    '\u{1f0bf}', ON), ('\u{1f0c1}', '\u{1f0cf}', ON), ('\u{1f0d1}', '\u{1f0f5}', ON), ('\u{1f100}',
-    '\u{1f10a}', EN), ('\u{1f10b}', '\u{1f10c}', ON), ('\u{1f110}', '\u{1f12e}', L), ('\u{1f130}',
-    '\u{1f169}', L), ('\u{1f16a}', '\u{1f16b}', ON), ('\u{1f170}', '\u{1f1ac}', L), ('\u{1f1e6}',
-    '\u{1f202}', L), ('\u{1f210}', '\u{1f23b}', L), ('\u{1f240}', '\u{1f248}', L), ('\u{1f250}',
-    '\u{1f251}', L), ('\u{1f300}', '\u{1f6d2}', ON), ('\u{1f6e0}', '\u{1f6ec}', ON), ('\u{1f6f0}',
-    '\u{1f6f6}', ON), ('\u{1f700}', '\u{1f773}', ON), ('\u{1f780}', '\u{1f7d4}', ON), ('\u{1f800}',
-    '\u{1f80b}', ON), ('\u{1f810}', '\u{1f847}', ON), ('\u{1f850}', '\u{1f859}', ON), ('\u{1f860}',
-    '\u{1f887}', ON), ('\u{1f890}', '\u{1f8ad}', ON), ('\u{1f910}', '\u{1f91e}', ON), ('\u{1f920}',
-    '\u{1f927}', ON), ('\u{1f930}', '\u{1f930}', ON), ('\u{1f933}', '\u{1f93e}', ON), ('\u{1f940}',
-    '\u{1f94b}', ON), ('\u{1f950}', '\u{1f95e}', ON), ('\u{1f980}', '\u{1f991}', ON), ('\u{1f9c0}',
-    '\u{1f9c0}', ON), ('\u{20000}', '\u{2a6d6}', L), ('\u{2a700}', '\u{2b734}', L), ('\u{2b740}',
-    '\u{2b81d}', L), ('\u{2b820}', '\u{2cea1}', L), ('\u{2f800}', '\u{2fa1d}', L), ('\u{e0001}',
-    '\u{e0001}', BN), ('\u{e0020}', '\u{e007f}', BN), ('\u{e0100}', '\u{e01ef}', NSM), ('\u{f0000}',
-    '\u{ffffd}', L), ('\u{100000}', '\u{10fffd}', L)
-];
-
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/deprecated.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! This module holds deprecated assets only.
-
-use super::*;
-
-/// Find the level runs within a line and return them in visual order.
-///
-/// NOTE: This implementation is incomplete. The algorithm needs information about the text,
-/// including original BidiClass property of each character, to be able to perform correctly.
-/// Please see [`BidiInfo::visual_runs()`](../struct.BidiInfo.html#method.visual_runs) for the
-/// improved implementation.
-///
-/// `line` is a range of bytes indices within `levels`.
-///
-/// http://www.unicode.org/reports/tr9/#Reordering_Resolved_Levels
-#[deprecated(since="0.3.0", note="please use `BidiInfo::visual_runs()` instead.")]
-pub fn visual_runs(line: Range<usize>, levels: &[Level]) -> Vec<LevelRun> {
-    assert!(line.start <= levels.len());
-    assert!(line.end <= levels.len());
-
-    let mut runs = Vec::new();
-
-    // Find consecutive level runs.
-    let mut start = line.start;
-    let mut level = levels[start];
-    let mut min_level = level;
-    let mut max_level = level;
-
-    for i in (start + 1)..line.end {
-        let new_level = levels[i];
-        if new_level != level {
-            // End of the previous run, start of a new one.
-            runs.push(start..i);
-            start = i;
-            level = new_level;
-
-            min_level = min(level, min_level);
-            max_level = max(level, max_level);
-        }
-    }
-    runs.push(start..line.end);
-
-    let run_count = runs.len();
-
-    // Re-order the odd runs.
-    // http://www.unicode.org/reports/tr9/#L2
-
-    // Stop at the lowest *odd* level.
-    min_level = min_level.new_lowest_ge_rtl().expect("Level error");
-
-    while max_level >= min_level {
-        // Look for the start of a sequence of consecutive runs of max_level or higher.
-        let mut seq_start = 0;
-        while seq_start < run_count {
-            if levels[runs[seq_start].start] < max_level {
-                seq_start += 1;
-                continue;
-            }
-
-            // Found the start of a sequence. Now find the end.
-            let mut seq_end = seq_start + 1;
-            while seq_end < run_count {
-                if levels[runs[seq_end].start] < max_level {
-                    break;
-                }
-                seq_end += 1;
-            }
-
-            // Reverse the runs within this sequence.
-            runs[seq_start..seq_end].reverse();
-
-            seq_start = seq_end;
-        }
-        max_level
-            .lower(1)
-            .expect("Lowering embedding level below zero");
-    }
-
-    runs
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/explicit.rs
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! 3.3.2 Explicit Levels and Directions
-//!
-//! http://www.unicode.org/reports/tr9/#Explicit_Levels_and_Directions
-
-use super::char_data::{BidiClass, is_rtl};
-use super::level::Level;
-
-use BidiClass::*;
-
-/// Compute explicit embedding levels for one paragraph of text (X1-X8).
-///
-/// `processing_classes[i]` must contain the BidiClass of the char at byte index `i`,
-/// for each char in `text`.
-pub fn compute(
-    text: &str,
-    para_level: Level,
-    original_classes: &[BidiClass],
-    levels: &mut [Level],
-    processing_classes: &mut [BidiClass],
-) {
-    assert!(text.len() == original_classes.len());
-
-    // http://www.unicode.org/reports/tr9/#X1
-    let mut stack = DirectionalStatusStack::new();
-    stack.push(para_level, OverrideStatus::Neutral);
-
-    let mut overflow_isolate_count = 0u32;
-    let mut overflow_embedding_count = 0u32;
-    let mut valid_isolate_count = 0u32;
-
-    for (i, c) in text.char_indices() {
-        match original_classes[i] {
-
-            // Rules X2-X5c
-            RLE | LRE | RLO | LRO | RLI | LRI | FSI => {
-                let last_level = stack.last().level;
-
-                // X5a-X5c: Isolate initiators get the level of the last entry on the stack.
-                let is_isolate = matches!(original_classes[i], RLI | LRI | FSI);
-                if is_isolate {
-                    levels[i] = last_level;
-                    match stack.last().status {
-                        OverrideStatus::RTL => processing_classes[i] = R,
-                        OverrideStatus::LTR => processing_classes[i] = L,
-                        _ => {}
-                    }
-                }
-
-                let new_level = if is_rtl(original_classes[i]) {
-                    last_level.new_explicit_next_rtl()
-                } else {
-                    last_level.new_explicit_next_ltr()
-                };
-                if new_level.is_ok() && overflow_isolate_count == 0 &&
-                   overflow_embedding_count == 0 {
-                    let new_level = new_level.unwrap();
-                    stack.push(
-                        new_level, match original_classes[i] {
-                            RLO => OverrideStatus::RTL,
-                            LRO => OverrideStatus::LTR,
-                            RLI | LRI | FSI => OverrideStatus::Isolate,
-                            _ => OverrideStatus::Neutral,
-                        }
-                    );
-                    if is_isolate {
-                        valid_isolate_count += 1;
-                    } else {
-                        // The spec doesn't explicitly mention this step, but it is necessary.
-                        // See the reference implementations for comparison.
-                        levels[i] = new_level;
-                    }
-                } else if is_isolate {
-                    overflow_isolate_count += 1;
-                } else if overflow_isolate_count == 0 {
-                    overflow_embedding_count += 1;
-                }
-            }
-
-            // http://www.unicode.org/reports/tr9/#X6a
-            PDI => {
-                if overflow_isolate_count > 0 {
-                    overflow_isolate_count -= 1;
-                } else if valid_isolate_count > 0 {
-                    overflow_embedding_count = 0;
-                    loop {
-                        // Pop everything up to and including the last Isolate status.
-                        match stack.vec.pop() {
-                            Some(Status { status: OverrideStatus::Isolate, .. }) => break,
-                            None => break,
-                            _ => continue,
-                        }
-                    }
-                    valid_isolate_count -= 1;
-                }
-                let last = stack.last();
-                levels[i] = last.level;
-                match last.status {
-                    OverrideStatus::RTL => processing_classes[i] = R,
-                    OverrideStatus::LTR => processing_classes[i] = L,
-                    _ => {}
-                }
-            }
-
-            // http://www.unicode.org/reports/tr9/#X7
-            PDF => {
-                if overflow_isolate_count > 0 {
-                    continue;
-                }
-                if overflow_embedding_count > 0 {
-                    overflow_embedding_count -= 1;
-                    continue;
-                }
-                if stack.last().status != OverrideStatus::Isolate && stack.vec.len() >= 2 {
-                    stack.vec.pop();
-                }
-                // The spec doesn't explicitly mention this step, but it is necessary.
-                // See the reference implementations for comparison.
-                levels[i] = stack.last().level;
-            }
-
-            // Nothing
-            B | BN => {}
-
-            // http://www.unicode.org/reports/tr9/#X6
-            _ => {
-                let last = stack.last();
-                levels[i] = last.level;
-                match last.status {
-                    OverrideStatus::RTL => processing_classes[i] = R,
-                    OverrideStatus::LTR => processing_classes[i] = L,
-                    _ => {}
-                }
-            }
-        }
-
-        // Handle multi-byte characters.
-        for j in 1..c.len_utf8() {
-            levels[i + j] = levels[i];
-            processing_classes[i + j] = processing_classes[i];
-        }
-    }
-}
-
-/// Entries in the directional status stack:
-struct Status {
-    level: Level,
-    status: OverrideStatus,
-}
-
-#[derive(PartialEq)]
-enum OverrideStatus {
-    Neutral,
-    RTL,
-    LTR,
-    Isolate,
-}
-
-struct DirectionalStatusStack {
-    vec: Vec<Status>,
-}
-
-impl DirectionalStatusStack {
-    fn new() -> Self {
-        DirectionalStatusStack { vec: Vec::with_capacity(Level::max_explicit_depth() as usize + 2) }
-    }
-
-    fn push(&mut self, level: Level, status: OverrideStatus) {
-        self.vec
-            .push(
-                Status {
-                    level: level,
-                    status: status,
-                }
-            );
-    }
-
-    fn last(&self) -> &Status {
-        self.vec.last().unwrap()
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/format_chars.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 The html5ever Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Directional Formatting Characters
-//!
-//! http://www.unicode.org/reports/tr9/#Directional_Formatting_Characters
-
-// == Implicit ==
-/// ARABIC LETTER MARK
-pub const ALM: char = '\u{061C}';
-/// LEFT-TO-RIGHT MARK
-pub const LRM: char = '\u{200E}';
-/// RIGHT-TO-LEFT MARK
-pub const RLM: char = '\u{200F}';
-
-// == Explicit Isolates ==
-/// LEFT‑TO‑RIGHT ISOLATE
-pub const LRI: char = '\u{2066}';
-/// RIGHT‑TO‑LEFT ISOLATE
-pub const RLI: char = '\u{2067}';
-/// FIRST STRONG ISOLATE
-pub const FSI: char = '\u{2068}';
-/// POP DIRECTIONAL ISOLATE
-pub const PDI: char = '\u{2069}';
-
-// == Explicit Embeddings and Overrides ==
-/// LEFT-TO-RIGHT EMBEDDING
-pub const LRE: char = '\u{202A}';
-/// RIGHT-TO-LEFT EMBEDDING
-pub const RLE: char = '\u{202B}';
-/// POP DIRECTIONAL FORMATTING
-pub const PDF: char = '\u{202C}';
-/// LEFT-TO-RIGHT OVERRIDE
-pub const LRO: char = '\u{202D}';
-/// RIGHT-TO-LEFT OVERRIDE
-pub const RLO: char = '\u{202E}';
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/implicit.rs
+++ /dev/null
@@ -1,229 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! 3.3.4 - 3.3.6. Resolve implicit levels and types.
-
-use std::cmp::max;
-
-use super::char_data::BidiClass;
-use super::prepare::{IsolatingRunSequence, LevelRun, not_removed_by_x9, removed_by_x9};
-use super::level::Level;
-
-use BidiClass::*;
-
-/// 3.3.4 Resolving Weak Types
-///
-/// http://www.unicode.org/reports/tr9/#Resolving_Weak_Types
-pub fn resolve_weak(sequence: &IsolatingRunSequence, processing_classes: &mut [BidiClass]) {
-    // FIXME (#8): This function applies steps W1-W6 in a single pass.  This can produce
-    // incorrect results in cases where a "later" rule changes the value of `prev_class` seen
-    // by an "earlier" rule.  We should either split this into separate passes, or preserve
-    // extra state so each rule can see the correct previous class.
-
-    // FIXME: Also, this could be the cause of increased failure for using longer-UTF-8 chars in
-    // conformance tests, like BidiTest:69635 (AL ET EN)
-
-    let mut prev_class = sequence.sos;
-    let mut last_strong_is_al = false;
-    let mut et_run_indices = Vec::new(); // for W5
-
-    // Like sequence.runs.iter().flat_map(Clone::clone), but make indices itself clonable.
-    fn id(x: LevelRun) -> LevelRun {
-        x
-    }
-    let mut indices = sequence
-        .runs
-        .iter()
-        .cloned()
-        .flat_map(id as fn(LevelRun) -> LevelRun);
-
-    while let Some(i) = indices.next() {
-        match processing_classes[i] {
-            // http://www.unicode.org/reports/tr9/#W1
-            NSM => {
-                processing_classes[i] = match prev_class {
-                    RLI | LRI | FSI | PDI => ON,
-                    _ => prev_class,
-                };
-            }
-            EN => {
-                if last_strong_is_al {
-                    // W2. If previous strong char was AL, change EN to AN.
-                    processing_classes[i] = AN;
-                } else {
-                    // W5. If a run of ETs is adjacent to an EN, change the ETs to EN.
-                    for j in &et_run_indices {
-                        processing_classes[*j] = EN;
-                    }
-                    et_run_indices.clear();
-                }
-            }
-            // http://www.unicode.org/reports/tr9/#W3
-            AL => processing_classes[i] = R,
-
-            // http://www.unicode.org/reports/tr9/#W4
-            ES | CS => {
-                let next_class = indices
-                    .clone()
-                    .map(|j| processing_classes[j])
-                    .filter(not_removed_by_x9)
-                    .next()
-                    .unwrap_or(sequence.eos);
-                processing_classes[i] = match (prev_class, processing_classes[i], next_class) {
-                    (EN, ES, EN) | (EN, CS, EN) => EN,
-                    (AN, CS, AN) => AN,
-                    (_, _, _) => ON,
-                }
-            }
-            // http://www.unicode.org/reports/tr9/#W5
-            ET => {
-                match prev_class {
-                    EN => processing_classes[i] = EN,
-                    _ => et_run_indices.push(i), // In case this is followed by an EN.
-                }
-            }
-            class => {
-                if removed_by_x9(class) {
-                    continue;
-                }
-            }
-        }
-
-        prev_class = processing_classes[i];
-        match prev_class {
-            L | R => {
-                last_strong_is_al = false;
-            }
-            AL => {
-                last_strong_is_al = true;
-            }
-            _ => {}
-        }
-        if prev_class != ET {
-            // W6. If we didn't find an adjacent EN, turn any ETs into ON instead.
-            for j in &et_run_indices {
-                processing_classes[*j] = ON;
-            }
-            et_run_indices.clear();
-        }
-    }
-
-    // W7. If the previous strong char was L, change EN to L.
-    let mut last_strong_is_l = sequence.sos == L;
-    for run in &sequence.runs {
-        for i in run.clone() {
-            match processing_classes[i] {
-                EN if last_strong_is_l => {
-                    processing_classes[i] = L;
-                }
-                L => {
-                    last_strong_is_l = true;
-                }
-                R | AL => {
-                    last_strong_is_l = false;
-                }
-                _ => {}
-            }
-        }
-    }
-}
-
-/// 3.3.5 Resolving Neutral Types
-///
-/// http://www.unicode.org/reports/tr9/#Resolving_Neutral_Types
-pub fn resolve_neutral(
-    sequence: &IsolatingRunSequence,
-    levels: &[Level],
-    processing_classes: &mut [BidiClass],
-) {
-    let e: BidiClass = levels[sequence.runs[0].start].bidi_class();
-    let mut indices = sequence.runs.iter().flat_map(Clone::clone);
-    let mut prev_class = sequence.sos;
-
-    while let Some(mut i) = indices.next() {
-        // N0. Process bracket pairs.
-        // TODO
-
-        // Process sequences of NI characters.
-        let mut ni_run = Vec::new();
-        if is_NI(processing_classes[i]) {
-            // Consume a run of consecutive NI characters.
-            ni_run.push(i);
-            let mut next_class;
-            loop {
-                match indices.next() {
-                    Some(j) => {
-                        i = j;
-                        if removed_by_x9(processing_classes[i]) {
-                            continue;
-                        }
-                        next_class = processing_classes[j];
-                        if is_NI(next_class) {
-                            ni_run.push(i);
-                        } else {
-                            break;
-                        }
-                    }
-                    None => {
-                        next_class = sequence.eos;
-                        break;
-                    }
-                };
-            }
-
-            // N1-N2.
-            //
-            // http://www.unicode.org/reports/tr9/#N1
-            // http://www.unicode.org/reports/tr9/#N2
-            let new_class = match (prev_class, next_class) {
-                (L, L) => L,
-                (R, R) | (R, AN) | (R, EN) | (AN, R) | (AN, AN) | (AN, EN) | (EN, R) |
-                (EN, AN) | (EN, EN) => R,
-                (_, _) => e,
-            };
-            for j in &ni_run {
-                processing_classes[*j] = new_class;
-            }
-            ni_run.clear();
-        }
-        prev_class = processing_classes[i];
-    }
-}
-
-/// 3.3.6 Resolving Implicit Levels
-///
-/// Returns the maximum embedding level in the paragraph.
-///
-/// http://www.unicode.org/reports/tr9/#Resolving_Implicit_Levels
-pub fn resolve_levels(original_classes: &[BidiClass], levels: &mut [Level]) -> Level {
-    let mut max_level = Level::ltr();
-
-    assert!(original_classes.len() == levels.len());
-    for i in 0..levels.len() {
-        match (levels[i].is_rtl(), original_classes[i]) {
-            // http://www.unicode.org/reports/tr9/#I1
-            (false, R) => levels[i].raise(1).expect("Level number error"),
-            (false, AN) | (false, EN) => levels[i].raise(2).expect("Level number error"),
-            // http://www.unicode.org/reports/tr9/#I2
-            (true, L) | (true, EN) | (true, AN) => levels[i].raise(1).expect("Level number error"),
-            (_, _) => {}
-        }
-        max_level = max(max_level, levels[i]);
-    }
-
-    max_level
-}
-
-/// Neutral or Isolate formatting character (B, S, WS, ON, FSI, LRI, RLI, PDI)
-///
-/// http://www.unicode.org/reports/tr9/#NI
-#[allow(non_snake_case)]
-fn is_NI(class: BidiClass) -> bool {
-    matches!(class, B | S | WS | ON | FSI | LRI | RLI | PDI)
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/level.rs
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright 2017 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Bidi Embedding Level
-//!
-//! See [`Level`](struct.Level.html) for more details.
-//!
-//! http://www.unicode.org/reports/tr9/#BD2
-
-use std::convert::{From, Into};
-
-use super::char_data::BidiClass;
-
-/// Embedding Level
-///
-/// Embedding Levels are numbers between 0 and 126 (inclusive), where even values denote a
-/// left-to-right (LTR) direction and odd values a right-to-left (RTL) direction.
-///
-/// This struct maintains a *valid* status for level numbers, meaning that creating a new level, or
-/// mutating an existing level, with the value smaller than `0` (before conversion to `u8`) or
-/// larger than 125 results in an `Error`.
-///
-/// http://www.unicode.org/reports/tr9/#BD2
-#[derive(Copy, Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
-#[cfg_attr(feature = "with_serde", derive(Serialize, Deserialize))]
-pub struct Level(u8);
-
-pub const LTR_LEVEL: Level = Level(0);
-pub const RTL_LEVEL: Level = Level(1);
-
-const MAX_DEPTH: u8 = 125;
-/// During explicit level resolution, embedding level can go as high as `max_depth`.
-pub const MAX_EXPLICIT_DEPTH: u8 = MAX_DEPTH;
-/// During implicit level resolution, embedding level can go as high as `max_depth + 1`.
-pub const MAX_IMPLICIT_DEPTH: u8 = MAX_DEPTH + 1;
-
-/// Errors that can occur on Level creation or mutation
-#[derive(Debug, PartialEq)]
-pub enum Error {
-    /// Out-of-range (invalid) embedding level number.
-    OutOfRangeNumber,
-}
-
-impl Level {
-    /// New LTR level with smallest number value (0).
-    #[inline]
-    pub fn ltr() -> Level {
-        LTR_LEVEL
-    }
-
-    /// New RTL level with smallest number value (1).
-    #[inline]
-    pub fn rtl() -> Level {
-        RTL_LEVEL
-    }
-
-    /// Maximum depth of the directional status stack during implicit resolutions.
-    pub fn max_implicit_depth() -> u8 {
-        MAX_IMPLICIT_DEPTH
-    }
-
-    /// Maximum depth of the directional status stack during explicit resolutions.
-    pub fn max_explicit_depth() -> u8 {
-        MAX_EXPLICIT_DEPTH
-    }
-
-    // == Inquiries ==
-
-    /// Create new level, fail if number is larger than `max_depth + 1`.
-    #[inline]
-    pub fn new(number: u8) -> Result<Level, Error> {
-        if number <= MAX_IMPLICIT_DEPTH {
-            Ok(Level(number))
-        } else {
-            Err(Error::OutOfRangeNumber)
-        }
-    }
-
-    /// Create new level, fail if number is larger than `max_depth`.
-    #[inline]
-    pub fn new_explicit(number: u8) -> Result<Level, Error> {
-        if number <= MAX_EXPLICIT_DEPTH {
-            Ok(Level(number))
-        } else {
-            Err(Error::OutOfRangeNumber)
-        }
-    }
-
-    // == Inquiries ==
-
-    /// The level number.
-    #[inline]
-    pub fn number(&self) -> u8 {
-        self.0
-    }
-
-    /// If this level is left-to-right.
-    #[inline]
-    pub fn is_ltr(&self) -> bool {
-        self.0 % 2 == 0
-    }
-
-    /// If this level is right-to-left.
-    #[inline]
-    pub fn is_rtl(&self) -> bool {
-        self.0 % 2 == 1
-    }
-
-    // == Mutators ==
-
-    /// Raise level by `amount`, fail if number is larger than `max_depth + 1`.
-    #[inline]
-    pub fn raise(&mut self, amount: u8) -> Result<(), Error> {
-        match self.0.checked_add(amount) {
-            Some(number) => {
-                if number <= MAX_IMPLICIT_DEPTH {
-                    self.0 = number;
-                    Ok(())
-                } else {
-                    Err(Error::OutOfRangeNumber)
-                }
-            }
-            None => Err(Error::OutOfRangeNumber),
-        }
-    }
-
-    /// Raise level by `amount`, fail if number is larger than `max_depth`.
-    #[inline]
-    pub fn raise_explicit(&mut self, amount: u8) -> Result<(), Error> {
-        match self.0.checked_add(amount) {
-            Some(number) => {
-                if number <= MAX_EXPLICIT_DEPTH {
-                    self.0 = number;
-                    Ok(())
-                } else {
-                    Err(Error::OutOfRangeNumber)
-                }
-            }
-            None => Err(Error::OutOfRangeNumber),
-        }
-    }
-
-    /// Lower level by `amount`, fail if number goes below zero.
-    #[inline]
-    pub fn lower(&mut self, amount: u8) -> Result<(), Error> {
-        match self.0.checked_sub(amount) {
-            Some(number) => {
-                self.0 = number;
-                Ok(())
-            }
-            None => Err(Error::OutOfRangeNumber),
-        }
-    }
-
-    // == Helpers ==
-
-    /// The next LTR (even) level greater than this, or fail if number is larger than `max_depth`.
-    #[inline]
-    pub fn new_explicit_next_ltr(&self) -> Result<Level, Error> {
-        Level::new_explicit(self.0 + 2 & !1)
-    }
-
-    /// The next RTL (odd) level greater than this, or fail if number is larger than `max_depth`.
-    #[inline]
-    pub fn new_explicit_next_rtl(&self) -> Result<Level, Error> {
-        Level::new_explicit((self.0 + 1) | 1)
-    }
-
-    /// The lowest RTL (odd) level greater than or equal to this, or fail if number is larger than
-    /// `max_depth + 1`.
-    #[inline]
-    pub fn new_lowest_ge_rtl(&self) -> Result<Level, Error> {
-        Level::new(self.0 | 1)
-    }
-
-    /// Generate a character type based on a level (as specified in steps X10 and N2).
-    #[inline]
-    pub fn bidi_class(&self) -> BidiClass {
-        if self.is_rtl() {
-            BidiClass::R
-        } else {
-            BidiClass::L
-        }
-    }
-
-    pub fn vec(v: &[u8]) -> Vec<Level> {
-        v.iter().map(|&x| x.into()).collect()
-    }
-}
-
-/// If levels has any RTL (odd) level
-///
-/// This information is usually used to skip re-ordering of text when no RTL level is present
-#[inline]
-pub fn has_rtl(levels: &[Level]) -> bool {
-    levels.iter().any(|&lvl| lvl.is_rtl())
-}
-
-impl Into<u8> for Level {
-    /// Convert to the level number
-    #[inline]
-    fn into(self) -> u8 {
-        self.number()
-    }
-}
-
-impl From<u8> for Level {
-    /// Create level by number
-    #[inline]
-    fn from(number: u8) -> Level {
-        Level::new(number).expect("Level number error")
-    }
-}
-
-/// Used for matching levels in conformance tests
-impl<'a> PartialEq<&'a str> for Level {
-    #[inline]
-    fn eq(&self, s: &&'a str) -> bool {
-        *s == "x" || *s == self.0.to_string()
-    }
-}
-
-/// Used for matching levels in conformance tests
-impl<'a> PartialEq<String> for Level {
-    #[inline]
-    fn eq(&self, s: &String) -> bool {
-        self == &s.as_str()
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_new() {
-        assert_eq!(Level::new(0), Ok(Level(0)));
-        assert_eq!(Level::new(1), Ok(Level(1)));
-        assert_eq!(Level::new(10), Ok(Level(10)));
-        assert_eq!(Level::new(125), Ok(Level(125)));
-        assert_eq!(Level::new(126), Ok(Level(126)));
-        assert_eq!(Level::new(127), Err(Error::OutOfRangeNumber));
-        assert_eq!(Level::new(255), Err(Error::OutOfRangeNumber));
-    }
-
-    #[test]
-    fn test_new_explicit() {
-        assert_eq!(Level::new_explicit(0), Ok(Level(0)));
-        assert_eq!(Level::new_explicit(1), Ok(Level(1)));
-        assert_eq!(Level::new_explicit(10), Ok(Level(10)));
-        assert_eq!(Level::new_explicit(125), Ok(Level(125)));
-        assert_eq!(Level::new_explicit(126), Err(Error::OutOfRangeNumber));
-        assert_eq!(Level::new_explicit(255), Err(Error::OutOfRangeNumber));
-    }
-
-    #[test]
-    fn test_is_ltr() {
-        assert_eq!(Level(0).is_ltr(), true);
-        assert_eq!(Level(1).is_ltr(), false);
-        assert_eq!(Level(10).is_ltr(), true);
-        assert_eq!(Level(11).is_ltr(), false);
-        assert_eq!(Level(124).is_ltr(), true);
-        assert_eq!(Level(125).is_ltr(), false);
-    }
-
-    #[test]
-    fn test_is_rtl() {
-        assert_eq!(Level(0).is_rtl(), false);
-        assert_eq!(Level(1).is_rtl(), true);
-        assert_eq!(Level(10).is_rtl(), false);
-        assert_eq!(Level(11).is_rtl(), true);
-        assert_eq!(Level(124).is_rtl(), false);
-        assert_eq!(Level(125).is_rtl(), true);
-    }
-
-    #[test]
-    fn test_raise() {
-        let mut level = Level::ltr();
-        assert_eq!(level.number(), 0);
-        assert!(level.raise(100).is_ok());
-        assert_eq!(level.number(), 100);
-        assert!(level.raise(26).is_ok());
-        assert_eq!(level.number(), 126);
-        assert!(level.raise(1).is_err()); // invalid!
-        assert!(level.raise(250).is_err()); // overflow!
-        assert_eq!(level.number(), 126);
-    }
-
-    #[test]
-    fn test_raise_explicit() {
-        let mut level = Level::ltr();
-        assert_eq!(level.number(), 0);
-        assert!(level.raise_explicit(100).is_ok());
-        assert_eq!(level.number(), 100);
-        assert!(level.raise_explicit(25).is_ok());
-        assert_eq!(level.number(), 125);
-        assert!(level.raise_explicit(1).is_err()); // invalid!
-        assert!(level.raise_explicit(250).is_err()); // overflow!
-        assert_eq!(level.number(), 125);
-    }
-
-    #[test]
-    fn test_lower() {
-        let mut level = Level::rtl();
-        assert_eq!(level.number(), 1);
-        assert!(level.lower(1).is_ok());
-        assert_eq!(level.number(), 0);
-        assert!(level.lower(1).is_err()); // underflow!
-        assert!(level.lower(250).is_err()); // underflow!
-        assert_eq!(level.number(), 0);
-    }
-
-    #[test]
-    fn test_has_rtl() {
-        assert_eq!(has_rtl(&Level::vec(&[0, 0, 0])), false);
-        assert_eq!(has_rtl(&Level::vec(&[0, 1, 0])), true);
-        assert_eq!(has_rtl(&Level::vec(&[0, 2, 0])), false);
-        assert_eq!(has_rtl(&Level::vec(&[0, 125, 0])), true);
-        assert_eq!(has_rtl(&Level::vec(&[0, 126, 0])), false);
-    }
-
-    #[test]
-    fn test_into() {
-        let level = Level::rtl();
-        assert_eq!(1u8, level.into());
-    }
-
-    #[test]
-    fn test_vec() {
-        assert_eq!(
-            Level::vec(&[0, 1, 125]),
-            vec![Level(0), Level(1), Level(125)]
-        );
-    }
-
-    #[test]
-    fn test_str_eq() {
-        assert_eq!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "x", "125"]);
-        assert_ne!(Level::vec(&[0, 1, 4, 125]), vec!["0", "1", "5", "125"]);
-    }
-
-    #[test]
-    fn test_string_eq() {
-        assert_eq!(
-            Level::vec(&[0, 1, 4, 125]),
-            vec!["0".to_string(), "1".to_string(), "x".to_string(), "125".to_string()]
-        );
-    }
-}
-
-#[cfg(all(feature = "with_serde", test))]
-mod serde_tests {
-    use serde_test::{Token, assert_tokens};
-    use super::*;
-
-    #[test]
-    fn test_statics() {
-        assert_tokens(
-            &Level::ltr(),
-            &[Token::NewtypeStruct { name: "Level" }, Token::U8(0)],
-        );
-        assert_tokens(
-            &Level::rtl(),
-            &[Token::NewtypeStruct { name: "Level" }, Token::U8(1)],
-        );
-    }
-
-    #[test]
-    fn test_new() {
-        let level = Level::new(42).unwrap();
-        assert_tokens(
-            &level,
-            &[Token::NewtypeStruct { name: "Level" }, Token::U8(42)],
-        );
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/lib.rs
+++ /dev/null
@@ -1,873 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! This crate implements the [Unicode Bidirectional Algorithm][tr9] for display of mixed
-//! right-to-left and left-to-right text.  It is written in safe Rust, compatible with the
-//! current stable release.
-//!
-//! ## Example
-//!
-//! ```rust
-//! use unicode_bidi::BidiInfo;
-//!
-//! // This example text is defined using `concat!` because some browsers
-//! // and text editors have trouble displaying bidi strings.
-//! let text = concat![
-//!   "א",
-//!   "ב",
-//!   "ג",
-//!   "a",
-//!   "b",
-//!   "c",
-//! ];
-//!
-//! // Resolve embedding levels within the text.  Pass `None` to detect the
-//! // paragraph level automatically.
-//! let bidi_info = BidiInfo::new(&text, None);
-//!
-//! // This paragraph has embedding level 1 because its first strong character is RTL.
-//! assert_eq!(bidi_info.paragraphs.len(), 1);
-//! let para = &bidi_info.paragraphs[0];
-//! assert_eq!(para.level.number(), 1);
-//! assert_eq!(para.level.is_rtl(), true);
-//!
-//! // Re-ordering is done after wrapping each paragraph into a sequence of
-//! // lines. For this example, I'll just use a single line that spans the
-//! // entire paragraph.
-//! let line = para.range.clone();
-//!
-//! let display = bidi_info.reorder_line(para, line);
-//! assert_eq!(display, concat![
-//!   "a",
-//!   "b",
-//!   "c",
-//!   "ג",
-//!   "ב",
-//!   "א",
-//! ]);
-//! ```
-//!
-//! [tr9]: http://www.unicode.org/reports/tr9/
-
-#![forbid(unsafe_code)]
-
-#[macro_use]
-extern crate matches;
-
-#[cfg(feature = "with_serde")]
-#[macro_use]
-extern crate serde_derive;
-
-#[cfg(all(feature = "with_serde", test))]
-extern crate serde_test;
-
-pub mod deprecated;
-pub mod format_chars;
-pub mod level;
-
-mod char_data;
-mod explicit;
-mod implicit;
-mod prepare;
-
-pub use char_data::{BidiClass, bidi_class, UNICODE_VERSION};
-pub use level::Level;
-pub use prepare::LevelRun;
-
-use std::borrow::Cow;
-use std::cmp::{max, min};
-use std::iter::repeat;
-use std::ops::Range;
-
-use BidiClass::*;
-use format_chars as chars;
-
-
-/// Bidi information about a single paragraph
-#[derive(Debug, PartialEq)]
-pub struct ParagraphInfo {
-    /// The paragraphs boundaries within the text, as byte indices.
-    ///
-    /// TODO: Shrink this to only include the starting index?
-    pub range: Range<usize>,
-
-    /// The paragraph embedding level.
-    ///
-    /// http://www.unicode.org/reports/tr9/#BD4
-    pub level: Level,
-}
-
-/// Initial bidi information of the text
-///
-/// Contains the paragraphs and BidiClasses in a string of text.
-#[derive(PartialEq, Debug)]
-pub struct InitialInfo<'text> {
-    /// The text
-    pub text: &'text str,
-
-    /// The BidiClass of the character at each byte in the text.
-    /// If a character is multiple bytes, its class will appear multiple times in the vector.
-    pub original_classes: Vec<BidiClass>,
-
-    /// The boundaries and level of each paragraph within the text.
-    pub paragraphs: Vec<ParagraphInfo>,
-}
-
-impl<'text> InitialInfo<'text> {
-    /// Find the paragraphs and BidiClasses in a string of text.
-    ///
-    /// http://www.unicode.org/reports/tr9/#The_Paragraph_Level
-    ///
-    /// Also sets the class for each First Strong Isolate initiator (FSI) to LRI or RLI if a strong
-    /// character is found before the matching PDI.  If no strong character is found, the class will
-    /// remain FSI, and it's up to later stages to treat these as LRI when needed.
-    pub fn new(text: &str, default_para_level: Option<Level>) -> InitialInfo {
-        let mut original_classes = Vec::with_capacity(text.len());
-
-        // The stack contains the starting byte index for each nested isolate we're inside.
-        let mut isolate_stack = Vec::new();
-        let mut paragraphs = Vec::new();
-
-        let mut para_start = 0;
-        let mut para_level = default_para_level;
-
-        for (i, c) in text.char_indices() {
-            let class = bidi_class(c);
-            original_classes.extend(repeat(class).take(c.len_utf8()));
-            match class {
-                B => {
-                    // P1. Split the text into separate paragraphs. The paragraph separator is kept
-                    // with the previous paragraph.
-                    let para_end = i + c.len_utf8();
-                    paragraphs.push(
-                        ParagraphInfo {
-                            range: para_start..para_end,
-                            // P3. If no character is found in p2, set the paragraph level to zero.
-                            level: para_level.unwrap_or(Level::ltr()),
-                        }
-                    );
-                    // Reset state for the start of the next paragraph.
-                    para_start = para_end;
-                    // TODO: Support defaulting to direction of previous paragraph
-                    //
-                    // http://www.unicode.org/reports/tr9/#HL1
-                    para_level = default_para_level;
-                    isolate_stack.clear();
-                }
-                L | R | AL => {
-                    match isolate_stack.last() {
-                        Some(&start) => {
-                            if original_classes[start] == FSI {
-                                // X5c. If the first strong character between FSI and its matching
-                                // PDI is R or AL, treat it as RLI. Otherwise, treat it as LRI.
-                                for j in 0..chars::FSI.len_utf8() {
-                                    original_classes[start + j] =
-                                        if class == L { LRI } else { RLI };
-                                }
-                            }
-                        }
-                        None => {
-                            if para_level.is_none() {
-                                // P2. Find the first character of type L, AL, or R, while skipping
-                                // any characters between an isolate initiator and its matching
-                                // PDI.
-                                para_level = Some(
-                                    if class != L {
-                                        Level::rtl()
-                                    } else {
-                                        Level::ltr()
-                                    }
-                                );
-                            }
-                        }
-                    }
-                }
-                RLI | LRI | FSI => {
-                    isolate_stack.push(i);
-                }
-                PDI => {
-                    isolate_stack.pop();
-                }
-                _ => {}
-            }
-        }
-        if para_start < text.len() {
-            paragraphs.push(
-                ParagraphInfo {
-                    range: para_start..text.len(),
-                    level: para_level.unwrap_or(Level::ltr()),
-                }
-            );
-        }
-        assert!(original_classes.len() == text.len());
-
-        InitialInfo {
-            text: text,
-            original_classes: original_classes,
-            paragraphs: paragraphs,
-        }
-    }
-}
-
-/// Bidi information of the text
-///
-/// The `original_classes` and `levels` vectors are indexed by byte offsets into the text.  If a
-/// character is multiple bytes wide, then its class and level will appear multiple times in these
-/// vectors.
-// TODO: Impl `struct StringProperty<T> { values: Vec<T> }` and use instead of Vec<T>
-#[derive(Debug, PartialEq)]
-pub struct BidiInfo<'text> {
-    /// The text
-    pub text: &'text str,
-
-    /// The BidiClass of the character at each byte in the text.
-    pub original_classes: Vec<BidiClass>,
-
-    /// The directional embedding level of each byte in the text.
-    pub levels: Vec<Level>,
-
-    /// The boundaries and paragraph embedding level of each paragraph within the text.
-    ///
-    /// TODO: Use SmallVec or similar to avoid overhead when there are only one or two paragraphs?
-    /// Or just don't include the first paragraph, which always starts at 0?
-    pub paragraphs: Vec<ParagraphInfo>,
-}
-
-impl<'text> BidiInfo<'text> {
-    /// Split the text into paragraphs and determine the bidi embedding levels for each paragraph.
-    ///
-    /// TODO: In early steps, check for special cases that allow later steps to be skipped. like
-    /// text that is entirely LTR.  See the `nsBidi` class from Gecko for comparison.
-    ///
-    /// TODO: Support auto-RTL base direction
-    pub fn new(text: &str, default_para_level: Option<Level>) -> BidiInfo {
-        let InitialInfo {
-            text: _,
-            original_classes,
-            paragraphs,
-        } = InitialInfo::new(text, default_para_level);
-
-        let mut levels = Vec::<Level>::with_capacity(text.len());
-        let mut processing_classes = original_classes.clone();
-
-        for para in &paragraphs {
-            let text = &text[para.range.clone()];
-            let original_classes = &original_classes[para.range.clone()];
-            let processing_classes = &mut processing_classes[para.range.clone()];
-
-            let new_len = levels.len() + para.range.len();
-            levels.resize(new_len, para.level);
-            let levels = &mut levels[para.range.clone()];
-
-            explicit::compute(
-                text,
-                para.level,
-                &original_classes,
-                levels,
-                processing_classes,
-            );
-
-            let sequences = prepare::isolating_run_sequences(para.level, &original_classes, levels);
-            for sequence in &sequences {
-                implicit::resolve_weak(sequence, processing_classes);
-                implicit::resolve_neutral(sequence, levels, processing_classes);
-            }
-            implicit::resolve_levels(processing_classes, levels);
-
-            assign_levels_to_removed_chars(para.level, &original_classes, levels);
-        }
-
-        BidiInfo {
-            text: text,
-            original_classes: original_classes,
-            paragraphs: paragraphs,
-            levels: levels,
-        }
-    }
-
-    /// Re-order a line based on resolved levels and return only the embedding levels, one `Level`
-    /// per *byte*.
-    pub fn reordered_levels(&self, para: &ParagraphInfo, line: Range<usize>) -> Vec<Level> {
-        let (levels, _) = self.visual_runs(para, line.clone());
-        levels
-    }
-
-    /// Re-order a line based on resolved levels and return only the embedding levels, one `Level`
-    /// per *character*.
-    pub fn reordered_levels_per_char(
-        &self,
-        para: &ParagraphInfo,
-        line: Range<usize>,
-    ) -> Vec<Level> {
-        let levels = self.reordered_levels(para, line);
-        self.text.char_indices().map(|(i, _)| levels[i]).collect()
-    }
-
-
-    /// Re-order a line based on resolved levels and return the line in display order.
-    pub fn reorder_line(&self, para: &ParagraphInfo, line: Range<usize>) -> Cow<'text, str> {
-        let (levels, runs) = self.visual_runs(para, line.clone());
-
-        // If all isolating run sequences are LTR, no reordering is needed
-        if runs.iter().all(|run| levels[run.start].is_ltr()) {
-            return self.text[line.clone()].into();
-        }
-
-        let mut result = String::with_capacity(line.len());
-        for run in runs {
-            if levels[run.start].is_rtl() {
-                result.extend(self.text[run].chars().rev());
-            } else {
-                result.push_str(&self.text[run]);
-            }
-        }
-        result.into()
-    }
-
-    /// Find the level runs within a line and return them in visual order.
-    ///
-    /// `line` is a range of bytes indices within `levels`.
-    ///
-    /// http://www.unicode.org/reports/tr9/#Reordering_Resolved_Levels
-    pub fn visual_runs(
-        &self,
-        para: &ParagraphInfo,
-        line: Range<usize>,
-    ) -> (Vec<Level>, Vec<LevelRun>) {
-        assert!(line.start <= self.levels.len());
-        assert!(line.end <= self.levels.len());
-
-        let mut levels = self.levels.clone();
-
-        // Reset some whitespace chars to paragraph level.
-        // http://www.unicode.org/reports/tr9/#L1
-        let line_str: &str = &self.text[line.clone()];
-        let mut reset_from: Option<usize> = Some(0);
-        let mut reset_to: Option<usize> = None;
-        for (i, c) in line_str.char_indices() {
-            match self.original_classes[i] {
-                // Ignored by X9
-                RLE | LRE | RLO | LRO | PDF | BN => {}
-                // Segment separator, Paragraph separator
-                B | S => {
-                    assert!(reset_to == None);
-                    reset_to = Some(i + c.len_utf8());
-                    if reset_from == None {
-                        reset_from = Some(i);
-                    }
-                }
-                // Whitespace, isolate formatting
-                WS | FSI | LRI | RLI | PDI => {
-                    if reset_from == None {
-                        reset_from = Some(i);
-                    }
-                }
-                _ => {
-                    reset_from = None;
-                }
-            }
-            if let (Some(from), Some(to)) = (reset_from, reset_to) {
-                for j in from..to {
-                    levels[j] = para.level;
-                }
-                reset_from = None;
-                reset_to = None;
-            }
-        }
-        if let Some(from) = reset_from {
-            for j in from..line_str.len() {
-                levels[j] = para.level;
-            }
-        }
-
-        // Find consecutive level runs.
-        let mut runs = Vec::new();
-        let mut start = line.start;
-        let mut level = levels[start];
-        let mut min_level = level;
-        let mut max_level = level;
-
-        for i in (start + 1)..line.end {
-            let new_level = levels[i];
-            if new_level != level {
-                // End of the previous run, start of a new one.
-                runs.push(start..i);
-                start = i;
-                level = new_level;
-
-                min_level = min(level, min_level);
-                max_level = max(level, max_level);
-            }
-        }
-        runs.push(start..line.end);
-
-        let run_count = runs.len();
-
-        // Re-order the odd runs.
-        // http://www.unicode.org/reports/tr9/#L2
-
-        // Stop at the lowest *odd* level.
-        min_level = min_level.new_lowest_ge_rtl().expect("Level error");
-
-        while max_level >= min_level {
-            // Look for the start of a sequence of consecutive runs of max_level or higher.
-            let mut seq_start = 0;
-            while seq_start < run_count {
-                if self.levels[runs[seq_start].start] < max_level {
-                    seq_start += 1;
-                    continue;
-                }
-
-                // Found the start of a sequence. Now find the end.
-                let mut seq_end = seq_start + 1;
-                while seq_end < run_count {
-                    if self.levels[runs[seq_end].start] < max_level {
-                        break;
-                    }
-                    seq_end += 1;
-                }
-
-                // Reverse the runs within this sequence.
-                runs[seq_start..seq_end].reverse();
-
-                seq_start = seq_end;
-            }
-            max_level
-                .lower(1)
-                .expect("Lowering embedding level below zero");
-        }
-
-        (levels, runs)
-    }
-
-    /// If processed text has any computed RTL levels
-    ///
-    /// This information is usually used to skip re-ordering of text when no RTL level is present
-    #[inline]
-    pub fn has_rtl(&self) -> bool {
-        level::has_rtl(&self.levels)
-    }
-}
-
-/// Assign levels to characters removed by rule X9.
-///
-/// The levels assigned to these characters are not specified by the algorithm.  This function
-/// assigns each one the level of the previous character, to avoid breaking level runs.
-fn assign_levels_to_removed_chars(para_level: Level, classes: &[BidiClass], levels: &mut [Level]) {
-    for i in 0..levels.len() {
-        if prepare::removed_by_x9(classes[i]) {
-            levels[i] = if i > 0 { levels[i - 1] } else { para_level };
-        }
-    }
-}
-
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_initial_text_info() {
-        let text = "a1";
-        assert_eq!(
-            InitialInfo::new(text, None),
-            InitialInfo {
-                text: &text,
-                original_classes: vec![L, EN],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..2,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-
-        let text = "غ א";
-        assert_eq!(
-            InitialInfo::new(text, None),
-            InitialInfo {
-                text: &text,
-                original_classes: vec![AL, AL, WS, R, R],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..5,
-                        level: Level::rtl(),
-                    },
-                ],
-            }
-        );
-
-        let text = "a\u{2029}b";
-        assert_eq!(
-            InitialInfo::new(text, None),
-            InitialInfo {
-                text: &text,
-                original_classes: vec![L, B, B, B, L],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..4,
-                        level: Level::ltr(),
-                    },
-                    ParagraphInfo {
-                        range: 4..5,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-
-        let text = format!("{}א{}a", chars::FSI, chars::PDI);
-        assert_eq!(
-            InitialInfo::new(&text, None),
-            InitialInfo {
-                text: &text,
-                original_classes: vec![RLI, RLI, RLI, R, R, PDI, PDI, PDI, L],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..9,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-    }
-
-    #[test]
-    fn test_process_text() {
-        let text = "abc123";
-        assert_eq!(
-            BidiInfo::new(text, Some(Level::ltr())),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[0, 0, 0, 0, 0, 0]),
-                original_classes: vec![L, L, L, EN, EN, EN],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..6,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-
-        let text = "abc אבג";
-        assert_eq!(
-            BidiInfo::new(text, Some(Level::ltr())),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[0, 0, 0, 0, 1, 1, 1, 1, 1, 1]),
-                original_classes: vec![L, L, L, WS, R, R, R, R, R, R],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..10,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-        assert_eq!(
-            BidiInfo::new(text, Some(Level::rtl())),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[2, 2, 2, 1, 1, 1, 1, 1, 1, 1]),
-                original_classes: vec![L, L, L, WS, R, R, R, R, R, R],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..10,
-                        level: Level::rtl(),
-                    },
-                ],
-            }
-        );
-
-        let text = "אבג abc";
-        assert_eq!(
-            BidiInfo::new(text, Some(Level::ltr())),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]),
-                original_classes: vec![R, R, R, R, R, R, WS, L, L, L],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..10,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-        assert_eq!(
-            BidiInfo::new(text, None),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[1, 1, 1, 1, 1, 1, 1, 2, 2, 2]),
-                original_classes: vec![R, R, R, R, R, R, WS, L, L, L],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..10,
-                        level: Level::rtl(),
-                    },
-                ],
-            }
-        );
-
-        let text = "غ2ظ א2ג";
-        assert_eq!(
-            BidiInfo::new(text, Some(Level::ltr())),
-            BidiInfo {
-                text: &text,
-                levels: Level::vec(&[1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1]),
-                original_classes: vec![AL, AL, EN, AL, AL, WS, R, R, EN, R, R],
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..11,
-                        level: Level::ltr(),
-                    },
-                ],
-            }
-        );
-
-        let text = "a א.\nג";
-        assert_eq!(
-            BidiInfo::new(text, None),
-            BidiInfo {
-                text: &text,
-                original_classes: vec![L, WS, R, R, CS, B, R, R],
-                levels: Level::vec(&[0, 0, 1, 1, 0, 0, 1, 1]),
-                paragraphs: vec![
-                    ParagraphInfo {
-                        range: 0..6,
-                        level: Level::ltr(),
-                    },
-                    ParagraphInfo {
-                        range: 6..8,
-                        level: Level::rtl(),
-                    },
-                ],
-            }
-        );
-
-        /// BidiTest:69635 (AL ET EN)
-        let bidi_info = BidiInfo::new("\u{060B}\u{20CF}\u{06F9}", None);
-        assert_eq!(bidi_info.original_classes, vec![AL, AL, ET, ET, ET, EN, EN]);
-    }
-
-    #[test]
-    fn test_bidi_info_has_rtl() {
-        // ASCII only
-        assert_eq!(BidiInfo::new("123", None).has_rtl(), false);
-        assert_eq!(BidiInfo::new("123", Some(Level::ltr())).has_rtl(), false);
-        assert_eq!(BidiInfo::new("123", Some(Level::rtl())).has_rtl(), false);
-        assert_eq!(BidiInfo::new("abc", None).has_rtl(), false);
-        assert_eq!(BidiInfo::new("abc", Some(Level::ltr())).has_rtl(), false);
-        assert_eq!(BidiInfo::new("abc", Some(Level::rtl())).has_rtl(), false);
-        assert_eq!(BidiInfo::new("abc 123", None).has_rtl(), false);
-        assert_eq!(BidiInfo::new("abc\n123", None).has_rtl(), false);
-
-        // With Hebrew
-        assert_eq!(BidiInfo::new("אבּג", None).has_rtl(), true);
-        assert_eq!(
-            BidiInfo::new("אבּג", Some(Level::ltr())).has_rtl(),
-            true
-        );
-        assert_eq!(
-            BidiInfo::new("אבּג", Some(Level::rtl())).has_rtl(),
-            true
-        );
-        assert_eq!(BidiInfo::new("abc אבּג", None).has_rtl(), true);
-        assert_eq!(BidiInfo::new("abc\nאבּג", None).has_rtl(), true);
-        assert_eq!(BidiInfo::new("אבּג abc", None).has_rtl(), true);
-        assert_eq!(BidiInfo::new("אבּג\nabc", None).has_rtl(), true);
-        assert_eq!(BidiInfo::new("אבּג 123", None).has_rtl(), true);
-        assert_eq!(BidiInfo::new("אבּג\n123", None).has_rtl(), true);
-    }
-
-    fn reorder_paras(text: &str) -> Vec<Cow<str>> {
-        let bidi_info = BidiInfo::new(text, None);
-        bidi_info
-            .paragraphs
-            .iter()
-            .map(|para| bidi_info.reorder_line(para, para.range.clone()))
-            .collect()
-    }
-
-    #[test]
-    fn test_reorder_line() {
-        /// Bidi_Class: L L L B L L L B L L L
-        assert_eq!(
-            reorder_paras("abc\ndef\nghi"),
-            vec!["abc\n", "def\n", "ghi"]
-        );
-
-        /// Bidi_Class: L L EN B L L EN B L L EN
-        assert_eq!(
-            reorder_paras("ab1\nde2\ngh3"),
-            vec!["ab1\n", "de2\n", "gh3"]
-        );
-
-        /// Bidi_Class: L L L B AL AL AL
-        assert_eq!(reorder_paras("abc\nابج"), vec!["abc\n", "جبا"]);
-
-        /// Bidi_Class: AL AL AL B L L L
-        assert_eq!(reorder_paras("ابج\nabc"), vec!["\nجبا", "abc"]);
-
-        assert_eq!(reorder_paras("1.-2"), vec!["1.-2"]);
-        assert_eq!(reorder_paras("1-.2"), vec!["1-.2"]);
-        assert_eq!(reorder_paras("abc אבג"), vec!["abc גבא"]);
-
-        // Numbers being weak LTR characters, cannot reorder strong RTL
-        assert_eq!(reorder_paras("123 אבג"), vec!["גבא 123"]);
-
-        assert_eq!(reorder_paras("abc\u{202A}def"), vec!["abc\u{202A}def"]);
-
-        assert_eq!(
-            reorder_paras("abc\u{202A}def\u{202C}ghi"),
-            vec!["abc\u{202A}def\u{202C}ghi"]
-        );
-
-        assert_eq!(
-            reorder_paras("abc\u{2066}def\u{2069}ghi"),
-            vec!["abc\u{2066}def\u{2069}ghi"]
-        );
-
-        // Testing for RLE Character
-        assert_eq!(
-            reorder_paras("\u{202B}abc אבג\u{202C}"),
-            vec!["\u{202B}\u{202C}גבא abc"]
-        );
-
-        // Testing neutral characters
-        assert_eq!(reorder_paras("אבג? אבג"), vec!["גבא ?גבא"]);
-
-        // Testing neutral characters with special case
-        assert_eq!(reorder_paras("A אבג?"), vec!["A גבא?"]);
-
-        // Testing neutral characters with Implicit RTL Marker
-        assert_eq!(
-            reorder_paras("A אבג?\u{200F}"),
-            vec!["A \u{200F}?גבא"]
-        );
-        assert_eq!(reorder_paras("אבג abc"), vec!["abc גבא"]);
-        assert_eq!(
-            reorder_paras("abc\u{2067}.-\u{2069}ghi"),
-            vec!["abc\u{2067}-.\u{2069}ghi"]
-        );
-
-        assert_eq!(
-            reorder_paras("Hello, \u{2068}\u{202E}world\u{202C}\u{2069}!"),
-            vec!["Hello, \u{2068}\u{202E}\u{202C}dlrow\u{2069}!"]
-        );
-
-        // With mirrorable characters in RTL run
-        assert_eq!(reorder_paras("א(ב)ג."), vec![".ג)ב(א"]);
-
-        // With mirrorable characters on level boundry
-        assert_eq!(
-            reorder_paras("אב(גד[&ef].)gh"),
-            vec!["ef].)gh&[דג(בא"]
-        );
-    }
-
-    fn reordered_levels_for_paras(text: &str) -> Vec<Vec<Level>> {
-        let bidi_info = BidiInfo::new(text, None);
-        bidi_info
-            .paragraphs
-            .iter()
-            .map(|para| bidi_info.reordered_levels(para, para.range.clone()))
-            .collect()
-    }
-
-    fn reordered_levels_per_char_for_paras(text: &str) -> Vec<Vec<Level>> {
-        let bidi_info = BidiInfo::new(text, None);
-        bidi_info
-            .paragraphs
-            .iter()
-            .map(|para| bidi_info.reordered_levels_per_char(para, para.range.clone()))
-            .collect()
-    }
-
-    #[test]
-    fn test_reordered_levels() {
-
-        /// BidiTest:946 (LRI PDI)
-        let text = "\u{2067}\u{2069}";
-        assert_eq!(
-            reordered_levels_for_paras(text),
-            vec![Level::vec(&[0, 0, 0, 0, 0, 0])]
-        );
-        assert_eq!(
-            reordered_levels_per_char_for_paras(text),
-            vec![Level::vec(&[0, 0])]
-        );
-
-        /* TODO
-        /// BidiTest:69635 (AL ET EN)
-        let text = "\u{060B}\u{20CF}\u{06F9}";
-        assert_eq!(
-            reordered_levels_for_paras(text),
-            vec![Level::vec(&[1, 1, 1, 1, 1, 2, 2])]
-        );
-        assert_eq!(
-            reordered_levels_per_char_for_paras(text),
-            vec![Level::vec(&[1, 1, 2])]
-        );
-         */
-
-        /* TODO
-        // BidiTest:291284 (AN RLI PDF R)
-        assert_eq!(
-            reordered_levels_per_char_for_paras("\u{0605}\u{2067}\u{202C}\u{0590}"),
-            vec![&["2", "0", "x", "1"]]
-        );
-         */
-    }
-}
-
-
-#[cfg(all(feature = "with_serde", test))]
-mod serde_tests {
-    use serde_test::{Token, assert_tokens};
-    use super::*;
-
-    #[test]
-    fn test_levels() {
-        let text = "abc אבג";
-        let bidi_info = BidiInfo::new(text, None);
-        let levels = bidi_info.levels;
-        assert_eq!(text.as_bytes().len(), 10);
-        assert_eq!(levels.len(), 10);
-        assert_tokens(
-            &levels,
-            &[
-                Token::Seq { len: Some(10) },
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(0),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(0),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(0),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(0),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::NewtypeStruct { name: "Level" },
-                Token::U8(1),
-                Token::SeqEnd,
-            ],
-        );
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/src/prepare.rs
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2015 The Servo Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! 3.3.3 Preparations for Implicit Processing
-//!
-//! http://www.unicode.org/reports/tr9/#Preparations_for_Implicit_Processing
-
-use std::cmp::max;
-use std::ops::Range;
-
-use super::char_data::BidiClass;
-use super::level::Level;
-
-use BidiClass::*;
-
-/// A maximal substring of characters with the same embedding level.
-///
-/// Represented as a range of byte indices.
-pub type LevelRun = Range<usize>;
-
-
-/// Output of `isolating_run_sequences` (steps X9-X10)
-#[derive(Debug, PartialEq)]
-pub struct IsolatingRunSequence {
-    pub runs: Vec<LevelRun>,
-    pub sos: BidiClass, // Start-of-sequence type.
-    pub eos: BidiClass, // End-of-sequence type.
-}
-
-
-/// Compute the set of isolating run sequences.
-///
-/// An isolating run sequence is a maximal sequence of level runs such that for all level runs
-/// except the last one in the sequence, the last character of the run is an isolate initiator
-/// whose matching PDI is the first character of the next level run in the sequence.
-///
-/// Note: This function does *not* return the sequences in order by their first characters.
-pub fn isolating_run_sequences(
-    para_level: Level,
-    original_classes: &[BidiClass],
-    levels: &[Level],
-) -> Vec<IsolatingRunSequence> {
-    let runs = level_runs(levels, original_classes);
-
-    // Compute the set of isolating run sequences.
-    // http://www.unicode.org/reports/tr9/#BD13
-    let mut sequences = Vec::with_capacity(runs.len());
-
-    // When we encounter an isolate initiator, we push the current sequence onto the
-    // stack so we can resume it after the matching PDI.
-    let mut stack = vec![Vec::new()];
-
-    for run in runs {
-        assert!(run.len() > 0);
-        assert!(stack.len() > 0);
-
-        let start_class = original_classes[run.start];
-        let end_class = original_classes[run.end - 1];
-
-        let mut sequence = if start_class == PDI && stack.len() > 1 {
-            // Continue a previous sequence interrupted by an isolate.
-            stack.pop().unwrap()
-        } else {
-            // Start a new sequence.
-            Vec::new()
-        };
-
-        sequence.push(run);
-
-        if matches!(end_class, RLI | LRI | FSI) {
-            // Resume this sequence after the isolate.
-            stack.push(sequence);
-        } else {
-            // This sequence is finished.
-            sequences.push(sequence);
-        }
-    }
-    // Pop any remaning sequences off the stack.
-    sequences.extend(stack.into_iter().rev().filter(|seq| seq.len() > 0));
-
-    // Determine the `sos` and `eos` class for each sequence.
-    // http://www.unicode.org/reports/tr9/#X10
-    sequences
-        .into_iter()
-        .map(
-            |sequence: Vec<LevelRun>| {
-                assert!(!sequence.is_empty());
-
-                let start_of_seq = sequence[0].start;
-                let end_of_seq = sequence[sequence.len() - 1].end;
-                let seq_level = levels[start_of_seq];
-
-                #[cfg(test)]
-                for run in sequence.clone() {
-                    for idx in run {
-                        if not_removed_by_x9(&original_classes[idx]) {
-                            assert_eq!(seq_level, levels[idx]);
-                        }
-                    }
-                }
-
-                // Get the level of the last non-removed char before the runs.
-                let pred_level = match original_classes[..start_of_seq]
-                          .iter()
-                          .rposition(not_removed_by_x9) {
-                    Some(idx) => levels[idx],
-                    None => para_level,
-                };
-
-                // Get the level of the next non-removed char after the runs.
-                let succ_level = if matches!(original_classes[end_of_seq - 1], RLI | LRI | FSI) {
-                    para_level
-                } else {
-                    match original_classes[end_of_seq..]
-                              .iter()
-                              .position(not_removed_by_x9) {
-                        Some(idx) => levels[end_of_seq + idx],
-                        None => para_level,
-                    }
-                };
-
-                IsolatingRunSequence {
-                    runs: sequence,
-                    sos: max(seq_level, pred_level).bidi_class(),
-                    eos: max(seq_level, succ_level).bidi_class(),
-                }
-            }
-        )
-        .collect()
-}
-
-/// Finds the level runs in a paragraph.
-///
-/// http://www.unicode.org/reports/tr9/#BD7
-fn level_runs(levels: &[Level], original_classes: &[BidiClass]) -> Vec<LevelRun> {
-    assert!(levels.len() == original_classes.len());
-
-    let mut runs = Vec::new();
-    if levels.len() == 0 {
-        return runs;
-    }
-
-    let mut current_run_level = levels[0];
-    let mut current_run_start = 0;
-    for i in 1..levels.len() {
-        if !removed_by_x9(original_classes[i]) {
-            if levels[i] != current_run_level {
-                // End the last run and start a new one.
-                runs.push(current_run_start..i);
-                current_run_level = levels[i];
-                current_run_start = i;
-            }
-        }
-    }
-    runs.push(current_run_start..levels.len());
-
-    runs
-}
-
-/// Should this character be ignored in steps after X9?
-///
-/// http://www.unicode.org/reports/tr9/#X9
-pub fn removed_by_x9(class: BidiClass) -> bool {
-    matches!(class, RLE | LRE | RLO | LRO | PDF | BN)
-}
-
-// For use as a predicate for `position` / `rposition`
-pub fn not_removed_by_x9(class: &BidiClass) -> bool {
-    !removed_by_x9(*class)
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_level_runs() {
-        assert_eq!(level_runs(&Level::vec(&[]), &[]), &[]);
-        assert_eq!(
-            level_runs(&Level::vec(&[0, 0, 0, 1, 1, 2, 0, 0]), &[L; 8]),
-            &[0..3, 3..5, 5..6, 6..8]
-        );
-    }
-
-    // From http://www.unicode.org/reports/tr9/#BD13
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    #[test]
-    fn test_isolating_run_sequences() {
-
-        // == Example 1 ==
-        // text1·RLE·text2·PDF·RLE·text3·PDF·text4
-        // index        0    1  2    3    4  5    6  7
-        let classes = &[L, RLE, L, PDF, RLE, L, PDF, L];
-        let levels =  &[0,   1, 1,   1,   1, 1,   1, 0];
-        let para_level = Level::ltr();
-        let mut sequences = isolating_run_sequences(para_level, classes, &Level::vec(levels));
-        sequences.sort_by(|a, b| a.runs[0].clone().cmp(b.runs[0].clone()));
-        assert_eq!(
-            sequences.iter().map(|s| s.runs.clone()).collect::<Vec<_>>(),
-            vec![vec![0..2], vec![2..7], vec![7..8]]
-        );
-
-        // == Example 2 ==
-        // text1·RLI·text2·PDI·RLI·text3·PDI·text4
-        // index        0    1  2    3    4  5    6  7
-        let classes = &[L, RLI, L, PDI, RLI, L, PDI, L];
-        let levels =  &[0,   0, 1,   0,   0, 1,   0, 0];
-        let para_level = Level::ltr();
-        let mut sequences = isolating_run_sequences(para_level, classes, &Level::vec(levels));
-        sequences.sort_by(|a, b| a.runs[0].clone().cmp(b.runs[0].clone()));
-        assert_eq!(
-            sequences.iter().map(|s| s.runs.clone()).collect::<Vec<_>>(),
-            vec![vec![0..2, 3..5, 6..8], vec![2..3], vec![5..6]]
-        );
-
-        // == Example 3 ==
-        // text1·RLI·text2·LRI·text3·RLE·text4·PDF·text5·PDI·text6·PDI·text7
-        // index        0    1  2    3  4    5  6    7  8    9  10  11  12
-        let classes = &[L, RLI, L, LRI, L, RLE, L, PDF, L, PDI, L, PDI,  L];
-        let levels =  &[0,   0, 1,   1, 2,   3, 3,   3, 2,   1, 1,   0,  0];
-        let para_level = Level::ltr();
-        let mut sequences = isolating_run_sequences(para_level, classes, &Level::vec(levels));
-        sequences.sort_by(|a, b| a.runs[0].clone().cmp(b.runs[0].clone()));
-        assert_eq!(
-            sequences.iter().map(|s| s.runs.clone()).collect::<Vec<_>>(),
-            vec![vec![0..2, 11..13], vec![2..4, 9..11], vec![4..6], vec![6..8], vec![8..9]]
-        );
-    }
-
-    // From http://www.unicode.org/reports/tr9/#X10
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    #[test]
-    fn test_isolating_run_sequences_sos_and_eos() {
-
-        // == Example 1 ==
-        // text1·RLE·text2·LRE·text3·PDF·text4·PDF·RLE·text5·PDF·text6
-        // index        0    1  2    3  4    5  6    7    8  9   10  11
-        let classes = &[L, RLE, L, LRE, L, PDF, L, PDF, RLE, L, PDF,  L];
-        let levels =  &[0,   1, 1,   2, 2,   2, 1,   1,   1, 1,   1,  0];
-        let para_level = Level::ltr();
-        let mut sequences = isolating_run_sequences(para_level, classes, &Level::vec(levels));
-        sequences.sort_by(|a, b| a.runs[0].clone().cmp(b.runs[0].clone()));
-
-        // text1
-        assert_eq!(
-            &sequences[0],
-            &IsolatingRunSequence {
-                runs: vec![0..2],
-                sos: L,
-                eos: R,
-            }
-        );
-
-        // text2
-        assert_eq!(
-            &sequences[1],
-            &IsolatingRunSequence {
-                runs: vec![2..4],
-                sos: R,
-                eos: L,
-            }
-        );
-
-        // text3
-        assert_eq!(
-            &sequences[2],
-            &IsolatingRunSequence {
-                runs: vec![4..6],
-                sos: L,
-                eos: L,
-            }
-        );
-
-        // text4 text5
-        assert_eq!(
-            &sequences[3],
-            &IsolatingRunSequence {
-                runs: vec![6..11],
-                sos: L,
-                eos: R,
-            }
-        );
-
-        // text6
-        assert_eq!(
-            &sequences[4],
-            &IsolatingRunSequence {
-                runs: vec![11..12],
-                sos: R,
-                eos: L,
-            }
-        );
-
-        // == Example 2 ==
-        // text1·RLI·text2·LRI·text3·PDI·text4·PDI·RLI·text5·PDI·text6
-        // index        0    1  2    3  4    5  6    7    8  9   10  11
-        let classes = &[L, RLI, L, LRI, L, PDI, L, PDI, RLI, L, PDI,  L];
-        let levels =  &[0,   0, 1,   1, 2,   1, 1,   0,   0, 1,   0,  0];
-        let para_level = Level::ltr();
-        let mut sequences = isolating_run_sequences(para_level, classes, &Level::vec(levels));
-        sequences.sort_by(|a, b| a.runs[0].clone().cmp(b.runs[0].clone()));
-
-        // text1·RLI·PDI·RLI·PDI·text6
-        assert_eq!(
-            &sequences[0],
-            &IsolatingRunSequence {
-                runs: vec![0..2, 7..9, 10..12],
-                sos: L,
-                eos: L,
-            }
-        );
-
-        // text2·LRI·PDI·text4
-        assert_eq!(
-            &sequences[1],
-            &IsolatingRunSequence {
-                runs: vec![2..4, 5..7],
-                sos: R,
-                eos: R,
-            }
-        );
-
-        // text3
-        assert_eq!(
-            &sequences[2],
-            &IsolatingRunSequence {
-                runs: vec![4..5],
-                sos: L,
-                eos: L,
-            }
-        );
-
-        // text5
-        assert_eq!(
-            &sequences[3],
-            &IsolatingRunSequence {
-                runs: vec![9..10],
-                sos: R,
-                eos: R,
-            }
-        );
-    }
-
-    #[test]
-    fn test_removed_by_x9() {
-        let rem_classes = &[RLE, LRE, RLO, LRO, PDF, BN];
-        let not_classes = &[L, RLI, AL, LRI, PDI];
-        for x in rem_classes {
-            assert_eq!(removed_by_x9(*x), true);
-        }
-        for x in not_classes {
-            assert_eq!(removed_by_x9(*x), false);
-        }
-    }
-
-    #[test]
-    fn test_not_removed_by_x9() {
-        let non_x9_classes = &[L, R, AL, EN, ES, ET, AN, CS, NSM, B, S, WS, ON, LRI, RLI, FSI, PDI];
-        for x in non_x9_classes {
-            assert_eq!(not_removed_by_x9(&x), true);
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/unicode-bidi-0.3.3/tests/conformance_tests.rs
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2014 The html5ever Project Developers. See the
-// COPYRIGHT file at the top-level directory of this distribution.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![cfg(all(test, not(feature = "unstable")))]
-
-extern crate unicode_bidi;
-
-use unicode_bidi::{bidi_class, BidiInfo, format_chars, level, Level};
-
-#[derive(Debug)]
-struct Fail {
-    pub line_num: usize,
-    pub input_base_level: Option<Level>,
-    pub input_classes: Vec<String>,
-    pub input_string: String,
-    pub exp_base_level: Option<Level>,
-    pub exp_levels: Vec<String>,
-    pub exp_ordering: Vec<String>,
-    pub actual_base_level: Option<Level>,
-    pub actual_levels: Vec<Level>,
-    // TODO pub actual_ordering: Vec<String>,
-}
-
-#[test]
-#[should_panic(expected = "314 test cases failed! (256433 passed)")]
-fn test_basic_conformance() {
-    let test_data = include_str!("data/BidiTest.txt");
-
-    // Test set state
-    let mut passed_num: i32 = 0;
-    let mut fails: Vec<Fail> = Vec::new();
-    let mut exp_levels: Vec<String> = Vec::new();
-    let mut exp_ordering: Vec<String> = Vec::new();
-
-    for (line_num, line) in test_data.lines().enumerate() {
-        let line = line.trim();
-
-        // Empty and comment lines
-        if line.is_empty() || line.starts_with('#') {
-            // Ignore
-            continue;
-        }
-
-        // State setting lines
-        if line.starts_with('@') {
-            let tokens: Vec<String> = line.split_whitespace().map(|x| x.to_owned()).collect();
-            let (setting, values) = (tokens[0].as_ref(), tokens[1..].to_vec());
-            match setting {
-                "@Levels:" => {
-                    exp_levels = values.to_owned();
-                }
-                "@Reorder:" => {
-                    exp_ordering = values.to_owned();
-                }
-                _ => {
-                    // Ignore, to allow some degree of forward compatibility
-                }
-            }
-            continue;
-        }
-
-        // Data lines
-        {
-            // Levels and ordering need to be set before any data line
-            assert!(!exp_levels.is_empty());
-            assert!(exp_ordering.len() <= exp_levels.len());
-
-            let fields: Vec<&str> = line.split(';').collect();
-            let input_classes: Vec<&str> = fields[0].split_whitespace().collect();
-            let bitset: u8 = fields[1].trim().parse().unwrap();
-            assert!(!input_classes.is_empty());
-            assert!(bitset > 0);
-
-            let input_string = get_sample_string_from_bidi_classes(&input_classes);
-
-            for input_base_level in gen_base_levels_for_base_tests(bitset) {
-                let bidi_info = BidiInfo::new(&input_string, input_base_level);
-
-                // Check levels
-                let exp_levels: Vec<String> = exp_levels.iter().map(|x| x.to_owned()).collect();
-                let para = &bidi_info.paragraphs[0];
-                let levels = bidi_info.reordered_levels_per_char(para, para.range.clone());
-                if levels != exp_levels {
-                    fails.push(
-                        Fail {
-                            line_num: line_num,
-                            input_base_level: input_base_level,
-                            input_classes: input_classes.iter().map(|x| x.to_string()).collect(),
-                            input_string: input_string.to_owned(),
-                            exp_base_level: None,
-                            exp_levels: exp_levels.to_owned(),
-                            exp_ordering: exp_ordering.to_owned(),
-                            actual_base_level: None,
-                            actual_levels: levels.to_owned(),
-                        }
-                    );
-                } else {
-                    passed_num += 1;
-                }
-
-                // Check reorder map
-                // TODO: Add reorder map to API output and test the map here
-            }
-        }
-    }
-
-    if !fails.is_empty() {
-        // TODO: Show a list of failed cases when the number is less than 1K
-        panic!(
-            "{} test cases failed! ({} passed) {{\n\
-            \n\
-            0: {:?}\n\
-            \n\
-            ...\n\
-            \n\
-            {}: {:?}\n\
-            \n\
-            }}",
-            fails.len(),
-            passed_num,
-            fails[0],
-            fails.len() - 1,
-            fails[fails.len() - 1],
-        );
-    }
-}
-
-// TODO: Support auto-RTL
-fn gen_base_levels_for_base_tests(bitset: u8) -> Vec<Option<Level>> {
-    /// Values: auto-LTR, LTR, RTL
-    const VALUES: &'static [Option<Level>] =
-        &[None, Some(level::LTR_LEVEL), Some(level::RTL_LEVEL)];
-    assert!(bitset < (1 << VALUES.len()));
-    (0..VALUES.len())
-        .filter(|bit| bitset & (1u8 << bit) == 1)
-        .map(|idx| VALUES[idx])
-        .collect()
-}
-
-
-#[test]
-#[should_panic(expected = "14558 test cases failed! (77141 passed)")]
-fn test_character_conformance() {
-    let test_data = include_str!("data/BidiCharacterTest.txt");
-
-    // Test set state
-    let mut passed_num: i32 = 0;
-    let mut fails: Vec<Fail> = Vec::new();
-
-    for (line_num, line) in test_data.lines().enumerate() {
-        let line = line.trim();
-
-        // Empty and comment lines
-        if line.is_empty() || line.starts_with('#') {
-            // Ignore
-            continue;
-        }
-
-        // Data lines
-        {
-            let fields: Vec<&str> = line.split(';').collect();
-            let input_chars: Vec<char> = fields[0]
-                .split_whitespace()
-                .map(|cp_hex| u32::from_str_radix(cp_hex, 16).unwrap())
-                .map(|cp_u32| std::char::from_u32(cp_u32).unwrap())
-                .collect();
-            let input_string: String = input_chars.into_iter().collect();
-            let input_base_level: Option<Level> =
-                gen_base_level_for_characters_tests(fields[1].trim().parse().unwrap());
-            let exp_base_level: Level = Level::new(fields[2].trim().parse().unwrap()).unwrap();
-            let exp_levels: Vec<String> =
-                fields[3].split_whitespace().map(|x| x.to_owned()).collect();
-            let exp_ordering: Vec<String> =
-                fields[4].split_whitespace().map(|x| x.to_owned()).collect();
-
-            let bidi_info = BidiInfo::new(&input_string, input_base_level);
-
-            // Check levels
-            let para = &bidi_info.paragraphs[0];
-            let levels = bidi_info.reordered_levels_per_char(para, para.range.clone());
-            if levels != exp_levels {
-                fails.push(
-                    Fail {
-                        line_num: line_num,
-                        input_base_level: input_base_level,
-                        input_classes: vec![],
-                        input_string: input_string.to_owned(),
-                        exp_base_level: Some(exp_base_level),
-                        exp_levels: exp_levels.to_owned(),
-                        exp_ordering: exp_ordering.to_owned(),
-                        actual_base_level: None,
-                        actual_levels: levels.to_owned(),
-                    }
-                );
-            } else {
-                passed_num += 1;
-            }
-
-            // Check reorder map
-            // TODO: Add reorder map to API output and test the map here
-        }
-    }
-
-    if !fails.is_empty() {
-        // TODO: Show a list of failed cases when the number is less than 1K
-        panic!(
-            "{} test cases failed! ({} passed) {{\n\
-            \n\
-            0: {:?}\n\
-            \n\
-            ...\n\
-            \n\
-            {}: {:?}\n\
-            \n\
-            }}",
-            fails.len(),
-            passed_num,
-            fails[0],
-            fails.len() - 1,
-            fails[fails.len() - 1],
-        );
-    }
-}
-
-// TODO: Support auto-RTL
-fn gen_base_level_for_characters_tests(idx: usize) -> Option<Level> {
-    /// Values: LTR, RTL, auto-LTR
-    const VALUES: &'static [Option<Level>] =
-        &[Some(level::LTR_LEVEL), Some(level::RTL_LEVEL), None];
-    assert!(idx < VALUES.len());
-    VALUES[idx]
-}
-
-
-fn get_sample_string_from_bidi_classes(class_names: &[&str]) -> String {
-    class_names
-        .iter()
-        .map(|class_name| gen_char_from_bidi_class(class_name))
-        .collect()
-}
-
-fn gen_char_from_bidi_class(class_name: &str) -> char {
-    match class_name {
-        "AL" => '\u{060B}',
-        "AN" => '\u{0605}',
-        "B" => '\u{000A}',
-        "BN" => '\u{2060}',
-        "CS" => '\u{2044}',
-        "EN" => '\u{06F9}',
-        "ES" => '\u{208B}',
-        "ET" => '\u{20CF}',
-        "FSI" => format_chars::FSI,
-        "L" => '\u{02B8}',
-        "LRE" => format_chars::LRE,
-        "LRI" => format_chars::LRI,
-        "LRO" => format_chars::LRO,
-        "NSM" => '\u{0300}',
-        "ON" => '\u{03F6}',
-        "PDF" => format_chars::PDF,
-        "PDI" => format_chars::PDI,
-        "R" => '\u{0590}',
-        "RLE" => format_chars::RLE,
-        "RLI" => format_chars::RLI,
-        "RLO" => format_chars::RLO,
-        "S" => '\u{001F}',
-        "WS" => '\u{200A}',
-        &_ => panic!("Invalid Bidi_Class name: {}", class_name),
-    }
-}
-
-#[test]
-fn test_gen_char_from_bidi_class() {
-    use unicode_bidi::BidiClass::*;
-    for &class in &[
-        AL,
-        AN,
-        B,
-        BN,
-        CS,
-        EN,
-        ES,
-        ET,
-        FSI,
-        L,
-        LRE,
-        LRI,
-        LRO,
-        NSM,
-        ON,
-        PDF,
-        PDI,
-        R,
-        RLE,
-        RLI,
-        RLO,
-        S,
-        WS,
-    ] {
-        let class_name = format!("{:?}", class);
-        let sample_char = gen_char_from_bidi_class(&class_name);
-        assert_eq!(bidi_class(sample_char), class);
-    }
-}
deleted file mode 100755
--- a/third_party/rust/unicode-bidi-0.3.3/tools/generate.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env python
-#
-# Based on src/etc/unicode.py from Rust 1.2.0.
-#
-# Copyright 2011-2013 The Rust Project Developers.
-# Copyright 2015 The Servo Project Developers. See the COPYRIGHT
-# file at the top-level directory of this distribution and at
-# http://rust-lang.org/COPYRIGHT.
-#
-# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-# option. This file may not be copied, modified, or distributed
-# except according to those terms.
-
-
-import fileinput, re, os, sys, operator
-
-
-DATA_DIR = 'data'
-TESTS_DATA_DIR = 'tests/data'
-README_NAME = "ReadMe.txt"
-UNICODE_DATA_NAME = "UnicodeData.txt"
-TABLES_PATH = os.path.join("src", "char_data", "tables.rs")
-
-PREAMBLE = '''// NOTE:
-// The following code was generated by "tools/generate.py". do not edit directly
-
-#![allow(missing_docs, non_upper_case_globals, non_snake_case)]
-#![cfg_attr(rustfmt, rustfmt_skip)]
-'''
-
-# these are the surrogate codepoints, which are not valid rust characters
-surrogate_codepoints = (0xD800, 0xDFFF)
-
-def fetch(name, dst):
-    if not os.path.exists(dst):
-        os.system("curl -o '%s' 'http://www.unicode.org/Public/UNIDATA/%s'" % (dst, name))
-    if not os.path.exists(dst):
-        sys.stderr.write("cannot fetch %s" % name)
-        exit(1)
-
-def fetch_data(name):
-    dst = os.path.join(DATA_DIR, os.path.basename(name))
-    fetch(name, dst)
-
-def fetch_test_data(name):
-    dst = os.path.join(TESTS_DATA_DIR, os.path.basename(name))
-    fetch(name, dst)
-
-def open_data(name):
-    return open(os.path.join(DATA_DIR, name))
-
-def is_surrogate(n):
-    return surrogate_codepoints[0] <= n <= surrogate_codepoints[1]
-
-def load_unicode_data():
-    fetch_data(UNICODE_DATA_NAME)
-    udict = {};
-
-    range_start = -1;
-    for line in fileinput.input(os.path.join(DATA_DIR, UNICODE_DATA_NAME)):
-        data = line.split(';');
-        if len(data) != 15:
-            continue
-        cp = int(data[0], 16);
-        if is_surrogate(cp):
-            continue
-        if range_start >= 0:
-            for i in xrange(range_start, cp):
-                udict[i] = data;
-            range_start = -1;
-        if data[1].endswith(", First>"):
-            range_start = cp;
-            continue;
-        udict[cp] = data;
-
-    # Mapping of code point to Bidi_Class property:
-    bidi_class = {}
-
-    for code in udict:
-        [code_org, name, gencat, combine, bidi,
-         decomp, deci, digit, num, mirror,
-         old, iso, upcase, lowcase, titlecase ] = udict[code];
-
-        if bidi not in bidi_class:
-            bidi_class[bidi] = []
-        bidi_class[bidi].append(code)
-
-    # Default Bidi_Class for unassigned codepoints.
-    # http://www.unicode.org/Public/UNIDATA/extracted/DerivedBidiClass.txt
-    default_ranges = [
-        (0x0600, 0x07BF, "AL"), (0x08A0, 0x08FF, "AL"),
-        (0xFB50, 0xFDCF, "AL"), (0xFDF0, 0xFDFF, "AL"),
-        (0xFE70, 0xFEFF, "AL"), (0x1EE00, 0x1EEFF, "AL"),
-
-        (0x0590, 0x05FF, "R"), (0x07C0, 0x089F, "R"),
-        (0xFB1D, 0xFB4F, "R"), (0x10800, 0x10FFF, "R"),
-        (0x1E800, 0x1EDFF, "R"), (0x1EF00, 0x1EFFF, "R"),
-
-        (0x20A0, 0x20CF, "ET"),
-    ]
-
-    for (start, end, default) in default_ranges:
-        for code in range(start, end+1):
-            if not code in udict:
-                bidi_class[default].append(code)
-
-    return group_categories(bidi_class)
-
-def group_categories(cats):
-    cats_out = []
-    for cat in cats:
-        cats_out.extend([(x, y, cat) for (x, y) in group_cat(cats[cat])])
-    cats_out.sort(key=lambda w: w[0])
-    return (sorted(cats.keys()), cats_out)
-
-def group_cat(cat):
-    cat_out = []
-    letters = sorted(set(cat))
-    cur_start = letters.pop(0)
-    cur_end = cur_start
-    for letter in letters:
-        assert letter > cur_end, \
-            "cur_end: %s, letter: %s" % (hex(cur_end), hex(letter))
-        if letter == cur_end + 1:
-            cur_end = letter
-        else:
-            cat_out.append((cur_start, cur_end))
-            cur_start = cur_end = letter
-    cat_out.append((cur_start, cur_end))
-    return cat_out
-
-def format_table_content(f, content, indent):
-    line = " "*indent
-    first = True
-    for chunk in content.split(","):
-        if len(line) + len(chunk) < 98:
-            if first:
-                line += chunk
-            else:
-                line += ", " + chunk
-            first = False
-        else:
-            f.write(line + ",\n")
-            line = " "*indent + chunk
-    f.write(line)
-
-def escape_char(c):
-    return "'\\u{%x}'" % c
-
-def emit_table(
-    file_,
-    t_name,
-    t_data,
-    t_type = "&'static [(char, char)]",
-    is_pub=True,
-    pfun=lambda x: "(%s,%s)" % (escape_char(x[0]), escape_char(x[1]))
-):
-    if is_pub:
-        file_.write("pub ")
-    file_.write("const %s: %s = &[\n" % (t_name, t_type))
-
-    data = ""
-    first = True
-    for dat in t_data:
-        if not first:
-            data += ","
-        first = False
-        data += pfun(dat)
-    format_table_content(file_, data, 4)
-    file_.write("\n];\n\n")
-
-def emit_bidi_module(file_, bidi_class_table, cats):
-    file_.write("""
-#[allow(non_camel_case_types)]
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-/// Represents values of the Unicode character property
-/// [Bidi_Class](http://www.unicode.org/reports/tr44/#Bidi_Class), also
-/// known as the *bidirectional character type*.
-///
-/// * http://www.unicode.org/reports/tr9/#Bidirectional_Character_Types
-/// * http://www.unicode.org/reports/tr44/#Bidi_Class_Values
-pub enum BidiClass {
-""")
-    for cat in cats:
-        file_.write("    " + cat + ",\n")
-    file_.write("""}
-
-use self::BidiClass::*;
-""")
-
-    emit_table(
-        file_,
-        "bidi_class_table",
-        bidi_class_table,
-        "&'static [(char, char, BidiClass)]",
-        pfun=lambda x: "(%s,%s,%s)" % (escape_char(x[0]), escape_char(x[1]), x[2]),
-    )
-
-def get_unicode_version():
-    fetch_data(README_NAME)
-    with open_data(README_NAME) as readme:
-        pattern = "for Version (\d+)\.(\d+)\.(\d+) of the Unicode"
-        return re.search(pattern, readme.read()).groups()
-
-if __name__ == "__main__":
-    # Find Unicode Version
-    if not os.path.exists(DATA_DIR):
-        os.mkdir(DATA_DIR)
-    unicode_version = get_unicode_version()
-
-    # Build data tables
-    if os.path.exists(TABLES_PATH):
-        os.remove(TABLES_PATH)
-    with open(TABLES_PATH, "w") as file_:
-        file_.write(PREAMBLE)
-        file_.write("""
-/// The [Unicode version](http://www.unicode.org/versions/) of data
-pub const UNICODE_VERSION: (u64, u64, u64) = (%s, %s, %s);
-""" % unicode_version)
-
-        (bidi_categories, bidi_class_table) = load_unicode_data()
-        emit_bidi_module(file_, bidi_class_table, bidi_categories)
-
-    # Fetch test data files
-    fetch_test_data("BidiTest.txt")
-    fetch_test_data("BidiCharacterTest.txt")
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{".travis.yml":"890af214187ffcba4732acb2d1af30d7adb9aade0679e9fdb06baae363240b8e","Cargo.toml":"ec586106c4d0625919a3591fe3ae915043e82c8bfdd1c9e747171ba5e21047e1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","Makefile":"bffd75d34654b2955d4f005f1a5e85c821c90becf1a8a52cbe10121972f43148","README.md":"eb3f4694003f408cbe3c7f3e9fbbc71241defb940cc55a816981f0f0f144c8eb","UPGRADING.md":"fbcc2d39bdf17db0745793db6626fcd5c909dddd4ce13b27566cfabece22c368","appveyor.yml":"c78486dbfbe6ebbf3d808afb9a19f7ec18c4704ce451c6305f0716999b70a1a6","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","docs/index.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","github.png":"b432fd855efe7c430fe6a57ccf83935c1996f03a7cdc8d6e1b34154b8c43f6ec","rust-url-todo":"1192cee7b6cedf2133d97dc6074b593a1d19b0ee13fff6f28d6329855044e575","src/encoding.rs":"f3e109ca8ec5a9130da50cdfb3003530aedb6dd5a440f0790d76b71f6981119c","src/form_urlencoded.rs":"7ccaef7148e4bc2577154c50f8705db3a055b641269e24c22770f06222321e1e","src/host.rs":"281165d732ea87b6f01a98f7c68ffcb284c41f84b3ab6ed674fb8e57022d1019","src/lib.rs":"bd156e8bcfbd44f0cd52c8b394e03ec63fea012c0bf5ca554521352714838605","src/origin.rs":"7071dcc1070ccfae84cdcd43586b84a9706e35a9a099ff4dde128da0909bd0bc","src/parser.rs":"9d30868f0900586fec6f122a0322598a08116ab0b4c4d8caf5c35a720381a73a","src/path_segments.rs":"7bd3142eaa568863ef44e2255c181239141f9eeee337f889b9ffaaeab4ca669d","src/quirks.rs":"1231f965e22bb3632c22993e2a8d4c7470bcb4a8de25d049f31784303f0def03","src/slicing.rs":"4e539886b23945a92094625f3e531a4bff40daa44240b5d19ee8577478c4f7fe","tests/data.rs":"c333766897f6492fb6583ab5c8a511973b7a55f58ca550799432343da64d5ca7","tests/setters_tests.json":"ebcbdb52e9a4b5a565f8806d52ebc610d46a34df883e10b0be080d026468ff73","tests/unit.rs":"c2f206f433be619414d761d358a2a4a5a46cfe8a4fea5339adec5e9937d78de2","tests/urltestdata.json":"430c74aa3a31afaa57a92805544e00825f4dffe2def98c1e3c212c3db80268af"},"package":"eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: rust
-rust:
-  - nightly
-  - beta
-  - stable
-  - 1.17.0
-script: make test
-notifications:
-  webhooks: http://build.servo.org:54856/travis
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/Cargo.toml
+++ /dev/null
@@ -1,49 +0,0 @@
-[package]
-
-name = "url"
-# When updating version, also modify html_root_url in the lib.rs
-version = "1.5.1"
-authors = ["The rust-url developers"]
-
-description = "URL library for Rust, based on the WHATWG URL Standard"
-documentation = "https://docs.rs/url"
-repository = "https://github.com/servo/rust-url"
-readme = "README.md"
-keywords = ["url", "parser"]
-categories = ["parser-implementations", "web-programming", "encoding"]
-license = "MIT/Apache-2.0"
-
-[badges]
-travis-ci = { repository = "servo/rust-url" }
-appveyor = { repository = "servo/rust-url" }
-
-[workspace]
-members = [".", "idna", "percent_encoding", "url_serde"]
-
-[[test]]
-name = "unit"
-
-[[test]]
-name = "data"
-harness = false
-
-[lib]
-test = false
-
-[dev-dependencies]
-rustc-test = "0.1"
-rustc-serialize = "0.3"
-serde_json = ">=0.6.1, <0.9"
-
-[features]
-query_encoding = ["encoding"]
-heap_size = ["heapsize"]
-
-[dependencies]
-encoding = {version = "0.2", optional = true}
-heapsize = {version = ">=0.1.1, <0.5", optional = true}
-idna = { version = "0.1.0", path = "./idna" }
-matches = "0.1"
-percent-encoding = { version = "1.0.0", path = "./percent_encoding" }
-rustc-serialize = {version = "0.3", optional = true}
-serde = {version = ">=0.6.1, <0.9", optional = true}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2013-2016 The rust-url developers
-
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-test:
-	cargo test --features "query_encoding serde rustc-serialize heapsize"
-	(cd idna && cargo test)
-	(cd url_serde && cargo test)
-
-.PHONY: test
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-rust-url
-========
-
-[![Travis build Status](https://travis-ci.org/servo/rust-url.svg?branch=master)](https://travis-ci.org/servo/rust-url) [![Appveyor build status](https://ci.appveyor.com/api/projects/status/ulkqx2xcemyod6xa?svg=true)](https://ci.appveyor.com/project/Manishearth/rust-url)
-
-URL library for Rust, based on the [URL Standard](https://url.spec.whatwg.org/).
-
-[Documentation](https://docs.rs/url/)
-
-Please see [UPGRADING.md](https://github.com/servo/rust-url/blob/master/UPGRADING.md) if you are upgrading from 0.x to 1.x.
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/UPGRADING.md
+++ /dev/null
@@ -1,263 +0,0 @@
-# Guide to upgrading from url 0.x to 1.x
-
-* The fields of `Url` are now private because the `Url` constructor, parser,
-  and setters maintain invariants that could be violated if you were to set the fields directly.
-  Instead of accessing, for example, `url.scheme`, use the getter method, such as `url.scheme()`.
-  Instead of assigning directly to a field, for example `url.scheme = "https".to_string()`,
-  use the setter method, such as `url.set_scheme("https").unwrap()`.
-  (Some setters validate the new value and return a `Result` that must be used).
-
-* The methods of `Url` now return `&str` instead of `String`,
-  thus reducing allocations and making serialization cheap.
-
-* The `path()` method on `url::Url` instances used to return `Option<&[String]>`;
-  now it returns `&str`.
-  If you would like functionality more similar to the old behavior of `path()`,
-  use `path_segments()` that returns `Option<str::Split<char>>`.
-
-    Before upgrading:
-
-    ```rust
-    let issue_list_url = Url::parse(
-         "https://github.com/rust-lang/rust/issues?labels=E-easy&state=open"
-    ).unwrap();
-    assert_eq!(issue_list_url.path(), Some(&["rust-lang".to_string(),
-                                             "rust".to_string(),
-                                             "issues".to_string()][..]));
-    ```
-
-    After upgrading:
-
-    ```rust
-    let issue_list_url = Url::parse(
-         "https://github.com/rust-lang/rust/issues?labels=E-easy&state=open"
-    ).unwrap();
-    assert_eq!(issue_list_url.path(), "/rust-lang/rust/issues");
-    assert_eq!(issue_list_url.path_segments().map(|c| c.collect::<Vec<_>>()),
-               Some(vec!["rust-lang", "rust", "issues"]));
-    ```
-
-* The `path_mut()` method on `url::Url` instances that allowed modification of a URL's path
-  has been replaced by `path_segments_mut()`.
-
-    Before upgrading:
-
-    ```rust
-    let mut url = Url::parse("https://github.com/rust-lang/rust").unwrap();
-    url.path_mut().unwrap().push("issues");
-    ```
-
-    After upgrading:
-
-    ```rust
-    let mut url = Url::parse("https://github.com/rust-lang/rust").unwrap();
-    url.path_segments_mut().unwrap().push("issues");
-    ```
-
-* The `domain_mut()` method on `url::Url` instances that allowed modification of a URL's domain
-  has been replaced by `set_host()` and `set_ip_host()`.
-
-* The `host()` method on `url::Url` instances used to return `Option<&Host>`;
-  now it returns `Option<Host<&str>>`.
-  The `serialize_host()` method that returned `Option<String>`
-  has been replaced by the `host_str()` method that returns `Option<&str>`.
-
-* The `serialize()` method on `url::Url` instances that returned `String`
-  has been replaced by an `as_str()` method that returns `&str`.
-
-    Before upgrading:
-
-    ```rust
-    let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html").unwrap();
-    assert_eq!(this_document.serialize(), "http://servo.github.io/rust-url/url/index.html".to_string());
-    ```
-
-    After upgrading:
-
-    ```rust
-    let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html").unwrap();
-    assert_eq!(this_document.as_str(), "http://servo.github.io/rust-url/url/index.html");
-    ```
-
-* `url::UrlParser` has been replaced by `url::Url::parse()` and `url::Url::join()`.
-
-    Before upgrading:
-
-    ```rust
-    let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html").unwrap();
-    let css_url = UrlParser::new().base_url(&this_document).parse("../main.css").unwrap();
-    assert_eq!(css_url.serialize(), "http://servo.github.io/rust-url/main.css".to_string());
-    ```
-
-    After upgrading:
-
-    ```rust
-    let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html").unwrap();
-    let css_url = this_document.join("../main.css").unwrap();
-    assert_eq!(css_url.as_str(), "http://servo.github.io/rust-url/main.css");
-    ```
-
-* `url::parse_path()` and `url::UrlParser::parse_path()` have been removed without replacement.
-  As a workaround, you can give a base URL that you then ignore too `url::Url::parse()`.
-
-    Before upgrading:
-
-    ```rust
-    let (path, query, fragment) = url::parse_path("/foo/bar/../baz?q=42").unwrap();
-    assert_eq!(path, vec!["foo".to_string(), "baz".to_string()]);
-    assert_eq!(query, Some("q=42".to_string()));
-    assert_eq!(fragment, None);
-    ```
-
-    After upgrading:
-
-    ```rust
-    let base = Url::parse("http://example.com").unwrap();
-    let with_path = base.join("/foo/bar/../baz?q=42").unwrap();
-    assert_eq!(with_path.path(), "/foo/baz");
-    assert_eq!(with_path.query(), Some("q=42"));
-    assert_eq!(with_path.fragment(), None);
-    ```
-
-* The `url::form_urlencoded::serialize()` method
-  has been replaced with the `url::form_urlencoded::Serializer` struct.
-  Instead of calling `serialize()` with key/value pairs,
-  create a new `Serializer` with a new string,
-  call the `extend_pairs()` method on the `Serializer` instance with the key/value pairs as the argument,
-  then call `finish()`.
-
-    Before upgrading:
-
-    ```rust
-    let form = url::form_urlencoded::serialize(form.iter().map(|(k, v)| {
-        (&k[..], &v[..])
-    }));
-    ```
-
-    After upgrading:
-
-    ```rust
-    let form = url::form_urlencoded::Serializer::new(String::new()).extend_pairs(
-        form.iter().map(|(k, v)| { (&k[..], &v[..]) })
-    ).finish();
-    ```
-
-* The `set_query_from_pairs()` method on `url::Url` instances that took key/value pairs
-  has been replaced with `query_pairs_mut()`, which allows you to modify the `url::Url`'s query pairs.
-
-    Before upgrading:
-
-    ```rust
-    let mut url = Url::parse("https://duckduckgo.com/").unwrap();
-    let pairs = vec![
-        ("q", "test"),
-        ("ia", "images"),
-    ];
-    url.set_query_from_pairs(pairs.iter().map(|&(k, v)| {
-        (&k[..], &v[..])
-    }));
-    ```
-
-    After upgrading:
-
-    ```rust
-    let mut url = Url::parse("https://duckduckgo.com/").unwrap();
-    let pairs = vec![
-        ("q", "test"),
-        ("ia", "images"),
-    ];
-    url.query_pairs_mut().clear().extend_pairs(
-      pairs.iter().map(|&(k, v)| { (&k[..], &v[..]) })
-    );
-    ```
-
-* `url::SchemeData`, its variants `Relative` and `NonRelative`,
-  and the struct `url::RelativeSchemeData` have been removed.
-  Instead of matching on these variants
-  to determine if you have a URL in a relative scheme such as HTTP
-  versus a URL in a non-relative scheme as data,
-  use the `cannot_be_a_base()` method to determine which kind you have.
-
-    Before upgrading:
-
-    ```rust
-    match url.scheme_data {
-        url::SchemeData::Relative(..) => {}
-        url::SchemeData::NonRelative(..) => {
-            return Err(human(format!("`{}` must have relative scheme \
-                                      data: {}", field, url)))
-        }
-    }
-    ```
-
-    After upgrading:
-
-    ```rust
-    if url.cannot_be_a_base() {
-        return Err(human(format!("`{}` must have relative scheme \
-                                  data: {}", field, url)))
-    }
-    ```
-
-* The functions `url::whatwg_scheme_type_mapper()`, the `SchemeType` enum,
-  and the `scheme_type_mapper()` method on `url::UrlParser` instances have been removed.
-  `SchemeType` had a method for getting the `default_port()`;
-  to replicate this functionality, use the method `port_or_known_default()` on `url::Url` instances.
-  The `port_or_default()` method on `url::Url` instances has been removed;
-  use `port_or_known_default()` instead.
-
-    Before upgrading:
-
-    ```rust
-    let port = match whatwg_scheme_type_mapper(&url.scheme) {
-        SchemeType::Relative(port) => port,
-        _ => return Err(format!("Invalid special scheme: `{}`",
-                                raw_url.scheme)),
-    };
-    ```
-
-    After upgrading:
-
-    ```rust
-    let port = match url.port_or_known_default() {
-        Some(port) => port,
-        _ => return Err(format!("Invalid special scheme: `{}`",
-                                url.scheme())),
-    };
-    ```
-
-* The following formatting utilities have been removed without replacement;
-  look at their linked previous implementations
-  if you would like to replicate the functionality in your code:
-  * [`url::format::PathFormatter`](https://github.com/servo/rust-url/pull/176/commits/9e759f18726c8e1343162922b87163d4dd08fe3c#diff-0bb16ac13b75e9b568fa4aff61b0e71dL24)
-  * [`url::format::UserInfoFormatter`](https://github.com/servo/rust-url/pull/176/commits/9e759f18726c8e1343162922b87163d4dd08fe3c#diff-0bb16ac13b75e9b568fa4aff61b0e71dL50)
-  * [`url::format::UrlNoFragmentFormatter`](https://github.com/servo/rust-url/pull/176/commits/9e759f18726c8e1343162922b87163d4dd08fe3c#diff-0bb16ac13b75e9b568fa4aff61b0e71dL70)
-
-* `url::percent_encoding::percent_decode()` used to have a return type of `Vec<u8>`;
-  now it returns an iterator of decoded `u8` bytes that also implements `Into<Cow<u8>>`.
-  Use `.into().to_owned()` to obtain a `Vec<u8>`.
-  (`.collect()` also works but might not be as efficient.)
-
-* The `url::percent_encoding::EncodeSet` struct and constant instances
-  used with `url::percent_encoding::percent_encode()`
-  have been changed to structs that implement the trait `url::percent_encoding::EncodeSet`.
-  * `SIMPLE_ENCODE_SET`, `QUERY_ENCODE_SET`, `DEFAULT_ENCODE_SET`,
-    and `USERINFO_ENCODE_SET` have the same behavior.
-  * `USERNAME_ENCODE_SET` and `PASSWORD_ENCODE_SET` have been removed;
-    use `USERINFO_ENCODE_SET` instead.
-  * `HTTP_VALUE_ENCODE_SET` has been removed;
-    an implementation of it in the new types can be found [in hyper's source](
-    https://github.com/hyperium/hyper/blob/67436c5bf615cf5a55a71e32b788afef5985570e/src/header/parsing.rs#L131-L138)
-    if you need to replicate this functionality in your code.
-  * `FORM_URLENCODED_ENCODE_SET` has been removed;
-    instead, use the functionality in `url::form_urlencoded`.
-  * `PATH_SEGMENT_ENCODE_SET` has been added for use on '/'-separated path segments.
-
-* `url::percent_encoding::percent_decode_to()` has been removed.
-  Use `url::percent_encoding::percent_decode()` which returns an iterator.
-  You can then use the iterator’s `collect()` method
-  or give it to some data structure’s `extend()` method.
-* A number of `ParseError` variants have changed.
-  [See the documentation for the current set](http://servo.github.io/rust-url/url/enum.ParseError.html).
-* `url::OpaqueOrigin::new()` and `url::Origin::UID(OpaqueOrigin)`
-  have been replaced by `url::Origin::new_opaque()` and `url::Origin::Opaque(OpaqueOrigin)`, respectively.
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/appveyor.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-install:
-  - ps: Start-FileDownload 'https://static.rust-lang.org/dist/rust-nightly-i686-pc-windows-gnu.exe'
-  - rust-nightly-i686-pc-windows-gnu.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - rustc -V
-  - cargo -V
-  - git submodule update --init --recursive
-
-build: false
-
-test_script:
-  - cargo build
-  - cargo test --verbose
deleted file mode 100644
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/docs/404.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<meta http-equiv="refresh" content="0; url=https://docs.rs/url/">
-<link rel="canonical" href="https://docs.rs/url/">
-<a href="https://docs.rs/url/">Moved to docs.rs</a>
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/docs/index.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<meta http-equiv="refresh" content="0; url=https://docs.rs/url/">
-<link rel="canonical" href="https://docs.rs/url/">
-<a href="https://docs.rs/url/">Moved to docs.rs</a>
deleted file mode 100644
index b2c327097e33667628759b5b8194cbe364f471fc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/rust-url-todo
+++ /dev/null
@@ -1,14 +0,0 @@
-* standalone path parsing?
-* Test setters
-  * Test trim C0/space
-  * Test remove tab & newline
-
-
-
-#[test]
-fn test_path_segments() {
-    let mut url = Url::parse("http://example.net").unwrap();
-    url.push_path_segment("foo").unwrap();
-    url.extend_path_segments(&["bar", "b/az"]).unwrap();
-    assert_eq!(url.as_str(), "http://example.net/foo");
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/encoding.rs
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2013-2014 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-
-//! Abstraction that conditionally compiles either to rust-encoding,
-//! or to only support UTF-8.
-
-#[cfg(feature = "query_encoding")] extern crate encoding;
-
-use std::borrow::Cow;
-#[cfg(feature = "query_encoding")] use std::fmt::{self, Debug, Formatter};
-
-#[cfg(feature = "query_encoding")] use self::encoding::types::{DecoderTrap, EncoderTrap};
-#[cfg(feature = "query_encoding")] use self::encoding::label::encoding_from_whatwg_label;
-#[cfg(feature = "query_encoding")] pub use self::encoding::types::EncodingRef;
-
-#[cfg(feature = "query_encoding")]
-#[derive(Copy, Clone)]
-pub struct EncodingOverride {
-    /// `None` means UTF-8.
-    encoding: Option<EncodingRef>
-}
-
-#[cfg(feature = "query_encoding")]
-impl EncodingOverride {
-    pub fn from_opt_encoding(encoding: Option<EncodingRef>) -> Self {
-        encoding.map(Self::from_encoding).unwrap_or_else(Self::utf8)
-    }
-
-    pub fn from_encoding(encoding: EncodingRef) -> Self {
-        EncodingOverride {
-            encoding: if encoding.name() == "utf-8" { None } else { Some(encoding) }
-        }
-    }
-
-    #[inline]
-    pub fn utf8() -> Self {
-        EncodingOverride { encoding: None }
-    }
-
-    pub fn lookup(label: &[u8]) -> Option<Self> {
-        // Don't use String::from_utf8_lossy since no encoding label contains U+FFFD
-        // https://encoding.spec.whatwg.org/#names-and-labels
-        ::std::str::from_utf8(label)
-        .ok()
-        .and_then(encoding_from_whatwg_label)
-        .map(Self::from_encoding)
-    }
-
-    /// https://encoding.spec.whatwg.org/#get-an-output-encoding
-    pub fn to_output_encoding(self) -> Self {
-        if let Some(encoding) = self.encoding {
-            if matches!(encoding.name(), "utf-16le" | "utf-16be") {
-                return Self::utf8()
-            }
-        }
-        self
-    }
-
-    pub fn is_utf8(&self) -> bool {
-        self.encoding.is_none()
-    }
-
-    pub fn name(&self) -> &'static str {
-        match self.encoding {
-            Some(encoding) => encoding.name(),
-            None => "utf-8",
-        }
-    }
-
-    pub fn decode<'a>(&self, input: Cow<'a, [u8]>) -> Cow<'a, str> {
-        match self.encoding {
-            // `encoding.decode` never returns `Err` when called with `DecoderTrap::Replace`
-            Some(encoding) => encoding.decode(&input, DecoderTrap::Replace).unwrap().into(),
-            None => decode_utf8_lossy(input),
-        }
-    }
-
-    pub fn encode<'a>(&self, input: Cow<'a, str>) -> Cow<'a, [u8]> {
-        match self.encoding {
-            // `encoding.encode` never returns `Err` when called with `EncoderTrap::NcrEscape`
-            Some(encoding) => Cow::Owned(encoding.encode(&input, EncoderTrap::NcrEscape).unwrap()),
-            None => encode_utf8(input)
-        }
-    }
-}
-
-#[cfg(feature = "query_encoding")]
-impl Debug for EncodingOverride {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        write!(f, "EncodingOverride {{ encoding: ")?;
-        match self.encoding {
-            Some(e) => write!(f, "{} }}", e.name()),
-            None => write!(f, "None }}")
-        }
-    }
-}
-
-#[cfg(not(feature = "query_encoding"))]
-#[derive(Copy, Clone, Debug)]
-pub struct EncodingOverride;
-
-#[cfg(not(feature = "query_encoding"))]
-impl EncodingOverride {
-    #[inline]
-    pub fn utf8() -> Self {
-        EncodingOverride
-    }
-
-    pub fn decode<'a>(&self, input: Cow<'a, [u8]>) -> Cow<'a, str> {
-        decode_utf8_lossy(input)
-    }
-
-    pub fn encode<'a>(&self, input: Cow<'a, str>) -> Cow<'a, [u8]> {
-        encode_utf8(input)
-    }
-}
-
-pub fn decode_utf8_lossy(input: Cow<[u8]>) -> Cow<str> {
-    match input {
-        Cow::Borrowed(bytes) => String::from_utf8_lossy(bytes),
-        Cow::Owned(bytes) => {
-            let raw_utf8: *const [u8];
-            match String::from_utf8_lossy(&bytes) {
-                Cow::Borrowed(utf8) => raw_utf8 = utf8.as_bytes(),
-                Cow::Owned(s) => return s.into(),
-            }
-            // from_utf8_lossy returned a borrow of `bytes` unchanged.
-            debug_assert!(raw_utf8 == &*bytes as *const [u8]);
-            // Reuse the existing `Vec` allocation.
-            unsafe { String::from_utf8_unchecked(bytes) }.into()
-        }
-    }
-}
-
-pub fn encode_utf8(input: Cow<str>) -> Cow<[u8]> {
-    match input {
-        Cow::Borrowed(s) => Cow::Borrowed(s.as_bytes()),
-        Cow::Owned(s) => Cow::Owned(s.into_bytes())
-    }
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/form_urlencoded.rs
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2013-2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Parser and serializer for the [`application/x-www-form-urlencoded` syntax](
-//! http://url.spec.whatwg.org/#application/x-www-form-urlencoded),
-//! as used by HTML forms.
-//!
-//! Converts between a string (such as an URL’s query string)
-//! and a sequence of (name, value) pairs.
-
-use encoding::EncodingOverride;
-use percent_encoding::{percent_encode_byte, percent_decode};
-use std::borrow::{Borrow, Cow};
-use std::str;
-
-
-/// Convert a byte string in the `application/x-www-form-urlencoded` syntax
-/// into a iterator of (name, value) pairs.
-///
-/// Use `parse(input.as_bytes())` to parse a `&str` string.
-///
-/// The names and values are percent-decoded. For instance, `%23first=%25try%25` will be
-/// converted to `[("#first", "%try%")]`.
-#[inline]
-pub fn parse(input: &[u8]) -> Parse {
-    Parse {
-        input: input,
-        encoding: EncodingOverride::utf8(),
-    }
-}
-
-
-/// Convert a byte string in the `application/x-www-form-urlencoded` syntax
-/// into a iterator of (name, value) pairs.
-///
-/// Use `parse(input.as_bytes())` to parse a `&str` string.
-///
-/// This function is only available if the `query_encoding`
-/// [feature](http://doc.crates.io/manifest.html#the-features-section]) is enabled.
-///
-/// Arguments:
-///
-/// * `encoding_override`: The character encoding each name and values is decoded as
-///    after percent-decoding. Defaults to UTF-8.
-///    `EncodingRef` is defined in [rust-encoding](https://github.com/lifthrasiir/rust-encoding).
-/// * `use_charset`: The *use _charset_ flag*. If in doubt, set to `false`.
-#[cfg(feature = "query_encoding")]
-pub fn parse_with_encoding<'a>(input: &'a [u8],
-                               encoding_override: Option<::encoding::EncodingRef>,
-                               use_charset: bool)
-                               -> Result<Parse<'a>, ()> {
-    use std::ascii::AsciiExt;
-
-    let mut encoding = EncodingOverride::from_opt_encoding(encoding_override);
-    if !(encoding.is_utf8() || input.is_ascii()) {
-        return Err(())
-    }
-    if use_charset {
-        for sequence in input.split(|&b| b == b'&') {
-            // No '+' in "_charset_" to replace with ' '.
-            if sequence.starts_with(b"_charset_=") {
-                let value = &sequence[b"_charset_=".len()..];
-                // Skip replacing '+' with ' ' in value since no encoding label contains either:
-                // https://encoding.spec.whatwg.org/#names-and-labels
-                if let Some(e) = EncodingOverride::lookup(value) {
-                    encoding = e;
-                    break
-                }
-            }
-        }
-    }
-    Ok(Parse {
-        input: input,
-        encoding: encoding,
-    })
-}
-
-/// The return type of `parse()`.
-#[derive(Copy, Clone, Debug)]
-pub struct Parse<'a> {
-    input: &'a [u8],
-    encoding: EncodingOverride,
-}
-
-impl<'a> Iterator for Parse<'a> {
-    type Item = (Cow<'a, str>, Cow<'a, str>);
-
-    fn next(&mut self) -> Option<Self::Item> {
-        loop {
-            if self.input.is_empty() {
-                return None
-            }
-            let mut split2 = self.input.splitn(2, |&b| b == b'&');
-            let sequence = split2.next().unwrap();
-            self.input = split2.next().unwrap_or(&[][..]);
-            if sequence.is_empty() {
-                continue
-            }
-            let mut split2 = sequence.splitn(2, |&b| b == b'=');
-            let name = split2.next().unwrap();
-            let value = split2.next().unwrap_or(&[][..]);
-            return Some((
-                decode(name, self.encoding),
-                decode(value, self.encoding),
-            ))
-        }
-    }
-}
-
-fn decode(input: &[u8], encoding: EncodingOverride) -> Cow<str> {
-    let replaced = replace_plus(input);
-    encoding.decode(match percent_decode(&replaced).if_any() {
-        Some(vec) => Cow::Owned(vec),
-        None => replaced,
-    })
-}
-
-/// Replace b'+' with b' '
-fn replace_plus(input: &[u8]) -> Cow<[u8]> {
-    match input.iter().position(|&b| b == b'+') {
-        None => Cow::Borrowed(input),
-        Some(first_position) => {
-            let mut replaced = input.to_owned();
-            replaced[first_position] = b' ';
-            for byte in &mut replaced[first_position + 1..] {
-                if *byte == b'+' {
-                    *byte = b' ';
-                }
-            }
-            Cow::Owned(replaced)
-        }
-    }
-}
-
-impl<'a> Parse<'a> {
-    /// Return a new iterator that yields pairs of `String` instead of pairs of `Cow<str>`.
-    pub fn into_owned(self) -> ParseIntoOwned<'a> {
-        ParseIntoOwned { inner: self }
-    }
-}
-
-/// Like `Parse`, but yields pairs of `String` instead of pairs of `Cow<str>`.
-#[derive(Debug)]
-pub struct ParseIntoOwned<'a> {
-    inner: Parse<'a>
-}
-
-impl<'a> Iterator for ParseIntoOwned<'a> {
-    type Item = (String, String);
-
-    fn next(&mut self) -> Option<Self::Item> {
-        self.inner.next().map(|(k, v)| (k.into_owned(), v.into_owned()))
-    }
-}
-
-/// The [`application/x-www-form-urlencoded` byte serializer](
-/// https://url.spec.whatwg.org/#concept-urlencoded-byte-serializer).
-///
-/// Return an iterator of `&str` slices.
-pub fn byte_serialize(input: &[u8]) -> ByteSerialize {
-    ByteSerialize {
-        bytes: input,
-    }
-}
-
-/// Return value of `byte_serialize()`.
-#[derive(Debug)]
-pub struct ByteSerialize<'a> {
-    bytes: &'a [u8],
-}
-
-fn byte_serialized_unchanged(byte: u8) -> bool {
-    matches!(byte, b'*' | b'-' | b'.' | b'0' ... b'9' | b'A' ... b'Z' | b'_' | b'a' ... b'z')
-}
-
-impl<'a> Iterator for ByteSerialize<'a> {
-    type Item = &'a str;
-
-    fn next(&mut self) -> Option<&'a str> {
-        if let Some((&first, tail)) = self.bytes.split_first() {
-            if !byte_serialized_unchanged(first) {
-                self.bytes = tail;
-                return Some(if first == b' ' { "+" } else { percent_encode_byte(first) })
-            }
-            let position = tail.iter().position(|&b| !byte_serialized_unchanged(b));
-            let (unchanged_slice, remaining) = match position {
-                // 1 for first_byte + i unchanged in tail
-                Some(i) => self.bytes.split_at(1 + i),
-                None => (self.bytes, &[][..]),
-            };
-            self.bytes = remaining;
-            Some(unsafe { str::from_utf8_unchecked(unchanged_slice) })
-        } else {
-            None
-        }
-    }
-
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        if self.bytes.is_empty() {
-            (0, Some(0))
-        } else {
-            (1, Some(self.bytes.len()))
-        }
-    }
-}
-
-/// The [`application/x-www-form-urlencoded` serializer](
-/// https://url.spec.whatwg.org/#concept-urlencoded-serializer).
-#[derive(Debug)]
-pub struct Serializer<T: Target> {
-    target: Option<T>,
-    start_position: usize,
-    encoding: EncodingOverride,
-}
-
-pub trait Target {
-    fn as_mut_string(&mut self) -> &mut String;
-    fn finish(self) -> Self::Finished;
-    type Finished;
-}
-
-impl Target for String {
-    fn as_mut_string(&mut self) -> &mut String { self }
-    fn finish(self) -> Self { self }
-    type Finished = Self;
-}
-
-impl<'a> Target for &'a mut String {
-    fn as_mut_string(&mut self) -> &mut String { &mut **self }
-    fn finish(self) -> Self { self }
-    type Finished = Self;
-}
-
-// `as_mut_string` string here exposes the internal serialization of an `Url`,
-// which should not be exposed to users.
-// We achieve that by not giving users direct access to `UrlQuery`:
-// * Its fields are private
-//   (and so can not be constructed with struct literal syntax outside of this crate),
-// * It has no constructor
-// * It is only visible (on the type level) to users in the return type of
-//   `Url::query_pairs_mut` which is `Serializer<UrlQuery>`
-// * `Serializer` keeps its target in a private field
-// * Unlike in other `Target` impls, `UrlQuery::finished` does not return `Self`.
-impl<'a> Target for ::UrlQuery<'a> {
-    fn as_mut_string(&mut self) -> &mut String { &mut self.url.serialization }
-    fn finish(self) -> &'a mut ::Url { self.url }
-    type Finished = &'a mut ::Url;
-}
-
-impl<T: Target> Serializer<T> {
-    /// Create a new `application/x-www-form-urlencoded` serializer for the given target.
-    ///
-    /// If the target is non-empty,
-    /// its content is assumed to already be in `application/x-www-form-urlencoded` syntax.
-    pub fn new(target: T) -> Self {
-        Self::for_suffix(target, 0)
-    }
-
-    /// Create a new `application/x-www-form-urlencoded` serializer
-    /// for a suffix of the given target.
-    ///
-    /// If that suffix is non-empty,
-    /// its content is assumed to already be in `application/x-www-form-urlencoded` syntax.
-    pub fn for_suffix(mut target: T, start_position: usize) -> Self {
-        &target.as_mut_string()[start_position..];  // Panic if out of bounds
-        Serializer {
-            target: Some(target),
-            start_position: start_position,
-            encoding: EncodingOverride::utf8(),
-        }
-    }
-
-    /// Remove any existing name/value pair.
-    ///
-    /// Panics if called after `.finish()`.
-    pub fn clear(&mut self) -> &mut Self {
-        string(&mut self.target).truncate(self.start_position);
-        self
-    }
-
-    /// Set the character encoding to be used for names and values before percent-encoding.
-    #[cfg(feature = "query_encoding")]
-    pub fn encoding_override(&mut self, new: Option<::encoding::EncodingRef>) -> &mut Self {
-        self.encoding = EncodingOverride::from_opt_encoding(new).to_output_encoding();
-        self
-    }
-
-    /// Serialize and append a name/value pair.
-    ///
-    /// Panics if called after `.finish()`.
-    pub fn append_pair(&mut self, name: &str, value: &str) -> &mut Self {
-        append_pair(string(&mut self.target), self.start_position, self.encoding, name, value);
-        self
-    }
-
-    /// Serialize and append a number of name/value pairs.
-    ///
-    /// This simply calls `append_pair` repeatedly.
-    /// This can be more convenient, so the user doesn’t need to introduce a block
-    /// to limit the scope of `Serializer`’s borrow of its string.
-    ///
-    /// Panics if called after `.finish()`.
-    pub fn extend_pairs<I, K, V>(&mut self, iter: I) -> &mut Self
-    where I: IntoIterator, I::Item: Borrow<(K, V)>, K: AsRef<str>, V: AsRef<str> {
-        {
-            let string = string(&mut self.target);
-            for pair in iter {
-                let &(ref k, ref v) = pair.borrow();
-                append_pair(string, self.start_position, self.encoding, k.as_ref(), v.as_ref());
-            }
-        }
-        self
-    }
-
-    /// Add a name/value pair whose name is `_charset_`
-    /// and whose value is the character encoding’s name.
-    /// (See the `encoding_override()` method.)
-    ///
-    /// Panics if called after `.finish()`.
-    #[cfg(feature = "query_encoding")]
-    pub fn append_charset(&mut self) -> &mut Self {
-        {
-            let string = string(&mut self.target);
-            append_separator_if_needed(string, self.start_position);
-            string.push_str("_charset_=");
-            string.push_str(self.encoding.name());
-        }
-        self
-    }
-
-    /// If this serializer was constructed with a string, take and return that string.
-    ///
-    /// ```rust
-    /// use url::form_urlencoded;
-    /// let encoded: String = form_urlencoded::Serializer::new(String::new())
-    ///     .append_pair("foo", "bar & baz")
-    ///     .append_pair("saison", "Été+hiver")
-    ///     .finish();
-    /// assert_eq!(encoded, "foo=bar+%26+baz&saison=%C3%89t%C3%A9%2Bhiver");
-    /// ```
-    ///
-    /// Panics if called more than once.
-    pub fn finish(&mut self) -> T::Finished {
-        self.target.take().expect("url::form_urlencoded::Serializer double finish").finish()
-    }
-}
-
-fn append_separator_if_needed(string: &mut String, start_position: usize) {
-    if string.len() > start_position {
-        string.push('&')
-    }
-}
-
-fn string<T: Target>(target: &mut Option<T>) -> &mut String {
-    target.as_mut().expect("url::form_urlencoded::Serializer finished").as_mut_string()
-}
-
-fn append_pair(string: &mut String, start_position: usize, encoding: EncodingOverride,
-               name: &str, value: &str) {
-    append_separator_if_needed(string, start_position);
-    string.extend(byte_serialize(&encoding.encode(name.into())));
-    string.push('=');
-    string.extend(byte_serialize(&encoding.encode(value.into())));
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/host.rs
+++ /dev/null
@@ -1,502 +0,0 @@
-// Copyright 2013-2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#[cfg(feature = "heapsize")] use heapsize::HeapSizeOf;
-use std::cmp;
-use std::fmt::{self, Formatter};
-use std::io;
-use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs};
-use std::vec;
-use parser::{ParseResult, ParseError};
-use percent_encoding::percent_decode;
-use idna;
-
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-pub enum HostInternal {
-    None,
-    Domain,
-    Ipv4(Ipv4Addr),
-    Ipv6(Ipv6Addr),
-}
-
-#[cfg(feature = "heapsize")]
-known_heap_size!(0, HostInternal);
-
-#[cfg(feature="serde")]
-impl ::serde::Serialize for HostInternal {
-    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: ::serde::Serializer {
-        // This doesn’t use `derive` because that involves
-        // large dependencies (that take a long time to build), and
-        // either Macros 1.1 which are not stable yet or a cumbersome build script.
-        //
-        // Implementing `Serializer` correctly for an enum is tricky,
-        // so let’s use existing enums that already do.
-        use std::net::IpAddr;
-        match *self {
-            HostInternal::None => None,
-            HostInternal::Domain => Some(None),
-            HostInternal::Ipv4(addr) => Some(Some(IpAddr::V4(addr))),
-            HostInternal::Ipv6(addr) => Some(Some(IpAddr::V6(addr))),
-        }.serialize(serializer)
-    }
-}
-
-#[cfg(feature="serde")]
-impl ::serde::Deserialize for HostInternal {
-    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: ::serde::Deserializer {
-        use std::net::IpAddr;
-        Ok(match ::serde::Deserialize::deserialize(deserializer)? {
-            None => HostInternal::None,
-            Some(None) => HostInternal::Domain,
-            Some(Some(IpAddr::V4(addr))) => HostInternal::Ipv4(addr),
-            Some(Some(IpAddr::V6(addr))) => HostInternal::Ipv6(addr),
-        })
-    }
-}
-
-impl<S> From<Host<S>> for HostInternal {
-    fn from(host: Host<S>) -> HostInternal {
-        match host {
-            Host::Domain(_) => HostInternal::Domain,
-            Host::Ipv4(address) => HostInternal::Ipv4(address),
-            Host::Ipv6(address) => HostInternal::Ipv6(address),
-        }
-    }
-}
-
-/// The host name of an URL.
-#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
-pub enum Host<S=String> {
-    /// A DNS domain name, as '.' dot-separated labels.
-    /// Non-ASCII labels are encoded in punycode per IDNA.
-    Domain(S),
-
-    /// An IPv4 address.
-    /// `Url::host_str` returns the serialization of this address,
-    /// as four decimal integers separated by `.` dots.
-    Ipv4(Ipv4Addr),
-
-    /// An IPv6 address.
-    /// `Url::host_str` returns the serialization of that address between `[` and `]` brackets,
-    /// in the format per [RFC 5952 *A Recommendation
-    /// for IPv6 Address Text Representation*](https://tools.ietf.org/html/rfc5952):
-    /// lowercase hexadecimal with maximal `::` compression.
-    Ipv6(Ipv6Addr),
-}
-
-#[cfg(feature="serde")]
-impl<S: ::serde::Serialize>  ::serde::Serialize for Host<S> {
-    fn serialize<R>(&self, serializer: &mut R) -> Result<(), R::Error> where R: ::serde::Serializer {
-        use std::net::IpAddr;
-        match *self {
-            Host::Domain(ref s) => Ok(s),
-            Host::Ipv4(addr) => Err(IpAddr::V4(addr)),
-            Host::Ipv6(addr) => Err(IpAddr::V6(addr)),
-        }.serialize(serializer)
-    }
-}
-
-#[cfg(feature="serde")]
-impl<S: ::serde::Deserialize> ::serde::Deserialize for Host<S> {
-    fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: ::serde::Deserializer {
-        use std::net::IpAddr;
-        Ok(match ::serde::Deserialize::deserialize(deserializer)? {
-            Ok(s) => Host::Domain(s),
-            Err(IpAddr::V4(addr)) => Host::Ipv4(addr),
-            Err(IpAddr::V6(addr)) => Host::Ipv6(addr),
-        })
-    }
-}
-
-#[cfg(feature = "heapsize")]
-impl<S: HeapSizeOf> HeapSizeOf for Host<S> {
-    fn heap_size_of_children(&self) -> usize {
-        match *self {
-            Host::Domain(ref s) => s.heap_size_of_children(),
-            _ => 0,
-        }
-    }
-}
-
-impl<'a> Host<&'a str> {
-    /// Return a copy of `self` that owns an allocated `String` but does not borrow an `&Url`.
-    pub fn to_owned(&self) -> Host<String> {
-        match *self {
-            Host::Domain(domain) => Host::Domain(domain.to_owned()),
-            Host::Ipv4(address) => Host::Ipv4(address),
-            Host::Ipv6(address) => Host::Ipv6(address),
-        }
-    }
-}
-
-impl Host<String> {
-    /// Parse a host: either an IPv6 address in [] square brackets, or a domain.
-    ///
-    /// https://url.spec.whatwg.org/#host-parsing
-    pub fn parse(input: &str) -> Result<Self, ParseError> {
-        if input.starts_with('[') {
-            if !input.ends_with(']') {
-                return Err(ParseError::InvalidIpv6Address)
-            }
-            return parse_ipv6addr(&input[1..input.len() - 1]).map(Host::Ipv6)
-        }
-        let domain = percent_decode(input.as_bytes()).decode_utf8_lossy();
-        let domain = idna::domain_to_ascii(&domain)?;
-        if domain.find(|c| matches!(c,
-            '\0' | '\t' | '\n' | '\r' | ' ' | '#' | '%' | '/' | ':' | '?' | '@' | '[' | '\\' | ']'
-        )).is_some() {
-            return Err(ParseError::InvalidDomainCharacter)
-        }
-        if let Some(address) = parse_ipv4addr(&domain)? {
-            Ok(Host::Ipv4(address))
-        } else {
-            Ok(Host::Domain(domain.into()))
-        }
-    }
-}
-
-impl<S: AsRef<str>> fmt::Display for Host<S> {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match *self {
-            Host::Domain(ref domain) => domain.as_ref().fmt(f),
-            Host::Ipv4(ref addr) => addr.fmt(f),
-            Host::Ipv6(ref addr) => {
-                f.write_str("[")?;
-                write_ipv6(addr, f)?;
-                f.write_str("]")
-            }
-        }
-    }
-}
-
-/// This mostly exists because coherence rules don’t allow us to implement
-/// `ToSocketAddrs for (Host<S>, u16)`.
-#[derive(Clone, Debug)]
-pub struct HostAndPort<S=String> {
-    pub host: Host<S>,
-    pub port: u16,
-}
-
-impl<'a> HostAndPort<&'a str> {
-    /// Return a copy of `self` that owns an allocated `String` but does not borrow an `&Url`.
-    pub fn to_owned(&self) -> HostAndPort<String> {
-        HostAndPort {
-            host: self.host.to_owned(),
-            port: self.port
-        }
-    }
-}
-
-impl<S: AsRef<str>> fmt::Display for HostAndPort<S> {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        self.host.fmt(f)?;
-        f.write_str(":")?;
-        self.port.fmt(f)
-    }
-}
-
-
-impl<S: AsRef<str>> ToSocketAddrs for HostAndPort<S> {
-    type Iter = SocketAddrs;
-
-    fn to_socket_addrs(&self) -> io::Result<Self::Iter> {
-        let port = self.port;
-        match self.host {
-            Host::Domain(ref domain) => Ok(SocketAddrs {
-                // FIXME: use std::net::lookup_host when it’s stable.
-                state: SocketAddrsState::Domain((domain.as_ref(), port).to_socket_addrs()?)
-            }),
-            Host::Ipv4(address) => Ok(SocketAddrs {
-                state: SocketAddrsState::One(SocketAddr::V4(SocketAddrV4::new(address, port)))
-            }),
-            Host::Ipv6(address) => Ok(SocketAddrs {
-                state: SocketAddrsState::One(SocketAddr::V6(SocketAddrV6::new(address, port, 0, 0)))
-            }),
-        }
-    }
-}
-
-/// Socket addresses for an URL.
-#[derive(Debug)]
-pub struct SocketAddrs {
-    state: SocketAddrsState
-}
-
-#[derive(Debug)]
-enum SocketAddrsState {
-    Domain(vec::IntoIter<SocketAddr>),
-    One(SocketAddr),
-    Done,
-}
-
-impl Iterator for SocketAddrs {
-    type Item = SocketAddr;
-    fn next(&mut self) -> Option<SocketAddr> {
-        match self.state {
-            SocketAddrsState::Domain(ref mut iter) => iter.next(),
-            SocketAddrsState::One(s) => {
-                self.state = SocketAddrsState::Done;
-                Some(s)
-            }
-            SocketAddrsState::Done => None
-        }
-    }
-}
-
-fn write_ipv6(addr: &Ipv6Addr, f: &mut Formatter) -> fmt::Result {
-    let segments = addr.segments();
-    let (compress_start, compress_end) = longest_zero_sequence(&segments);
-    let mut i = 0;
-    while i < 8 {
-        if i == compress_start {
-            f.write_str(":")?;
-            if i == 0 {
-                f.write_str(":")?;
-            }
-            if compress_end < 8 {
-                i = compress_end;
-            } else {
-                break;
-            }
-        }
-        write!(f, "{:x}", segments[i as usize])?;
-        if i < 7 {
-            f.write_str(":")?;
-        }
-        i += 1;
-    }
-    Ok(())
-}
-
-// https://url.spec.whatwg.org/#concept-ipv6-serializer step 2 and 3
-fn longest_zero_sequence(pieces: &[u16; 8]) -> (isize, isize) {
-    let mut longest = -1;
-    let mut longest_length = -1;
-    let mut start = -1;
-    macro_rules! finish_sequence(
-        ($end: expr) => {
-            if start >= 0 {
-                let length = $end - start;
-                if length > longest_length {
-                    longest = start;
-                    longest_length = length;
-                }
-            }
-        };
-    );
-    for i in 0..8 {
-        if pieces[i as usize] == 0 {
-            if start < 0 {
-                start = i;
-            }
-        } else {
-            finish_sequence!(i);
-            start = -1;
-        }
-    }
-    finish_sequence!(8);
-    // https://url.spec.whatwg.org/#concept-ipv6-serializer
-    // step 3: ignore lone zeroes
-    if longest_length < 2 {
-        (-1, -2)
-    } else {
-        (longest, longest + longest_length)
-    }
-}
-
-/// https://url.spec.whatwg.org/#ipv4-number-parser
-fn parse_ipv4number(mut input: &str) -> Result<u32, ()> {
-    let mut r = 10;
-    if input.starts_with("0x") || input.starts_with("0X") {
-        input = &input[2..];
-        r = 16;
-    } else if input.len() >= 2 && input.starts_with('0') {
-        input = &input[1..];
-        r = 8;
-    }
-    if input.is_empty() {
-        return Ok(0);
-    }
-    if input.starts_with('+') {
-        return Err(())
-    }
-    match u32::from_str_radix(input, r) {
-        Ok(number) => Ok(number),
-        Err(_) => Err(()),
-    }
-}
-
-/// https://url.spec.whatwg.org/#concept-ipv4-parser
-fn parse_ipv4addr(input: &str) -> ParseResult<Option<Ipv4Addr>> {
-    if input.is_empty() {
-        return Ok(None)
-    }
-    let mut parts: Vec<&str> = input.split('.').collect();
-    if parts.last() == Some(&"") {
-        parts.pop();
-    }
-    if parts.len() > 4 {
-        return Ok(None);
-    }
-    let mut numbers: Vec<u32> = Vec::new();
-    for part in parts {
-        if part == "" {
-            return Ok(None);
-        }
-        if let Ok(n) = parse_ipv4number(part) {
-            numbers.push(n);
-        } else {
-            return Ok(None);
-        }
-    }
-    let mut ipv4 = numbers.pop().expect("a non-empty list of numbers");
-    // Equivalent to: ipv4 >= 256 ** (4 − numbers.len())
-    if ipv4 > u32::max_value() >> (8 * numbers.len() as u32)  {
-        return Err(ParseError::InvalidIpv4Address);
-    }
-    if numbers.iter().any(|x| *x > 255) {
-        return Err(ParseError::InvalidIpv4Address);
-    }
-    for (counter, n) in numbers.iter().enumerate() {
-        ipv4 += n << (8 * (3 - counter as u32))
-    }
-    Ok(Some(Ipv4Addr::from(ipv4)))
-}
-
-/// https://url.spec.whatwg.org/#concept-ipv6-parser
-fn parse_ipv6addr(input: &str) -> ParseResult<Ipv6Addr> {
-    let input = input.as_bytes();
-    let len = input.len();
-    let mut is_ip_v4 = false;
-    let mut pieces = [0, 0, 0, 0, 0, 0, 0, 0];
-    let mut piece_pointer = 0;
-    let mut compress_pointer = None;
-    let mut i = 0;
-
-    if len < 2 {
-        return Err(ParseError::InvalidIpv6Address)
-    }
-
-    if input[0] == b':' {
-        if input[1] != b':' {
-            return Err(ParseError::InvalidIpv6Address)
-        }
-        i = 2;
-        piece_pointer = 1;
-        compress_pointer = Some(1);
-    }
-
-    while i < len {
-        if piece_pointer == 8 {
-            return Err(ParseError::InvalidIpv6Address)
-        }
-        if input[i] == b':' {
-            if compress_pointer.is_some() {
-                return Err(ParseError::InvalidIpv6Address)
-            }
-            i += 1;
-            piece_pointer += 1;
-            compress_pointer = Some(piece_pointer);
-            continue
-        }
-        let start = i;
-        let end = cmp::min(len, start + 4);
-        let mut value = 0u16;
-        while i < end {
-            match (input[i] as char).to_digit(16) {
-                Some(digit) => {
-                    value = value * 0x10 + digit as u16;
-                    i += 1;
-                },
-                None => break
-            }
-        }
-        if i < len {
-            match input[i] {
-                b'.' => {
-                    if i == start {
-                        return Err(ParseError::InvalidIpv6Address)
-                    }
-                    i = start;
-                    is_ip_v4 = true;
-                },
-                b':' => {
-                    i += 1;
-                    if i == len {
-                        return Err(ParseError::InvalidIpv6Address)
-                    }
-                },
-                _ => return Err(ParseError::InvalidIpv6Address)
-            }
-        }
-        if is_ip_v4 {
-            break
-        }
-        pieces[piece_pointer] = value;
-        piece_pointer += 1;
-    }
-
-    if is_ip_v4 {
-        if piece_pointer > 6 {
-            return Err(ParseError::InvalidIpv6Address)
-        }
-        let mut dots_seen = 0;
-        while i < len {
-            let mut value = None;
-            while i < len {
-                let digit = match input[i] {
-                    c @ b'0' ... b'9' => c - b'0',
-                    _ => break
-                };
-                match value {
-                    None => value = Some(digit as u16),
-                    Some(0) => return Err(ParseError::InvalidIpv6Address),  // No leading zero
-                    Some(ref mut v) => {
-                        *v = *v * 10 + digit as u16;
-                        if *v > 255 {
-                            return Err(ParseError::InvalidIpv6Address)
-                        }
-                    }
-                }
-                i += 1;
-            }
-            if dots_seen < 3 && !(i < len && input[i] == b'.') {
-                return Err(ParseError::InvalidIpv6Address)
-            }
-            pieces[piece_pointer] = if let Some(v) = value {
-                pieces[piece_pointer] * 0x100 + v
-            } else {
-                return Err(ParseError::InvalidIpv6Address)
-            };
-            if dots_seen == 1 || dots_seen == 3 {
-                piece_pointer += 1;
-            }
-            i += 1;
-            if dots_seen == 3 && i < len {
-                return Err(ParseError::InvalidIpv6Address)
-            }
-            dots_seen += 1;
-        }
-    }
-    match compress_pointer {
-        Some(compress_pointer) => {
-            let mut swaps = piece_pointer - compress_pointer;
-            piece_pointer = 7;
-            while swaps > 0 {
-                pieces.swap(piece_pointer, compress_pointer + swaps - 1);
-                swaps -= 1;
-                piece_pointer -= 1;
-            }
-        }
-        _ => if piece_pointer != 8 {
-            return Err(ParseError::InvalidIpv6Address)
-        }
-    }
-    Ok(Ipv6Addr::new(pieces[0], pieces[1], pieces[2], pieces[3],
-                     pieces[4], pieces[5], pieces[6], pieces[7]))
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/lib.rs
+++ /dev/null
@@ -1,2403 +0,0 @@
-// Copyright 2013-2015 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-/*!
-
-rust-url is an implementation of the [URL Standard](http://url.spec.whatwg.org/)
-for the [Rust](http://rust-lang.org/) programming language.
-
-
-# URL parsing and data structures
-
-First, URL parsing may fail for various reasons and therefore returns a `Result`.
-
-```
-use url::{Url, ParseError};
-
-assert!(Url::parse("http://[:::1]") == Err(ParseError::InvalidIpv6Address))
-```
-
-Let’s parse a valid URL and look at its components.
-
-```
-use url::{Url, Host};
-# use url::ParseError;
-# fn run() -> Result<(), ParseError> {
-let issue_list_url = Url::parse(
-    "https://github.com/rust-lang/rust/issues?labels=E-easy&state=open"
-)?;
-
-
-assert!(issue_list_url.scheme() == "https");
-assert!(issue_list_url.username() == "");
-assert!(issue_list_url.password() == None);
-assert!(issue_list_url.host_str() == Some("github.com"));
-assert!(issue_list_url.host() == Some(Host::Domain("github.com")));
-assert!(issue_list_url.port() == None);
-assert!(issue_list_url.path() == "/rust-lang/rust/issues");
-assert!(issue_list_url.path_segments().map(|c| c.collect::<Vec<_>>()) ==
-        Some(vec!["rust-lang", "rust", "issues"]));
-assert!(issue_list_url.query() == Some("labels=E-easy&state=open"));
-assert!(issue_list_url.fragment() == None);
-assert!(!issue_list_url.cannot_be_a_base());
-# Ok(())
-# }
-# run().unwrap();
-```
-
-Some URLs are said to be *cannot-be-a-base*:
-they don’t have a username, password, host, or port,
-and their "path" is an arbitrary string rather than slash-separated segments:
-
-```
-use url::Url;
-# use url::ParseError;
-
-# fn run() -> Result<(), ParseError> {
-let data_url = Url::parse("data:text/plain,Hello?World#")?;
-
-assert!(data_url.cannot_be_a_base());
-assert!(data_url.scheme() == "data");
-assert!(data_url.path() == "text/plain,Hello");
-assert!(data_url.path_segments().is_none());
-assert!(data_url.query() == Some("World"));
-assert!(data_url.fragment() == Some(""));
-# Ok(())
-# }
-# run().unwrap();
-```
-
-
-# Base URL
-
-Many contexts allow URL *references* that can be relative to a *base URL*:
-
-```html
-<link rel="stylesheet" href="../main.css">
-```
-
-Since parsed URL are absolute, giving a base is required for parsing relative URLs:
-
-```
-use url::{Url, ParseError};
-
-assert!(Url::parse("../main.css") == Err(ParseError::RelativeUrlWithoutBase))
-```
-
-Use the `join` method on an `Url` to use it as a base URL:
-
-```
-use url::Url;
-# use url::ParseError;
-
-# fn run() -> Result<(), ParseError> {
-let this_document = Url::parse("http://servo.github.io/rust-url/url/index.html")?;
-let css_url = this_document.join("../main.css")?;
-assert_eq!(css_url.as_str(), "http://servo.github.io/rust-url/main.css");
-# Ok(())
-# }
-# run().unwrap();
-*/
-
-#![doc(html_root_url = "https://docs.rs/url/1.5.1")]
-
-#[cfg(feature="rustc-serialize")] extern crate rustc_serialize;
-#[macro_use] extern crate matches;
-#[cfg(feature="serde")] extern crate serde;
-#[cfg(feature="heapsize")] #[macro_use] extern crate heapsize;
-
-pub extern crate idna;
-pub extern crate percent_encoding;
-
-use encoding::EncodingOverride;
-#[cfg(feature = "heapsize")] use heapsize::HeapSizeOf;
-use host::HostInternal;
-use parser::{Parser, Context, SchemeType, to_u32};
-use percent_encoding::{PATH_SEGMENT_ENCODE_SET, USERINFO_ENCODE_SET,
-                       percent_encode, percent_decode, utf8_percent_encode};
-use std::borrow::Borrow;
-use std::cmp;
-#[cfg(feature = "serde")] use std::error::Error;
-use std::fmt::{self, Write, Debug, Formatter};
-use std::hash;
-use std::io;
-use std::mem;
-use std::net::{ToSocketAddrs, IpAddr};
-use std::ops::{Range, RangeFrom, RangeTo};
-use std::path::{Path, PathBuf};
-use std::str;
-
-pub use origin::{Origin, OpaqueOrigin};
-pub use host::{Host, HostAndPort, SocketAddrs};
-pub use path_segments::PathSegmentsMut;
-pub use parser::ParseError;
-pub use slicing::Position;
-
-mod encoding;
-mod host;
-mod origin;
-mod path_segments;
-mod parser;
-mod slicing;
-
-pub mod form_urlencoded;
-#[doc(hidden)] pub mod quirks;
-
-/// A parsed URL record.
-#[derive(Clone)]
-pub struct Url {
-    /// Syntax in pseudo-BNF:
-    ///
-    ///   url = scheme ":" [ hierarchical | non-hierarchical ] [ "?" query ]? [ "#" fragment ]?
-    ///   non-hierarchical = non-hierarchical-path
-    ///   non-hierarchical-path = /* Does not start with "/" */
-    ///   hierarchical = authority? hierarchical-path
-    ///   authority = "//" userinfo? host [ ":" port ]?
-    ///   userinfo = username [ ":" password ]? "@"
-    ///   hierarchical-path = [ "/" path-segment ]+
-    serialization: String,
-
-    // Components
-    scheme_end: u32,  // Before ':'
-    username_end: u32,  // Before ':' (if a password is given) or '@' (if not)
-    host_start: u32,
-    host_end: u32,
-    host: HostInternal,
-    port: Option<u16>,
-    path_start: u32,  // Before initial '/', if any
-    query_start: Option<u32>,  // Before '?', unlike Position::QueryStart
-    fragment_start: Option<u32>,  // Before '#', unlike Position::FragmentStart
-}
-
-#[cfg(feature = "heapsize")]
-impl HeapSizeOf for Url {
-    fn heap_size_of_children(&self) -> usize {
-        self.serialization.heap_size_of_children()
-    }
-}
-
-/// Full configuration for the URL parser.
-#[derive(Copy, Clone)]
-pub struct ParseOptions<'a> {
-    base_url: Option<&'a Url>,
-    encoding_override: encoding::EncodingOverride,
-    log_syntax_violation: Option<&'a Fn(&'static str)>,
-}
-
-impl<'a> ParseOptions<'a> {
-    /// Change the base URL
-    pub fn base_url(mut self, new: Option<&'a Url>) -> Self {
-        self.base_url = new;
-        self
-    }
-
-    /// Override the character encoding of query strings.
-    /// This is a legacy concept only relevant for HTML.
-    ///
-    /// `EncodingRef` is defined in [rust-encoding](https://github.com/lifthrasiir/rust-encoding).
-    ///
-    /// This method is only available if the `query_encoding`
-    /// [feature](http://doc.crates.io/manifest.html#the-features-section]) is enabled.
-    #[cfg(feature = "query_encoding")]
-    pub fn encoding_override(mut self, new: Option<encoding::EncodingRef>) -> Self {
-        self.encoding_override = EncodingOverride::from_opt_encoding(new).to_output_encoding();
-        self
-    }
-
-    /// Call the provided function or closure on non-fatal parse errors.
-    pub fn log_syntax_violation(mut self, new: Option<&'a Fn(&'static str)>) -> Self {
-        self.log_syntax_violation = new;
-        self
-    }
-
-    /// Parse an URL string with the configuration so far.
-    pub fn parse(self, input: &str) -> Result<Url, ::ParseError> {
-        Parser {
-            serialization: String::with_capacity(input.len()),
-            base_url: self.base_url,
-            query_encoding_override: self.encoding_override,
-            log_syntax_violation: self.log_syntax_violation,
-            context: Context::UrlParser,
-        }.parse_url(input)
-    }
-}
-
-impl<'a> Debug for ParseOptions<'a> {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        write!(f, "ParseOptions {{ base_url: {:?}, encoding_override: {:?}, log_syntax_violation: ", self.base_url, self.encoding_override)?;
-        match self.log_syntax_violation {
-            Some(_) => write!(f, "Some(Fn(&'static str)) }}"),
-            None => write!(f, "None }}")
-        }
-    }
-}
-
-impl Url {
-    /// Parse an absolute URL from a string.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.net")?;
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn parse(input: &str) -> Result<Url, ::ParseError> {
-        Url::options().parse(input)
-    }
-
-    /// Parse an absolute URL from a string and add params to its query string.
-    ///
-    /// Existing params are not removed.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse_with_params("https://example.net?dont=clobberme",
-    ///                                  &[("lang", "rust"), ("browser", "servo")])?;
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn parse_with_params<I, K, V>(input: &str, iter: I) -> Result<Url, ::ParseError>
-        where I: IntoIterator,
-              I::Item: Borrow<(K, V)>,
-              K: AsRef<str>,
-              V: AsRef<str>
-    {
-        let mut url = Url::options().parse(input);
-
-        if let Ok(ref mut url) = url {
-            url.query_pairs_mut().extend_pairs(iter);
-        }
-
-        url
-    }
-
-    /// Parse a string as an URL, with this URL as the base URL.
-    ///
-    /// Note: a trailing slash is significant.
-    /// Without it, the last path component is considered to be a “file” name
-    /// to be removed to get at the “directory” that is used as the base:
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let base = Url::parse("https://example.net/a/b.html")?;
-    /// let url = base.join("c.png")?;
-    /// assert_eq!(url.as_str(), "https://example.net/a/c.png");  // Not /a/b.html/c.png
-    ///
-    /// let base = Url::parse("https://example.net/a/b/")?;
-    /// let url = base.join("c.png")?;
-    /// assert_eq!(url.as_str(), "https://example.net/a/b/c.png");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn join(&self, input: &str) -> Result<Url, ::ParseError> {
-        Url::options().base_url(Some(self)).parse(input)
-    }
-
-    /// Return a default `ParseOptions` that can fully configure the URL parser.
-    ///
-    /// # Examples
-    ///
-    /// Get default `ParseOptions`, then change base url
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// # fn run() -> Result<(), ParseError> {
-    /// let options = Url::options();
-    /// let api = Url::parse("https://api.example.com")?;
-    /// let base_url = options.base_url(Some(&api));
-    /// let version_url = base_url.parse("version.json")?;
-    /// assert_eq!(version_url.as_str(), "https://api.example.com/version.json");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn options<'a>() -> ParseOptions<'a> {
-        ParseOptions {
-            base_url: None,
-            encoding_override: EncodingOverride::utf8(),
-            log_syntax_violation: None,
-        }
-    }
-
-    /// Return the serialization of this URL.
-    ///
-    /// This is fast since that serialization is already stored in the `Url` struct.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url_str = "https://example.net/";
-    /// let url = Url::parse(url_str)?;
-    /// assert_eq!(url.as_str(), url_str);
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn as_str(&self) -> &str {
-        &self.serialization
-    }
-
-    /// Return the serialization of this URL.
-    ///
-    /// This consumes the `Url` and takes ownership of the `String` stored in it.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url_str = "https://example.net/";
-    /// let url = Url::parse(url_str)?;
-    /// assert_eq!(url.into_string(), url_str);
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn into_string(self) -> String {
-        self.serialization
-    }
-
-    /// For internal testing, not part of the public API.
-    ///
-    /// Methods of the `Url` struct assume a number of invariants.
-    /// This checks each of these invariants and panic if one is not met.
-    /// This is for testing rust-url itself.
-    #[doc(hidden)]
-    pub fn check_invariants(&self) -> Result<(), String> {
-        macro_rules! assert {
-            ($x: expr) => {
-                if !$x {
-                    return Err(format!("!( {} ) for URL {:?}",
-                                       stringify!($x), self.serialization))
-                }
-            }
-        }
-
-        macro_rules! assert_eq {
-            ($a: expr, $b: expr) => {
-                {
-                    let a = $a;
-                    let b = $b;
-                    if a != b {
-                        return Err(format!("{:?} != {:?} ({} != {}) for URL {:?}",
-                                           a, b, stringify!($a), stringify!($b),
-                                           self.serialization))
-                    }
-                }
-            }
-        }
-
-        assert!(self.scheme_end >= 1);
-        assert!(matches!(self.byte_at(0), b'a'...b'z' | b'A'...b'Z'));
-        assert!(self.slice(1..self.scheme_end).chars()
-                .all(|c| matches!(c, 'a'...'z' | 'A'...'Z' | '0'...'9' | '+' | '-' | '.')));
-        assert_eq!(self.byte_at(self.scheme_end), b':');
-
-        if self.slice(self.scheme_end + 1 ..).starts_with("//") {
-            // URL with authority
-            match self.byte_at(self.username_end) {
-                b':' => {
-                    assert!(self.host_start >= self.username_end + 2);
-                    assert_eq!(self.byte_at(self.host_start - 1), b'@');
-                }
-                b'@' => assert!(self.host_start == self.username_end + 1),
-                _ => assert_eq!(self.username_end, self.scheme_end + 3),
-            }
-            assert!(self.host_start >= self.username_end);
-            assert!(self.host_end >= self.host_start);
-            let host_str = self.slice(self.host_start..self.host_end);
-            match self.host {
-                HostInternal::None => assert_eq!(host_str, ""),
-                HostInternal::Ipv4(address) => assert_eq!(host_str, address.to_string()),
-                HostInternal::Ipv6(address) => {
-                    let h: Host<String> = Host::Ipv6(address);
-                    assert_eq!(host_str, h.to_string())
-                }
-                HostInternal::Domain => {
-                    if SchemeType::from(self.scheme()).is_special() {
-                        assert!(!host_str.is_empty())
-                    }
-                }
-            }
-            if self.path_start == self.host_end {
-                assert_eq!(self.port, None);
-            } else {
-                assert_eq!(self.byte_at(self.host_end), b':');
-                let port_str = self.slice(self.host_end + 1..self.path_start);
-                assert_eq!(self.port, Some(port_str.parse::<u16>().expect("Couldn't parse port?")));
-            }
-            assert_eq!(self.byte_at(self.path_start), b'/');
-        } else {
-            // Anarchist URL (no authority)
-            assert_eq!(self.username_end, self.scheme_end + 1);
-            assert_eq!(self.host_start, self.scheme_end + 1);
-            assert_eq!(self.host_end, self.scheme_end + 1);
-            assert_eq!(self.host, HostInternal::None);
-            assert_eq!(self.port, None);
-            assert_eq!(self.path_start, self.scheme_end + 1);
-        }
-        if let Some(start) = self.query_start {
-            assert!(start > self.path_start);
-            assert_eq!(self.byte_at(start), b'?');
-        }
-        if let Some(start) = self.fragment_start {
-            assert!(start > self.path_start);
-            assert_eq!(self.byte_at(start), b'#');
-        }
-        if let (Some(query_start), Some(fragment_start)) = (self.query_start, self.fragment_start) {
-            assert!(fragment_start > query_start);
-        }
-
-        let other = Url::parse(self.as_str()).expect("Failed to parse myself?");
-        assert_eq!(&self.serialization, &other.serialization);
-        assert_eq!(self.scheme_end, other.scheme_end);
-        assert_eq!(self.username_end, other.username_end);
-        assert_eq!(self.host_start, other.host_start);
-        assert_eq!(self.host_end, other.host_end);
-        assert!(self.host == other.host ||
-                // XXX No host round-trips to empty host.
-                // See https://github.com/whatwg/url/issues/79
-                (self.host_str(), other.host_str()) == (None, Some("")));
-        assert_eq!(self.port, other.port);
-        assert_eq!(self.path_start, other.path_start);
-        assert_eq!(self.query_start, other.query_start);
-        assert_eq!(self.fragment_start, other.fragment_start);
-        Ok(())
-    }
-
-    /// Return the origin of this URL (https://url.spec.whatwg.org/#origin)
-    ///
-    /// Note: this returns an opaque origin for `file:` URLs, which causes
-    /// `url.origin() != url.origin()`.
-    ///
-    /// # Examples
-    ///
-    /// URL with `ftp` scheme:
-    ///
-    /// ```rust
-    /// use url::{Host, Origin, Url};
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://example.com/foo")?;
-    /// assert_eq!(url.origin(),
-    ///            Origin::Tuple("ftp".into(),
-    ///                          Host::Domain("example.com".into()),
-    ///                          21));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// URL with `blob` scheme:
-    ///
-    /// ```rust
-    /// use url::{Host, Origin, Url};
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("blob:https://example.com/foo")?;
-    /// assert_eq!(url.origin(),
-    ///            Origin::Tuple("https".into(),
-    ///                          Host::Domain("example.com".into()),
-    ///                          443));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// URL with `file` scheme:
-    ///
-    /// ```rust
-    /// use url::{Host, Origin, Url};
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("file:///tmp/foo")?;
-    /// assert!(!url.origin().is_tuple());
-    ///
-    /// let other_url = Url::parse("file:///tmp/foo")?;
-    /// assert!(url.origin() != other_url.origin());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// URL with other scheme:
-    ///
-    /// ```rust
-    /// use url::{Host, Origin, Url};
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("foo:bar")?;
-    /// assert!(!url.origin().is_tuple());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn origin(&self) -> Origin {
-        origin::url_origin(self)
-    }
-
-    /// Return the scheme of this URL, lower-cased, as an ASCII string without the ':' delimiter.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("file:///tmp/foo")?;
-    /// assert_eq!(url.scheme(), "file");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn scheme(&self) -> &str {
-        self.slice(..self.scheme_end)
-    }
-
-    /// Return whether the URL has an 'authority',
-    /// which can contain a username, password, host, and port number.
-    ///
-    /// URLs that do *not* are either path-only like `unix:/run/foo.socket`
-    /// or cannot-be-a-base like `data:text/plain,Stuff`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert!(url.has_authority());
-    ///
-    /// let url = Url::parse("unix:/run/foo.socket")?;
-    /// assert!(!url.has_authority());
-    ///
-    /// let url = Url::parse("data:text/plain,Stuff")?;
-    /// assert!(!url.has_authority());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn has_authority(&self) -> bool {
-        debug_assert!(self.byte_at(self.scheme_end) == b':');
-        self.slice(self.scheme_end..).starts_with("://")
-    }
-
-    /// Return whether this URL is a cannot-be-a-base URL,
-    /// meaning that parsing a relative URL string with this URL as the base will return an error.
-    ///
-    /// This is the case if the scheme and `:` delimiter are not followed by a `/` slash,
-    /// as is typically the case of `data:` and `mailto:` URLs.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert!(!url.cannot_be_a_base());
-    ///
-    /// let url = Url::parse("unix:/run/foo.socket")?;
-    /// assert!(!url.cannot_be_a_base());
-    ///
-    /// let url = Url::parse("data:text/plain,Stuff")?;
-    /// assert!(url.cannot_be_a_base());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn cannot_be_a_base(&self) -> bool {
-        !self.slice(self.path_start..).starts_with('/')
-    }
-
-    /// Return the username for this URL (typically the empty string)
-    /// as a percent-encoded ASCII string.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert_eq!(url.username(), "rms");
-    ///
-    /// let url = Url::parse("ftp://:secret123@example.com")?;
-    /// assert_eq!(url.username(), "");
-    ///
-    /// let url = Url::parse("https://example.com")?;
-    /// assert_eq!(url.username(), "");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn username(&self) -> &str {
-        if self.has_authority() {
-            self.slice(self.scheme_end + ("://".len() as u32)..self.username_end)
-        } else {
-            ""
-        }
-    }
-
-    /// Return the password for this URL, if any, as a percent-encoded ASCII string.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://rms:secret123@example.com")?;
-    /// assert_eq!(url.password(), Some("secret123"));
-    ///
-    /// let url = Url::parse("ftp://:secret123@example.com")?;
-    /// assert_eq!(url.password(), Some("secret123"));
-    ///
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert_eq!(url.password(), None);
-    ///
-    /// let url = Url::parse("https://example.com")?;
-    /// assert_eq!(url.password(), None);
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn password(&self) -> Option<&str> {
-        // This ':' is not the one marking a port number since a host can not be empty.
-        // (Except for file: URLs, which do not have port numbers.)
-        if self.has_authority() && self.byte_at(self.username_end) == b':' {
-            debug_assert!(self.byte_at(self.host_start - 1) == b'@');
-            Some(self.slice(self.username_end + 1..self.host_start - 1))
-        } else {
-            None
-        }
-    }
-
-    /// Equivalent to `url.host().is_some()`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert!(url.has_host());
-    ///
-    /// let url = Url::parse("unix:/run/foo.socket")?;
-    /// assert!(!url.has_host());
-    ///
-    /// let url = Url::parse("data:text/plain,Stuff")?;
-    /// assert!(!url.has_host());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn has_host(&self) -> bool {
-        !matches!(self.host, HostInternal::None)
-    }
-
-    /// Return the string representation of the host (domain or IP address) for this URL, if any.
-    ///
-    /// Non-ASCII domains are punycode-encoded per IDNA.
-    /// IPv6 addresses are given between `[` and `]` brackets.
-    ///
-    /// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs
-    /// don’t have a host.
-    ///
-    /// See also the `host` method.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://127.0.0.1/index.html")?;
-    /// assert_eq!(url.host_str(), Some("127.0.0.1"));
-    ///
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert_eq!(url.host_str(), Some("example.com"));
-    ///
-    /// let url = Url::parse("unix:/run/foo.socket")?;
-    /// assert_eq!(url.host_str(), None);
-    ///
-    /// let url = Url::parse("data:text/plain,Stuff")?;
-    /// assert_eq!(url.host_str(), None);
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn host_str(&self) -> Option<&str> {
-        if self.has_host() {
-            Some(self.slice(self.host_start..self.host_end))
-        } else {
-            None
-        }
-    }
-
-    /// Return the parsed representation of the host for this URL.
-    /// Non-ASCII domain labels are punycode-encoded per IDNA.
-    ///
-    /// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs
-    /// don’t have a host.
-    ///
-    /// See also the `host_str` method.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://127.0.0.1/index.html")?;
-    /// assert!(url.host().is_some());
-    ///
-    /// let url = Url::parse("ftp://rms@example.com")?;
-    /// assert!(url.host().is_some());
-    ///
-    /// let url = Url::parse("unix:/run/foo.socket")?;
-    /// assert!(url.host().is_none());
-    ///
-    /// let url = Url::parse("data:text/plain,Stuff")?;
-    /// assert!(url.host().is_none());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn host(&self) -> Option<Host<&str>> {
-        match self.host {
-            HostInternal::None => None,
-            HostInternal::Domain => Some(Host::Domain(self.slice(self.host_start..self.host_end))),
-            HostInternal::Ipv4(address) => Some(Host::Ipv4(address)),
-            HostInternal::Ipv6(address) => Some(Host::Ipv6(address)),
-        }
-    }
-
-    /// If this URL has a host and it is a domain name (not an IP address), return it.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://127.0.0.1/")?;
-    /// assert_eq!(url.domain(), None);
-    ///
-    /// let url = Url::parse("mailto:rms@example.net")?;
-    /// assert_eq!(url.domain(), None);
-    ///
-    /// let url = Url::parse("https://example.com/")?;
-    /// assert_eq!(url.domain(), Some("example.com"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn domain(&self) -> Option<&str> {
-        match self.host {
-            HostInternal::Domain => Some(self.slice(self.host_start..self.host_end)),
-            _ => None,
-        }
-    }
-
-    /// Return the port number for this URL, if any.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.com")?;
-    /// assert_eq!(url.port(), None);
-    ///
-    /// let url = Url::parse("ssh://example.com:22")?;
-    /// assert_eq!(url.port(), Some(22));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn port(&self) -> Option<u16> {
-        self.port
-    }
-
-    /// Return the port number for this URL, or the default port number if it is known.
-    ///
-    /// This method only knows the default port number
-    /// of the `http`, `https`, `ws`, `wss`, `ftp`, and `gopher` schemes.
-    ///
-    /// For URLs in these schemes, this method always returns `Some(_)`.
-    /// For other schemes, it is the same as `Url::port()`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("foo://example.com")?;
-    /// assert_eq!(url.port_or_known_default(), None);
-    ///
-    /// let url = Url::parse("foo://example.com:1456")?;
-    /// assert_eq!(url.port_or_known_default(), Some(1456));
-    ///
-    /// let url = Url::parse("https://example.com")?;
-    /// assert_eq!(url.port_or_known_default(), Some(443));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    #[inline]
-    pub fn port_or_known_default(&self) -> Option<u16> {
-        self.port.or_else(|| parser::default_port(self.scheme()))
-    }
-
-    /// If the URL has a host, return something that implements `ToSocketAddrs`.
-    ///
-    /// If the URL has no port number and the scheme’s default port number is not known
-    /// (see `Url::port_or_known_default`),
-    /// the closure is called to obtain a port number.
-    /// Typically, this closure can match on the result `Url::scheme`
-    /// to have per-scheme default port numbers,
-    /// and panic for schemes it’s not prepared to handle.
-    /// For example:
-    ///
-    /// ```rust
-    /// # use url::Url;
-    /// # use std::net::TcpStream;
-    /// # use std::io;
-    /// fn connect(url: &Url) -> io::Result<TcpStream> {
-    ///     TcpStream::connect(url.with_default_port(default_port)?)
-    /// }
-    ///
-    /// fn default_port(url: &Url) -> Result<u16, ()> {
-    ///     match url.scheme() {
-    ///         "git" => Ok(9418),
-    ///         "git+ssh" => Ok(22),
-    ///         "git+https" => Ok(443),
-    ///         "git+http" => Ok(80),
-    ///         _ => Err(()),
-    ///     }
-    /// }
-    /// ```
-    pub fn with_default_port<F>(&self, f: F) -> io::Result<HostAndPort<&str>>
-    where F: FnOnce(&Url) -> Result<u16, ()> {
-        Ok(HostAndPort {
-            host: self.host()
-                      .ok_or(())
-                      .or_else(|()| io_error("URL has no host"))?,
-            port: self.port_or_known_default()
-                      .ok_or(())
-                      .or_else(|()| f(self))
-                      .or_else(|()| io_error("URL has no port number"))?
-        })
-    }
-
-    /// Return the path for this URL, as a percent-encoded ASCII string.
-    /// For cannot-be-a-base URLs, this is an arbitrary string that doesn’t start with '/'.
-    /// For other URLs, this starts with a '/' slash
-    /// and continues with slash-separated path segments.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.com/api/versions?page=2")?;
-    /// assert_eq!(url.path(), "/api/versions");
-    ///
-    /// let url = Url::parse("https://example.com")?;
-    /// assert_eq!(url.path(), "/");
-    ///
-    /// let url = Url::parse("https://example.com/countries/việt nam")?;
-    /// assert_eq!(url.path(), "/countries/vi%E1%BB%87t%20nam");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn path(&self) -> &str {
-        match (self.query_start, self.fragment_start) {
-            (None, None) => self.slice(self.path_start..),
-            (Some(next_component_start), _) |
-            (None, Some(next_component_start)) => {
-                self.slice(self.path_start..next_component_start)
-            }
-        }
-    }
-
-    /// Unless this URL is cannot-be-a-base,
-    /// return an iterator of '/' slash-separated path segments,
-    /// each as a percent-encoded ASCII string.
-    ///
-    /// Return `None` for cannot-be-a-base URLs.
-    ///
-    /// When `Some` is returned, the iterator always contains at least one string
-    /// (which may be empty).
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let url = Url::parse("https://example.com/foo/bar")?;
-    /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
-    /// assert_eq!(path_segments.next(), Some("foo"));
-    /// assert_eq!(path_segments.next(), Some("bar"));
-    /// assert_eq!(path_segments.next(), None);
-    ///
-    /// let url = Url::parse("https://example.com")?;
-    /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
-    /// assert_eq!(path_segments.next(), Some(""));
-    /// assert_eq!(path_segments.next(), None);
-    ///
-    /// let url = Url::parse("data:text/plain,HelloWorld")?;
-    /// assert!(url.path_segments().is_none());
-    ///
-    /// let url = Url::parse("https://example.com/countries/việt nam")?;
-    /// let mut path_segments = url.path_segments().ok_or_else(|| "cannot be base")?;
-    /// assert_eq!(path_segments.next(), Some("countries"));
-    /// assert_eq!(path_segments.next(), Some("vi%E1%BB%87t%20nam"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn path_segments(&self) -> Option<str::Split<char>> {
-        let path = self.path();
-        if path.starts_with('/') {
-            Some(path[1..].split('/'))
-        } else {
-            None
-        }
-    }
-
-    /// Return this URL’s query string, if any, as a percent-encoded ASCII string.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.com/products?page=2")?;
-    /// let query = url.query();
-    /// assert_eq!(query, Some("page=2"));
-    ///
-    /// let url = Url::parse("https://example.com/products")?;
-    /// let query = url.query();
-    /// assert!(query.is_none());
-    ///
-    /// let url = Url::parse("https://example.com/?country=español")?;
-    /// let query = url.query();
-    /// assert_eq!(query, Some("country=espa%C3%B1ol"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn query(&self) -> Option<&str> {
-        match (self.query_start, self.fragment_start) {
-            (None, _) => None,
-            (Some(query_start), None) => {
-                debug_assert!(self.byte_at(query_start) == b'?');
-                Some(self.slice(query_start + 1..))
-            }
-            (Some(query_start), Some(fragment_start)) => {
-                debug_assert!(self.byte_at(query_start) == b'?');
-                Some(self.slice(query_start + 1..fragment_start))
-            }
-        }
-    }
-
-    /// Parse the URL’s query string, if any, as `application/x-www-form-urlencoded`
-    /// and return an iterator of (key, value) pairs.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use std::borrow::Cow;
-    ///
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.com/products?page=2&sort=desc")?;
-    /// let mut pairs = url.query_pairs();
-    ///
-    /// assert_eq!(pairs.count(), 2);
-    ///
-    /// assert_eq!(pairs.next(), Some((Cow::Borrowed("page"), Cow::Borrowed("2"))));
-    /// assert_eq!(pairs.next(), Some((Cow::Borrowed("sort"), Cow::Borrowed("desc"))));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    ///
-
-    #[inline]
-    pub fn query_pairs(&self) -> form_urlencoded::Parse {
-        form_urlencoded::parse(self.query().unwrap_or("").as_bytes())
-    }
-
-    /// Return this URL’s fragment identifier, if any.
-    ///
-    /// A fragment is the part of the URL after the `#` symbol.
-    /// The fragment is optional and, if present, contains a fragment identifier
-    /// that identifies a secondary resource, such as a section heading
-    /// of a document.
-    ///
-    /// In HTML, the fragment identifier is usually the id attribute of a an element
-    /// that is scrolled to on load. Browsers typically will not send the fragment portion
-    /// of a URL to the server.
-    ///
-    /// **Note:** the parser did *not* percent-encode this component,
-    /// but the input may have been percent-encoded already.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let url = Url::parse("https://example.com/data.csv#row=4")?;
-    ///
-    /// assert_eq!(url.fragment(), Some("row=4"));
-    ///
-    /// let url = Url::parse("https://example.com/data.csv#cell=4,1-6,2")?;
-    ///
-    /// assert_eq!(url.fragment(), Some("cell=4,1-6,2"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn fragment(&self) -> Option<&str> {
-        self.fragment_start.map(|start| {
-            debug_assert!(self.byte_at(start) == b'#');
-            self.slice(start + 1..)
-        })
-    }
-
-    fn mutate<F: FnOnce(&mut Parser) -> R, R>(&mut self, f: F) -> R {
-        let mut parser = Parser::for_setter(mem::replace(&mut self.serialization, String::new()));
-        let result = f(&mut parser);
-        self.serialization = parser.serialization;
-        result
-    }
-
-    /// Change this URL’s fragment identifier.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.com/data.csv")?;
-    /// assert_eq!(url.as_str(), "https://example.com/data.csv");
-
-    /// url.set_fragment(Some("cell=4,1-6,2"));
-    /// assert_eq!(url.as_str(), "https://example.com/data.csv#cell=4,1-6,2");  
-    /// assert_eq!(url.fragment(), Some("cell=4,1-6,2"));
-    ///
-    /// url.set_fragment(None);
-    /// assert_eq!(url.as_str(), "https://example.com/data.csv");    
-    /// assert!(url.fragment().is_none());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_fragment(&mut self, fragment: Option<&str>) {
-        // Remove any previous fragment
-        if let Some(start) = self.fragment_start {
-            debug_assert!(self.byte_at(start) == b'#');
-            self.serialization.truncate(start as usize);
-        }
-        // Write the new one
-        if let Some(input) = fragment {
-            self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
-            self.serialization.push('#');
-            self.mutate(|parser| parser.parse_fragment(parser::Input::new(input)))
-        } else {
-            self.fragment_start = None
-        }
-    }
-
-    fn take_fragment(&mut self) -> Option<String> {
-        self.fragment_start.take().map(|start| {
-            debug_assert!(self.byte_at(start) == b'#');
-            let fragment = self.slice(start + 1..).to_owned();
-            self.serialization.truncate(start as usize);
-            fragment
-        })
-    }
-
-    fn restore_already_parsed_fragment(&mut self, fragment: Option<String>) {
-        if let Some(ref fragment) = fragment {
-            assert!(self.fragment_start.is_none());
-            self.fragment_start = Some(to_u32(self.serialization.len()).unwrap());
-            self.serialization.push('#');
-            self.serialization.push_str(fragment);
-        }
-    }
-
-    /// Change this URL’s query string.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.com/products")?;
-    /// assert_eq!(url.as_str(), "https://example.com/products");
-    ///
-    /// url.set_query(Some("page=2"));
-    /// assert_eq!(url.as_str(), "https://example.com/products?page=2");    
-    /// assert_eq!(url.query(), Some("page=2"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_query(&mut self, query: Option<&str>) {
-        let fragment = self.take_fragment();
-
-        // Remove any previous query
-        if let Some(start) = self.query_start.take() {
-            debug_assert!(self.byte_at(start) == b'?');
-            self.serialization.truncate(start as usize);
-        }
-        // Write the new query, if any
-        if let Some(input) = query {
-            self.query_start = Some(to_u32(self.serialization.len()).unwrap());
-            self.serialization.push('?');
-            let scheme_end = self.scheme_end;
-            self.mutate(|parser| parser.parse_query(scheme_end, parser::Input::new(input)));
-        }
-
-        self.restore_already_parsed_fragment(fragment);
-    }
-
-    /// Manipulate this URL’s query string, viewed as a sequence of name/value pairs
-    /// in `application/x-www-form-urlencoded` syntax.
-    ///
-    /// The return value has a method-chaining API:
-    ///
-    /// ```rust
-    /// # use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.net?lang=fr#nav")?;
-    /// assert_eq!(url.query(), Some("lang=fr"));
-    ///
-    /// url.query_pairs_mut().append_pair("foo", "bar");
-    /// assert_eq!(url.query(), Some("lang=fr&foo=bar"));
-    /// assert_eq!(url.as_str(), "https://example.net/?lang=fr&foo=bar#nav");
-    ///
-    /// url.query_pairs_mut()
-    ///     .clear()
-    ///     .append_pair("foo", "bar & baz")
-    ///     .append_pair("saisons", "\u{00C9}t\u{00E9}+hiver");
-    /// assert_eq!(url.query(), Some("foo=bar+%26+baz&saisons=%C3%89t%C3%A9%2Bhiver"));
-    /// assert_eq!(url.as_str(),
-    ///            "https://example.net/?foo=bar+%26+baz&saisons=%C3%89t%C3%A9%2Bhiver#nav");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Note: `url.query_pairs_mut().clear();` is equivalent to `url.set_query(Some(""))`,
-    /// not `url.set_query(None)`.
-    ///
-    /// The state of `Url` is unspecified if this return value is leaked without being dropped.
-    pub fn query_pairs_mut(&mut self) -> form_urlencoded::Serializer<UrlQuery> {
-        let fragment = self.take_fragment();
-
-        let query_start;
-        if let Some(start) = self.query_start {
-            debug_assert!(self.byte_at(start) == b'?');
-            query_start = start as usize;
-        } else {
-            query_start = self.serialization.len();
-            self.query_start = Some(to_u32(query_start).unwrap());
-            self.serialization.push('?');
-        }
-
-        let query = UrlQuery { url: self, fragment: fragment };
-        form_urlencoded::Serializer::for_suffix(query, query_start + "?".len())
-    }
-
-    fn take_after_path(&mut self) -> String {
-        match (self.query_start, self.fragment_start) {
-            (Some(i), _) | (None, Some(i)) => {
-                let after_path = self.slice(i..).to_owned();
-                self.serialization.truncate(i as usize);
-                after_path
-            },
-            (None, None) => String::new(),
-        }
-    }
-
-    /// Change this URL’s path.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.com")?;
-    /// url.set_path("api/comments");
-    /// assert_eq!(url.as_str(), "https://example.com/api/comments");    
-    /// assert_eq!(url.path(), "/api/comments");
-    ///
-    /// let mut url = Url::parse("https://example.com/api")?;
-    /// url.set_path("data/report.csv");
-    /// assert_eq!(url.as_str(), "https://example.com/data/report.csv");    
-    /// assert_eq!(url.path(), "/data/report.csv");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_path(&mut self, mut path: &str) {
-        let after_path = self.take_after_path();
-        let old_after_path_pos = to_u32(self.serialization.len()).unwrap();
-        let cannot_be_a_base = self.cannot_be_a_base();
-        let scheme_type = SchemeType::from(self.scheme());
-        self.serialization.truncate(self.path_start as usize);
-        self.mutate(|parser| {
-            if cannot_be_a_base {
-                if path.starts_with('/') {
-                    parser.serialization.push_str("%2F");
-                    path = &path[1..];
-                }
-                parser.parse_cannot_be_a_base_path(parser::Input::new(path));
-            } else {
-                let mut has_host = true;  // FIXME
-                parser.parse_path_start(scheme_type, &mut has_host, parser::Input::new(path));
-            }
-        });
-        self.restore_after_path(old_after_path_pos, &after_path);
-    }
-
-    /// Return an object with methods to manipulate this URL’s path segments.
-    ///
-    /// Return `Err(())` if this URL is cannot-be-a-base.
-    pub fn path_segments_mut(&mut self) -> Result<PathSegmentsMut, ()> {
-        if self.cannot_be_a_base() {
-            Err(())
-        } else {
-            Ok(path_segments::new(self))
-        }
-    }
-
-    fn restore_after_path(&mut self, old_after_path_position: u32, after_path: &str) {
-        let new_after_path_position = to_u32(self.serialization.len()).unwrap();
-        let adjust = |index: &mut u32| {
-            *index -= old_after_path_position;
-            *index += new_after_path_position;
-        };
-        if let Some(ref mut index) = self.query_start { adjust(index) }
-        if let Some(ref mut index) = self.fragment_start { adjust(index) }
-        self.serialization.push_str(after_path)
-    }
-
-    /// Change this URL’s port number.
-    ///
-    /// If this URL is cannot-be-a-base, does not have a host, or has the `file` scheme;
-    /// do nothing and return `Err`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let mut url = Url::parse("ssh://example.net:2048/")?;
-    ///
-    /// url.set_port(Some(4096)).map_err(|_| "cannot be base")?;
-    /// assert_eq!(url.as_str(), "ssh://example.net:4096/");
-    ///
-    /// url.set_port(None).map_err(|_| "cannot be base")?;
-    /// assert_eq!(url.as_str(), "ssh://example.net/");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Cannot set port for cannot-be-a-base URLs:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rms@example.net")?;
-    ///
-    /// let result = url.set_port(Some(80));
-    /// assert!(result.is_err());
-    ///
-    /// let result = url.set_port(None);
-    /// assert!(result.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_port(&mut self, mut port: Option<u16>) -> Result<(), ()> {
-        if !self.has_host() || self.scheme() == "file" {
-            return Err(())
-        }
-        if port.is_some() && port == parser::default_port(self.scheme()) {
-            port = None
-        }
-        self.set_port_internal(port);
-        Ok(())
-    }
-
-    fn set_port_internal(&mut self, port: Option<u16>) {
-        match (self.port, port) {
-            (None, None) => {}
-            (Some(_), None) => {
-                self.serialization.drain(self.host_end as usize .. self.path_start as usize);
-                let offset = self.path_start - self.host_end;
-                self.path_start = self.host_end;
-                if let Some(ref mut index) = self.query_start { *index -= offset }
-                if let Some(ref mut index) = self.fragment_start { *index -= offset }
-            }
-            (Some(old), Some(new)) if old == new => {}
-            (_, Some(new)) => {
-                let path_and_after = self.slice(self.path_start..).to_owned();
-                self.serialization.truncate(self.host_end as usize);
-                write!(&mut self.serialization, ":{}", new).unwrap();
-                let old_path_start = self.path_start;
-                let new_path_start = to_u32(self.serialization.len()).unwrap();
-                self.path_start = new_path_start;
-                let adjust = |index: &mut u32| {
-                    *index -= old_path_start;
-                    *index += new_path_start;
-                };
-                if let Some(ref mut index) = self.query_start { adjust(index) }
-                if let Some(ref mut index) = self.fragment_start { adjust(index) }
-                self.serialization.push_str(&path_and_after);
-            }
-        }
-        self.port = port;
-    }
-
-    /// Change this URL’s host.
-    ///
-    /// If this URL is cannot-be-a-base or there is an error parsing the given `host`,
-    /// do nothing and return `Err`.
-    ///
-    /// Removing the host (calling this with `None`)
-    /// will also remove any username, password, and port number.
-    ///
-    /// # Examples
-    ///
-    /// Change host:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.net")?;
-    /// let result = url.set_host(Some("rust-lang.org"));
-    /// assert!(result.is_ok());
-    /// assert_eq!(url.as_str(), "https://rust-lang.org/");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Remove host:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("foo://example.net")?;
-    /// let result = url.set_host(None);
-    /// assert!(result.is_ok());
-    /// assert_eq!(url.as_str(), "foo:/");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Cannot remove host for 'special' schemes (e.g. `http`):
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.net")?;
-    /// let result = url.set_host(None);
-    /// assert!(result.is_err());
-    /// assert_eq!(url.as_str(), "https://example.net/");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Cannot change or remove host for cannot-be-a-base URLs:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rms@example.net")?;
-    ///
-    /// let result = url.set_host(Some("rust-lang.org"));
-    /// assert!(result.is_err());
-    /// assert_eq!(url.as_str(), "mailto:rms@example.net");
-    ///
-    /// let result = url.set_host(None);
-    /// assert!(result.is_err());
-    /// assert_eq!(url.as_str(), "mailto:rms@example.net");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_host(&mut self, host: Option<&str>) -> Result<(), ParseError> {
-        if self.cannot_be_a_base() {
-            return Err(ParseError::SetHostOnCannotBeABaseUrl)
-        }
-
-        if let Some(host) = host {
-            if host == "" && SchemeType::from(self.scheme()).is_special() {
-                return Err(ParseError::EmptyHost);
-            }
-            self.set_host_internal(Host::parse(host)?, None)
-        } else if self.has_host() {
-            if SchemeType::from(self.scheme()).is_special() {
-                return Err(ParseError::EmptyHost)
-            }
-            debug_assert!(self.byte_at(self.scheme_end) == b':');
-            debug_assert!(self.byte_at(self.path_start) == b'/');
-            let new_path_start = self.scheme_end + 1;
-            self.serialization.drain(new_path_start as usize..self.path_start as usize);
-            let offset = self.path_start - new_path_start;
-            self.path_start = new_path_start;
-            self.username_end = new_path_start;
-            self.host_start = new_path_start;
-            self.host_end = new_path_start;
-            self.port = None;
-            if let Some(ref mut index) = self.query_start { *index -= offset }
-            if let Some(ref mut index) = self.fragment_start { *index -= offset }
-        }
-        Ok(())
-    }
-
-    /// opt_new_port: None means leave unchanged, Some(None) means remove any port number.
-    fn set_host_internal(&mut self, host: Host<String>, opt_new_port: Option<Option<u16>>) {
-        let old_suffix_pos = if opt_new_port.is_some() { self.path_start } else { self.host_end };
-        let suffix = self.slice(old_suffix_pos..).to_owned();
-        self.serialization.truncate(self.host_start as usize);
-        if !self.has_authority() {
-            debug_assert!(self.slice(self.scheme_end..self.host_start) == ":");
-            debug_assert!(self.username_end == self.host_start);
-            self.serialization.push('/');
-            self.serialization.push('/');
-            self.username_end += 2;
-            self.host_start += 2;
-        }
-        write!(&mut self.serialization, "{}", host).unwrap();
-        self.host_end = to_u32(self.serialization.len()).unwrap();
-        self.host = host.into();
-
-        if let Some(new_port) = opt_new_port {
-            self.port = new_port;
-            if let Some(port) = new_port {
-                write!(&mut self.serialization, ":{}", port).unwrap();
-            }
-        }
-        let new_suffix_pos = to_u32(self.serialization.len()).unwrap();
-        self.serialization.push_str(&suffix);
-
-        let adjust = |index: &mut u32| {
-            *index -= old_suffix_pos;
-            *index += new_suffix_pos;
-        };
-        adjust(&mut self.path_start);
-        if let Some(ref mut index) = self.query_start { adjust(index) }
-        if let Some(ref mut index) = self.fragment_start { adjust(index) }
-    }
-
-    /// Change this URL’s host to the given IP address.
-    ///
-    /// If this URL is cannot-be-a-base, do nothing and return `Err`.
-    ///
-    /// Compared to `Url::set_host`, this skips the host parser.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("http://example.com")?;
-    /// url.set_ip_host("127.0.0.1".parse().unwrap());
-    /// assert_eq!(url.host_str(), Some("127.0.0.1"));
-    /// assert_eq!(url.as_str(), "http://127.0.0.1/");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Cannot change URL's from mailto(cannot-be-base) to ip:
-    ///
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rms@example.com")?;
-    /// let result = url.set_ip_host("127.0.0.1".parse().unwrap());
-    ///
-    /// assert_eq!(url.as_str(), "mailto:rms@example.com");
-    /// assert!(result.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    pub fn set_ip_host(&mut self, address: IpAddr) -> Result<(), ()> {
-        if self.cannot_be_a_base() {
-            return Err(())
-        }
-
-        let address = match address {
-            IpAddr::V4(address) => Host::Ipv4(address),
-            IpAddr::V6(address) => Host::Ipv6(address),
-        };
-        self.set_host_internal(address, None);
-        Ok(())
-    }
-
-    /// Change this URL’s password.
-    ///
-    /// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rmz@example.com")?;
-    /// let result = url.set_password(Some("secret_password"));
-    /// assert!(result.is_err());
-    ///
-    /// let mut url = Url::parse("ftp://user1:secret1@example.com")?;
-    /// let result = url.set_password(Some("secret_password"));
-    /// assert_eq!(url.password(), Some("secret_password"));
-    ///
-    /// let mut url = Url::parse("ftp://user2:@example.com")?;
-    /// let result = url.set_password(Some("secret2"));
-    /// assert!(result.is_ok());
-    /// assert_eq!(url.password(), Some("secret2"));
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_password(&mut self, password: Option<&str>) -> Result<(), ()> {
-        if !self.has_host() {
-            return Err(())
-        }
-        if let Some(password) = password {
-            let host_and_after = self.slice(self.host_start..).to_owned();
-            self.serialization.truncate(self.username_end as usize);
-            self.serialization.push(':');
-            self.serialization.extend(utf8_percent_encode(password, USERINFO_ENCODE_SET));
-            self.serialization.push('@');
-
-            let old_host_start = self.host_start;
-            let new_host_start = to_u32(self.serialization.len()).unwrap();
-            let adjust = |index: &mut u32| {
-                *index -= old_host_start;
-                *index += new_host_start;
-            };
-            self.host_start = new_host_start;
-            adjust(&mut self.host_end);
-            adjust(&mut self.path_start);
-            if let Some(ref mut index) = self.query_start { adjust(index) }
-            if let Some(ref mut index) = self.fragment_start { adjust(index) }
-
-            self.serialization.push_str(&host_and_after);
-        } else if self.byte_at(self.username_end) == b':' {  // If there is a password to remove
-            let has_username_or_password = self.byte_at(self.host_start - 1) == b'@';
-            debug_assert!(has_username_or_password);
-            let username_start = self.scheme_end + 3;
-            let empty_username = username_start == self.username_end;
-            let start = self.username_end;  // Remove the ':'
-            let end = if empty_username {
-                self.host_start // Remove the '@' as well
-            } else {
-                self.host_start - 1  // Keep the '@' to separate the username from the host
-            };
-            self.serialization.drain(start as usize .. end as usize);
-            let offset = end - start;
-            self.host_start -= offset;
-            self.host_end -= offset;
-            self.path_start -= offset;
-            if let Some(ref mut index) = self.query_start { *index -= offset }
-            if let Some(ref mut index) = self.fragment_start { *index -= offset }
-        }
-        Ok(())
-    }
-
-    /// Change this URL’s username.
-    ///
-    /// If this URL is cannot-be-a-base or does not have a host, do nothing and return `Err`.
-    /// # Examples
-    ///
-    /// Cannot setup username from mailto(cannot-be-base)
-    ///
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rmz@example.com")?;
-    /// let result = url.set_username("user1");
-    /// assert_eq!(url.as_str(), "mailto:rmz@example.com");
-    /// assert!(result.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Setup username to user1
-    /// ```rust
-    /// use url::{Url, ParseError};
-    ///
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("ftp://:secre1@example.com")?;
-    /// let result = url.set_username("user1");
-    /// assert!(result.is_ok());
-    /// assert_eq!(url.username(), "user1");
-    /// assert_eq!(url.as_str(), "ftp://user1:secre1@example.com");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_username(&mut self, username: &str) -> Result<(), ()> {
-        if !self.has_host() {
-            return Err(())
-        }
-        let username_start = self.scheme_end + 3;
-        debug_assert!(self.slice(self.scheme_end..username_start) == "://");
-        if self.slice(username_start..self.username_end) == username {
-            return Ok(())
-        }
-        let after_username = self.slice(self.username_end..).to_owned();
-        self.serialization.truncate(username_start as usize);
-        self.serialization.extend(utf8_percent_encode(username, USERINFO_ENCODE_SET));
-
-        let mut removed_bytes = self.username_end;
-        self.username_end = to_u32(self.serialization.len()).unwrap();
-        let mut added_bytes = self.username_end;
-
-        let new_username_is_empty = self.username_end == username_start;
-        match (new_username_is_empty, after_username.chars().next()) {
-            (true, Some('@')) => {
-                removed_bytes += 1;
-                self.serialization.push_str(&after_username[1..]);
-            }
-            (false, Some('@')) | (_, Some(':')) | (true, _) => {
-                self.serialization.push_str(&after_username);
-            }
-            (false, _) => {
-                added_bytes += 1;
-                self.serialization.push('@');
-                self.serialization.push_str(&after_username);
-            }
-        }
-
-        let adjust = |index: &mut u32| {
-            *index -= removed_bytes;
-            *index += added_bytes;
-        };
-        adjust(&mut self.host_start);
-        adjust(&mut self.host_end);
-        adjust(&mut self.path_start);
-        if let Some(ref mut index) = self.query_start { adjust(index) }
-        if let Some(ref mut index) = self.fragment_start { adjust(index) }
-        Ok(())
-    }
-
-    /// Change this URL’s scheme.
-    ///
-    /// Do nothing and return `Err` if:
-    ///
-    /// * The new scheme is not in `[a-zA-Z][a-zA-Z0-9+.-]+`
-    /// * This URL is cannot-be-a-base and the new scheme is one of
-    ///   `http`, `https`, `ws`, `wss`, `ftp`, or `gopher`
-    ///
-    /// # Examples
-    ///
-    /// Change the URL’s scheme from `https` to `foo`:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.net")?;
-    /// let result = url.set_scheme("foo");
-    /// assert_eq!(url.as_str(), "foo://example.net/");
-    /// assert!(result.is_ok());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    ///
-    /// Cannot change URL’s scheme from `https` to `foõ`:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("https://example.net")?;
-    /// let result = url.set_scheme("foõ");
-    /// assert_eq!(url.as_str(), "https://example.net/");
-    /// assert!(result.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// Cannot change URL’s scheme from `mailto` (cannot-be-a-base) to `https`:
-    ///
-    /// ```
-    /// use url::Url;
-    /// # use url::ParseError;
-    /// 
-    /// # fn run() -> Result<(), ParseError> {
-    /// let mut url = Url::parse("mailto:rms@example.net")?;
-    /// let result = url.set_scheme("https");
-    /// assert_eq!(url.as_str(), "mailto:rms@example.net");
-    /// assert!(result.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn set_scheme(&mut self, scheme: &str) -> Result<(), ()> {
-        let mut parser = Parser::for_setter(String::new());
-        let remaining = parser.parse_scheme(parser::Input::new(scheme))?;
-        if !remaining.is_empty() ||
-                (!self.has_host() && SchemeType::from(&parser.serialization).is_special()) {
-            return Err(())
-        }
-        let old_scheme_end = self.scheme_end;
-        let new_scheme_end = to_u32(parser.serialization.len()).unwrap();
-        let adjust = |index: &mut u32| {
-            *index -= old_scheme_end;
-            *index += new_scheme_end;
-        };
-
-        self.scheme_end = new_scheme_end;
-        adjust(&mut self.username_end);
-        adjust(&mut self.host_start);
-        adjust(&mut self.host_end);
-        adjust(&mut self.path_start);
-        if let Some(ref mut index) = self.query_start { adjust(index) }
-        if let Some(ref mut index) = self.fragment_start { adjust(index) }
-
-        parser.serialization.push_str(self.slice(old_scheme_end..));
-        self.serialization = parser.serialization;
-        Ok(())
-    }
-
-    /// Convert a file name as `std::path::Path` into an URL in the `file` scheme.
-    ///
-    /// This returns `Err` if the given path is not absolute or,
-    /// on Windows, if the prefix is not a disk prefix (e.g. `C:`) or a UNC prefix (`\\`).
-    ///
-    /// # Examples
-    ///
-    /// On Unix-like platforms:
-    ///
-    /// ```
-    /// # if cfg!(unix) {
-    /// use url::Url;
-    /// 
-    /// # fn run() -> Result<(), ()> {
-    /// let url = Url::from_file_path("/tmp/foo.txt")?;
-    /// assert_eq!(url.as_str(), "file:///tmp/foo.txt");
-    ///
-    /// let url = Url::from_file_path("../foo.txt");
-    /// assert!(url.is_err());
-    ///
-    /// let url = Url::from_file_path("https://google.com/");
-    /// assert!(url.is_err());
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// # }
-    /// ```
-    pub fn from_file_path<P: AsRef<Path>>(path: P) -> Result<Url, ()> {
-        let mut serialization = "file://".to_owned();
-        let host_start = serialization.len() as u32;
-        let (host_end, host) = path_to_file_url_segments(path.as_ref(), &mut serialization)?;
-        Ok(Url {
-            serialization: serialization,
-            scheme_end: "file".len() as u32,
-            username_end: host_start,
-            host_start: host_start,
-            host_end: host_end,
-            host: host,
-            port: None,
-            path_start: host_end,
-            query_start: None,
-            fragment_start: None,
-        })
-    }
-
-    /// Convert a directory name as `std::path::Path` into an URL in the `file` scheme.
-    ///
-    /// This returns `Err` if the given path is not absolute or,
-    /// on Windows, if the prefix is not a disk prefix (e.g. `C:`) or a UNC prefix (`\\`).
-    ///
-    /// Compared to `from_file_path`, this ensure that URL’s the path has a trailing slash
-    /// so that the entire path is considered when using this URL as a base URL.
-    ///
-    /// For example:
-    ///
-    /// * `"index.html"` parsed with `Url::from_directory_path(Path::new("/var/www"))`
-    ///   as the base URL is `file:///var/www/index.html`
-    /// * `"index.html"` parsed with `Url::from_file_path(Path::new("/var/www"))`
-    ///   as the base URL is `file:///var/index.html`, which might not be what was intended.
-    ///
-    /// Note that `std::path` does not consider trailing slashes significant
-    /// and usually does not include them (e.g. in `Path::parent()`).
-    pub fn from_directory_path<P: AsRef<Path>>(path: P) -> Result<Url, ()> {
-        let mut url = Url::from_file_path(path)?;
-        if !url.serialization.ends_with('/') {
-            url.serialization.push('/')
-        }
-        Ok(url)
-    }
-
-    /// Serialize with Serde using the internal representation of the `Url` struct.
-    ///
-    /// The corresponding `deserialize_internal` method sacrifices some invariant-checking
-    /// for speed, compared to the `Deserialize` trait impl.
-    ///
-    /// This method is only available if the `serde` Cargo feature is enabled.
-    #[cfg(feature = "serde")]
-    #[deny(unused)]
-    pub fn serialize_internal<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: serde::Serializer {
-        use serde::Serialize;
-        // Destructuring first lets us ensure that adding or removing fields forces this method
-        // to be updated
-        let Url { ref serialization, ref scheme_end,
-                  ref username_end, ref host_start,
-                  ref host_end, ref host, ref port,
-                  ref path_start, ref query_start,
-                  ref fragment_start} = *self;
-        (serialization, scheme_end, username_end,
-         host_start, host_end, host, port, path_start,
-         query_start, fragment_start).serialize(serializer)
-    }
-
-    /// Serialize with Serde using the internal representation of the `Url` struct.
-    ///
-    /// The corresponding `deserialize_internal` method sacrifices some invariant-checking
-    /// for speed, compared to the `Deserialize` trait impl.
-    ///
-    /// This method is only available if the `serde` Cargo feature is enabled.
-    #[cfg(feature = "serde")]
-    #[deny(unused)]
-    pub fn deserialize_internal<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: serde::Deserializer {
-        use serde::{Deserialize, Error};
-        let (serialization, scheme_end, username_end,
-             host_start, host_end, host, port, path_start,
-             query_start, fragment_start) = Deserialize::deserialize(deserializer)?;
-        let url = Url {
-            serialization: serialization,
-            scheme_end: scheme_end,
-            username_end: username_end,
-            host_start: host_start,
-            host_end: host_end,
-            host: host,
-            port: port,
-            path_start: path_start,
-            query_start: query_start,
-            fragment_start: fragment_start
-        };
-        if cfg!(debug_assertions) {
-            url.check_invariants().map_err(|ref reason| Error::invalid_value(&reason))?
-        }
-        Ok(url)
-    }
-
-
-    /// Assuming the URL is in the `file` scheme or similar,
-    /// convert its path to an absolute `std::path::Path`.
-    ///
-    /// **Note:** This does not actually check the URL’s `scheme`,
-    /// and may give nonsensical results for other schemes.
-    /// It is the user’s responsibility to check the URL’s scheme before calling this.
-    ///
-    /// ```
-    /// # use url::Url;
-    /// # let url = Url::parse("file:///etc/passwd").unwrap();
-    /// let path = url.to_file_path();
-    /// ```
-    ///
-    /// Returns `Err` if the host is neither empty nor `"localhost"` (except on Windows, where
-    /// `file:` URLs may have a non-local host),
-    /// or if `Path::new_opt()` returns `None`.
-    /// (That is, if the percent-decoded path contains a NUL byte or,
-    /// for a Windows path, is not UTF-8.)
-    #[inline]
-    pub fn to_file_path(&self) -> Result<PathBuf, ()> {
-        if let Some(segments) = self.path_segments() {
-            let host = match self.host() {
-                None | Some(Host::Domain("localhost")) => None,
-                Some(_) if cfg!(windows) && self.scheme() == "file" => {
-                    Some(&self.serialization[self.host_start as usize .. self.host_end as usize])
-                },
-                _ => return Err(())
-            };
-
-            return file_url_segments_to_pathbuf(host, segments);
-        }
-        Err(())
-    }
-
-    // Private helper methods:
-
-    #[inline]
-    fn slice<R>(&self, range: R) -> &str where R: RangeArg {
-        range.slice_of(&self.serialization)
-    }
-
-    #[inline]
-    fn byte_at(&self, i: u32) -> u8 {
-        self.serialization.as_bytes()[i as usize]
-    }
-}
-
-/// Return an error if `Url::host` or `Url::port_or_known_default` return `None`.
-impl ToSocketAddrs for Url {
-    type Iter = SocketAddrs;
-
-    fn to_socket_addrs(&self) -> io::Result<Self::Iter> {
-        self.with_default_port(|_| Err(()))?.to_socket_addrs()
-    }
-}
-
-/// Parse a string as an URL, without a base URL or encoding override.
-impl str::FromStr for Url {
-    type Err = ParseError;
-
-    #[inline]
-    fn from_str(input: &str) -> Result<Url, ::ParseError> {
-        Url::parse(input)
-    }
-}
-
-/// Display the serialization of this URL.
-impl fmt::Display for Url {
-    #[inline]
-    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
-        fmt::Display::fmt(&self.serialization, formatter)
-    }
-}
-
-/// Debug the serialization of this URL.
-impl fmt::Debug for Url {
-    #[inline]
-    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
-        fmt::Debug::fmt(&self.serialization, formatter)
-    }
-}
-
-/// URLs compare like their serialization.
-impl Eq for Url {}
-
-/// URLs compare like their serialization.
-impl PartialEq for Url {
-    #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.serialization == other.serialization
-    }
-}
-
-/// URLs compare like their serialization.
-impl Ord for Url {
-    #[inline]
-    fn cmp(&self, other: &Self) -> cmp::Ordering {
-        self.serialization.cmp(&other.serialization)
-    }
-}
-
-/// URLs compare like their serialization.
-impl PartialOrd for Url {
-    #[inline]
-    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
-        self.serialization.partial_cmp(&other.serialization)
-    }
-}
-
-/// URLs hash like their serialization.
-impl hash::Hash for Url {
-    #[inline]
-    fn hash<H>(&self, state: &mut H) where H: hash::Hasher {
-        hash::Hash::hash(&self.serialization, state)
-    }
-}
-
-/// Return the serialization of this URL.
-impl AsRef<str> for Url {
-    #[inline]
-    fn as_ref(&self) -> &str {
-        &self.serialization
-    }
-}
-
-trait RangeArg {
-    fn slice_of<'a>(&self, s: &'a str) -> &'a str;
-}
-
-impl RangeArg for Range<u32> {
-    #[inline]
-    fn slice_of<'a>(&self, s: &'a str) -> &'a str {
-        &s[self.start as usize .. self.end as usize]
-    }
-}
-
-impl RangeArg for RangeFrom<u32> {
-    #[inline]
-    fn slice_of<'a>(&self, s: &'a str) -> &'a str {
-        &s[self.start as usize ..]
-    }
-}
-
-impl RangeArg for RangeTo<u32> {
-    #[inline]
-    fn slice_of<'a>(&self, s: &'a str) -> &'a str {
-        &s[.. self.end as usize]
-    }
-}
-
-#[cfg(feature="rustc-serialize")]
-impl rustc_serialize::Encodable for Url {
-    fn encode<S: rustc_serialize::Encoder>(&self, encoder: &mut S) -> Result<(), S::Error> {
-        encoder.emit_str(self.as_str())
-    }
-}
-
-
-#[cfg(feature="rustc-serialize")]
-impl rustc_serialize::Decodable for Url {
-    fn decode<D: rustc_serialize::Decoder>(decoder: &mut D) -> Result<Url, D::Error> {
-        Url::parse(&*decoder.read_str()?).map_err(|error| {
-            decoder.error(&format!("URL parsing error: {}", error))
-        })
-    }
-}
-
-/// Serializes this URL into a `serde` stream.
-///
-/// This implementation is only available if the `serde` Cargo feature is enabled.
-#[cfg(feature="serde")]
-impl serde::Serialize for Url {
-    fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: serde::Serializer {
-        serializer.serialize_str(self.as_str())
-    }
-}
-
-/// Deserializes this URL from a `serde` stream.
-///
-/// This implementation is only available if the `serde` Cargo feature is enabled.
-#[cfg(feature="serde")]
-impl serde::Deserialize for Url {
-    fn deserialize<D>(deserializer: &mut D) -> Result<Url, D::Error> where D: serde::Deserializer {
-        let string_representation: String = serde::Deserialize::deserialize(deserializer)?;
-        Url::parse(&string_representation).map_err(|err| {
-            serde::Error::invalid_value(err.description())
-        })
-    }
-}
-
-#[cfg(any(unix, target_os = "redox"))]
-fn path_to_file_url_segments(path: &Path, serialization: &mut String)
-                             -> Result<(u32, HostInternal), ()> {
-    use std::os::unix::prelude::OsStrExt;
-    if !path.is_absolute() {
-        return Err(())
-    }
-    let host_end = to_u32(serialization.len()).unwrap();
-    let mut empty = true;
-    // skip the root component
-    for component in path.components().skip(1) {
-        empty = false;
-        serialization.push('/');
-        serialization.extend(percent_encode(
-            component.as_os_str().as_bytes(), PATH_SEGMENT_ENCODE_SET));
-    }
-    if empty {
-        // An URL’s path must not be empty.
-        serialization.push('/');
-    }
-    Ok((host_end, HostInternal::None))
-}
-
-#[cfg(windows)]
-fn path_to_file_url_segments(path: &Path, serialization: &mut String)
-                             -> Result<(u32, HostInternal), ()> {
-    path_to_file_url_segments_windows(path, serialization)
-}
-
-// Build this unconditionally to alleviate https://github.com/servo/rust-url/issues/102
-#[cfg_attr(not(windows), allow(dead_code))]
-fn path_to_file_url_segments_windows(path: &Path, serialization: &mut String)
-                                     -> Result<(u32, HostInternal), ()> {
-    use std::path::{Prefix, Component};
-    if !path.is_absolute() {
-        return Err(())
-    }
-    let mut components = path.components();
-
-    let host_end;
-    let host_internal;
-    match components.next() {
-        Some(Component::Prefix(ref p)) => match p.kind() {
-            Prefix::Disk(letter) | Prefix::VerbatimDisk(letter) => {
-                host_end = to_u32(serialization.len()).unwrap();
-                host_internal = HostInternal::None;
-                serialization.push('/');
-                serialization.push(letter as char);
-                serialization.push(':');
-            },
-            Prefix::UNC(server, share) | Prefix::VerbatimUNC(server, share) => {
-                let host = Host::parse(server.to_str().ok_or(())?).map_err(|_| ())?;
-                write!(serialization, "{}", host).unwrap();
-                host_end = to_u32(serialization.len()).unwrap();
-                host_internal = host.into();
-                serialization.push('/');
-                let share = share.to_str().ok_or(())?;
-                serialization.extend(percent_encode(share.as_bytes(), PATH_SEGMENT_ENCODE_SET));
-            },
-            _ => return Err(())
-        },
-
-        _ => return Err(())
-    }
-
-    for component in components {
-        if component == Component::RootDir { continue }
-        // FIXME: somehow work with non-unicode?
-        let component = component.as_os_str().to_str().ok_or(())?;
-        serialization.push('/');
-        serialization.extend(percent_encode(component.as_bytes(), PATH_SEGMENT_ENCODE_SET));
-    }
-    Ok((host_end, host_internal))
-}
-
-#[cfg(any(unix, target_os = "redox"))]
-fn file_url_segments_to_pathbuf(host: Option<&str>, segments: str::Split<char>) -> Result<PathBuf, ()> {
-    use std::ffi::OsStr;
-    use std::os::unix::prelude::OsStrExt;
-    use std::path::PathBuf;
-
-    if host.is_some() {
-        return Err(());
-    }
-
-    let mut bytes = Vec::new();
-    for segment in segments {
-        bytes.push(b'/');
-        bytes.extend(percent_decode(segment.as_bytes()));
-    }
-    let os_str = OsStr::from_bytes(&bytes);
-    let path = PathBuf::from(os_str);
-    debug_assert!(path.is_absolute(),
-                  "to_file_path() failed to produce an absolute Path");
-    Ok(path)
-}
-
-#[cfg(windows)]
-fn file_url_segments_to_pathbuf(host: Option<&str>, segments: str::Split<char>) -> Result<PathBuf, ()> {
-    file_url_segments_to_pathbuf_windows(host, segments)
-}
-
-// Build this unconditionally to alleviate https://github.com/servo/rust-url/issues/102
-#[cfg_attr(not(windows), allow(dead_code))]
-fn file_url_segments_to_pathbuf_windows(host: Option<&str>, mut segments: str::Split<char>) -> Result<PathBuf, ()> {
-
-    let mut string = if let Some(host) = host {
-        r"\\".to_owned() + host
-    } else {
-        let first = segments.next().ok_or(())?;
-
-        match first.len() {
-            2 => {
-                if !first.starts_with(parser::ascii_alpha) || first.as_bytes()[1] != b':' {
-                    return Err(())
-                }
-
-                first.to_owned()
-            },
-
-            4 => {
-                if !first.starts_with(parser::ascii_alpha) {
-                    return Err(())
-                }
-                let bytes = first.as_bytes();
-                if bytes[1] != b'%' || bytes[2] != b'3' || (bytes[3] != b'a' && bytes[3] != b'A') {
-                    return Err(())
-                }
-
-                first[0..1].to_owned() + ":"
-            },
-
-            _ => return Err(()),
-        }
-    };
-
-    for segment in segments {
-        string.push('\\');
-
-        // Currently non-unicode windows paths cannot be represented
-        match String::from_utf8(percent_decode(segment.as_bytes()).collect()) {
-            Ok(s) => string.push_str(&s),
-            Err(..) => return Err(()),
-        }
-    }
-    let path = PathBuf::from(string);
-    debug_assert!(path.is_absolute(),
-                  "to_file_path() failed to produce an absolute Path");
-    Ok(path)
-}
-
-fn io_error<T>(reason: &str) -> io::Result<T> {
-    Err(io::Error::new(io::ErrorKind::InvalidData, reason))
-}
-
-/// Implementation detail of `Url::query_pairs_mut`. Typically not used directly.
-#[derive(Debug)]
-pub struct UrlQuery<'a> {
-    url: &'a mut Url,
-    fragment: Option<String>,
-}
-
-impl<'a> Drop for UrlQuery<'a> {
-    fn drop(&mut self) {
-        self.url.restore_already_parsed_fragment(self.fragment.take())
-    }
-}
-
-
-/// Define a new struct
-/// that implements the [`EncodeSet`](percent_encoding/trait.EncodeSet.html) trait,
-/// for use in [`percent_decode()`](percent_encoding/fn.percent_encode.html)
-/// and related functions.
-///
-/// Parameters are characters to include in the set in addition to those of the base set.
-/// See [encode sets specification](http://url.spec.whatwg.org/#simple-encode-set).
-///
-/// Example
-/// =======
-///
-/// ```rust
-/// #[macro_use] extern crate url;
-/// use url::percent_encoding::{utf8_percent_encode, SIMPLE_ENCODE_SET};
-/// define_encode_set! {
-///     /// This encode set is used in the URL parser for query strings.
-///     pub QUERY_ENCODE_SET = [SIMPLE_ENCODE_SET] | {' ', '"', '#', '<', '>'}
-/// }
-/// # fn main() {
-/// assert_eq!(utf8_percent_encode("foo bar", QUERY_ENCODE_SET).collect::<String>(), "foo%20bar");
-/// # }
-/// ```
-#[macro_export]
-macro_rules! define_encode_set {
-    ($(#[$attr: meta])* pub $name: ident = [$base_set: expr] | {$($ch: pat),*}) => {
-        $(#[$attr])*
-        #[derive(Copy, Clone)]
-        #[allow(non_camel_case_types)]
-        pub struct $name;
-
-        impl $crate::percent_encoding::EncodeSet for $name {
-            #[inline]
-            fn contains(&self, byte: u8) -> bool {
-                match byte as char {
-                    $(
-                        $ch => true,
-                    )*
-                    _ => $base_set.contains(byte)
-                }
-            }
-        }
-    }
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/origin.rs
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#[cfg(feature = "heapsize")] use heapsize::HeapSizeOf;
-use host::Host;
-use idna::domain_to_unicode;
-use parser::default_port;
-use std::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering};
-use Url;
-
-pub fn url_origin(url: &Url) -> Origin {
-    let scheme = url.scheme();
-    match scheme {
-        "blob" => {
-            let result = Url::parse(url.path());
-            match result {
-                Ok(ref url) => url_origin(url),
-                Err(_)  => Origin::new_opaque()
-            }
-        },
-        "ftp" | "gopher" | "http" | "https" | "ws" | "wss" => {
-            Origin::Tuple(scheme.to_owned(), url.host().unwrap().to_owned(),
-                url.port_or_known_default().unwrap())
-        },
-        // TODO: Figure out what to do if the scheme is a file
-        "file" => Origin::new_opaque(),
-        _ => Origin::new_opaque()
-    }
-}
-
-/// The origin of an URL
-///
-/// Two URLs with the same origin are considered
-/// to originate from the same entity and can therefore trust
-/// each other.
-///
-/// The origin is determined based on the scheme as follows:
-///
-/// - If the scheme is "blob" the origin is the origin of the
-///   URL contained in the path component. If parsing fails,
-///   it is an opaque origin.
-/// - If the scheme is "ftp", "gopher", "http", "https", "ws", or "wss",
-///   then the origin is a tuple of the scheme, host, and port.
-/// - If the scheme is anything else, the origin is opaque, meaning
-///   the URL does not have the same origin as any other URL.
-///
-/// For more information see https://url.spec.whatwg.org/#origin
-#[derive(PartialEq, Eq, Hash, Clone, Debug)]
-pub enum Origin {
-    /// A globally unique identifier
-    Opaque(OpaqueOrigin),
-
-    /// Consists of the URL's scheme, host and port
-    Tuple(String, Host<String>, u16)
-}
-
-#[cfg(feature = "heapsize")]
-impl HeapSizeOf for Origin {
-    fn heap_size_of_children(&self) -> usize {
-        match *self {
-            Origin::Tuple(ref scheme, ref host, _) => {
-                scheme.heap_size_of_children() +
-                host.heap_size_of_children()
-            },
-            _ => 0,
-        }
-    }
-}
-
-
-impl Origin {
-    /// Creates a new opaque origin that is only equal to itself.
-    pub fn new_opaque() -> Origin {
-        static COUNTER: AtomicUsize = ATOMIC_USIZE_INIT;
-        Origin::Opaque(OpaqueOrigin(COUNTER.fetch_add(1, Ordering::SeqCst)))
-    }
-
-    /// Return whether this origin is a (scheme, host, port) tuple
-    /// (as opposed to an opaque origin).
-    pub fn is_tuple(&self) -> bool {
-        matches!(*self, Origin::Tuple(..))
-    }
-
-    /// https://html.spec.whatwg.org/multipage/#ascii-serialisation-of-an-origin
-    pub fn ascii_serialization(&self) -> String {
-        match *self {
-            Origin::Opaque(_) => "null".to_owned(),
-            Origin::Tuple(ref scheme, ref host, port) => {
-                if default_port(scheme) == Some(port) {
-                    format!("{}://{}", scheme, host)
-                } else {
-                    format!("{}://{}:{}", scheme, host, port)
-                }
-            }
-        }
-    }
-
-    /// https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin
-    pub fn unicode_serialization(&self) -> String {
-        match *self {
-            Origin::Opaque(_) => "null".to_owned(),
-            Origin::Tuple(ref scheme, ref host, port) => {
-                let host = match *host {
-                    Host::Domain(ref domain) => {
-                        let (domain, _errors) = domain_to_unicode(domain);
-                        Host::Domain(domain)
-                    }
-                    _ => host.clone()
-                };
-                if default_port(scheme) == Some(port) {
-                    format!("{}://{}", scheme, host)
-                } else {
-                    format!("{}://{}:{}", scheme, host, port)
-                }
-            }
-        }
-    }
-}
-
-/// Opaque identifier for URLs that have file or other schemes
-#[derive(Eq, PartialEq, Hash, Clone, Debug)]
-pub struct OpaqueOrigin(usize);
-
-#[cfg(feature = "heapsize")]
-known_heap_size!(0, OpaqueOrigin);
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/parser.rs
+++ /dev/null
@@ -1,1182 +0,0 @@
-// Copyright 2013-2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use std::ascii::AsciiExt;
-use std::error::Error;
-use std::fmt::{self, Formatter, Write};
-use std::str;
-
-use Url;
-use encoding::EncodingOverride;
-use host::{Host, HostInternal};
-use percent_encoding::{
-    utf8_percent_encode, percent_encode,
-    SIMPLE_ENCODE_SET, DEFAULT_ENCODE_SET, USERINFO_ENCODE_SET, QUERY_ENCODE_SET,
-    PATH_SEGMENT_ENCODE_SET
-};
-
-pub type ParseResult<T> = Result<T, ParseError>;
-
-macro_rules! simple_enum_error {
-    ($($name: ident => $description: expr,)+) => {
-        /// Errors that can occur during parsing.
-        #[derive(PartialEq, Eq, Clone, Copy, Debug)]
-        pub enum ParseError {
-            $(
-                $name,
-            )+
-        }
-
-        impl Error for ParseError {
-            fn description(&self) -> &str {
-                match *self {
-                    $(
-                        ParseError::$name => $description,
-                    )+
-                }
-            }
-        }
-    }
-}
-
-simple_enum_error! {
-    EmptyHost => "empty host",
-    IdnaError => "invalid international domain name",
-    InvalidPort => "invalid port number",
-    InvalidIpv4Address => "invalid IPv4 address",
-    InvalidIpv6Address => "invalid IPv6 address",
-    InvalidDomainCharacter => "invalid domain character",
-    RelativeUrlWithoutBase => "relative URL without a base",
-    RelativeUrlWithCannotBeABaseBase => "relative URL with a cannot-be-a-base base",
-    SetHostOnCannotBeABaseUrl => "a cannot-be-a-base URL doesn’t have a host to set",
-    Overflow => "URLs more than 4 GB are not supported",
-}
-
-#[cfg(feature = "heapsize")]
-known_heap_size!(0, ParseError);
-
-impl fmt::Display for ParseError {
-    fn fmt(&self, fmt: &mut Formatter) -> fmt::Result {
-        self.description().fmt(fmt)
-    }
-}
-
-impl From<::idna::uts46::Errors> for ParseError {
-    fn from(_: ::idna::uts46::Errors) -> ParseError { ParseError::IdnaError }
-}
-
-#[derive(Copy, Clone)]
-pub enum SchemeType {
-    File,
-    SpecialNotFile,
-    NotSpecial,
-}
-
-impl SchemeType {
-    pub fn is_special(&self) -> bool {
-        !matches!(*self, SchemeType::NotSpecial)
-    }
-
-    pub fn is_file(&self) -> bool {
-        matches!(*self, SchemeType::File)
-    }
-
-    pub fn from(s: &str) -> Self {
-        match s {
-            "http" | "https" | "ws" | "wss" | "ftp" | "gopher" => SchemeType::SpecialNotFile,
-            "file" => SchemeType::File,
-            _ => SchemeType::NotSpecial,
-        }
-    }
-}
-
-pub fn default_port(scheme: &str) -> Option<u16> {
-    match scheme {
-        "http" | "ws" => Some(80),
-        "https" | "wss" => Some(443),
-        "ftp" => Some(21),
-        "gopher" => Some(70),
-        _ => None,
-    }
-}
-
-#[derive(Clone)]
-pub struct Input<'i> {
-    chars: str::Chars<'i>,
-}
-
-impl<'i> Input<'i> {
-    pub fn new(input: &'i str) -> Self {
-        Input::with_log(input, None)
-    }
-
-    pub fn with_log(original_input: &'i str, log_syntax_violation: Option<&Fn(&'static str)>)
-                    -> Self {
-        let input = original_input.trim_matches(c0_control_or_space);
-        if let Some(log) = log_syntax_violation {
-            if input.len() < original_input.len() {
-                log("leading or trailing control or space character are ignored in URLs")
-            }
-            if input.chars().any(|c| matches!(c, '\t' | '\n' | '\r')) {
-                log("tabs or newlines are ignored in URLs")
-            }
-        }
-        Input { chars: input.chars() }
-    }
-
-    #[inline]
-    pub fn is_empty(&self) -> bool {
-        self.clone().next().is_none()
-    }
-
-    #[inline]
-    fn starts_with<P: Pattern>(&self, p: P) -> bool {
-        p.split_prefix(&mut self.clone())
-    }
-
-    #[inline]
-    pub fn split_prefix<P: Pattern>(&self, p: P) -> Option<Self> {
-        let mut remaining = self.clone();
-        if p.split_prefix(&mut remaining) {
-            Some(remaining)
-        } else {
-            None
-        }
-    }
-
-    #[inline]
-    fn split_first(&self) -> (Option<char>, Self) {
-        let mut remaining = self.clone();
-        (remaining.next(), remaining)
-    }
-
-    #[inline]
-    fn count_matching<F: Fn(char) -> bool>(&self, f: F) -> (u32, Self) {
-        let mut count = 0;
-        let mut remaining = self.clone();
-        loop {
-            let mut input = remaining.clone();
-            if matches!(input.next(), Some(c) if f(c)) {
-                remaining = input;
-                count += 1;
-            } else {
-                return (count, remaining)
-            }
-        }
-    }
-
-    #[inline]
-    fn next_utf8(&mut self) -> Option<(char, &'i str)> {
-        loop {
-            let utf8 = self.chars.as_str();
-            match self.chars.next() {
-                Some(c) => {
-                    if !matches!(c, '\t' | '\n' | '\r') {
-                        return Some((c, &utf8[..c.len_utf8()]))
-                    }
-                }
-                None => return None
-            }
-        }
-    }
-}
-
-pub trait Pattern {
-    fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool;
-}
-
-impl Pattern for char {
-    fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool { input.next() == Some(self) }
-}
-
-impl<'a> Pattern for &'a str {
-    fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool {
-        for c in self.chars() {
-            if input.next() != Some(c) {
-                return false
-            }
-        }
-        true
-    }
-}
-
-impl<F: FnMut(char) -> bool> Pattern for F {
-    fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool { input.next().map_or(false, self) }
-}
-
-impl<'i> Iterator for Input<'i> {
-    type Item = char;
-    fn next(&mut self) -> Option<char> {
-        self.chars.by_ref().find(|&c| !matches!(c, '\t' | '\n' | '\r'))
-    }
-}
-
-pub struct Parser<'a> {
-    pub serialization: String,
-    pub base_url: Option<&'a Url>,
-    pub query_encoding_override: EncodingOverride,
-    pub log_syntax_violation: Option<&'a Fn(&'static str)>,
-    pub context: Context,
-}
-
-#[derive(PartialEq, Eq, Copy, Clone)]
-pub enum Context {
-    UrlParser,
-    Setter,
-    PathSegmentSetter,
-}
-
-impl<'a> Parser<'a> {
-    pub fn for_setter(serialization: String) -> Parser<'a> {
-        Parser {
-            serialization: serialization,
-            base_url: None,
-            query_encoding_override: EncodingOverride::utf8(),
-            log_syntax_violation: None,
-            context: Context::Setter,
-        }
-    }
-
-    fn syntax_violation(&self, reason: &'static str) {
-        if let Some(log) = self.log_syntax_violation {
-            log(reason)
-        }
-    }
-
-    fn syntax_violation_if<F: Fn() -> bool>(&self, reason: &'static str, test: F) {
-        // Skip test if not logging.
-        if let Some(log) = self.log_syntax_violation {
-            if test() {
-                log(reason)
-            }
-        }
-    }
-
-    /// https://url.spec.whatwg.org/#concept-basic-url-parser
-    pub fn parse_url(mut self, input: &str) -> ParseResult<Url> {
-        let input = Input::with_log(input, self.log_syntax_violation);
-        if let Ok(remaining) = self.parse_scheme(input.clone()) {
-            return self.parse_with_scheme(remaining)
-        }
-
-        // No-scheme state
-        if let Some(base_url) = self.base_url {
-            if input.starts_with('#') {
-                self.fragment_only(base_url, input)
-            } else if base_url.cannot_be_a_base() {
-                Err(ParseError::RelativeUrlWithCannotBeABaseBase)
-            } else {
-                let scheme_type = SchemeType::from(base_url.scheme());
-                if scheme_type.is_file() {
-                    self.parse_file(input, Some(base_url))
-                } else {
-                    self.parse_relative(input, scheme_type, base_url)
-                }
-            }
-        } else {
-            Err(ParseError::RelativeUrlWithoutBase)
-        }
-    }
-
-    pub fn parse_scheme<'i>(&mut self, mut input: Input<'i>) -> Result<Input<'i>, ()> {
-        if input.is_empty() || !input.starts_with(ascii_alpha) {
-            return Err(())
-        }
-        debug_assert!(self.serialization.is_empty());
-        while let Some(c) = input.next() {
-            match c {
-                'a'...'z' | 'A'...'Z' | '0'...'9' | '+' | '-' | '.' => {
-                    self.serialization.push(c.to_ascii_lowercase())
-                }
-                ':' => return Ok(input),
-                _ => {
-                    self.serialization.clear();
-                    return Err(())
-                }
-            }
-        }
-        // EOF before ':'
-        if self.context == Context::Setter {
-            Ok(input)
-        } else {
-            self.serialization.clear();
-            Err(())
-        }
-    }
-
-    fn parse_with_scheme(mut self, input: Input) -> ParseResult<Url> {
-        let scheme_end = to_u32(self.serialization.len())?;
-        let scheme_type = SchemeType::from(&self.serialization);
-        self.serialization.push(':');
-        match scheme_type {
-            SchemeType::File => {
-                self.syntax_violation_if("expected // after file:", || !input.starts_with("//"));
-                let base_file_url = self.base_url.and_then(|base| {
-                    if base.scheme() == "file" { Some(base) } else { None }
-                });
-                self.serialization.clear();
-                self.parse_file(input, base_file_url)
-            }
-            SchemeType::SpecialNotFile => {
-                // special relative or authority state
-                let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\'));
-                if let Some(base_url) = self.base_url {
-                    if slashes_count < 2 &&
-                            base_url.scheme() == &self.serialization[..scheme_end as usize] {
-                        // "Cannot-be-a-base" URLs only happen with "not special" schemes.
-                        debug_assert!(!base_url.cannot_be_a_base());
-                        self.serialization.clear();
-                        return self.parse_relative(input, scheme_type, base_url)
-                    }
-                }
-                // special authority slashes state
-                self.syntax_violation_if("expected //", || {
-                    input.clone().take_while(|&c| matches!(c, '/' | '\\'))
-                    .collect::<String>() != "//"
-                });
-                self.after_double_slash(remaining, scheme_type, scheme_end)
-            }
-            SchemeType::NotSpecial => self.parse_non_special(input, scheme_type, scheme_end)
-        }
-    }
-
-    /// Scheme other than file, http, https, ws, ws, ftp, gopher.
-    fn parse_non_special(mut self, input: Input, scheme_type: SchemeType, scheme_end: u32)
-                         -> ParseResult<Url> {
-        // path or authority state (
-        if let Some(input) = input.split_prefix("//") {
-            return self.after_double_slash(input, scheme_type, scheme_end)
-        }
-        // Anarchist URL (no authority)
-        let path_start = to_u32(self.serialization.len())?;
-        let username_end = path_start;
-        let host_start = path_start;
-        let host_end = path_start;
-        let host = HostInternal::None;
-        let port = None;
-        let remaining = if let Some(input) = input.split_prefix('/') {
-            let path_start = self.serialization.len();
-            self.serialization.push('/');
-            self.parse_path(scheme_type, &mut false, path_start, input)
-        } else {
-            self.parse_cannot_be_a_base_path(input)
-        };
-        self.with_query_and_fragment(scheme_end, username_end, host_start,
-                                     host_end, host, port, path_start, remaining)
-    }
-
-    fn parse_file(mut self, input: Input, mut base_file_url: Option<&Url>) -> ParseResult<Url> {
-        // file state
-        debug_assert!(self.serialization.is_empty());
-        let (first_char, input_after_first_char) = input.split_first();
-        match first_char {
-            None => {
-                if let Some(base_url) = base_file_url {
-                    // Copy everything except the fragment
-                    let before_fragment = match base_url.fragment_start {
-                        Some(i) => &base_url.serialization[..i as usize],
-                        None => &*base_url.serialization,
-                    };
-                    self.serialization.push_str(before_fragment);
-                    Ok(Url {
-                        serialization: self.serialization,
-                        fragment_start: None,
-                        ..*base_url
-                    })
-                } else {
-                    self.serialization.push_str("file:///");
-                    let scheme_end = "file".len() as u32;
-                    let path_start = "file://".len() as u32;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: path_start,
-                        host_start: path_start,
-                        host_end: path_start,
-                        host: HostInternal::None,
-                        port: None,
-                        path_start: path_start,
-                        query_start: None,
-                        fragment_start: None,
-                    })
-                }
-            },
-            Some('?') => {
-                if let Some(base_url) = base_file_url {
-                    // Copy everything up to the query string
-                    let before_query = match (base_url.query_start, base_url.fragment_start) {
-                        (None, None) => &*base_url.serialization,
-                        (Some(i), _) |
-                        (None, Some(i)) => base_url.slice(..i)
-                    };
-                    self.serialization.push_str(before_query);
-                    let (query_start, fragment_start) =
-                        self.parse_query_and_fragment(base_url.scheme_end, input)?;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        query_start: query_start,
-                        fragment_start: fragment_start,
-                        ..*base_url
-                    })
-                } else {
-                    self.serialization.push_str("file:///");
-                    let scheme_end = "file".len() as u32;
-                    let path_start = "file://".len() as u32;
-                    let (query_start, fragment_start) =
-                        self.parse_query_and_fragment(scheme_end, input)?;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: path_start,
-                        host_start: path_start,
-                        host_end: path_start,
-                        host: HostInternal::None,
-                        port: None,
-                        path_start: path_start,
-                        query_start: query_start,
-                        fragment_start: fragment_start,
-                    })
-                }
-            },
-            Some('#') => {
-                if let Some(base_url) = base_file_url {
-                    self.fragment_only(base_url, input)
-                } else {
-                    self.serialization.push_str("file:///");
-                    let scheme_end = "file".len() as u32;
-                    let path_start = "file://".len() as u32;
-                    let fragment_start = "file:///".len() as u32;
-                    self.parse_fragment(input_after_first_char);
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: path_start,
-                        host_start: path_start,
-                        host_end: path_start,
-                        host: HostInternal::None,
-                        port: None,
-                        path_start: path_start,
-                        query_start: None,
-                        fragment_start: Some(fragment_start),
-                    })
-                }
-            }
-            Some('/') | Some('\\') => {
-                self.syntax_violation_if("backslash", || first_char == Some('\\'));
-                // file slash state
-                let (next_char, input_after_next_char) = input_after_first_char.split_first();
-                self.syntax_violation_if("backslash", || next_char == Some('\\'));
-                if matches!(next_char, Some('/') | Some('\\')) {
-                    // file host state
-                    self.serialization.push_str("file://");
-                    let scheme_end = "file".len() as u32;
-                    let host_start = "file://".len() as u32;
-                    let (path_start, host, remaining) =
-                        self.parse_file_host(input_after_next_char)?;
-                    let host_end = to_u32(self.serialization.len())?;
-                    let mut has_host = !matches!(host, HostInternal::None);
-                    let remaining = if path_start {
-                        self.parse_path_start(SchemeType::File, &mut has_host, remaining)
-                    } else {
-                        let path_start = self.serialization.len();
-                        self.serialization.push('/');
-                        self.parse_path(SchemeType::File, &mut has_host, path_start, remaining)
-                    };
-                    // FIXME: deal with has_host
-                    let (query_start, fragment_start) =
-                        self.parse_query_and_fragment(scheme_end, remaining)?;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: host_start,
-                        host_start: host_start,
-                        host_end: host_end,
-                        host: host,
-                        port: None,
-                        path_start: host_end,
-                        query_start: query_start,
-                        fragment_start: fragment_start,
-                    })
-                } else {
-                    self.serialization.push_str("file:///");
-                    let scheme_end = "file".len() as u32;
-                    let path_start = "file://".len();
-                    if let Some(base_url) = base_file_url {
-                        let first_segment = base_url.path_segments().unwrap().next().unwrap();
-                        // FIXME: *normalized* drive letter
-                        if is_windows_drive_letter(first_segment) {
-                            self.serialization.push_str(first_segment);
-                            self.serialization.push('/');
-                        }
-                    }
-                    let remaining = self.parse_path(
-                        SchemeType::File, &mut false, path_start, input_after_first_char);
-                    let (query_start, fragment_start) =
-                        self.parse_query_and_fragment(scheme_end, remaining)?;
-                    let path_start = path_start as u32;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: path_start,
-                        host_start: path_start,
-                        host_end: path_start,
-                        host: HostInternal::None,
-                        port: None,
-                        path_start: path_start,
-                        query_start: query_start,
-                        fragment_start: fragment_start,
-                    })
-                }
-            }
-            _ => {
-                if starts_with_windows_drive_letter_segment(&input) {
-                    base_file_url = None;
-                }
-                if let Some(base_url) = base_file_url {
-                    let before_query = match (base_url.query_start, base_url.fragment_start) {
-                        (None, None) => &*base_url.serialization,
-                        (Some(i), _) |
-                        (None, Some(i)) => base_url.slice(..i)
-                    };
-                    self.serialization.push_str(before_query);
-                    self.pop_path(SchemeType::File, base_url.path_start as usize);
-                    let remaining = self.parse_path(
-                        SchemeType::File, &mut true, base_url.path_start as usize, input);
-                    self.with_query_and_fragment(
-                        base_url.scheme_end, base_url.username_end, base_url.host_start,
-                        base_url.host_end, base_url.host, base_url.port, base_url.path_start, remaining)
-                } else {
-                    self.serialization.push_str("file:///");
-                    let scheme_end = "file".len() as u32;
-                    let path_start = "file://".len();
-                    let remaining = self.parse_path(
-                        SchemeType::File, &mut false, path_start, input);
-                    let (query_start, fragment_start) =
-                        self.parse_query_and_fragment(scheme_end, remaining)?;
-                    let path_start = path_start as u32;
-                    Ok(Url {
-                        serialization: self.serialization,
-                        scheme_end: scheme_end,
-                        username_end: path_start,
-                        host_start: path_start,
-                        host_end: path_start,
-                        host: HostInternal::None,
-                        port: None,
-                        path_start: path_start,
-                        query_start: query_start,
-                        fragment_start: fragment_start,
-                    })
-                }
-            }
-        }
-    }
-
-    fn parse_relative(mut self, input: Input, scheme_type: SchemeType, base_url: &Url)
-                      -> ParseResult<Url> {
-        // relative state
-        debug_assert!(self.serialization.is_empty());
-        let (first_char, input_after_first_char) = input.split_first();
-        match first_char {
-            None => {
-                // Copy everything except the fragment
-                let before_fragment = match base_url.fragment_start {
-                    Some(i) => &base_url.serialization[..i as usize],
-                    None => &*base_url.serialization,
-                };
-                self.serialization.push_str(before_fragment);
-                Ok(Url {
-                    serialization: self.serialization,
-                    fragment_start: None,
-                    ..*base_url
-                })
-            },
-            Some('?') => {
-                // Copy everything up to the query string
-                let before_query = match (base_url.query_start, base_url.fragment_start) {
-                    (None, None) => &*base_url.serialization,
-                    (Some(i), _) |
-                    (None, Some(i)) => base_url.slice(..i)
-                };
-                self.serialization.push_str(before_query);
-                let (query_start, fragment_start) =
-                    self.parse_query_and_fragment(base_url.scheme_end, input)?;
-                Ok(Url {
-                    serialization: self.serialization,
-                    query_start: query_start,
-                    fragment_start: fragment_start,
-                    ..*base_url
-                })
-            },
-            Some('#') => self.fragment_only(base_url, input),
-            Some('/') | Some('\\') => {
-                let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\'));
-                if slashes_count >= 2 {
-                    self.syntax_violation_if("expected //", || {
-                        input.clone().take_while(|&c| matches!(c, '/' | '\\'))
-                        .collect::<String>() != "//"
-                    });
-                    let scheme_end = base_url.scheme_end;
-                    debug_assert!(base_url.byte_at(scheme_end) == b':');
-                    self.serialization.push_str(base_url.slice(..scheme_end + 1));
-                    return self.after_double_slash(remaining, scheme_type, scheme_end)
-                }
-                let path_start = base_url.path_start;
-                debug_assert!(base_url.byte_at(path_start) == b'/');
-                self.serialization.push_str(base_url.slice(..path_start + 1));
-                let remaining = self.parse_path(
-                    scheme_type, &mut true, path_start as usize, input_after_first_char);
-                self.with_query_and_fragment(
-                    base_url.scheme_end, base_url.username_end, base_url.host_start,
-                    base_url.host_end, base_url.host, base_url.port, base_url.path_start, remaining)
-            }
-            _ => {
-                let before_query = match (base_url.query_start, base_url.fragment_start) {
-                    (None, None) => &*base_url.serialization,
-                    (Some(i), _) |
-                    (None, Some(i)) => base_url.slice(..i)
-                };
-                self.serialization.push_str(before_query);
-                // FIXME spec says just "remove last entry", not the "pop" algorithm
-                self.pop_path(scheme_type, base_url.path_start as usize);
-                let remaining = self.parse_path(
-                    scheme_type, &mut true, base_url.path_start as usize, input);
-                self.with_query_and_fragment(
-                    base_url.scheme_end, base_url.username_end, base_url.host_start,
-                    base_url.host_end, base_url.host, base_url.port, base_url.path_start, remaining)
-            }
-        }
-    }
-
-    fn after_double_slash(mut self, input: Input, scheme_type: SchemeType, scheme_end: u32)
-                          -> ParseResult<Url> {
-        self.serialization.push('/');
-        self.serialization.push('/');
-        // authority state
-        let (username_end, remaining) = self.parse_userinfo(input, scheme_type)?;
-        // host state
-        let host_start = to_u32(self.serialization.len())?;
-        let (host_end, host, port, remaining) =
-            self.parse_host_and_port(remaining, scheme_end, scheme_type)?;
-        // path state
-        let path_start = to_u32(self.serialization.len())?;
-        let remaining = self.parse_path_start(
-            scheme_type, &mut true, remaining);
-        self.with_query_and_fragment(scheme_end, username_end, host_start,
-                                     host_end, host, port, path_start, remaining)
-    }
-
-    /// Return (username_end, remaining)
-    fn parse_userinfo<'i>(&mut self, mut input: Input<'i>, scheme_type: SchemeType)
-                          -> ParseResult<(u32, Input<'i>)> {
-        let mut last_at = None;
-        let mut remaining = input.clone();
-        let mut char_count = 0;
-        while let Some(c) = remaining.next() {
-            match c {
-                '@' => {
-                    if last_at.is_some() {
-                        self.syntax_violation("unencoded @ sign in username or password")
-                    } else {
-                        self.syntax_violation(
-                            "embedding authentification information (username or password) \
-                            in an URL is not recommended")
-                    }
-                    last_at = Some((char_count, remaining.clone()))
-                },
-                '/' | '?' | '#' => break,
-                '\\' if scheme_type.is_special() => break,
-                _ => (),
-            }
-            char_count += 1;
-        }
-        let (mut userinfo_char_count, remaining) = match last_at {
-            None => return Ok((to_u32(self.serialization.len())?, input)),
-            Some((0, remaining)) => return Ok((to_u32(self.serialization.len())?, remaining)),
-            Some(x) => x
-        };
-
-        let mut username_end = None;
-        while userinfo_char_count > 0 {
-            let (c, utf8_c) = input.next_utf8().unwrap();
-            userinfo_char_count -= 1;
-            if c == ':' && username_end.is_none() {
-                // Start parsing password
-                username_end = Some(to_u32(self.serialization.len())?);
-                self.serialization.push(':');
-            } else {
-                self.check_url_code_point(c, &input);
-                self.serialization.extend(utf8_percent_encode(utf8_c, USERINFO_ENCODE_SET));
-            }
-        }
-        let username_end = match username_end {
-            Some(i) => i,
-            None => to_u32(self.serialization.len())?,
-        };
-        self.serialization.push('@');
-        Ok((username_end, remaining))
-    }
-
-    fn parse_host_and_port<'i>(&mut self, input: Input<'i>,
-                                   scheme_end: u32, scheme_type: SchemeType)
-                                   -> ParseResult<(u32, HostInternal, Option<u16>, Input<'i>)> {
-        let (host, remaining) = Parser::parse_host(input, scheme_type)?;
-        write!(&mut self.serialization, "{}", host).unwrap();
-        let host_end = to_u32(self.serialization.len())?;
-        let (port, remaining) = if let Some(remaining) = remaining.split_prefix(':') {
-            let scheme = || default_port(&self.serialization[..scheme_end as usize]);
-            Parser::parse_port(remaining, scheme, self.context)?
-        } else {
-            (None, remaining)
-        };
-        if let Some(port) = port {
-            write!(&mut self.serialization, ":{}", port).unwrap()
-        }
-        Ok((host_end, host.into(), port, remaining))
-    }
-
-    pub fn parse_host(mut input: Input, scheme_type: SchemeType)
-                             -> ParseResult<(Host<String>, Input)> {
-        // Undo the Input abstraction here to avoid allocating in the common case
-        // where the host part of the input does not contain any tab or newline
-        let input_str = input.chars.as_str();
-        let mut inside_square_brackets = false;
-        let mut has_ignored_chars = false;
-        let mut non_ignored_chars = 0;
-        let mut bytes = 0;
-        for c in input_str.chars() {
-            match c {
-                ':' if !inside_square_brackets => break,
-                '\\' if scheme_type.is_special() => break,
-                '/' | '?' | '#' => break,
-                '\t' | '\n' | '\r' => {
-                    has_ignored_chars = true;
-                }
-                '[' => {
-                    inside_square_brackets = true;
-                    non_ignored_chars += 1
-                }
-                ']' => {
-                    inside_square_brackets = false;
-                    non_ignored_chars += 1
-                }
-                _ => non_ignored_chars += 1
-            }
-            bytes += c.len_utf8();
-        }
-        let replaced: String;
-        let host_str;
-        {
-            let host_input = input.by_ref().take(non_ignored_chars);
-            if has_ignored_chars {
-                replaced = host_input.collect();
-                host_str = &*replaced
-            } else {
-                for _ in host_input {}
-                host_str = &input_str[..bytes]
-            }
-        }
-        if scheme_type.is_special() && host_str.is_empty() {
-            return Err(ParseError::EmptyHost)
-        }
-        let host = Host::parse(host_str)?;
-        Ok((host, input))
-    }
-
-    pub fn parse_file_host<'i>(&mut self, input: Input<'i>)
-                               -> ParseResult<(bool, HostInternal, Input<'i>)> {
-        // Undo the Input abstraction here to avoid allocating in the common case
-        // where the host part of the input does not contain any tab or newline
-        let input_str = input.chars.as_str();
-        let mut has_ignored_chars = false;
-        let mut non_ignored_chars = 0;
-        let mut bytes = 0;
-        for c in input_str.chars() {
-            match c {
-                '/' | '\\' | '?' | '#' => break,
-                '\t' | '\n' | '\r' => has_ignored_chars = true,
-                _ => non_ignored_chars += 1,
-            }
-            bytes += c.len_utf8();
-        }
-        let replaced: String;
-        let host_str;
-        let mut remaining = input.clone();
-        {
-            let host_input = remaining.by_ref().take(non_ignored_chars);
-            if has_ignored_chars {
-                replaced = host_input.collect();
-                host_str = &*replaced
-            } else {
-                for _ in host_input {}
-                host_str = &input_str[..bytes]
-            }
-        }
-        if is_windows_drive_letter(host_str) {
-            return Ok((false, HostInternal::None, input))
-        }
-        let host = if host_str.is_empty() {
-            HostInternal::None
-        } else {
-            match Host::parse(host_str)? {
-                Host::Domain(ref d) if d == "localhost" => HostInternal::None,
-                host => {
-                    write!(&mut self.serialization, "{}", host).unwrap();
-                    host.into()
-                }
-            }
-        };
-        Ok((true, host, remaining))
-    }
-
-    pub fn parse_port<P>(mut input: Input, default_port: P,
-                                context: Context)
-                                -> ParseResult<(Option<u16>, Input)>
-                                where P: Fn() -> Option<u16> {
-        let mut port: u32 = 0;
-        let mut has_any_digit = false;
-        while let (Some(c), remaining) = input.split_first() {
-            if let Some(digit) = c.to_digit(10) {
-                port = port * 10 + digit;
-                if port > ::std::u16::MAX as u32 {
-                    return Err(ParseError::InvalidPort)
-                }
-                has_any_digit = true;
-            } else if context == Context::UrlParser && !matches!(c, '/' | '\\' | '?' | '#') {
-                return Err(ParseError::InvalidPort)
-            } else {
-                break
-            }
-            input = remaining;
-        }
-        let mut opt_port = Some(port as u16);
-        if !has_any_digit || opt_port == default_port() {
-            opt_port = None;
-        }
-        Ok((opt_port, input))
-    }
-
-    pub fn parse_path_start<'i>(&mut self, scheme_type: SchemeType, has_host: &mut bool,
-                            mut input: Input<'i>)
-                            -> Input<'i> {
-        // Path start state
-        match input.split_first() {
-            (Some('/'), remaining) => input = remaining,
-            (Some('\\'), remaining) => if scheme_type.is_special() {
-                self.syntax_violation("backslash");
-                input = remaining
-            },
-            _ => {}
-        }
-        let path_start = self.serialization.len();
-        self.serialization.push('/');
-        self.parse_path(scheme_type, has_host, path_start, input)
-    }
-
-    pub fn parse_path<'i>(&mut self, scheme_type: SchemeType, has_host: &mut bool,
-                          path_start: usize, mut input: Input<'i>)
-                          -> Input<'i> {
-        // Relative path state
-        debug_assert!(self.serialization.ends_with('/'));
-        loop {
-            let segment_start = self.serialization.len();
-            let mut ends_with_slash = false;
-            loop {
-                let input_before_c = input.clone();
-                let (c, utf8_c) = if let Some(x) = input.next_utf8() { x } else { break };
-                match c {
-                    '/' if self.context != Context::PathSegmentSetter => {
-                        ends_with_slash = true;
-                        break
-                    },
-                    '\\' if self.context != Context::PathSegmentSetter &&
-                            scheme_type.is_special() => {
-                        self.syntax_violation("backslash");
-                        ends_with_slash = true;
-                        break
-                    },
-                    '?' | '#' if self.context == Context::UrlParser => {
-                        input = input_before_c;
-                        break
-                    },
-                    _ => {
-                        self.check_url_code_point(c, &input);
-                        if c == '%' {
-                            let after_percent_sign = input.clone();
-                            if matches!(input.next(), Some('2')) &&
-                                    matches!(input.next(), Some('E') | Some('e')) {
-                                self.serialization.push('.');
-                                continue
-                            }
-                            input = after_percent_sign
-                        }
-                        if self.context == Context::PathSegmentSetter {
-                            self.serialization.extend(utf8_percent_encode(
-                                utf8_c, PATH_SEGMENT_ENCODE_SET));
-                        } else {
-                            self.serialization.extend(utf8_percent_encode(
-                                utf8_c, DEFAULT_ENCODE_SET));
-                        }
-                    }
-                }
-            }
-            match &self.serialization[segment_start..] {
-                ".." => {
-                    debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/');
-                    self.serialization.truncate(segment_start - 1);  // Truncate "/.."
-                    self.pop_path(scheme_type, path_start);
-                    if !self.serialization[path_start..].ends_with('/') {
-                        self.serialization.push('/')
-                    }
-                },
-                "." => {
-                    self.serialization.truncate(segment_start);
-                },
-                _ => {
-                    if scheme_type.is_file() && is_windows_drive_letter(
-                        &self.serialization[path_start + 1..]
-                    ) {
-                        if self.serialization.ends_with('|') {
-                            self.serialization.pop();
-                            self.serialization.push(':');
-                        }
-                        if *has_host {
-                            self.syntax_violation("file: with host and Windows drive letter");
-                            *has_host = false;  // FIXME account for this in callers
-                        }
-                    }
-                    if ends_with_slash {
-                        self.serialization.push('/')
-                    }
-                }
-            }
-            if !ends_with_slash {
-                break
-            }
-        }
-        input
-    }
-
-    /// https://url.spec.whatwg.org/#pop-a-urls-path
-    fn pop_path(&mut self, scheme_type: SchemeType, path_start: usize) {
-        if self.serialization.len() > path_start {
-            let slash_position = self.serialization[path_start..].rfind('/').unwrap();
-            // + 1 since rfind returns the position before the slash.
-            let segment_start = path_start + slash_position + 1;
-            // Don’t pop a Windows drive letter
-            // FIXME: *normalized* Windows drive letter
-            if !(
-                scheme_type.is_file() &&
-                is_windows_drive_letter(&self.serialization[segment_start..])
-            ) {
-                self.serialization.truncate(segment_start);
-            }
-        }
-
-    }
-
-    pub fn parse_cannot_be_a_base_path<'i>(&mut self, mut input: Input<'i>) -> Input<'i> {
-        loop {
-            let input_before_c = input.clone();
-            match input.next_utf8() {
-                Some(('?', _)) | Some(('#', _)) if self.context == Context::UrlParser => {
-                    return input_before_c
-                }
-                Some((c, utf8_c)) => {
-                    self.check_url_code_point(c, &input);
-                    self.serialization.extend(utf8_percent_encode(
-                        utf8_c, SIMPLE_ENCODE_SET));
-                }
-                None => return input
-            }
-        }
-    }
-
-    fn with_query_and_fragment(mut self, scheme_end: u32, username_end: u32,
-                               host_start: u32, host_end: u32, host: HostInternal,
-                               port: Option<u16>, path_start: u32, remaining: Input)
-                               -> ParseResult<Url> {
-        let (query_start, fragment_start) =
-            self.parse_query_and_fragment(scheme_end, remaining)?;
-        Ok(Url {
-            serialization: self.serialization,
-            scheme_end: scheme_end,
-            username_end: username_end,
-            host_start: host_start,
-            host_end: host_end,
-            host: host,
-            port: port,
-            path_start: path_start,
-            query_start: query_start,
-            fragment_start: fragment_start
-        })
-    }
-
-    /// Return (query_start, fragment_start)
-    fn parse_query_and_fragment(&mut self, scheme_end: u32, mut input: Input)
-                                -> ParseResult<(Option<u32>, Option<u32>)> {
-        let mut query_start = None;
-        match input.next() {
-            Some('#') => {}
-            Some('?') => {
-                query_start = Some(to_u32(self.serialization.len())?);
-                self.serialization.push('?');
-                let remaining = self.parse_query(scheme_end, input);
-                if let Some(remaining) = remaining {
-                    input = remaining
-                } else {
-                    return Ok((query_start, None))
-                }
-            }
-            None => return Ok((None, None)),
-            _ => panic!("Programming error. parse_query_and_fragment() called without ? or #")
-        }
-
-        let fragment_start = to_u32(self.serialization.len())?;
-        self.serialization.push('#');
-        self.parse_fragment(input);
-        Ok((query_start, Some(fragment_start)))
-    }
-
-    pub fn parse_query<'i>(&mut self, scheme_end: u32, mut input: Input<'i>)
-                           -> Option<Input<'i>> {
-        let mut query = String::new();  // FIXME: use a streaming decoder instead
-        let mut remaining = None;
-        while let Some(c) = input.next() {
-            if c == '#' && self.context == Context::UrlParser {
-                remaining = Some(input);
-                break
-            } else {
-                self.check_url_code_point(c, &input);
-                query.push(c);
-            }
-        }
-
-        let encoding = match &self.serialization[..scheme_end as usize] {
-            "http" | "https" | "file" | "ftp" | "gopher" => self.query_encoding_override,
-            _ => EncodingOverride::utf8(),
-        };
-        let query_bytes = encoding.encode(query.into());
-        self.serialization.extend(percent_encode(&query_bytes, QUERY_ENCODE_SET));
-        remaining
-    }
-
-    fn fragment_only(mut self, base_url: &Url, mut input: Input) -> ParseResult<Url> {
-        let before_fragment = match base_url.fragment_start {
-            Some(i) => base_url.slice(..i),
-            None => &*base_url.serialization,
-        };
-        debug_assert!(self.serialization.is_empty());
-        self.serialization.reserve(before_fragment.len() + input.chars.as_str().len());
-        self.serialization.push_str(before_fragment);
-        self.serialization.push('#');
-        let next = input.next();
-        debug_assert!(next == Some('#'));
-        self.parse_fragment(input);
-        Ok(Url {
-            serialization: self.serialization,
-            fragment_start: Some(to_u32(before_fragment.len())?),
-            ..*base_url
-        })
-    }
-
-    pub fn parse_fragment(&mut self, mut input: Input) {
-        while let Some((c, utf8_c)) = input.next_utf8() {
-            if c ==  '\0' {
-                self.syntax_violation("NULL characters are ignored in URL fragment identifiers")
-            } else {
-                self.check_url_code_point(c, &input);
-                self.serialization.extend(utf8_percent_encode(utf8_c,
-                                                              SIMPLE_ENCODE_SET));
-            }
-        }
-    }
-
-    fn check_url_code_point(&self, c: char, input: &Input) {
-        if let Some(log) = self.log_syntax_violation {
-            if c == '%' {
-                let mut input = input.clone();
-                if !matches!((input.next(), input.next()), (Some(a), Some(b))
-                             if is_ascii_hex_digit(a) && is_ascii_hex_digit(b)) {
-                    log("expected 2 hex digits after %")
-                }
-            } else if !is_url_code_point(c) {
-                log("non-URL code point")
-            }
-        }
-    }
-}
-
-#[inline]
-fn is_ascii_hex_digit(c: char) -> bool {
-    matches!(c, 'a'...'f' | 'A'...'F' | '0'...'9')
-}
-
-// Non URL code points:
-// U+0000 to U+0020 (space)
-// " # % < > [ \ ] ^ ` { | }
-// U+007F to U+009F
-// surrogates
-// U+FDD0 to U+FDEF
-// Last two of each plane: U+__FFFE to U+__FFFF for __ in 00 to 10 hex
-#[inline]
-fn is_url_code_point(c: char) -> bool {
-    matches!(c,
-        'a'...'z' |
-        'A'...'Z' |
-        '0'...'9' |
-        '!' | '$' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | '-' |
-        '.' | '/' | ':' | ';' | '=' | '?' | '@' | '_' | '~' |
-        '\u{A0}'...'\u{D7FF}' | '\u{E000}'...'\u{FDCF}' | '\u{FDF0}'...'\u{FFFD}' |
-        '\u{10000}'...'\u{1FFFD}' | '\u{20000}'...'\u{2FFFD}' |
-        '\u{30000}'...'\u{3FFFD}' | '\u{40000}'...'\u{4FFFD}' |
-        '\u{50000}'...'\u{5FFFD}' | '\u{60000}'...'\u{6FFFD}' |
-        '\u{70000}'...'\u{7FFFD}' | '\u{80000}'...'\u{8FFFD}' |
-        '\u{90000}'...'\u{9FFFD}' | '\u{A0000}'...'\u{AFFFD}' |
-        '\u{B0000}'...'\u{BFFFD}' | '\u{C0000}'...'\u{CFFFD}' |
-        '\u{D0000}'...'\u{DFFFD}' | '\u{E1000}'...'\u{EFFFD}' |
-        '\u{F0000}'...'\u{FFFFD}' | '\u{100000}'...'\u{10FFFD}')
-}
-
-/// https://url.spec.whatwg.org/#c0-controls-and-space
-#[inline]
-fn c0_control_or_space(ch: char) -> bool {
-    ch <= ' '  // U+0000 to U+0020
-}
-
-/// https://url.spec.whatwg.org/#ascii-alpha
-#[inline]
-pub fn ascii_alpha(ch: char) -> bool {
-    matches!(ch, 'a'...'z' | 'A'...'Z')
-}
-
-#[inline]
-pub fn to_u32(i: usize) -> ParseResult<u32> {
-    if i <= ::std::u32::MAX as usize {
-        Ok(i as u32)
-    } else {
-        Err(ParseError::Overflow)
-    }
-}
-
-/// Wether the scheme is file:, the path has a single segment, and that segment
-/// is a Windows drive letter
-fn is_windows_drive_letter(segment: &str) -> bool {
-    segment.len() == 2
-    && starts_with_windows_drive_letter(segment)
-}
-
-fn starts_with_windows_drive_letter(s: &str) -> bool {
-    ascii_alpha(s.as_bytes()[0] as char)
-    && matches!(s.as_bytes()[1], b':' | b'|')
-}
-
-fn starts_with_windows_drive_letter_segment(input: &Input) -> bool {
-    let mut input = input.clone();
-    matches!((input.next(), input.next(), input.next()), (Some(a), Some(b), Some(c))
-             if ascii_alpha(a) && matches!(b, ':' | '|') && matches!(c, '/' | '\\' | '?' | '#'))
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/path_segments.rs
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright 2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use parser::{self, SchemeType, to_u32};
-use std::str;
-use Url;
-
-/// Exposes methods to manipulate the path of an URL that is not cannot-be-base.
-///
-/// The path always starts with a `/` slash, and is made of slash-separated segments.
-/// There is always at least one segment (which may be the empty string).
-///
-/// Examples:
-///
-/// ```rust
-/// use url::Url;
-/// # use std::error::Error;
-///
-/// # fn run() -> Result<(), Box<Error>> {
-/// let mut url = Url::parse("mailto:me@example.com")?;
-/// assert!(url.path_segments_mut().is_err());
-///
-/// let mut url = Url::parse("http://example.net/foo/index.html")?;
-/// url.path_segments_mut().map_err(|_| "cannot be base")?
-///     .pop().push("img").push("2/100%.png");
-/// assert_eq!(url.as_str(), "http://example.net/foo/img/2%2F100%25.png");
-/// # Ok(())
-/// # }
-/// # run().unwrap();
-/// ```
-#[derive(Debug)]
-pub struct PathSegmentsMut<'a> {
-    url: &'a mut Url,
-    after_first_slash: usize,
-    after_path: String,
-    old_after_path_position: u32,
-}
-
-// Not re-exported outside the crate
-pub fn new(url: &mut Url) -> PathSegmentsMut {
-    let after_path = url.take_after_path();
-    let old_after_path_position = to_u32(url.serialization.len()).unwrap();
-    debug_assert!(url.byte_at(url.path_start) == b'/');
-    PathSegmentsMut {
-        after_first_slash: url.path_start as usize + "/".len(),
-        url: url,
-        old_after_path_position: old_after_path_position,
-        after_path: after_path,
-    }
-}
-
-impl<'a> Drop for PathSegmentsMut<'a> {
-    fn drop(&mut self) {
-        self.url.restore_after_path(self.old_after_path_position, &self.after_path)
-    }
-}
-
-impl<'a> PathSegmentsMut<'a> {
-    /// Remove all segments in the path, leaving the minimal `url.path() == "/"`.
-    ///
-    /// Returns `&mut Self` so that method calls can be chained.
-    ///
-    /// Example:
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let mut url = Url::parse("https://github.com/servo/rust-url/")?;
-    /// url.path_segments_mut().map_err(|_| "cannot be base")?
-    ///     .clear().push("logout");
-    /// assert_eq!(url.as_str(), "https://github.com/logout");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn clear(&mut self) -> &mut Self {
-        self.url.serialization.truncate(self.after_first_slash);
-        self
-    }
-
-    /// Remove the last segment of this URL’s path if it is empty,
-    /// except if these was only one segment to begin with.
-    ///
-    /// In other words, remove one path trailing slash, if any,
-    /// unless it is also the initial slash (so this does nothing if `url.path() == "/")`.
-    ///
-    /// Returns `&mut Self` so that method calls can be chained.
-    ///
-    /// Example:
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let mut url = Url::parse("https://github.com/servo/rust-url/")?;
-    /// url.path_segments_mut().map_err(|_| "cannot be base")?
-    ///     .push("pulls");
-    /// assert_eq!(url.as_str(), "https://github.com/servo/rust-url//pulls");
-    ///
-    /// let mut url = Url::parse("https://github.com/servo/rust-url/")?;
-    /// url.path_segments_mut().map_err(|_| "cannot be base")?
-    ///     .pop_if_empty().push("pulls");
-    /// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/pulls");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn pop_if_empty(&mut self) -> &mut Self {
-        if self.url.serialization[self.after_first_slash..].ends_with('/') {
-            self.url.serialization.pop();
-        }
-        self
-    }
-
-    /// Remove the last segment of this URL’s path.
-    ///
-    /// If the path only has one segment, make it empty such that `url.path() == "/"`.
-    ///
-    /// Returns `&mut Self` so that method calls can be chained.
-    pub fn pop(&mut self) -> &mut Self {
-        let last_slash = self.url.serialization[self.after_first_slash..].rfind('/').unwrap_or(0);
-        self.url.serialization.truncate(self.after_first_slash + last_slash);
-        self
-    }
-
-    /// Append the given segment at the end of this URL’s path.
-    ///
-    /// See the documentation for `.extend()`.
-    ///
-    /// Returns `&mut Self` so that method calls can be chained.
-    pub fn push(&mut self, segment: &str) -> &mut Self {
-        self.extend(Some(segment))
-    }
-
-    /// Append each segment from the given iterator at the end of this URL’s path.
-    ///
-    /// Each segment is percent-encoded like in `Url::parse` or `Url::join`,
-    /// except that `%` and `/` characters are also encoded (to `%25` and `%2F`).
-    /// This is unlike `Url::parse` where `%` is left as-is in case some of the input
-    /// is already percent-encoded, and `/` denotes a path segment separator.)
-    ///
-    /// Note that, in addition to slashes between new segments,
-    /// this always adds a slash between the existing path and the new segments
-    /// *except* if the existing path is `"/"`.
-    /// If the previous last segment was empty (if the path had a trailing slash)
-    /// the path after `.extend()` will contain two consecutive slashes.
-    /// If that is undesired, call `.pop_if_empty()` first.
-    ///
-    /// To obtain a behavior similar to `Url::join`, call `.pop()` unconditionally first.
-    ///
-    /// Returns `&mut Self` so that method calls can be chained.
-    ///
-    /// Example:
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let mut url = Url::parse("https://github.com/")?;
-    /// let org = "servo";
-    /// let repo = "rust-url";
-    /// let issue_number = "188";
-    /// url.path_segments_mut().map_err(|_| "cannot be base")?
-    ///     .extend(&[org, repo, "issues", issue_number]);
-    /// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/issues/188");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    ///
-    /// In order to make sure that parsing the serialization of an URL gives the same URL,
-    /// a segment is ignored if it is `"."` or `".."`:
-    ///
-    /// ```rust
-    /// use url::Url;
-    /// # use std::error::Error;
-    ///
-    /// # fn run() -> Result<(), Box<Error>> {
-    /// let mut url = Url::parse("https://github.com/servo")?;
-    /// url.path_segments_mut().map_err(|_| "cannot be base")?
-    ///     .extend(&["..", "rust-url", ".", "pulls"]);
-    /// assert_eq!(url.as_str(), "https://github.com/servo/rust-url/pulls");
-    /// # Ok(())
-    /// # }
-    /// # run().unwrap();
-    /// ```
-    pub fn extend<I>(&mut self, segments: I) -> &mut Self
-    where I: IntoIterator, I::Item: AsRef<str> {
-        let scheme_type = SchemeType::from(self.url.scheme());
-        let path_start = self.url.path_start as usize;
-        self.url.mutate(|parser| {
-            parser.context = parser::Context::PathSegmentSetter;
-            for segment in segments {
-                let segment = segment.as_ref();
-                if matches!(segment, "." | "..") {
-                    continue
-                }
-                if parser.serialization.len() > path_start + 1 {
-                    parser.serialization.push('/');
-                }
-                let mut has_host = true;  // FIXME account for this?
-                parser.parse_path(scheme_type, &mut has_host, path_start,
-                                  parser::Input::new(segment));
-            }
-        });
-        self
-    }
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/quirks.rs
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright 2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Getters and setters for URL components implemented per https://url.spec.whatwg.org/#api
-//!
-//! Unless you need to be interoperable with web browsers,
-//! you probably want to use `Url` method instead.
-
-use {Url, Position, Host, ParseError, idna};
-use parser::{Parser, SchemeType, default_port, Context, Input};
-
-/// https://url.spec.whatwg.org/#dom-url-domaintoascii
-pub fn domain_to_ascii(domain: &str) -> String {
-    match Host::parse(domain) {
-        Ok(Host::Domain(domain)) => domain,
-        _ => String::new(),
-    }
-}
-
-/// https://url.spec.whatwg.org/#dom-url-domaintounicode
-pub fn domain_to_unicode(domain: &str) -> String {
-    match Host::parse(domain) {
-        Ok(Host::Domain(ref domain)) => {
-            let (unicode, _errors) = idna::domain_to_unicode(domain);
-            unicode
-        }
-        _ => String::new(),
-    }
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-href
-pub fn href(url: &Url) -> &str {
-    url.as_str()
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-href
-pub fn set_href(url: &mut Url, value: &str) -> Result<(), ParseError> {
-    *url = Url::parse(value)?;
-    Ok(())
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-origin
-pub fn origin(url: &Url) -> String {
-    url.origin().unicode_serialization()
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-protocol
-#[inline]
-pub fn protocol(url: &Url) -> &str {
-    &url.as_str()[..url.scheme().len() + ":".len()]
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-protocol
-pub fn set_protocol(url: &mut Url, mut new_protocol: &str) -> Result<(), ()> {
-    // The scheme state in the spec ignores everything after the first `:`,
-    // but `set_scheme` errors if there is more.
-    if let Some(position) = new_protocol.find(':') {
-        new_protocol = &new_protocol[..position];
-    }
-    url.set_scheme(new_protocol)
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-username
-#[inline]
-pub fn username(url: &Url) -> &str {
-    url.username()
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-username
-pub fn set_username(url: &mut Url, new_username: &str) -> Result<(), ()> {
-    url.set_username(new_username)
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-password
-#[inline]
-pub fn password(url: &Url) -> &str {
-    url.password().unwrap_or("")
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-password
-pub fn set_password(url: &mut Url, new_password: &str) -> Result<(), ()> {
-    url.set_password(if new_password.is_empty() { None } else { Some(new_password) })
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-host
-#[inline]
-pub fn host(url: &Url) -> &str {
-    &url[Position::BeforeHost..Position::AfterPort]
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-host
-pub fn set_host(url: &mut Url, new_host: &str) -> Result<(), ()> {
-    if url.cannot_be_a_base() {
-        return Err(())
-    }
-    let host;
-    let opt_port;
-    {
-        let scheme = url.scheme();
-        let result = Parser::parse_host(Input::new(new_host), SchemeType::from(scheme));
-        match result {
-            Ok((h, remaining)) => {
-                host = h;
-                opt_port = if let Some(remaining) = remaining.split_prefix(':') {
-                    Parser::parse_port(remaining, || default_port(scheme), Context::Setter)
-                    .ok().map(|(port, _remaining)| port)
-                } else {
-                    None
-                };
-            }
-            Err(_) => return Err(())
-        }
-    }
-    url.set_host_internal(host, opt_port);
-    Ok(())
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-hostname
-#[inline]
-pub fn hostname(url: &Url) -> &str {
-    url.host_str().unwrap_or("")
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-hostname
-pub fn set_hostname(url: &mut Url, new_hostname: &str) -> Result<(), ()> {
-    if url.cannot_be_a_base() {
-        return Err(())
-    }
-    let result = Parser::parse_host(Input::new(new_hostname), SchemeType::from(url.scheme()));
-    if let Ok((host, _remaining)) = result {
-        url.set_host_internal(host, None);
-        Ok(())
-    } else {
-        Err(())
-    }
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-port
-#[inline]
-pub fn port(url: &Url) -> &str {
-    &url[Position::BeforePort..Position::AfterPort]
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-port
-pub fn set_port(url: &mut Url, new_port: &str) -> Result<(), ()> {
-    let result;
-    {
-        // has_host implies !cannot_be_a_base
-        let scheme = url.scheme();
-        if !url.has_host() || scheme == "file" {
-            return Err(())
-        }
-        result = Parser::parse_port(Input::new(new_port), || default_port(scheme), Context::Setter)
-    }
-    if let Ok((new_port, _remaining)) = result {
-        url.set_port_internal(new_port);
-        Ok(())
-    } else {
-        Err(())
-    }
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-pathname
-#[inline]
-pub fn pathname(url: &Url) -> &str {
-     url.path()
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-pathname
-pub fn set_pathname(url: &mut Url, new_pathname: &str) {
-    if !url.cannot_be_a_base() {
-        url.set_path(new_pathname)
-    }
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-search
-pub fn search(url: &Url) -> &str {
-    trim(&url[Position::AfterPath..Position::AfterQuery])
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-search
-pub fn set_search(url: &mut Url, new_search: &str) {
-    url.set_query(match new_search {
-        "" => None,
-        _ if new_search.starts_with('?') => Some(&new_search[1..]),
-        _ => Some(new_search),
-    })
-}
-
-/// Getter for https://url.spec.whatwg.org/#dom-url-hash
-pub fn hash(url: &Url) -> &str {
-    trim(&url[Position::AfterQuery..])
-}
-
-/// Setter for https://url.spec.whatwg.org/#dom-url-hash
-pub fn set_hash(url: &mut Url, new_hash: &str) {
-    if url.scheme() != "javascript" {
-        url.set_fragment(match new_hash {
-            "" => None,
-            _ if new_hash.starts_with('#') => Some(&new_hash[1..]),
-            _ => Some(new_hash),
-        })
-    }
-}
-
-fn trim(s: &str) -> &str {
-    if s.len() == 1 {
-        ""
-    } else {
-        s
-    }
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/src/slicing.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2016 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use std::ops::{Range, RangeFrom, RangeTo, RangeFull, Index};
-use Url;
-
-impl Index<RangeFull> for Url {
-    type Output = str;
-    fn index(&self, _: RangeFull) -> &str {
-        &self.serialization
-    }
-}
-
-impl Index<RangeFrom<Position>> for Url {
-    type Output = str;
-    fn index(&self, range: RangeFrom<Position>) -> &str {
-        &self.serialization[self.index(range.start)..]
-    }
-}
-
-impl Index<RangeTo<Position>> for Url {
-    type Output = str;
-    fn index(&self, range: RangeTo<Position>) -> &str {
-        &self.serialization[..self.index(range.end)]
-    }
-}
-
-impl Index<Range<Position>> for Url {
-    type Output = str;
-    fn index(&self, range: Range<Position>) -> &str {
-        &self.serialization[self.index(range.start)..self.index(range.end)]
-    }
-}
-
-/// Indicates a position within a URL based on its components.
-///
-/// A range of positions can be used for slicing `Url`:
-///
-/// ```rust
-/// # use url::{Url, Position};
-/// # fn something(some_url: Url) {
-/// let serialization: &str = &some_url[..];
-/// let serialization_without_fragment: &str = &some_url[..Position::AfterQuery];
-/// let authority: &str = &some_url[Position::BeforeUsername..Position::AfterPort];
-/// let data_url_payload: &str = &some_url[Position::BeforePath..Position::AfterQuery];
-/// let scheme_relative: &str = &some_url[Position::BeforeUsername..];
-/// # }
-/// ```
-///
-/// In a pseudo-grammar (where `[`…`]?` makes a sub-sequence optional),
-/// URL components and delimiters that separate them are:
-///
-/// ```notrust
-/// url =
-///     scheme ":"
-///     [ "//" [ username [ ":" password ]? "@" ]? host [ ":" port ]? ]?
-///     path [ "?" query ]? [ "#" fragment ]?
-/// ```
-///
-/// When a given component is not present,
-/// its "before" and "after" position are the same
-/// (so that `&some_url[BeforeFoo..AfterFoo]` is the empty string)
-/// and component ordering is preserved
-/// (so that a missing query "is between" a path and a fragment).
-///
-/// The end of a component and the start of the next are either the same or separate
-/// by a delimiter.
-/// (Not that the initial `/` of a path is considered part of the path here, not a delimiter.)
-/// For example, `&url[..BeforeFragment]` would include a `#` delimiter (if present in `url`),
-/// so `&url[..AfterQuery]` might be desired instead.
-///
-/// `BeforeScheme` and `AfterFragment` are always the start and end of the entire URL,
-/// so `&url[BeforeScheme..X]` is the same as `&url[..X]`
-/// and `&url[X..AfterFragment]` is the same as `&url[X..]`.
-#[derive(Copy, Clone, Debug)]
-pub enum Position {
-    BeforeScheme,
-    AfterScheme,
-    BeforeUsername,
-    AfterUsername,
-    BeforePassword,
-    AfterPassword,
-    BeforeHost,
-    AfterHost,
-    BeforePort,
-    AfterPort,
-    BeforePath,
-    AfterPath,
-    BeforeQuery,
-    AfterQuery,
-    BeforeFragment,
-    AfterFragment
-}
-
-impl Url {
-    #[inline]
-    fn index(&self, position: Position) -> usize {
-        match position {
-            Position::BeforeScheme => 0,
-
-            Position::AfterScheme => self.scheme_end as usize,
-
-            Position::BeforeUsername => if self.has_authority() {
-                self.scheme_end as usize + "://".len()
-            } else {
-                debug_assert!(self.byte_at(self.scheme_end) == b':');
-                debug_assert!(self.scheme_end + ":".len() as u32 == self.username_end);
-                self.scheme_end as usize + ":".len()
-            },
-
-            Position::AfterUsername => self.username_end as usize,
-
-            Position::BeforePassword => if self.has_authority() &&
-                                           self.byte_at(self.username_end) == b':' {
-                self.username_end as usize + ":".len()
-            } else {
-                debug_assert!(self.username_end == self.host_start);
-                self.username_end as usize
-            },
-
-            Position::AfterPassword => if self.has_authority() &&
-                                          self.byte_at(self.username_end) == b':' {
-                debug_assert!(self.byte_at(self.host_start - "@".len() as u32) == b'@');
-                self.host_start as usize - "@".len()
-            } else {
-                debug_assert!(self.username_end == self.host_start);
-                self.host_start as usize
-            },
-
-            Position::BeforeHost => self.host_start as usize,
-
-            Position::AfterHost => self.host_end as usize,
-
-            Position::BeforePort => if self.port.is_some() {
-                debug_assert!(self.byte_at(self.host_end) == b':');
-                self.host_end as usize + ":".len()
-            } else {
-                self.host_end as usize
-            },
-
-            Position::AfterPort => self.path_start as usize,
-
-            Position::BeforePath => self.path_start as usize,
-
-            Position::AfterPath => match (self.query_start, self.fragment_start) {
-                (Some(q), _) => q as usize,
-                (None, Some(f)) => f as usize,
-                (None, None) => self.serialization.len(),
-            },
-
-            Position::BeforeQuery => match (self.query_start, self.fragment_start) {
-                (Some(q), _) => {
-                    debug_assert!(self.byte_at(q) == b'?');
-                    q as usize + "?".len()
-                }
-                (None, Some(f)) => f as usize,
-                (None, None) => self.serialization.len(),
-            },
-
-            Position::AfterQuery => match self.fragment_start {
-                None => self.serialization.len(),
-                Some(f) => f as usize,
-            },
-
-            Position::BeforeFragment => match self.fragment_start {
-                Some(f) => {
-                    debug_assert!(self.byte_at(f) == b'#');
-                    f as usize + "#".len()
-                }
-                None => self.serialization.len(),
-            },
-
-            Position::AfterFragment => self.serialization.len(),
-        }
-    }
-}
-
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/tests/data.rs
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright 2013-2014 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Data-driven tests
-
-extern crate rustc_serialize;
-extern crate test;
-extern crate url;
-
-use rustc_serialize::json::{self, Json};
-use url::{Url, quirks};
-
-fn check_invariants(url: &Url) {
-    url.check_invariants().unwrap();
-    #[cfg(feature="serde")] {
-        extern crate serde_json;
-        let bytes = serde_json::to_vec(url).unwrap();
-        let new_url: Url = serde_json::from_slice(&bytes).unwrap();
-        assert_eq!(url, &new_url);
-    }
-}
-
-
-fn run_parsing(input: &str, base: &str, expected: Result<ExpectedAttributes, ()>) {
-    let base = match Url::parse(&base) {
-        Ok(base) => base,
-        Err(message) => panic!("Error parsing base {:?}: {}", base, message)
-    };
-    let (url, expected) = match (base.join(&input), expected) {
-        (Ok(url), Ok(expected)) => (url, expected),
-        (Err(_), Err(())) => return,
-        (Err(message), Ok(_)) => panic!("Error parsing URL {:?}: {}", input, message),
-        (Ok(_), Err(())) => panic!("Expected a parse error for URL {:?}", input),
-    };
-
-    check_invariants(&url);
-
-    macro_rules! assert_eq {
-        ($expected: expr, $got: expr) => {
-            {
-                let expected = $expected;
-                let got = $got;
-                assert!(expected == got, "{:?} != {} {:?} for URL {:?}",
-                        got, stringify!($expected), expected, url);
-            }
-        }
-    }
-
-    macro_rules! assert_attributes {
-        ($($attr: ident)+) => {
-            {
-                $(
-                    assert_eq!(expected.$attr, quirks::$attr(&url));
-                )+;
-            }
-        }
-    }
-
-    assert_attributes!(href protocol username password host hostname port pathname search hash);
-
-    if let Some(expected_origin) = expected.origin {
-        assert_eq!(expected_origin, quirks::origin(&url));
-    }
-}
-
-struct ExpectedAttributes {
-    href: String,
-    origin: Option<String>,
-    protocol: String,
-    username: String,
-    password: String,
-    host: String,
-    hostname: String,
-    port: String,
-    pathname: String,
-    search: String,
-    hash: String,
-}
-
-trait JsonExt {
-    fn take(&mut self, key: &str) -> Option<Json>;
-    fn object(self) -> json::Object;
-    fn string(self) -> String;
-    fn take_string(&mut self, key: &str) -> String;
-}
-
-impl JsonExt for Json {
-    fn take(&mut self, key: &str) -> Option<Json> {
-        self.as_object_mut().unwrap().remove(key)
-    }
-
-    fn object(self) -> json::Object {
-        if let Json::Object(o) = self { o } else { panic!("Not a Json::Object") }
-    }
-
-    fn string(self) -> String {
-        if let Json::String(s) = self { s } else { panic!("Not a Json::String") }
-    }
-
-    fn take_string(&mut self, key: &str) -> String {
-        self.take(key).unwrap().string()
-    }
-}
-
-fn collect_parsing<F: FnMut(String, test::TestFn)>(add_test: &mut F) {
-    // Copied form https://github.com/w3c/web-platform-tests/blob/master/url/
-    let mut json = Json::from_str(include_str!("urltestdata.json"))
-        .expect("JSON parse error in urltestdata.json");
-    for entry in json.as_array_mut().unwrap() {
-        if entry.is_string() {
-            continue  // ignore comments
-        }
-        let base = entry.take_string("base");
-        let input = entry.take_string("input");
-        let expected = if entry.find("failure").is_some() {
-            Err(())
-        } else {
-            Ok(ExpectedAttributes {
-                href: entry.take_string("href"),
-                origin: entry.take("origin").map(Json::string),
-                protocol: entry.take_string("protocol"),
-                username: entry.take_string("username"),
-                password: entry.take_string("password"),
-                host: entry.take_string("host"),
-                hostname: entry.take_string("hostname"),
-                port: entry.take_string("port"),
-                pathname: entry.take_string("pathname"),
-                search: entry.take_string("search"),
-                hash: entry.take_string("hash"),
-            })
-        };
-        add_test(format!("{:?} @ base {:?}", input, base),
-                 test::TestFn::dyn_test_fn(move || run_parsing(&input, &base, expected)));
-    }
-}
-
-fn collect_setters<F>(add_test: &mut F) where F: FnMut(String, test::TestFn) {
-    let mut json = Json::from_str(include_str!("setters_tests.json"))
-        .expect("JSON parse error in setters_tests.json");
-
-    macro_rules! setter {
-        ($attr: expr, $setter: ident) => {{
-            let mut tests = json.take($attr).unwrap();
-            for mut test in tests.as_array_mut().unwrap().drain(..) {
-                let comment = test.take("comment").map(Json::string).unwrap_or(String::new());
-                let href = test.take_string("href");
-                let new_value = test.take_string("new_value");
-                let name = format!("{:?}.{} = {:?} {}", href, $attr, new_value, comment);
-                let mut expected = test.take("expected").unwrap();
-                add_test(name, test::TestFn::dyn_test_fn(move || {
-                    let mut url = Url::parse(&href).unwrap();
-                    check_invariants(&url);
-                    let _ = quirks::$setter(&mut url, &new_value);
-                    assert_attributes!(url, expected,
-                        href protocol username password host hostname port pathname search hash);
-                    check_invariants(&url);
-                }))
-            }
-        }}
-    }
-    macro_rules! assert_attributes {
-        ($url: expr, $expected: expr, $($attr: ident)+) => {
-            $(
-                if let Some(value) = $expected.take(stringify!($attr)) {
-                    assert_eq!(quirks::$attr(&$url), value.string())
-                }
-            )+
-        }
-    }
-    setter!("protocol", set_protocol);
-    setter!("username", set_username);
-    setter!("password", set_password);
-    setter!("hostname", set_hostname);
-    setter!("host", set_host);
-    setter!("port", set_port);
-    setter!("pathname", set_pathname);
-    setter!("search", set_search);
-    setter!("hash", set_hash);
-}
-
-fn main() {
-    let mut tests = Vec::new();
-    {
-        let mut add_one = |name: String, run: test::TestFn| {
-            tests.push(test::TestDescAndFn {
-                desc: test::TestDesc {
-                    name: test::DynTestName(name),
-                    ignore: false,
-                    should_panic: test::ShouldPanic::No,
-                },
-                testfn: run,
-            })
-        };
-        collect_parsing(&mut add_one);
-        collect_setters(&mut add_one);
-    }
-    test::test_main(&std::env::args().collect::<Vec<_>>(), tests)
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/tests/setters_tests.json
+++ /dev/null
@@ -1,1148 +0,0 @@
-{
-    "comment": [
-        "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members",
-        "",
-        "This file contains a JSON object.",
-        "Other than 'comment', each key is an attribute of the `URL` interface",
-        "defined in WHATWG’s URL Standard.",
-        "The values are arrays of test case objects for that attribute.",
-        "",
-        "To run a test case for the attribute `attr`:",
-        "",
-        "* Create a new `URL` object with the value for the 'href' key",
-        "  the constructor single parameter. (Without a base URL.)",
-        "  This must not throw.",
-        "* Set the attribute `attr` to (invoke its setter with)",
-        "  with the value of for 'new_value' key.",
-        "* The value for the 'expected' key is another object.",
-        "  For each `key` / `value` pair of that object,",
-        "  get the attribute `key` (invoke its getter).",
-        "  The returned string must be equal to `value`.",
-        "",
-        "Note: the 'href' setter is already covered by urltestdata.json."
-    ],
-    "protocol": [
-        {
-            "comment": "The empty string is not a valid scheme. Setter leaves the URL unchanged.",
-            "href": "a://example.net",
-            "new_value": "",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "href": "a://example.net",
-            "new_value": "b",
-            "expected": {
-                "href": "b://example.net/",
-                "protocol": "b:"
-            }
-        },
-        {
-            "comment": "Upper-case ASCII is lower-cased",
-            "href": "a://example.net",
-            "new_value": "B",
-            "expected": {
-                "href": "b://example.net/",
-                "protocol": "b:"
-            }
-        },
-        {
-            "comment": "Non-ASCII is rejected",
-            "href": "a://example.net",
-            "new_value": "é",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "comment": "No leading digit",
-            "href": "a://example.net",
-            "new_value": "0b",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "comment": "No leading punctuation",
-            "href": "a://example.net",
-            "new_value": "+b",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "href": "a://example.net",
-            "new_value": "bC0+-.",
-            "expected": {
-                "href": "bc0+-.://example.net/",
-                "protocol": "bc0+-.:"
-            }
-        },
-        {
-            "comment": "Only some punctuation is acceptable",
-            "href": "a://example.net",
-            "new_value": "b,c",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "comment": "Non-ASCII is rejected",
-            "href": "a://example.net",
-            "new_value": "bé",
-            "expected": {
-                "href": "a://example.net/",
-                "protocol": "a:"
-            }
-        },
-        {
-            "comment": "Spec deviation: from special scheme to not is not problematic. https://github.com/whatwg/url/issues/104",
-            "href": "http://example.net",
-            "new_value": "b",
-            "expected": {
-                "href": "b://example.net/",
-                "protocol": "b:"
-            }
-        },
-        {
-            "comment": "Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.",
-            "href": "mailto:me@example.net",
-            "new_value": "http",
-            "expected": {
-                "href": "mailto:me@example.net",
-                "protocol": "mailto:"
-            }
-        },
-        {
-            "comment": "Spec deviation: from non-special scheme with a host to special is not problematic. https://github.com/whatwg/url/issues/104",
-            "href": "ssh://me@example.net",
-            "new_value": "http",
-            "expected": {
-                "href": "http://me@example.net/",
-                "protocol": "http:"
-            }
-        },
-        {
-            "comment": "Stuff after the first ':' is ignored",
-            "href": "http://example.net",
-            "new_value": "https:foo : bar",
-            "expected": {
-                "href": "https://example.net/",
-                "protocol": "https:"
-            }
-        },
-        {
-            "comment": "Stuff after the first ':' is ignored",
-            "href": "data:text/html,<p>Test",
-            "new_value": "view-source+data:foo : bar",
-            "expected": {
-                "href": "view-source+data:text/html,<p>Test",
-                "protocol": "view-source+data:"
-            }
-        }
-    ],
-    "username": [
-        {
-            "comment": "No host means no username",
-            "href": "file:///home/you/index.html",
-            "new_value": "me",
-            "expected": {
-                "href": "file:///home/you/index.html",
-                "username": ""
-            }
-        },
-        {
-            "comment": "No host means no username",
-            "href": "unix:/run/foo.socket",
-            "new_value": "me",
-            "expected": {
-                "href": "unix:/run/foo.socket",
-                "username": ""
-            }
-        },
-        {
-            "comment": "Cannot-be-a-base means no username",
-            "href": "mailto:you@example.net",
-            "new_value": "me",
-            "expected": {
-                "href": "mailto:you@example.net",
-                "username": ""
-            }
-        },
-        {
-            "href": "http://example.net",
-            "new_value": "me",
-            "expected": {
-                "href": "http://me@example.net/",
-                "username": "me"
-            }
-        },
-        {
-            "href": "http://:secret@example.net",
-            "new_value": "me",
-            "expected": {
-                "href": "http://me:secret@example.net/",
-                "username": "me"
-            }
-        },
-        {
-            "href": "http://me@example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://example.net/",
-                "username": ""
-            }
-        },
-        {
-            "href": "http://me:secret@example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://:secret@example.net/",
-                "username": ""
-            }
-        },
-        {
-            "comment": "UTF-8 percent encoding with the userinfo encode set.",
-            "href": "http://example.net",
-            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
-            "expected": {
-                "href": "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/",
-                "username": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
-            }
-        },
-        {
-            "comment": "Bytes already percent-encoded are left as-is.",
-            "href": "http://example.net",
-            "new_value": "%c3%89té",
-            "expected": {
-                "href": "http://%c3%89t%C3%A9@example.net/",
-                "username": "%c3%89t%C3%A9"
-            }
-        }
-    ],
-    "password": [
-        {
-            "comment": "No host means no password",
-            "href": "file:///home/me/index.html",
-            "new_value": "secret",
-            "expected": {
-                "href": "file:///home/me/index.html",
-                "password": ""
-            }
-        },
-        {
-            "comment": "No host means no password",
-            "href": "unix:/run/foo.socket",
-            "new_value": "secret",
-            "expected": {
-                "href": "unix:/run/foo.socket",
-                "password": ""
-            }
-        },
-        {
-            "comment": "Cannot-be-a-base means no password",
-            "href": "mailto:me@example.net",
-            "new_value": "secret",
-            "expected": {
-                "href": "mailto:me@example.net",
-                "password": ""
-            }
-        },
-        {
-            "href": "http://example.net",
-            "new_value": "secret",
-            "expected": {
-                "href": "http://:secret@example.net/",
-                "password": "secret"
-            }
-        },
-        {
-            "href": "http://me@example.net",
-            "new_value": "secret",
-            "expected": {
-                "href": "http://me:secret@example.net/",
-                "password": "secret"
-            }
-        },
-        {
-            "href": "http://:secret@example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://example.net/",
-                "password": ""
-            }
-        },
-        {
-            "href": "http://me:secret@example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://me@example.net/",
-                "password": ""
-            }
-        },
-        {
-            "comment": "UTF-8 percent encoding with the userinfo encode set.",
-            "href": "http://example.net",
-            "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
-            "expected": {
-                "href": "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/",
-                "password": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
-            }
-        },
-        {
-            "comment": "Bytes already percent-encoded are left as-is.",
-            "href": "http://example.net",
-            "new_value": "%c3%89té",
-            "expected": {
-                "href": "http://:%c3%89t%C3%A9@example.net/",
-                "password": "%c3%89t%C3%A9"
-            }
-        }
-    ],
-    "host": [
-        {
-            "comment": "Cannot-be-a-base means no host",
-            "href": "mailto:me@example.net",
-            "new_value": "example.com",
-            "expected": {
-                "href": "mailto:me@example.net",
-                "host": ""
-            }
-        },
-        {
-            "comment": "Cannot-be-a-base means no password",
-            "href": "data:text/plain,Stuff",
-            "new_value": "example.net",
-            "expected": {
-                "href": "data:text/plain,Stuff",
-                "host": ""
-            }
-        },
-        {
-            "href": "http://example.net",
-            "new_value": "example.com:8080",
-            "expected": {
-                "href": "http://example.com:8080/",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Port number is unchanged if not specified in the new value",
-            "href": "http://example.net:8080",
-            "new_value": "example.com",
-            "expected": {
-                "href": "http://example.com:8080/",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Port number is removed if empty in the new value: https://github.com/whatwg/url/pull/113",
-            "href": "http://example.net:8080",
-            "new_value": "example.com:",
-            "expected": {
-                "href": "http://example.com/",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "The empty host is not valid for special schemes",
-            "href": "http://example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://example.net/",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "The empty host is OK for non-special schemes",
-            "href": "view-source+http://example.net/foo",
-            "new_value": "",
-            "expected": {
-                "href": "view-source+http:///foo",
-                "host": ""
-            }
-        },
-        {
-            "comment": "Path-only URLs can gain a host",
-            "href": "a:/foo",
-            "new_value": "example.net",
-            "expected": {
-                "href": "a://example.net/foo",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "Path-only URLs can gain a host",
-            "href": "a:/foo",
-            "new_value": "example.net",
-            "expected": {
-                "href": "a://example.net/foo",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "IPv4 address syntax is normalized",
-            "href": "http://example.net",
-            "new_value": "0x7F000001:8080",
-            "expected": {
-                "href": "http://127.0.0.1:8080/",
-                "host": "127.0.0.1:8080",
-                "hostname": "127.0.0.1",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "IPv6 address syntax is normalized",
-            "href": "http://example.net",
-            "new_value": "[::0:01]:2",
-            "expected": {
-                "href": "http://[::1]:2/",
-                "host": "[::1]:2",
-                "hostname": "[::1]",
-                "port": "2"
-            }
-        },
-        {
-            "comment": "Default port number is removed",
-            "href": "http://example.net",
-            "new_value": "example.com:80",
-            "expected": {
-                "href": "http://example.com/",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Default port number is removed",
-            "href": "https://example.net",
-            "new_value": "example.com:443",
-            "expected": {
-                "href": "https://example.com/",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Default port number is only removed for the relevant scheme",
-            "href": "https://example.net",
-            "new_value": "example.com:80",
-            "expected": {
-                "href": "https://example.com:80/",
-                "host": "example.com:80",
-                "hostname": "example.com",
-                "port": "80"
-            }
-        },
-        {
-            "comment": "Stuff after a / delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com/stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a / delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080/stuff",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a ? delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com?stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a ? delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080?stuff",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a # delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com#stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a # delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080#stuff",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
-            "href": "http://example.net/path",
-            "new_value": "example.com\\stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080\\stuff",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain",
-            "href": "view-source+http://example.net/path",
-            "new_value": "example.com\\stuff",
-            "expected": {
-                "href": "view-source+http://example.net/path",
-                "host": "example.net",
-                "hostname": "example.net",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "view-source+http://example.net/path",
-            "new_value": "example.com:8080stuff2",
-            "expected": {
-                "href": "view-source+http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080stuff2",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080+2",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Port numbers are 16 bit integers",
-            "href": "http://example.net/path",
-            "new_value": "example.com:65535",
-            "expected": {
-                "href": "http://example.com:65535/path",
-                "host": "example.com:65535",
-                "hostname": "example.com",
-                "port": "65535"
-            }
-        },
-        {
-            "comment": "Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.",
-            "href": "http://example.net/path",
-            "new_value": "example.com:65536",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        }
-    ],
-    "hostname": [
-        {
-            "comment": "Cannot-be-a-base means no host",
-            "href": "mailto:me@example.net",
-            "new_value": "example.com",
-            "expected": {
-                "href": "mailto:me@example.net",
-                "host": ""
-            }
-        },
-        {
-            "comment": "Cannot-be-a-base means no password",
-            "href": "data:text/plain,Stuff",
-            "new_value": "example.net",
-            "expected": {
-                "href": "data:text/plain,Stuff",
-                "host": ""
-            }
-        },
-        {
-            "href": "http://example.net:8080",
-            "new_value": "example.com",
-            "expected": {
-                "href": "http://example.com:8080/",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "The empty host is not valid for special schemes",
-            "href": "http://example.net",
-            "new_value": "",
-            "expected": {
-                "href": "http://example.net/",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "The empty host is OK for non-special schemes",
-            "href": "view-source+http://example.net/foo",
-            "new_value": "",
-            "expected": {
-                "href": "view-source+http:///foo",
-                "host": ""
-            }
-        },
-        {
-            "comment": "Path-only URLs can gain a host",
-            "href": "a:/foo",
-            "new_value": "example.net",
-            "expected": {
-                "href": "a://example.net/foo",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "Path-only URLs can gain a host",
-            "href": "a:/foo",
-            "new_value": "example.net",
-            "expected": {
-                "href": "a://example.net/foo",
-                "host": "example.net"
-            }
-        },
-        {
-            "comment": "IPv4 address syntax is normalized",
-            "href": "http://example.net:8080",
-            "new_value": "0x7F000001",
-            "expected": {
-                "href": "http://127.0.0.1:8080/",
-                "host": "127.0.0.1:8080",
-                "hostname": "127.0.0.1",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "IPv6 address syntax is normalized",
-            "href": "http://example.net",
-            "new_value": "[::0:01]",
-            "expected": {
-                "href": "http://[::1]/",
-                "host": "[::1]",
-                "hostname": "[::1]",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a : delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com:8080",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a : delimiter is ignored",
-            "href": "http://example.net:8080/path",
-            "new_value": "example.com:",
-            "expected": {
-                "href": "http://example.com:8080/path",
-                "host": "example.com:8080",
-                "hostname": "example.com",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a / delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com/stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a ? delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com?stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a # delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "example.com#stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
-            "href": "http://example.net/path",
-            "new_value": "example.com\\stuff",
-            "expected": {
-                "href": "http://example.com/path",
-                "host": "example.com",
-                "hostname": "example.com",
-                "port": ""
-            }
-        },
-        {
-            "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain",
-            "href": "view-source+http://example.net/path",
-            "new_value": "example.com\\stuff",
-            "expected": {
-                "href": "view-source+http://example.net/path",
-                "host": "example.net",
-                "hostname": "example.net",
-                "port": ""
-            }
-        }
-    ],
-    "port": [
-        {
-            "href": "http://example.net",
-            "new_value": "8080",
-            "expected": {
-                "href": "http://example.net:8080/",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Port number is removed if empty in the new value: https://github.com/whatwg/url/pull/113",
-            "href": "http://example.net:8080",
-            "new_value": "",
-            "expected": {
-                "href": "http://example.net/",
-                "host": "example.net",
-                "hostname": "example.net",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Default port number is removed",
-            "href": "http://example.net:8080",
-            "new_value": "80",
-            "expected": {
-                "href": "http://example.net/",
-                "host": "example.net",
-                "hostname": "example.net",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Default port number is removed",
-            "href": "https://example.net:4433",
-            "new_value": "443",
-            "expected": {
-                "href": "https://example.net/",
-                "host": "example.net",
-                "hostname": "example.net",
-                "port": ""
-            }
-        },
-        {
-            "comment": "Default port number is only removed for the relevant scheme",
-            "href": "https://example.net",
-            "new_value": "80",
-            "expected": {
-                "href": "https://example.net:80/",
-                "host": "example.net:80",
-                "hostname": "example.net",
-                "port": "80"
-            }
-        },
-        {
-            "comment": "Stuff after a / delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "8080/stuff",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a ? delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "8080?stuff",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a # delimiter is ignored",
-            "href": "http://example.net/path",
-            "new_value": "8080#stuff",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Stuff after a \\ delimiter is ignored for special schemes",
-            "href": "http://example.net/path",
-            "new_value": "8080\\stuff",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "view-source+http://example.net/path",
-            "new_value": "8080stuff2",
-            "expected": {
-                "href": "view-source+http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "http://example.net/path",
-            "new_value": "8080stuff2",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error",
-            "href": "http://example.net/path",
-            "new_value": "8080+2",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        },
-        {
-            "comment": "Port numbers are 16 bit integers",
-            "href": "http://example.net/path",
-            "new_value": "65535",
-            "expected": {
-                "href": "http://example.net:65535/path",
-                "host": "example.net:65535",
-                "hostname": "example.net",
-                "port": "65535"
-            }
-        },
-        {
-            "comment": "Port numbers are 16 bit integers, overflowing is an error",
-            "href": "http://example.net:8080/path",
-            "new_value": "65536",
-            "expected": {
-                "href": "http://example.net:8080/path",
-                "host": "example.net:8080",
-                "hostname": "example.net",
-                "port": "8080"
-            }
-        }
-    ],
-    "pathname": [
-        {
-            "comment": "Cannot-be-a-base don’t have a path",
-            "href": "mailto:me@example.net",
-            "new_value": "/foo",
-            "expected": {
-                "href": "mailto:me@example.net",
-                "pathname": "me@example.net"
-            }
-        },
-        {
-            "href": "unix:/run/foo.socket?timeout=10",
-            "new_value": "/var/log/../run/bar.socket",
-            "expected": {
-                "href": "unix:/var/run/bar.socket?timeout=10",
-                "pathname": "/var/run/bar.socket"
-            }
-        },
-        {
-            "href": "https://example.net#nav",
-            "new_value": "home",
-            "expected": {
-                "href": "https://example.net/home#nav",
-                "pathname": "/home"
-            }
-        },
-        {
-            "href": "https://example.net#nav",
-            "new_value": "../home",
-            "expected": {
-                "href": "https://example.net/home#nav",
-                "pathname": "/home"
-            }
-        },
-        {
-            "comment": "\\ is a segment delimiter for 'special' URLs",
-            "href": "http://example.net/home?lang=fr#nav",
-            "new_value": "\\a\\%2E\\b\\%2e.\\c",
-            "expected": {
-                "href": "http://example.net/a/c?lang=fr#nav",
-                "pathname": "/a/c"
-            }
-        },
-        {
-            "comment": "\\ is *not* a segment delimiter for non-'special' URLs",
-            "href": "view-source+http://example.net/home?lang=fr#nav",
-            "new_value": "\\a\\%2E\\b\\%2e.\\c",
-            "expected": {
-                "href": "view-source+http://example.net/\\a\\.\\b\\..\\c?lang=fr#nav",
-                "pathname": "/\\a\\.\\b\\..\\c"
-            }
-        },
-        {
-            "comment": "UTF-8 percent encoding with the default encode set. Tabs and newlines are removed. Leading or training C0 controls and space are removed.",
-            "href": "a:/",
-            "new_value": "\u0000\u0001\t\n\r\u001f !\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
-            "expected": {
-                "href": "a:/!%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9",
-                "pathname": "/!%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9"
-            }
-        },
-        {
-            "comment": "Bytes already percent-encoded are left as-is, except %2E.",
-            "href": "http://example.net",
-            "new_value": "%2e%2E%c3%89té",
-            "expected": {
-                "href": "http://example.net/..%c3%89t%C3%A9",
-                "pathname": "/..%c3%89t%C3%A9"
-            }
-        }
-    ],
-    "search": [
-        {
-            "href": "https://example.net#nav",
-            "new_value": "lang=fr",
-            "expected": {
-                "href": "https://example.net/?lang=fr#nav",
-                "search": "?lang=fr"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "lang=fr",
-            "expected": {
-                "href": "https://example.net/?lang=fr#nav",
-                "search": "?lang=fr"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "?lang=fr",
-            "expected": {
-                "href": "https://example.net/?lang=fr#nav",
-                "search": "?lang=fr"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "??lang=fr",
-            "expected": {
-                "href": "https://example.net/??lang=fr#nav",
-                "search": "??lang=fr"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "?",
-            "expected": {
-                "href": "https://example.net/?#nav",
-                "search": ""
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "",
-            "expected": {
-                "href": "https://example.net/#nav",
-                "search": ""
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US",
-            "new_value": "",
-            "expected": {
-                "href": "https://example.net/",
-                "search": ""
-            }
-        },
-        {
-            "href": "https://example.net",
-            "new_value": "",
-            "expected": {
-                "href": "https://example.net/",
-                "search": ""
-            }
-        },
-        {
-            "comment": "UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. Leading or training C0 controls and space are removed.",
-            "href": "a:/",
-            "new_value": "\u0000\u0001\t\n\r\u001f !\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
-            "expected": {
-                "href": "a:/?!%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9",
-                "search": "?!%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
-            }
-        },
-        {
-            "comment": "Bytes already percent-encoded are left as-is",
-            "href": "http://example.net",
-            "new_value": "%c3%89té",
-            "expected": {
-                "href": "http://example.net/?%c3%89t%C3%A9",
-                "search": "?%c3%89t%C3%A9"
-            }
-        }
-    ],
-    "hash": [
-        {
-            "href": "https://example.net",
-            "new_value": "main",
-            "expected": {
-                "href": "https://example.net/#main",
-                "hash": "#main"
-            }
-        },
-        {
-            "href": "https://example.net#nav",
-            "new_value": "main",
-            "expected": {
-                "href": "https://example.net/#main",
-                "hash": "#main"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US",
-            "new_value": "##nav",
-            "expected": {
-                "href": "https://example.net/?lang=en-US##nav",
-                "hash": "##nav"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "#main",
-            "expected": {
-                "href": "https://example.net/?lang=en-US#main",
-                "hash": "#main"
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "#",
-            "expected": {
-                "href": "https://example.net/?lang=en-US#",
-                "hash": ""
-            }
-        },
-        {
-            "href": "https://example.net?lang=en-US#nav",
-            "new_value": "",
-            "expected": {
-                "href": "https://example.net/?lang=en-US",
-                "hash": ""
-            }
-        },
-        {
-            "comment": "Simple percent-encoding; nuls, tabs, and newlines are removed",
-            "href": "a:/",
-            "new_value": "\u0000\u0001\t\n\r\u001f !\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé",
-            "expected": {
-                "href": "a:/#!%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9",
-                "hash": "#!%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
-            }
-        },
-        {
-            "comment": "Bytes already percent-encoded are left as-is",
-            "href": "http://example.net",
-            "new_value": "%c3%89té",
-            "expected": {
-                "href": "http://example.net/#%c3%89t%C3%A9",
-                "hash": "#%c3%89t%C3%A9"
-            }
-        }
-    ]
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/tests/unit.rs
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright 2013-2014 The rust-url developers.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-//! Unit tests
-
-#[macro_use]
-extern crate url;
-
-use std::borrow::Cow;
-use std::net::{Ipv4Addr, Ipv6Addr};
-use std::path::{Path, PathBuf};
-use url::{Host, HostAndPort, Url, form_urlencoded};
-
-#[test]
-fn size() {
-    use std::mem::size_of;
-    assert_eq!(size_of::<Url>(), size_of::<Option<Url>>());
-}
-
-macro_rules! assert_from_file_path {
-    ($path: expr) => { assert_from_file_path!($path, $path) };
-    ($path: expr, $url_path: expr) => {{
-        let url = Url::from_file_path(Path::new($path)).unwrap();
-        assert_eq!(url.host(), None);
-        assert_eq!(url.path(), $url_path);
-        assert_eq!(url.to_file_path(), Ok(PathBuf::from($path)));
-    }};
-}
-
-
-
-#[test]
-fn new_file_paths() {
-    if cfg!(unix) {
-        assert_eq!(Url::from_file_path(Path::new("relative")), Err(()));
-        assert_eq!(Url::from_file_path(Path::new("../relative")), Err(()));
-    }
-    if cfg!(windows) {
-        assert_eq!(Url::from_file_path(Path::new("relative")), Err(()));
-        assert_eq!(Url::from_file_path(Path::new(r"..\relative")), Err(()));
-        assert_eq!(Url::from_file_path(Path::new(r"\drive-relative")), Err(()));
-        assert_eq!(Url::from_file_path(Path::new(r"\\ucn\")), Err(()));
-    }
-
-    if cfg!(unix) {
-        assert_from_file_path!("/foo/bar");
-        assert_from_file_path!("/foo/ba\0r", "/foo/ba%00r");
-        assert_from_file_path!("/foo/ba%00r", "/foo/ba%2500r");
-    }
-}
-
-#[test]
-#[cfg(unix)]
-fn new_path_bad_utf8() {
-    use std::ffi::OsStr;
-    use std::os::unix::prelude::*;
-
-    let url = Url::from_file_path(Path::new(OsStr::from_bytes(b"/foo/ba\x80r"))).unwrap();
-    let os_str = OsStr::from_bytes(b"/foo/ba\x80r");
-    assert_eq!(url.to_file_path(), Ok(PathBuf::from(os_str)));
-}
-
-#[test]
-fn new_path_windows_fun() {
-    if cfg!(windows) {
-        assert_from_file_path!(r"C:\foo\bar", "/C:/foo/bar");
-        assert_from_file_path!("C:\\foo\\ba\0r", "/C:/foo/ba%00r");
-
-        // Invalid UTF-8
-        assert!(Url::parse("file:///C:/foo/ba%80r").unwrap().to_file_path().is_err());
-
-        // test windows canonicalized path
-        let path = PathBuf::from(r"\\?\C:\foo\bar");
-        assert!(Url::from_file_path(path).is_ok());
-
-        // Percent-encoded drive letter
-        let url = Url::parse("file:///C%3A/foo/bar").unwrap();
-        assert_eq!(url.to_file_path(), Ok(PathBuf::from(r"C:\foo\bar")));
-    }
-}
-
-
-#[test]
-fn new_directory_paths() {
-    if cfg!(unix) {
-        assert_eq!(Url::from_directory_path(Path::new("relative")), Err(()));
-        assert_eq!(Url::from_directory_path(Path::new("../relative")), Err(()));
-
-        let url = Url::from_directory_path(Path::new("/foo/bar")).unwrap();
-        assert_eq!(url.host(), None);
-        assert_eq!(url.path(), "/foo/bar/");
-    }
-    if cfg!(windows) {
-        assert_eq!(Url::from_directory_path(Path::new("relative")), Err(()));
-        assert_eq!(Url::from_directory_path(Path::new(r"..\relative")), Err(()));
-        assert_eq!(Url::from_directory_path(Path::new(r"\drive-relative")), Err(()));
-        assert_eq!(Url::from_directory_path(Path::new(r"\\ucn\")), Err(()));
-
-        let url = Url::from_directory_path(Path::new(r"C:\foo\bar")).unwrap();
-        assert_eq!(url.host(), None);
-        assert_eq!(url.path(), "/C:/foo/bar/");
-    }
-}
-
-#[test]
-fn from_str() {
-    assert!("http://testing.com/this".parse::<Url>().is_ok());
-}
-
-#[test]
-fn parse_with_params() {
-    let url = Url::parse_with_params("http://testing.com/this?dont=clobberme",
-                                     &[("lang", "rust")]).unwrap();
-
-    assert_eq!(url.as_str(), "http://testing.com/this?dont=clobberme&lang=rust");
-}
-
-#[test]
-fn issue_124() {
-    let url: Url = "file:a".parse().unwrap();
-    assert_eq!(url.path(), "/a");
-    let url: Url = "file:...".parse().unwrap();
-    assert_eq!(url.path(), "/...");
-    let url: Url = "file:..".parse().unwrap();
-    assert_eq!(url.path(), "/");
-}
-
-#[test]
-fn test_equality() {
-    use std::hash::{Hash, Hasher};
-    use std::collections::hash_map::DefaultHasher;
-
-    fn check_eq(a: &Url, b: &Url) {
-        assert_eq!(a, b);
-
-        let mut h1 = DefaultHasher::new();
-        a.hash(&mut h1);
-        let mut h2 = DefaultHasher::new();
-        b.hash(&mut h2);
-        assert_eq!(h1.finish(), h2.finish());
-    }
-
-    fn url(s: &str) -> Url {
-        let rv = s.parse().unwrap();
-        check_eq(&rv, &rv);
-        rv
-    }
-
-    // Doesn't care if default port is given.
-    let a: Url = url("https://example.com/");
-    let b: Url = url("https://example.com:443/");
-    check_eq(&a, &b);
-
-    // Different ports
-    let a: Url = url("http://example.com/");
-    let b: Url = url("http://example.com:8080/");
-    assert!(a != b, "{:?} != {:?}", a, b);
-
-    // Different scheme
-    let a: Url = url("http://example.com/");
-    let b: Url = url("https://example.com/");
-    assert_ne!(a, b);
-
-    // Different host
-    let a: Url = url("http://foo.com/");
-    let b: Url = url("http://bar.com/");
-    assert_ne!(a, b);
-
-    // Missing path, automatically substituted. Semantically the same.
-    let a: Url = url("http://foo.com");
-    let b: Url = url("http://foo.com/");
-    check_eq(&a, &b);
-}
-
-#[test]
-fn host() {
-    fn assert_host(input: &str, host: Host<&str>) {
-        assert_eq!(Url::parse(input).unwrap().host(), Some(host));
-    }
-    assert_host("http://www.mozilla.org", Host::Domain("www.mozilla.org"));
-    assert_host("http://1.35.33.49", Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)));
-    assert_host("http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]", Host::Ipv6(Ipv6Addr::new(
-        0x2001, 0x0db8, 0x85a3, 0x08d3, 0x1319, 0x8a2e, 0x0370, 0x7344)));
-    assert_host("http://1.35.+33.49", Host::Domain("1.35.+33.49"));
-    assert_host("http://[::]", Host::Ipv6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0)));
-    assert_host("http://[::1]", Host::Ipv6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)));
-    assert_host("http://0x1.0X23.0x21.061", Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)));
-    assert_host("http://0x1232131", Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)));
-    assert_host("http://111", Host::Ipv4(Ipv4Addr::new(0, 0, 0, 111)));
-    assert_host("http://2..2.3", Host::Domain("2..2.3"));
-    assert!(Url::parse("http://42.0x1232131").is_err());
-    assert!(Url::parse("http://192.168.0.257").is_err());
-}
-
-#[test]
-fn host_serialization() {
-    // libstd’s `Display for Ipv6Addr` serializes 0:0:0:0:0:0:_:_ and 0:0:0:0:0:ffff:_:_
-    // using IPv4-like syntax, as suggested in https://tools.ietf.org/html/rfc5952#section-4
-    // but https://url.spec.whatwg.org/#concept-ipv6-serializer specifies not to.
-
-    // Not [::0.0.0.2] / [::ffff:0.0.0.2]
-    assert_eq!(Url::parse("http://[0::2]").unwrap().host_str(), Some("[::2]"));
-    assert_eq!(Url::parse("http://[0::ffff:0:2]").unwrap().host_str(), Some("[::ffff:0:2]"));
-}
-
-#[test]
-fn test_idna() {
-    assert!("http://goșu.ro".parse::<Url>().is_ok());
-    assert_eq!(Url::parse("http://☃.net/").unwrap().host(), Some(Host::Domain("xn--n3h.net")));
-    assert!("https://r2---sn-huoa-cvhl.googlevideo.com/crossdomain.xml".parse::<Url>().is_ok());
-}
-
-#[test]
-fn test_serialization() {
-    let data = [
-        ("http://example.com/", "http://example.com/"),
-        ("http://addslash.com", "http://addslash.com/"),
-        ("http://@emptyuser.com/", "http://emptyuser.com/"),
-        ("http://:@emptypass.com/", "http://:@emptypass.com/"),
-        ("http://user@user.com/", "http://user@user.com/"),
-        ("http://user:pass@userpass.com/", "http://user:pass@userpass.com/"),
-        ("http://slashquery.com/path/?q=something", "http://slashquery.com/path/?q=something"),
-        ("http://noslashquery.com/path?q=something", "http://noslashquery.com/path?q=something")
-    ];
-    for &(input, result) in &data {
-        let url = Url::parse(input).unwrap();
-        assert_eq!(url.as_str(), result);
-    }
-}
-
-#[test]
-fn test_form_urlencoded() {
-    let pairs: &[(Cow<str>, Cow<str>)] = &[
-        ("foo".into(), "é&".into()),
-        ("bar".into(), "".into()),
-        ("foo".into(), "#".into())
-    ];
-    let encoded = form_urlencoded::Serializer::new(String::new()).extend_pairs(pairs).finish();
-    assert_eq!(encoded, "foo=%C3%A9%26&bar=&foo=%23");
-    assert_eq!(form_urlencoded::parse(encoded.as_bytes()).collect::<Vec<_>>(), pairs.to_vec());
-}
-
-#[test]
-fn test_form_serialize() {
-    let encoded = form_urlencoded::Serializer::new(String::new())
-        .append_pair("foo", "é&")
-        .append_pair("bar", "")
-        .append_pair("foo", "#")
-        .finish();
-    assert_eq!(encoded, "foo=%C3%A9%26&bar=&foo=%23");
-}
-
-#[test]
-fn host_and_port_display() {
-    assert_eq!(
-        format!(
-            "{}",
-            HostAndPort{ host: Host::Domain("www.mozilla.org"), port: 80}
-        ),
-        "www.mozilla.org:80"
-    );
-    assert_eq!(
-        format!(
-            "{}",
-            HostAndPort::<String>{ host: Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)), port: 65535 }
-        ),
-        "1.35.33.49:65535"
-    );
-    assert_eq!(
-        format!(
-            "{}",
-            HostAndPort::<String>{
-                host: Host::Ipv6(Ipv6Addr::new(
-                    0x2001, 0x0db8, 0x85a3, 0x08d3, 0x1319, 0x8a2e, 0x0370, 0x7344
-                )),
-                port: 1337
-            })
-        ,
-        "[2001:db8:85a3:8d3:1319:8a2e:370:7344]:1337"
-    )
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/25
-fn issue_25() {
-    let filename = if cfg!(windows) { r"C:\run\pg.sock" } else { "/run/pg.sock" };
-    let mut url = Url::from_file_path(filename).unwrap();
-    url.check_invariants().unwrap();
-    url.set_scheme("postgres").unwrap();
-    url.check_invariants().unwrap();
-    url.set_host(Some("")).unwrap();
-    url.check_invariants().unwrap();
-    url.set_username("me").unwrap();
-    url.check_invariants().unwrap();
-    let expected = format!("postgres://me@/{}run/pg.sock", if cfg!(windows) { "C:/" } else { "" });
-    assert_eq!(url.as_str(), expected);
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/61
-fn issue_61() {
-    let mut url = Url::parse("http://mozilla.org").unwrap();
-    url.set_scheme("https").unwrap();
-    assert_eq!(url.port(), None);
-    assert_eq!(url.port_or_known_default(), Some(443));
-    url.check_invariants().unwrap();
-}
-
-#[test]
-#[cfg(not(windows))]
-/// https://github.com/servo/rust-url/issues/197
-fn issue_197() {
-    let mut url = Url::from_file_path("/").expect("Failed to parse path");
-    url.check_invariants().unwrap();
-    assert_eq!(url, Url::parse("file:///").expect("Failed to parse path + protocol"));
-    url.path_segments_mut().expect("path_segments_mut").pop_if_empty();
-}
-
-#[test]
-fn issue_241() {
-    Url::parse("mailto:").unwrap().cannot_be_a_base();
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/222
-fn append_trailing_slash() {
-    let mut url: Url = "http://localhost:6767/foo/bar?a=b".parse().unwrap();
-    url.check_invariants().unwrap();
-    url.path_segments_mut().unwrap().push("");
-    url.check_invariants().unwrap();
-    assert_eq!(url.to_string(), "http://localhost:6767/foo/bar/?a=b");
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/227
-fn extend_query_pairs_then_mutate() {
-    let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap();
-    url.query_pairs_mut().extend_pairs(vec![ ("auth", "my-token") ].into_iter());
-    url.check_invariants().unwrap();
-    assert_eq!(url.to_string(), "http://localhost:6767/foo/bar?auth=my-token");
-    url.path_segments_mut().unwrap().push("some_other_path");
-    url.check_invariants().unwrap();
-    assert_eq!(url.to_string(), "http://localhost:6767/foo/bar/some_other_path?auth=my-token");
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/222
-fn append_empty_segment_then_mutate() {
-    let mut url: Url = "http://localhost:6767/foo/bar?a=b".parse().unwrap();
-    url.check_invariants().unwrap();
-    url.path_segments_mut().unwrap().push("").pop();
-    url.check_invariants().unwrap();
-    assert_eq!(url.to_string(), "http://localhost:6767/foo/bar?a=b");
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/243
-fn test_set_host() {
-    let mut url = Url::parse("https://example.net/hello").unwrap();
-    url.set_host(Some("foo.com")).unwrap();
-    assert_eq!(url.as_str(), "https://foo.com/hello");
-    assert!(url.set_host(None).is_err());
-    assert_eq!(url.as_str(), "https://foo.com/hello");
-    assert!(url.set_host(Some("")).is_err());
-    assert_eq!(url.as_str(), "https://foo.com/hello");
-
-    let mut url = Url::parse("foobar://example.net/hello").unwrap();
-    url.set_host(None).unwrap();
-    assert_eq!(url.as_str(), "foobar:/hello");
-}
-
-#[test]
-// https://github.com/servo/rust-url/issues/166
-fn test_leading_dots() {
-    assert_eq!(Host::parse(".org").unwrap(), Host::Domain(".org".to_owned()));
-    assert_eq!(Url::parse("file://./foo").unwrap().domain(), Some("."));
-}
-
-// This is testing that the macro produces buildable code when invoked
-// inside both a module and a function
-#[test]
-fn define_encode_set_scopes() {
-    use url::percent_encoding::{utf8_percent_encode, SIMPLE_ENCODE_SET};
-
-    define_encode_set! {
-        /// This encode set is used in the URL parser for query strings.
-        pub QUERY_ENCODE_SET = [SIMPLE_ENCODE_SET] | {' ', '"', '#', '<', '>'}
-    }
-
-    assert_eq!(utf8_percent_encode("foo bar", QUERY_ENCODE_SET).collect::<String>(), "foo%20bar");
-
-    mod m {
-        use url::percent_encoding::{utf8_percent_encode, SIMPLE_ENCODE_SET};
-
-        define_encode_set! {
-            /// This encode set is used in the URL parser for query strings.
-            pub QUERY_ENCODE_SET = [SIMPLE_ENCODE_SET] | {' ', '"', '#', '<', '>'}
-        }
-
-        pub fn test() {
-            assert_eq!(utf8_percent_encode("foo bar", QUERY_ENCODE_SET).collect::<String>(), "foo%20bar");
-        }
-    }
-
-    m::test();
-}
-
-#[test]
-/// https://github.com/servo/rust-url/issues/302
-fn test_origin_hash() {
-    use std::hash::{Hash,Hasher};
-    use std::collections::hash_map::DefaultHasher;
-
-    fn hash<T: Hash>(value: &T) -> u64 {
-        let mut hasher = DefaultHasher::new();
-        value.hash(&mut hasher);
-        hasher.finish()
-    }
-
-    let origin = &Url::parse("http://example.net/").unwrap().origin();
-
-    let origins_to_compare = [
-        Url::parse("http://example.net:80/").unwrap().origin(),
-        Url::parse("http://example.net:81/").unwrap().origin(),
-        Url::parse("http://example.net").unwrap().origin(),
-        Url::parse("http://example.net/hello").unwrap().origin(),
-        Url::parse("https://example.net").unwrap().origin(),
-        Url::parse("ftp://example.net").unwrap().origin(),
-        Url::parse("file://example.net").unwrap().origin(),
-        Url::parse("http://user@example.net/").unwrap().origin(),
-        Url::parse("http://user:pass@example.net/").unwrap().origin(),
-    ];
-
-    for origin_to_compare in &origins_to_compare {
-        if origin == origin_to_compare {
-            assert_eq!(hash(origin), hash(origin_to_compare));
-        } else {
-            assert_ne!(hash(origin), hash(origin_to_compare));
-        }
-    }
-
-    let opaque_origin = Url::parse("file://example.net").unwrap().origin();
-    let same_opaque_origin = Url::parse("file://example.net").unwrap().origin();
-    let other_opaque_origin = Url::parse("file://other").unwrap().origin();
-
-    assert_ne!(hash(&opaque_origin), hash(&same_opaque_origin));
-    assert_ne!(hash(&opaque_origin), hash(&other_opaque_origin));
-}
-
-#[test]
-fn test_windows_unc_path() {
-    if !cfg!(windows) {
-        return
-    }
-
-    let url = Url::from_file_path(Path::new(r"\\host\share\path\file.txt")).unwrap();
-    assert_eq!(url.as_str(), "file://host/share/path/file.txt");
-
-    let url = Url::from_file_path(Path::new(r"\\höst\share\path\file.txt")).unwrap();
-    assert_eq!(url.as_str(), "file://xn--hst-sna/share/path/file.txt");
-
-    let url = Url::from_file_path(Path::new(r"\\192.168.0.1\share\path\file.txt")).unwrap();
-    assert_eq!(url.host(), Some(Host::Ipv4(Ipv4Addr::new(192, 168, 0, 1))));
-
-    let path = url.to_file_path().unwrap();
-    assert_eq!(path.to_str(), Some(r"\\192.168.0.1\share\path\file.txt"));
-
-    // Another way to write these:
-    let url = Url::from_file_path(Path::new(r"\\?\UNC\host\share\path\file.txt")).unwrap();
-    assert_eq!(url.as_str(), "file://host/share/path/file.txt");
-
-    // Paths starting with "\\.\" (Local Device Paths) are intentionally not supported.
-    let url = Url::from_file_path(Path::new(r"\\.\some\path\file.txt"));
-    assert!(url.is_err());
-}
deleted file mode 100644
--- a/third_party/rust/url-1.5.1/tests/urltestdata.json
+++ /dev/null
@@ -1,4445 +0,0 @@
-[
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js",
-  {
-    "input": "http://example\t.\norg",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://user:pass@foo:21/bar;par?b#c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://user:pass@foo:21/bar;par?b#c",
-    "origin": "http://foo:21",
-    "protocol": "http:",
-    "username": "user",
-    "password": "pass",
-    "host": "foo:21",
-    "hostname": "foo",
-    "port": "21",
-    "pathname": "/bar;par",
-    "search": "?b",
-    "hash": "#c"
-  },
-  {
-    "input": "http:foo.com",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/foo.com",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/foo.com",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "\t   :foo.com   \n",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:foo.com",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:foo.com",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": " foo.com  ",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/foo.com",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/foo.com",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "a:\t foo.com",
-    "base": "http://example.org/foo/bar",
-    "href": "a: foo.com",
-    "origin": "null",
-    "protocol": "a:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": " foo.com",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:21/ b ? d # e ",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f:21/%20b%20?%20d%20# e",
-    "origin": "http://f:21",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f:21",
-    "hostname": "f",
-    "port": "21",
-    "pathname": "/%20b%20",
-    "search": "?%20d%20",
-    "hash": "# e"
-  },
-  {
-    "input": "http://f:/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f/c",
-    "origin": "http://f",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f",
-    "hostname": "f",
-    "port": "",
-    "pathname": "/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:0/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f:0/c",
-    "origin": "http://f:0",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f:0",
-    "hostname": "f",
-    "port": "0",
-    "pathname": "/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:00000000000000/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f:0/c",
-    "origin": "http://f:0",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f:0",
-    "hostname": "f",
-    "port": "0",
-    "pathname": "/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:00000000000000000000080/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f/c",
-    "origin": "http://f",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f",
-    "hostname": "f",
-    "port": "",
-    "pathname": "/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:b/c",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://f: /c",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://f:\n/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://f/c",
-    "origin": "http://f",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "f",
-    "hostname": "f",
-    "port": "",
-    "pathname": "/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://f:fifty-two/c",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://f:999999/c",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://f: 21 / b ? d # e ",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "  \t",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":foo.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:foo.com/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:foo.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":foo.com\\",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:foo.com/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:foo.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":a",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:a",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:a",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":\\",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":#",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:#",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "#",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar#",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "#/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar#/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": "#/"
-  },
-  {
-    "input": "#\\",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar#\\",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": "#\\"
-  },
-  {
-    "input": "#;?",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar#;?",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": "#;?"
-  },
-  {
-    "input": "?",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar?",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ":23",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:23",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:23",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/:23",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/:23",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/:23",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "::",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/::",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/::",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "::23",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/::23",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/::23",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo://",
-    "base": "http://example.org/foo/bar",
-    "href": "foo:///",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://a:b@c:29/d",
-    "base": "http://example.org/foo/bar",
-    "href": "http://a:b@c:29/d",
-    "origin": "http://c:29",
-    "protocol": "http:",
-    "username": "a",
-    "password": "b",
-    "host": "c:29",
-    "hostname": "c",
-    "port": "29",
-    "pathname": "/d",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http::@c:29",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/:@c:29",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/:@c:29",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://&a:foo(b]c@d:2/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://&a:foo(b%5Dc@d:2/",
-    "origin": "http://d:2",
-    "protocol": "http:",
-    "username": "&a",
-    "password": "foo(b%5Dc",
-    "host": "d:2",
-    "hostname": "d",
-    "port": "2",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://::@c@d:2",
-    "base": "http://example.org/foo/bar",
-    "href": "http://:%3A%40c@d:2/",
-    "origin": "http://d:2",
-    "protocol": "http:",
-    "username": "",
-    "password": "%3A%40c",
-    "host": "d:2",
-    "hostname": "d",
-    "port": "2",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo.com:b@d/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo.com:b@d/",
-    "origin": "http://d",
-    "protocol": "http:",
-    "username": "foo.com",
-    "password": "b",
-    "host": "d",
-    "hostname": "d",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo.com/\\@",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo.com//@",
-    "origin": "http://foo.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo.com",
-    "hostname": "foo.com",
-    "port": "",
-    "pathname": "//@",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:\\\\foo.com\\",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo.com/",
-    "origin": "http://foo.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo.com",
-    "hostname": "foo.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:\\\\a\\b:c\\d@foo.com\\",
-    "base": "http://example.org/foo/bar",
-    "href": "http://a/b:c/d@foo.com/",
-    "origin": "http://a",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "a",
-    "hostname": "a",
-    "port": "",
-    "pathname": "/b:c/d@foo.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo:/",
-    "base": "http://example.org/foo/bar",
-    "href": "foo:/",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo:/bar.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "foo:/bar.com/",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/bar.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo://///////",
-    "base": "http://example.org/foo/bar",
-    "href": "foo://///////",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "///////",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo://///////bar.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "foo://///////bar.com/",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "///////bar.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "foo:////://///",
-    "base": "http://example.org/foo/bar",
-    "href": "foo:////://///",
-    "origin": "null",
-    "protocol": "foo:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "//://///",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "c:/foo",
-    "base": "http://example.org/foo/bar",
-    "href": "c:/foo",
-    "origin": "null",
-    "protocol": "c:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "//foo/bar",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo/bar",
-    "origin": "http://foo",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo/path;a??e#f#g",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo/path;a??e#f#g",
-    "origin": "http://foo",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/path;a",
-    "search": "??e",
-    "hash": "#f#g"
-  },
-  {
-    "input": "http://foo/abcd?efgh?ijkl",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo/abcd?efgh?ijkl",
-    "origin": "http://foo",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/abcd",
-    "search": "?efgh?ijkl",
-    "hash": ""
-  },
-  {
-    "input": "http://foo/abcd#foo?bar",
-    "base": "http://example.org/foo/bar",
-    "href": "http://foo/abcd#foo?bar",
-    "origin": "http://foo",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/abcd",
-    "search": "",
-    "hash": "#foo?bar"
-  },
-  {
-    "input": "[61:24:74]:98",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/[61:24:74]:98",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/[61:24:74]:98",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:[61:27]/:foo",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/[61:27]/:foo",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/[61:27]/:foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://[1::2]:3:4",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://2001::1",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://2001::1]",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://2001::1]:80",
-    "base": "http://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "http://[2001::1]",
-    "base": "http://example.org/foo/bar",
-    "href": "http://[2001::1]/",
-    "origin": "http://[2001::1]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[2001::1]",
-    "hostname": "[2001::1]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://[::127.0.0.1]",
-    "base": "http://example.org/foo/bar",
-    "href": "http://[::7f00:1]/",
-    "origin": "http://[::7f00:1]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[::7f00:1]",
-    "hostname": "[::7f00:1]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://[0:0:0:0:0:0:13.1.68.3]",
-    "base": "http://example.org/foo/bar",
-    "href": "http://[::d01:4403]/",
-    "origin": "http://[::d01:4403]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[::d01:4403]",
-    "hostname": "[::d01:4403]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://[2001::1]:80",
-    "base": "http://example.org/foo/bar",
-    "href": "http://[2001::1]/",
-    "origin": "http://[2001::1]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[2001::1]",
-    "hostname": "[2001::1]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/example.com/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ftp://example.com/",
-    "origin": "ftp://example.com",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "https://example.com/",
-    "origin": "https://example.com",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "madeupscheme:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "madeupscheme:/example.com/",
-    "origin": "null",
-    "protocol": "madeupscheme:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "file:///example.com/",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftps:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ftps:/example.com/",
-    "origin": "null",
-    "protocol": "ftps:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "gopher://example.com/",
-    "origin": "gopher://example.com",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ws://example.com/",
-    "origin": "ws://example.com",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "wss://example.com/",
-    "origin": "wss://example.com",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "data:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "data:/example.com/",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "javascript:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "javascript:/example.com/",
-    "origin": "null",
-    "protocol": "javascript:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "mailto:/example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "mailto:/example.com/",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/example.com/",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ftp://example.com/",
-    "origin": "ftp://example.com",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "https://example.com/",
-    "origin": "https://example.com",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "madeupscheme:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "madeupscheme:example.com/",
-    "origin": "null",
-    "protocol": "madeupscheme:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftps:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ftps:example.com/",
-    "origin": "null",
-    "protocol": "ftps:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "gopher://example.com/",
-    "origin": "gopher://example.com",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "ws://example.com/",
-    "origin": "ws://example.com",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "wss://example.com/",
-    "origin": "wss://example.com",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "data:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "data:example.com/",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "javascript:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "javascript:example.com/",
-    "origin": "null",
-    "protocol": "javascript:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "mailto:example.com/",
-    "base": "http://example.org/foo/bar",
-    "href": "mailto:example.com/",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/a/b/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/a/b/c",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/a/b/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/a/ /c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/a/%20/c",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/a/%20/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/a%2fc",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/a%2fc",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/a%2fc",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/a/%2f/c",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/a/%2f/c",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/a/%2f/c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "#β",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar#%CE%B2",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "hash": "#%CE%B2"
-  },
-  {
-    "input": "data:text/html,test#test",
-    "base": "http://example.org/foo/bar",
-    "href": "data:text/html,test#test",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "text/html,test",
-    "search": "",
-    "hash": "#test"
-  },
-  {
-    "input": "tel:1234567890",
-    "base": "http://example.org/foo/bar",
-    "href": "tel:1234567890",
-    "origin": "null",
-    "protocol": "tel:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "1234567890",
-    "search": "",
-    "hash": ""
-  },
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/file.html",
-  {
-    "input": "file:c:\\foo\\bar.html",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///c:/foo/bar.html",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/c:/foo/bar.html",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "  File:c|////foo\\bar.html",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///c:////foo/bar.html",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/c:////foo/bar.html",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "C|/foo/bar",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///C:/foo/bar",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/C:/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/C|\\foo\\bar",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///C:/foo/bar",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/C:/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "//C|/foo/bar",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///C:/foo/bar",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/C:/foo/bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "//server/file",
-    "base": "file:///tmp/mock/path",
-    "href": "file://server/file",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "server",
-    "hostname": "server",
-    "port": "",
-    "pathname": "/file",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "\\\\server\\file",
-    "base": "file:///tmp/mock/path",
-    "href": "file://server/file",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "server",
-    "hostname": "server",
-    "port": "",
-    "pathname": "/file",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/\\server/file",
-    "base": "file:///tmp/mock/path",
-    "href": "file://server/file",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "server",
-    "hostname": "server",
-    "port": "",
-    "pathname": "/file",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:///foo/bar.txt",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///foo/bar.txt",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/foo/bar.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:///home/me",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///home/me",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/home/me",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "//",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "///",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "///test",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///test",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/test",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file://test",
-    "base": "file:///tmp/mock/path",
-    "href": "file://test/",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "test",
-    "hostname": "test",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file://localhost",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file://localhost/",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file://localhost/test",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///test",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/test",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "test",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///tmp/mock/test",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/tmp/mock/test",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:test",
-    "base": "file:///tmp/mock/path",
-    "href": "file:///tmp/mock/test",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/tmp/mock/test",
-    "search": "",
-    "hash": ""
-  },
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js",
-  {
-    "input": "http://example.com/././foo",
-    "base": "about:blank",
-    "href": "http://example.com/foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/./.foo",
-    "base": "about:blank",
-    "href": "http://example.com/.foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/.foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/.",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/./",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar/..",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar/../",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/..bar",
-    "base": "about:blank",
-    "href": "http://example.com/foo/..bar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/..bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar/../ton",
-    "base": "about:blank",
-    "href": "http://example.com/foo/ton",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/ton",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar/../ton/../../a",
-    "base": "about:blank",
-    "href": "http://example.com/a",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/a",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/../../..",
-    "base": "about:blank",
-    "href": "http://example.com/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/../../../ton",
-    "base": "about:blank",
-    "href": "http://example.com/ton",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/ton",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/%2e",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/%2e%2",
-    "base": "about:blank",
-    "href": "http://example.com/foo/.%2",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/.%2",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar",
-    "base": "about:blank",
-    "href": "http://example.com/..bar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/..bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com////../..",
-    "base": "about:blank",
-    "href": "http://example.com//",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "//",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar//../..",
-    "base": "about:blank",
-    "href": "http://example.com/foo/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo/bar//..",
-    "base": "about:blank",
-    "href": "http://example.com/foo/bar/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo/bar/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo",
-    "base": "about:blank",
-    "href": "http://example.com/foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/%20foo",
-    "base": "about:blank",
-    "href": "http://example.com/%20foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%20foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%",
-    "base": "about:blank",
-    "href": "http://example.com/foo%",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%2",
-    "base": "about:blank",
-    "href": "http://example.com/foo%2",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%2",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%2zbar",
-    "base": "about:blank",
-    "href": "http://example.com/foo%2zbar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%2zbar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%2©zbar",
-    "base": "about:blank",
-    "href": "http://example.com/foo%2%C3%82%C2%A9zbar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%2%C3%82%C2%A9zbar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%41%7a",
-    "base": "about:blank",
-    "href": "http://example.com/foo%41%7a",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%41%7a",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo\t\u0091%91",
-    "base": "about:blank",
-    "href": "http://example.com/foo%C2%91%91",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%C2%91%91",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo%00%51",
-    "base": "about:blank",
-    "href": "http://example.com/foo%00%51",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foo%00%51",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/(%28:%3A%29)",
-    "base": "about:blank",
-    "href": "http://example.com/(%28:%3A%29)",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/(%28:%3A%29)",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/%3A%3a%3C%3c",
-    "base": "about:blank",
-    "href": "http://example.com/%3A%3a%3C%3c",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%3A%3a%3C%3c",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/foo\tbar",
-    "base": "about:blank",
-    "href": "http://example.com/foobar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/foobar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com\\\\foo\\\\bar",
-    "base": "about:blank",
-    "href": "http://example.com//foo//bar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "//foo//bar",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd",
-    "base": "about:blank",
-    "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%7Ffp3%3Eju%3Dduvgw%3Dd",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/@asdf%40",
-    "base": "about:blank",
-    "href": "http://example.com/@asdf%40",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/@asdf%40",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/你好你好",
-    "base": "about:blank",
-    "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/‥/foo",
-    "base": "about:blank",
-    "href": "http://example.com/%E2%80%A5/foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%E2%80%A5/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com//foo",
-    "base": "about:blank",
-    "href": "http://example.com/%EF%BB%BF/foo",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%EF%BB%BF/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example.com/‮/foo/‭/bar",
-    "base": "about:blank",
-    "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/%E2%80%AE/foo/%E2%80%AD/bar",
-    "search": "",
-    "hash": ""
-  },
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js",
-  {
-    "input": "http://www.google.com/foo?bar=baz#",
-    "base": "about:blank",
-    "href": "http://www.google.com/foo?bar=baz#",
-    "origin": "http://www.google.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.google.com",
-    "hostname": "www.google.com",
-    "port": "",
-    "pathname": "/foo",
-    "search": "?bar=baz",
-    "hash": ""
-  },
-  {
-    "input": "http://www.google.com/foo?bar=baz# »",
-    "base": "about:blank",
-    "href": "http://www.google.com/foo?bar=baz# %C2%BB",
-    "origin": "http://www.google.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.google.com",
-    "hostname": "www.google.com",
-    "port": "",
-    "pathname": "/foo",
-    "search": "?bar=baz",
-    "hash": "# %C2%BB"
-  },
-  {
-    "input": "data:test# »",
-    "base": "about:blank",
-    "href": "data:test# %C2%BB",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "test",
-    "search": "",
-    "hash": "# %C2%BB"
-  },
-  {
-    "input": "http://[www.google.com]/",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://www.google.com",
-    "base": "about:blank",
-    "href": "http://www.google.com/",
-    "origin": "http://www.google.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.google.com",
-    "hostname": "www.google.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://192.0x00A80001",
-    "base": "about:blank",
-    "href": "http://192.168.0.1/",
-    "origin": "http://192.168.0.1",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "192.168.0.1",
-    "hostname": "192.168.0.1",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://www/foo%2Ehtml",
-    "base": "about:blank",
-    "href": "http://www/foo.html",
-    "origin": "http://www",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www",
-    "hostname": "www",
-    "port": "",
-    "pathname": "/foo.html",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://www/foo/%2E/html",
-    "base": "about:blank",
-    "href": "http://www/foo/html",
-    "origin": "http://www",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www",
-    "hostname": "www",
-    "port": "",
-    "pathname": "/foo/html",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://user:pass@/",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://%25DOMAIN:foobar@foodomain.com/",
-    "base": "about:blank",
-    "href": "http://%25DOMAIN:foobar@foodomain.com/",
-    "origin": "http://foodomain.com",
-    "protocol": "http:",
-    "username": "%25DOMAIN",
-    "password": "foobar",
-    "host": "foodomain.com",
-    "hostname": "foodomain.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:\\\\www.google.com\\foo",
-    "base": "about:blank",
-    "href": "http://www.google.com/foo",
-    "origin": "http://www.google.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.google.com",
-    "hostname": "www.google.com",
-    "port": "",
-    "pathname": "/foo",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo:80/",
-    "base": "about:blank",
-    "href": "http://foo/",
-    "origin": "http://foo",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo:81/",
-    "base": "about:blank",
-    "href": "http://foo:81/",
-    "origin": "http://foo:81",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo:81",
-    "hostname": "foo",
-    "port": "81",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "httpa://foo:80/",
-    "base": "about:blank",
-    "href": "httpa://foo:80/",
-    "origin": "null",
-    "protocol": "httpa:",
-    "username": "",
-    "password": "",
-    "host": "foo:80",
-    "hostname": "foo",
-    "port": "80",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://foo:-80/",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "https://foo:443/",
-    "base": "about:blank",
-    "href": "https://foo/",
-    "origin": "https://foo",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https://foo:80/",
-    "base": "about:blank",
-    "href": "https://foo:80/",
-    "origin": "https://foo:80",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "foo:80",
-    "hostname": "foo",
-    "port": "80",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp://foo:21/",
-    "base": "about:blank",
-    "href": "ftp://foo/",
-    "origin": "ftp://foo",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp://foo:80/",
-    "base": "about:blank",
-    "href": "ftp://foo:80/",
-    "origin": "ftp://foo:80",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "foo:80",
-    "hostname": "foo",
-    "port": "80",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher://foo:70/",
-    "base": "about:blank",
-    "href": "gopher://foo/",
-    "origin": "gopher://foo",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher://foo:443/",
-    "base": "about:blank",
-    "href": "gopher://foo:443/",
-    "origin": "gopher://foo:443",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "foo:443",
-    "hostname": "foo",
-    "port": "443",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws://foo:80/",
-    "base": "about:blank",
-    "href": "ws://foo/",
-    "origin": "ws://foo",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws://foo:81/",
-    "base": "about:blank",
-    "href": "ws://foo:81/",
-    "origin": "ws://foo:81",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "foo:81",
-    "hostname": "foo",
-    "port": "81",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws://foo:443/",
-    "base": "about:blank",
-    "href": "ws://foo:443/",
-    "origin": "ws://foo:443",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "foo:443",
-    "hostname": "foo",
-    "port": "443",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws://foo:815/",
-    "base": "about:blank",
-    "href": "ws://foo:815/",
-    "origin": "ws://foo:815",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "foo:815",
-    "hostname": "foo",
-    "port": "815",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss://foo:80/",
-    "base": "about:blank",
-    "href": "wss://foo:80/",
-    "origin": "wss://foo:80",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "foo:80",
-    "hostname": "foo",
-    "port": "80",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss://foo:81/",
-    "base": "about:blank",
-    "href": "wss://foo:81/",
-    "origin": "wss://foo:81",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "foo:81",
-    "hostname": "foo",
-    "port": "81",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss://foo:443/",
-    "base": "about:blank",
-    "href": "wss://foo/",
-    "origin": "wss://foo",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "foo",
-    "hostname": "foo",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss://foo:815/",
-    "base": "about:blank",
-    "href": "wss://foo:815/",
-    "origin": "wss://foo:815",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "foo:815",
-    "hostname": "foo",
-    "port": "815",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/example.com/",
-    "base": "about:blank",
-    "href": "http://example.com/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp:/example.com/",
-    "base": "about:blank",
-    "href": "ftp://example.com/",
-    "origin": "ftp://example.com",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https:/example.com/",
-    "base": "about:blank",
-    "href": "https://example.com/",
-    "origin": "https://example.com",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "madeupscheme:/example.com/",
-    "base": "about:blank",
-    "href": "madeupscheme:/example.com/",
-    "origin": "null",
-    "protocol": "madeupscheme:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:/example.com/",
-    "base": "about:blank",
-    "href": "file:///example.com/",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftps:/example.com/",
-    "base": "about:blank",
-    "href": "ftps:/example.com/",
-    "origin": "null",
-    "protocol": "ftps:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher:/example.com/",
-    "base": "about:blank",
-    "href": "gopher://example.com/",
-    "origin": "gopher://example.com",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws:/example.com/",
-    "base": "about:blank",
-    "href": "ws://example.com/",
-    "origin": "ws://example.com",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss:/example.com/",
-    "base": "about:blank",
-    "href": "wss://example.com/",
-    "origin": "wss://example.com",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "data:/example.com/",
-    "base": "about:blank",
-    "href": "data:/example.com/",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "javascript:/example.com/",
-    "base": "about:blank",
-    "href": "javascript:/example.com/",
-    "origin": "null",
-    "protocol": "javascript:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "mailto:/example.com/",
-    "base": "about:blank",
-    "href": "mailto:/example.com/",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:example.com/",
-    "base": "about:blank",
-    "href": "http://example.com/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftp:example.com/",
-    "base": "about:blank",
-    "href": "ftp://example.com/",
-    "origin": "ftp://example.com",
-    "protocol": "ftp:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https:example.com/",
-    "base": "about:blank",
-    "href": "https://example.com/",
-    "origin": "https://example.com",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "madeupscheme:example.com/",
-    "base": "about:blank",
-    "href": "madeupscheme:example.com/",
-    "origin": "null",
-    "protocol": "madeupscheme:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ftps:example.com/",
-    "base": "about:blank",
-    "href": "ftps:example.com/",
-    "origin": "null",
-    "protocol": "ftps:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "gopher:example.com/",
-    "base": "about:blank",
-    "href": "gopher://example.com/",
-    "origin": "gopher://example.com",
-    "protocol": "gopher:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "ws:example.com/",
-    "base": "about:blank",
-    "href": "ws://example.com/",
-    "origin": "ws://example.com",
-    "protocol": "ws:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "wss:example.com/",
-    "base": "about:blank",
-    "href": "wss://example.com/",
-    "origin": "wss://example.com",
-    "protocol": "wss:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "data:example.com/",
-    "base": "about:blank",
-    "href": "data:example.com/",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "javascript:example.com/",
-    "base": "about:blank",
-    "href": "javascript:example.com/",
-    "origin": "null",
-    "protocol": "javascript:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "mailto:example.com/",
-    "base": "about:blank",
-    "href": "mailto:example.com/",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "example.com/",
-    "search": "",
-    "hash": ""
-  },
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html",
-  {
-    "input": "http:@www.example.com",
-    "base": "about:blank",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/@www.example.com",
-    "base": "about:blank",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://@www.example.com",
-    "base": "about:blank",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:a:b@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/a:b@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://a:b@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://@pple.com",
-    "base": "about:blank",
-    "href": "http://pple.com/",
-    "origin": "http://pple.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "pple.com",
-    "hostname": "pple.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http::b@www.example.com",
-    "base": "about:blank",
-    "href": "http://:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/:b@www.example.com",
-    "base": "about:blank",
-    "href": "http://:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://:b@www.example.com",
-    "base": "about:blank",
-    "href": "http://:b@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "b",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/:@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://user@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:/@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "https:@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:a:b@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:/a:b@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://a:b@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http::@/www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:a:@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:/a:@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://a:@www.example.com",
-    "base": "about:blank",
-    "href": "http://a:@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "a",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://www.@pple.com",
-    "base": "about:blank",
-    "href": "http://www.@pple.com/",
-    "origin": "http://pple.com",
-    "protocol": "http:",
-    "username": "www.",
-    "password": "",
-    "host": "pple.com",
-    "hostname": "pple.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http:@:www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http:/@:www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://@:www.example.com",
-    "base": "about:blank",
-    "failure": true
-  },
-  {
-    "input": "http://:@www.example.com",
-    "base": "about:blank",
-    "href": "http://:@www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "# Others",
-  {
-    "input": "/",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": ".",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "..",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "./test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../aaa/test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/aaa/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/aaa/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../../test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "中/test.txt",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example.com/%E4%B8%AD/test.txt",
-    "origin": "http://www.example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example.com",
-    "hostname": "www.example.com",
-    "port": "",
-    "pathname": "/%E4%B8%AD/test.txt",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://www.example2.com",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example2.com/",
-    "origin": "http://www.example2.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example2.com",
-    "hostname": "www.example2.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "//www.example2.com",
-    "base": "http://www.example.com/test",
-    "href": "http://www.example2.com/",
-    "origin": "http://www.example2.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.example2.com",
-    "hostname": "www.example2.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:...",
-    "base": "http://www.example.com/test",
-    "href": "file:///...",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/...",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:..",
-    "base": "http://www.example.com/test",
-    "href": "file:///",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "file:a",
-    "base": "http://www.example.com/test",
-    "href": "file:///a",
-    "protocol": "file:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/a",
-    "search": "",
-    "hash": ""
-  },
-  "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/host.html",
-  "Basic canonicalization, uppercase should be converted to lowercase",
-  {
-    "input": "http://ExAmPlE.CoM",
-    "base": "http://other.com/",
-    "href": "http://example.com/",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://example example.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://Goo%20 goo%7C|.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://[]",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://[:]",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "U+3000 is mapped to U+0020 (space) which is disallowed",
-  {
-    "input": "http://GOO\u00a0\u3000goo.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Other types of space (no-break, zero-width, zero-width-no-break) are name-prepped away to nothing. U+200B, U+2060, and U+FEFF, are ignored",
-  {
-    "input": "http://GOO\u200b\u2060\ufeffgoo.com",
-    "base": "http://other.com/",
-    "href": "http://googoo.com/",
-    "origin": "http://googoo.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "googoo.com",
-    "hostname": "googoo.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)",
-  {
-    "input": "http://www.foo。bar.com",
-    "base": "http://other.com/",
-    "href": "http://www.foo.bar.com/",
-    "origin": "http://www.foo.bar.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "www.foo.bar.com",
-    "hostname": "www.foo.bar.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "Invalid unicode characters should fail... U+FDD0 is disallowed; %ef%b7%90 is U+FDD0",
-  {
-    "input": "http://\ufdd0zyx.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "This is the same as previous but escaped",
-  {
-    "input": "http://%ef%b7%90zyx.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.",
-  {
-    "input": "http://Go.com",
-    "base": "http://other.com/",
-    "href": "http://go.com/",
-    "origin": "http://go.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "go.com",
-    "hostname": "go.com",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "URL spec forbids the following. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24257",
-  {
-    "input": "http://%41.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://%ef%bc%85%ef%bc%94%ef%bc%91.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "...%00 in fullwidth should fail (also as escaped UTF-8 input)",
-  {
-    "input": "http://%00.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://%ef%bc%85%ef%bc%90%ef%bc%90.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN",
-  {
-    "input": "http://你好你好",
-    "base": "http://other.com/",
-    "href": "http://xn--6qqa088eba/",
-    "origin": "http://你好你好",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "xn--6qqa088eba",
-    "hostname": "xn--6qqa088eba",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "Invalid escaped characters should fail and the percents should be escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191",
-  {
-    "input": "http://%zz%66%a.com",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "If we get an invalid character that has been escaped.",
-  {
-    "input": "http://%25",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  {
-    "input": "http://hello%00",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Escaped numbers should be treated like IP addresses if they are.",
-  {
-    "input": "http://%30%78%63%30%2e%30%32%35%30.01",
-    "base": "http://other.com/",
-    "href": "http://192.168.0.1/",
-    "origin": "http://192.168.0.1",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "192.168.0.1",
-    "hostname": "192.168.0.1",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://%30%78%63%30%2e%30%32%35%30.01%2e",
-    "base": "http://other.com/",
-    "href": "http://192.168.0.1/",
-    "origin": "http://192.168.0.1",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "192.168.0.1",
-    "hostname": "192.168.0.1",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://192.168.0.257",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Invalid escaping should trigger the regular host error handling",
-  {
-    "input": "http://%3g%78%63%30%2e%30%32%35%30%2E.01",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Something that isn't exactly an IP should get treated as a host and spaces escaped",
-  {
-    "input": "http://192.168.0.1 hello",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP",
-  {
-    "input": "http://0Xc0.0250.01",
-    "base": "http://other.com/",
-    "href": "http://192.168.0.1/",
-    "origin": "http://192.168.0.1",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "192.168.0.1",
-    "hostname": "192.168.0.1",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "Broken IPv6",
-  {
-    "input": "http://[google.com]",
-    "base": "http://other.com/",
-    "failure": true
-  },
-  "Misc Unicode",
-  {
-    "input": "http://foo:💩@example.com/bar",
-    "base": "http://other.com/",
-    "href": "http://foo:%F0%9F%92%A9@example.com/bar",
-    "origin": "http://example.com",
-    "protocol": "http:",
-    "username": "foo",
-    "password": "%F0%9F%92%A9",
-    "host": "example.com",
-    "hostname": "example.com",
-    "port": "",
-    "pathname": "/bar",
-    "search": "",
-    "hash": ""
-  },
-  "# resolving a fragment against any scheme succeeds",
-  {
-    "input": "#",
-    "base": "test:test",
-    "href": "test:test#",
-    "origin": "null",
-    "protocol": "test:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "test",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "#x",
-    "base": "mailto:x@x.com",
-    "href": "mailto:x@x.com#x",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "x@x.com",
-    "search": "",
-    "hash": "#x"
-  },
-  {
-    "input": "#x",
-    "base": "data:,",
-    "href": "data:,#x",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": ",",
-    "search": "",
-    "hash": "#x"
-  },
-  {
-    "input": "#x",
-    "base": "about:blank",
-    "href": "about:blank#x",
-    "origin": "null",
-    "protocol": "about:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "blank",
-    "search": "",
-    "hash": "#x"
-  },
-  {
-    "input": "#",
-    "base": "test:test?test",
-    "href": "test:test?test#",
-    "origin": "null",
-    "protocol": "test:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "test",
-    "search": "?test",
-    "hash": ""
-  },
-  "# multiple @ in authority state",
-  {
-    "input": "https://@test@test@example:800/",
-    "base": "http://doesnotmatter/",
-    "href": "https://%40test%40test@example:800/",
-    "origin": "https://example:800",
-    "protocol": "https:",
-    "username": "%40test%40test",
-    "password": "",
-    "host": "example:800",
-    "hostname": "example",
-    "port": "800",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "https://@@@example",
-    "base": "http://doesnotmatter/",
-    "href": "https://%40%40@example/",
-    "origin": "https://example",
-    "protocol": "https:",
-    "username": "%40%40",
-    "password": "",
-    "host": "example",
-    "hostname": "example",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "non-az-09 characters",
-  {
-    "input": "http://`{}:`{}@h/`{}?`{}",
-    "base": "http://doesnotmatter/",
-    "href": "http://%60%7B%7D:%60%7B%7D@h/%60%7B%7D?`{}",
-    "origin": "http://h",
-    "protocol": "http:",
-    "username": "%60%7B%7D",
-    "password": "%60%7B%7D",
-    "host": "h",
-    "hostname": "h",
-    "port": "",
-    "pathname": "/%60%7B%7D",
-    "search": "?`{}",
-    "hash": ""
-  },
-  "# Credentials in base",
-  {
-    "input": "/some/path",
-    "base": "http://user@example.org/smth",
-    "href": "http://user@example.org/some/path",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "user",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/some/path",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "",
-    "base": "http://user:pass@example.org:21/smth",
-    "href": "http://user:pass@example.org:21/smth",
-    "origin": "http://example.org:21",
-    "protocol": "http:",
-    "username": "user",
-    "password": "pass",
-    "host": "example.org:21",
-    "hostname": "example.org",
-    "port": "21",
-    "pathname": "/smth",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/some/path",
-    "base": "http://user:pass@example.org:21/smth",
-    "href": "http://user:pass@example.org:21/some/path",
-    "origin": "http://example.org:21",
-    "protocol": "http:",
-    "username": "user",
-    "password": "pass",
-    "host": "example.org:21",
-    "hostname": "example.org",
-    "port": "21",
-    "pathname": "/some/path",
-    "search": "",
-    "hash": ""
-  },
-  "# a set of tests designed by zcorpan for relative URLs with unknown schemes",
-  {
-    "input": "i",
-    "base": "sc:sd",
-    "failure": true
-  },
-  {
-    "input": "i",
-    "base": "sc:sd/sd",
-    "failure": true
-  },
-  {
-    "input": "i",
-    "base": "sc:/pa/pa",
-    "href": "sc:/pa/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "i",
-    "base": "sc://ho/pa",
-    "href": "sc://ho/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "ho",
-    "hostname": "ho",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "i",
-    "base": "sc:///pa/pa",
-    "href": "sc:///pa/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../i",
-    "base": "sc:sd",
-    "failure": true
-  },
-  {
-    "input": "../i",
-    "base": "sc:sd/sd",
-    "failure": true
-  },
-  {
-    "input": "../i",
-    "base": "sc:/pa/pa",
-    "href": "sc:/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../i",
-    "base": "sc://ho/pa",
-    "href": "sc://ho/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "ho",
-    "hostname": "ho",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "../i",
-    "base": "sc:///pa/pa",
-    "href": "sc:///i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/i",
-    "base": "sc:sd",
-    "failure": true
-  },
-  {
-    "input": "/i",
-    "base": "sc:sd/sd",
-    "failure": true
-  },
-  {
-    "input": "/i",
-    "base": "sc:/pa/pa",
-    "href": "sc:/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/i",
-    "base": "sc://ho/pa",
-    "href": "sc://ho/i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "ho",
-    "hostname": "ho",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "/i",
-    "base": "sc:///pa/pa",
-    "href": "sc:///i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/i",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "?i",
-    "base": "sc:sd",
-    "failure": true
-  },
-  {
-    "input": "?i",
-    "base": "sc:sd/sd",
-    "failure": true
-  },
-  {
-    "input": "?i",
-    "base": "sc:/pa/pa",
-    "href": "sc:/pa/pa?i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/pa",
-    "search": "?i",
-    "hash": ""
-  },
-  {
-    "input": "?i",
-    "base": "sc://ho/pa",
-    "href": "sc://ho/pa?i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "ho",
-    "hostname": "ho",
-    "port": "",
-    "pathname": "/pa",
-    "search": "?i",
-    "hash": ""
-  },
-  {
-    "input": "?i",
-    "base": "sc:///pa/pa",
-    "href": "sc:///pa/pa?i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/pa",
-    "search": "?i",
-    "hash": ""
-  },
-  {
-    "input": "#i",
-    "base": "sc:sd",
-    "href": "sc:sd#i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "sd",
-    "search": "",
-    "hash": "#i"
-  },
-  {
-    "input": "#i",
-    "base": "sc:sd/sd",
-    "href": "sc:sd/sd#i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "sd/sd",
-    "search": "",
-    "hash": "#i"
-  },
-  {
-    "input": "#i",
-    "base": "sc:/pa/pa",
-    "href": "sc:/pa/pa#i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/pa",
-    "search": "",
-    "hash": "#i"
-  },
-  {
-    "input": "#i",
-    "base": "sc://ho/pa",
-    "href": "sc://ho/pa#i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "ho",
-    "hostname": "ho",
-    "port": "",
-    "pathname": "/pa",
-    "search": "",
-    "hash": "#i"
-  },
-  {
-    "input": "#i",
-    "base": "sc:///pa/pa",
-    "href": "sc:///pa/pa#i",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/pa/pa",
-    "search": "",
-    "hash": "#i"
-  },
-  "# make sure that relative URL logic works on known typically non-relative schemes too",
-  {
-    "input": "about:/../",
-    "base": "about:blank",
-    "href": "about:/",
-    "origin": "null",
-    "protocol": "about:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "data:/../",
-    "base": "about:blank",
-    "href": "data:/",
-    "origin": "null",
-    "protocol": "data:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "javascript:/../",
-    "base": "about:blank",
-    "href": "javascript:/",
-    "origin": "null",
-    "protocol": "javascript:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "mailto:/../",
-    "base": "about:blank",
-    "href": "mailto:/",
-    "origin": "null",
-    "protocol": "mailto:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "# unknown schemes and non-ASCII domains",
-  {
-    "input": "sc://ñ.test/",
-    "base": "about:blank",
-    "href": "sc://xn--ida.test/",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "xn--ida.test",
-    "hostname": "xn--ida.test",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "hash": ""
-  },
-  "# unknown schemes and backslashes",
-  {
-    "input": "sc:\\../",
-    "base": "about:blank",
-    "href": "sc:\\../",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "\\../",
-    "search": "",
-    "hash": ""
-  },
-  "# unknown scheme with path looking like a password",
-  {
-    "input": "sc::a@example.net",
-    "base": "about:blank",
-    "href": "sc::a@example.net",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": ":a@example.net",
-    "search": "",
-    "hash": ""
-  },
-  "# tests from jsdom/whatwg-url designed for code coverage",
-  {
-    "input": "http://127.0.0.1:10100/relative_import.html",
-    "base": "about:blank",
-    "href": "http://127.0.0.1:10100/relative_import.html",
-    "origin": "http://127.0.0.1:10100",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "127.0.0.1:10100",
-    "hostname": "127.0.0.1",
-    "port": "10100",
-    "pathname": "/relative_import.html",
-    "search": "",
-    "hash": ""
-  },
-  {
-    "input": "http://facebook.com/?foo=%7B%22abc%22",
-    "base": "about:blank",
-    "href": "http://facebook.com/?foo=%7B%22abc%22",
-    "origin": "http://facebook.com",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "facebook.com",
-    "hostname": "facebook.com",
-    "port": "",
-    "pathname": "/",
-    "search": "?foo=%7B%22abc%22",
-    "hash": ""
-  },
-  {
-    "input": "https://localhost:3000/jqueryui@1.2.3",
-    "base": "about:blank",
-    "href": "https://localhost:3000/jqueryui@1.2.3",
-    "origin": "https://localhost:3000",
-    "protocol": "https:",
-    "username": "",
-    "password": "",
-    "host": "localhost:3000",
-    "hostname": "localhost",
-    "port": "3000",
-    "pathname": "/jqueryui@1.2.3",
-    "search": "",
-    "hash": ""
-  },
-  "# tab/LF/CR",
-  {
-    "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg",
-    "base": "about:blank",
-    "href": "http://host:9000/path?query#frag",
-    "origin": "http://host:9000",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "host:9000",
-    "hostname": "host",
-    "port": "9000",
-    "pathname": "/path",
-    "search": "?query",
-    "hash": "#frag"
-  },
-  "# Stringification of URL.searchParams",
-  {
-    "input": "?a=b&c=d",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar?a=b&c=d",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "?a=b&c=d",
-    "searchParams": "a=b&c=d",
-    "hash": ""
-  },
-  {
-    "input": "??a=b&c=d",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar??a=b&c=d",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "??a=b&c=d",
-    "searchParams": "%3Fa=b&c=d",
-    "hash": ""
-  },
-  "# Scheme only",
-  {
-    "input": "http:",
-    "base": "http://example.org/foo/bar",
-    "href": "http://example.org/foo/bar",
-    "origin": "http://example.org",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "example.org",
-    "hostname": "example.org",
-    "port": "",
-    "pathname": "/foo/bar",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  },
-  {
-    "input": "http:",
-    "base": "https://example.org/foo/bar",
-    "failure": true
-  },
-  {
-    "input": "sc:",
-    "base": "https://example.org/foo/bar",
-    "href": "sc:",
-    "origin": "null",
-    "protocol": "sc:",
-    "username": "",
-    "password": "",
-    "host": "",
-    "hostname": "",
-    "port": "",
-    "pathname": "",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  },
-  "# Percent encoding of fragments",
-  {
-    "input": "http://foo.bar/baz?qux#foo\bbar",
-    "base": "about:blank",
-    "href": "http://foo.bar/baz?qux#foo%08bar",
-    "origin": "http://foo.bar",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "foo.bar",
-    "hostname": "foo.bar",
-    "port": "",
-    "pathname": "/baz",
-    "search": "?qux",
-    "searchParams": "",
-    "hash": "#foo%08bar"
-  },
-  "# IPv6 compression and serialization",
-  {
-    "input": "http://[fe80:cd00::1257:0:211e:729c]/",
-    "base": "about:blank",
-    "href": "http://[fe80:cd00::1257:0:211e:729c]/",
-    "origin": "http://[fe80:cd00::1257:0:211e:729c]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[fe80:cd00::1257:0:211e:729c]",
-    "hostname": "[fe80:cd00::1257:0:211e:729c]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  },
-  "# IPv6 compression and serialization: Compress sequences of two or more zeroes",
-  {
-    "input": "http://[fe80:cd00:0:0:1257:0:211e:729c]/",
-    "base": "about:blank",
-    "href": "http://[fe80:cd00::1257:0:211e:729c]/",
-    "origin": "http://[fe80:cd00::1257:0:211e:729c]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[fe80:cd00::1257:0:211e:729c]",
-    "hostname": "[fe80:cd00::1257:0:211e:729c]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  },
-  "# IPv6 compression and serialization: Compress longest sequence of zeroes",
-  {
-    "input": "http://[fe80:0:0:1257:0:0:0:cd00]/",
-    "base": "about:blank",
-    "href": "http://[fe80:0:0:1257::cd00]/",
-    "origin": "http://[fe80:0:0:1257::cd00]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[fe80:0:0:1257::cd00]",
-    "hostname": "[fe80:0:0:1257::cd00]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  },
-  "# IPv6 compression and serialization: Do not compress lone zeroes",
-  {
-    "input": "http://[fe80:cd00:0:cde:1257:0:211e:729c]/",
-    "base": "about:blank",
-    "href": "http://[fe80:cd00:0:cde:1257:0:211e:729c]/",
-    "origin": "http://[fe80:cd00:0:cde:1257:0:211e:729c]",
-    "protocol": "http:",
-    "username": "",
-    "password": "",
-    "host": "[fe80:cd00:0:cde:1257:0:211e:729c]",
-    "hostname": "[fe80:cd00:0:cde:1257:0:211e:729c]",
-    "port": "",
-    "pathname": "/",
-    "search": "",
-    "searchParams": "",
-    "hash": ""
-  }
-]
deleted file mode 100644
--- a/third_party/rust/which-1.0.2/.cargo-checksum.json
+++ /dev/null
@@ -1,1 +0,0 @@
-{"files":{"Cargo.toml":"9435a9e1724cb647f4a4f3e4b6f33df5ec4f23cf94be62f54c24635b63cc3b31","LICENSE.txt":"0041560f5d419c30e1594567f3b7ac2bc078ff6a68f437e0348ba85d9cf99112","README.md":"cc89b0731a6efd4be15d4ea9005e6b998981506cf9ce057e56acd8bc4edbfa3c","src/lib.rs":"4ead66ddef1b6824a656ff1be692b74dc099aae944fbb677352ad2a0c78782d3"},"package":"d238435618c0f298d2d75596c2d4fa7d4ea469c0c1c3ff824737ed50ad5ab61c"}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/rust/which-1.0.2/Cargo.toml
+++ /dev/null
@@ -1,16 +0,0 @@
-[package]
-name = "which"
-version = "1.0.2"
-authors = ["fangyuanziti <tiziyuanfang@gmail.com>"]
-repository = "https://github.com/fangyuanziti/which-rs.git"
-documentation = "http://fangyuanziti.github.io/which-rs/which/"
-license = "MIT"
-description= "A Rust equivalent of Unix command \"which\"."
-categories = ["command-line-utilities"]
-keywords = ["which", "which-rs", "unix", "command"]
-
-[dependencies]
-libc = "0.2.10"
-
-[dev-dependencies]
-tempdir = "0.3.4"
deleted file mode 100644
--- a/third_party/rust/which-1.0.2/LICENSE.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2015 fangyuanziti
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
deleted file mode 100644
--- a/third_party/rust/which-1.0.2/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# which
-
-A Rust equivalent of Unix command "which".
-
-## Example
-
-To find which rustc exectable binary is using.
-
-``` rust
-use which::which;
-
-let result = which::which("rustc").unwrap();
-assert_eq!(result, PathBuf::from("/usr/bin/rustc"));
-
-```
-
-## Documentation
-
-The documentation is [available online](http://fangyuanziti.github.io/which-rs/which/).
deleted file mode 100644
--- a/third_party/rust/which-1.0.2/src/lib.rs
+++ /dev/null
@@ -1,445 +0,0 @@
-//! which
-//!
-//! A Rust equivalent of Unix command `which(1)`.
-//! # Example:
-//!
-//! To find which rustc executable binary is using:
-//!
-//! ``` norun
-//! use which::which;
-//!
-//! let result = which::which("rustc").unwrap();
-//! assert_eq!(result, PathBuf::from("/usr/bin/rustc"));
-//!
-//! ```
-
-extern crate libc;
-#[cfg(test)]
-extern crate tempdir;
-
-use std::ascii::AsciiExt;
-use std::path::{Path,PathBuf};
-use std::{env, fs};
-#[cfg(unix)]
-use std::ffi::CString;
-use std::ffi::OsStr;
-#[cfg(unix)]
-use std::os::unix::ffi::OsStrExt;
-
-/// Like `Path::with_extension`, but don't replace an existing extension.
-fn ensure_exe_extension<T: AsRef<Path>>(path: T) -> PathBuf {
-    if env::consts::EXE_EXTENSION.is_empty() {
-        // Nothing to do.
-        path.as_ref().to_path_buf()
-    } else {
-        match path.as_ref().extension().and_then(|e| e.to_str()).map(|e| e.eq_ignore_ascii_case(env::consts::EXE_EXTENSION)) {
-            // Already has the right extension.
-            Some(true) => path.as_ref().to_path_buf(),
-            _ => {
-                // Append the extension.
-                let mut s = path.as_ref().to_path_buf().into_os_string();
-                s.push(".");
-                s.push(env::consts::EXE_EXTENSION);
-                PathBuf::from(s)
-            }
-        }
-    }
-}
-
-
-/// Find a exectable binary's path by name.
-///
-/// If given an absolute path, returns it if the file exists and is executable.
-///
-/// If given a relative path, returns an absolute path to the file if
-/// it exists and is executable.
-///
-/// If given a string without path separators, looks for a file named
-/// `binary_name` at each directory in `$PATH` and if it finds an executable
-/// file there, returns it.
-///
-/// # Example
-///
-/// ``` norun
-/// use which::which;
-/// use std::path::PathBuf;
-///
-/// let result = which::which("rustc").unwrap();
-/// assert_eq!(result, PathBuf::from("/usr/bin/rustc"));
-///
-/// ```
-pub fn which<T: AsRef<OsStr>>(binary_name: T)
-             -> Result<PathBuf, &'static str> {
-    env::current_dir()
-        .or_else(|_| Err("Couldn't get current directory"))
-        .and_then(|cwd| which_in(binary_name, env::var_os("PATH"), &cwd))
-}
-
-/// Find `binary_name` in the path list `paths`, using `cwd` to resolve relative paths.
-pub fn which_in<T, U, V>(binary_name: T, paths: Option<U>, cwd: V)
-             -> Result<PathBuf, &'static str>
-                where T: AsRef<OsStr>,
-                      U: AsRef<OsStr>,
-                      V: AsRef<Path> {
-    let binary_checker = CompositeChecker::new()
-        .add_checker(Box::new(ExistedChecker::new()))
-        .add_checker(Box::new(ExecutableChecker::new()));
-
-    let finder = Finder::new();
-
-    finder.find(binary_name, paths, cwd, &binary_checker)
-}
-
-struct Finder;
-
-impl Finder {
-    fn new() -> Finder {
-        Finder
-    }
-
-    fn find<T, U, V>(&self, binary_name: T, paths: Option<U>, cwd: V,
-                     binary_checker: &Checker)
-                     -> Result<PathBuf, &'static str>
-        where T: AsRef<OsStr>,
-              U: AsRef<OsStr>,
-              V: AsRef<Path> {
-
-        let path = ensure_exe_extension(binary_name.as_ref());
-
-        // Does it have a path separator?
-        if path.components().count() > 1 {
-            if path.is_absolute() {
-                if binary_checker.is_valid(&path) {
-                    // Already fine.
-                    Ok(path)
-                } else {
-                    // Absolute path but it's not usable.
-                    Err("Bad absolute path")
-                }
-            } else {
-                // Try to make it absolute.
-                let mut new_path = PathBuf::from(cwd.as_ref());
-                new_path.push(path);
-                let new_path = ensure_exe_extension(new_path);
-                if binary_checker.is_valid(&new_path) {
-                    Ok(new_path)
-                } else {
-                    // File doesn't exist or isn't executable.
-                    Err("Bad relative path")
-                }
-            }
-        } else {
-            // No separator, look it up in `paths`.
-            paths.and_then(
-                |paths|
-                env::split_paths(paths.as_ref())
-                    .map(|p| ensure_exe_extension(p.join(binary_name.as_ref())))
-                    .skip_while(|p| !(binary_checker.is_valid(&p)))
-                    .next())
-                .ok_or("Cannot find binary path")
-        }
-    }
-}
-
-
-trait Checker {
-    fn is_valid(&self, path: &Path) -> bool;
-}
-
-struct ExecutableChecker;
-
-impl ExecutableChecker {
-    fn new() -> ExecutableChecker {
-        ExecutableChecker
-    }
-}
-
-impl Checker for ExecutableChecker {
-    #[cfg(unix)]
-    fn is_valid(&self, path: &Path) -> bool {
-        CString::new(path.as_os_str().as_bytes())
-            .and_then(|c| {
-                Ok(unsafe { libc::access(c.as_ptr(), libc::X_OK) == 0 })
-            })
-            .unwrap_or(false)
-    }
-
-    #[cfg(not(unix))]
-    fn is_valid(&self, _path: &Path) -> bool { true }
-}
-
-struct ExistedChecker;
-
-impl ExistedChecker {
-    fn new() -> ExistedChecker {
-        ExistedChecker
-    }
-}
-
-impl Checker for ExistedChecker {
-    fn is_valid(&self, path: &Path) -> bool {
-        fs::metadata(path).map(|metadata|{
-            metadata.is_file()
-        }).unwrap_or(false)
-    }
-}
-
-struct CompositeChecker {
-    checkers: Vec<Box<Checker>>
-}
-
-impl CompositeChecker {
-    fn new() -> CompositeChecker {
-        CompositeChecker {
-            checkers: Vec::new()
-        }
-    }
-
-    fn add_checker(mut self, checker: Box<Checker>) -> CompositeChecker {
-        self.checkers.push(checker);
-        self
-    }
-}
-
-impl Checker for CompositeChecker {
-    fn is_valid(&self, path: &Path) -> bool {
-        self.checkers.iter()
-            .all(|checker| checker.is_valid(path))
-    }
-}
-
-#[test]
-fn test_exe_extension() {
-    let expected = PathBuf::from("foo").with_extension(env::consts::EXE_EXTENSION);
-    assert_eq!(expected, ensure_exe_extension(PathBuf::from("foo")));
-    let p = expected.clone();
-    assert_eq!(expected, ensure_exe_extension(p));
-}
-
-#[test]
-#[cfg(windows)]
-fn test_exe_extension_existing_extension() {
-    assert_eq!(PathBuf::from("foo.bar.exe"),
-               ensure_exe_extension("foo.bar"));
-}
-
-#[test]
-#[cfg(windows)]
-fn test_exe_extension_existing_extension_uppercase() {
-    assert_eq!(PathBuf::from("foo.EXE"),
-               ensure_exe_extension("foo.EXE"));
-}
-
-#[cfg(test)]
-mod test {
-    use super::*;
-
-    use std::env;
-    use std::ffi::{OsStr,OsString};
-    use std::fs;
-    use std::io;
-    use std::path::{Path,PathBuf};
-    use tempdir::TempDir;
-
-    struct TestFixture {
-        /// Temp directory.
-        pub tempdir: TempDir,
-        /// $PATH
-        pub paths: OsString,
-        /// Binaries created in $PATH
-        pub bins: Vec<PathBuf>,
-    }
-
-    const SUBDIRS: &'static [&'static str] = &["a", "b", "c"];
-    const BIN_NAME: &'static str = "bin";
-
-    #[cfg(unix)]
-    fn mk_bin(dir: &Path, path: &str) -> io::Result<PathBuf> {
-        use libc;
-        use std::os::unix::fs::OpenOptionsExt;
-        let bin = dir.join(path).with_extension(env::consts::EXE_EXTENSION);
-        fs::OpenOptions::new()
-            .write(true)
-            .create(true)
-            .mode(0o666 | (libc::S_IXUSR as u32))
-            .open(&bin)
-            .and_then(|_f| bin.canonicalize())
-    }
-
-    fn touch(dir: &Path, path: &str) -> io::Result<PathBuf> {
-        let b = dir.join(path).with_extension(env::consts::EXE_EXTENSION);
-        fs::File::create(&b)
-            .and_then(|_f| b.canonicalize())
-    }
-
-    #[cfg(not(unix))]
-    fn mk_bin(dir: &Path, path: &str) -> io::Result<PathBuf> {
-        touch(dir, path)
-    }
-
-    impl TestFixture {
-        pub fn new() -> TestFixture {
-            let tempdir = TempDir::new("which_tests").unwrap();
-            let mut builder = fs::DirBuilder::new();
-            builder.recursive(true);
-            let mut paths = vec!();
-            let mut bins = vec!();
-            for d in SUBDIRS.iter() {
-                let p = tempdir.path().join(d);
-                builder.create(&p).unwrap();
-                bins.push(mk_bin(&p, &BIN_NAME).unwrap());
-                paths.push(p);
-            }
-            TestFixture {
-                tempdir: tempdir,
-                paths: env::join_paths(paths).unwrap(),
-                bins: bins,
-            }
-        }
-
-        #[allow(dead_code)]
-        pub fn touch(&self, path: &str) -> io::Result<PathBuf> {
-            touch(self.tempdir.path(), &path)
-        }
-
-        pub fn mk_bin(&self, path: &str) -> io::Result<PathBuf> {
-            mk_bin(self.tempdir.path(), &path)
-        }
-    }
-
-    fn _which<T: AsRef<OsStr>>(f: &TestFixture, path: T) -> Result<PathBuf, &'static str> {
-        which_in(path, Some(f.paths.clone()), f.tempdir.path())
-    }
-
-    #[test]
-    #[cfg(unix)]
-    fn it_works() {
-        use std::process::Command;
-        let result = which("rustc");
-        assert!(result.is_ok());
-
-        let which_result = Command::new("which")
-            .arg("rustc")
-            .output();
-
-        assert_eq!(String::from(result.unwrap().to_str().unwrap()),
-                   String::from_utf8(which_result.unwrap().stdout).unwrap().trim());
-    }
-
-    #[test]
-    fn test_which() {
-        let f = TestFixture::new();
-        assert_eq!(_which(&f, &BIN_NAME).unwrap().canonicalize().unwrap(),
-                   f.bins[0])
-    }
-
-    #[test]
-    fn test_which_extension() {
-        let f = TestFixture::new();
-        let b = Path::new(&BIN_NAME).with_extension(env::consts::EXE_EXTENSION);
-        assert_eq!(_which(&f, &b).unwrap().canonicalize().unwrap(),
-                   f.bins[0])
-    }
-
-    #[test]
-    fn test_which_not_found() {
-        let f = TestFixture::new();
-        assert!(_which(&f, "a").is_err());
-    }
-
-    #[test]
-    fn test_which_second() {
-        let f = TestFixture::new();
-        let b = f.mk_bin("b/another").unwrap();
-        assert_eq!(_which(&f, "another").unwrap().canonicalize().unwrap(), b);
-    }
-
-    #[test]
-    fn test_which_absolute() {
-        let f = TestFixture::new();
-        assert_eq!(_which(&f, &f.bins[1]).unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    #[cfg(windows)]
-    fn test_which_absolute_path_case() {
-        // Test that an absolute path with an uppercase extension
-        // is accepted.
-        let f = TestFixture::new();
-        let p = f.bins[1].with_extension("EXE");
-        assert_eq!(_which(&f, &p).unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    fn test_which_absolute_extension() {
-        let f = TestFixture::new();
-        // Don't append EXE_EXTENSION here.
-        let b = f.bins[1].parent().unwrap().join(&BIN_NAME);
-        assert_eq!(_which(&f, &b).unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    fn test_which_relative() {
-        let f = TestFixture::new();
-        assert_eq!(_which(&f, "b/bin").unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    fn test_which_relative_extension() {
-        // test_which_relative tests a relative path without an extension,
-        // so test a relative path with an extension here.
-        let f = TestFixture::new();
-        let b = Path::new("b/bin").with_extension(env::consts::EXE_EXTENSION);
-        assert_eq!(_which(&f, &b).unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    #[cfg(windows)]
-    fn test_which_relative_extension_case() {
-        // Test that a relative path with an uppercase extension
-        // is accepted.
-        let f = TestFixture::new();
-        let b = Path::new("b/bin").with_extension("EXE");
-        assert_eq!(_which(&f, &b).unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    fn test_which_relative_leading_dot() {
-        let f = TestFixture::new();
-        assert_eq!(_which(&f, "./b/bin").unwrap().canonicalize().unwrap(),
-                   f.bins[1].canonicalize().unwrap());
-    }
-
-    #[test]
-    #[cfg(unix)]
-    fn test_which_non_executable() {
-        // Shouldn't return non-executable files.
-        let f = TestFixture::new();
-        f.touch("b/another").unwrap();
-        assert!(_which(&f, "another").is_err());
-    }
-
-    #[test]
-    #[cfg(unix)]
-    fn test_which_absolute_non_executable() {
-        // Shouldn't return non-executable files, even if given an absolute path.
-        let f = TestFixture::new();
-        let b = f.touch("b/another").unwrap();
-        assert!(_which(&f, &b).is_err());
-    }
-
-    #[test]
-    #[cfg(unix)]
-    fn test_which_relative_non_executable() {
-        // Shouldn't return non-executable files.
-        let f = TestFixture::new();
-        f.touch("b/another").unwrap();
-        assert!(_which(&f, "b/another").is_err());
-    }
-}
--- a/toolkit/library/gtest/rust/Cargo.lock
+++ b/toolkit/library/gtest/rust/Cargo.lock
@@ -1,28 +1,28 @@
 [[package]]
 name = "aho-corasick"
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ansi_term"
-version = "0.9.0"
+version = "0.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "app_units"
 version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "arrayvec"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -36,59 +36,59 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atty"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc"
 version = "0.1.0"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb-core 0.1.0",
  "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc-client"
 version = "0.1.0"
 dependencies = [
  "audioipc 0.1.0",
  "cubeb-backend 0.2.0",
  "cubeb-core 0.1.0",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc-server"
 version = "0.1.0"
 dependencies = [
  "audioipc 0.1.0",
  "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb 0.3.0",
  "cubeb-core 0.1.0",
  "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "binary-space-partition"
@@ -96,17 +96,17 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bincode"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bincode"
 version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -117,19 +117,19 @@ dependencies = [
 [[package]]
 name = "bindgen"
 version = "0.31.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -185,32 +185,30 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "clang-sys"
 version = "0.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "clap"
-version = "2.25.0"
+version = "2.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "coco"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -220,55 +218,55 @@ dependencies = [
 ]
 
 [[package]]
 name = "core-foundation"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation-sys 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-foundation-sys"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-foundation-sys"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-graphics"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-text"
 version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cose"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -282,17 +280,17 @@ dependencies = [
 [[package]]
 name = "cssparser"
 version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -355,17 +353,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "darling_core"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "darling_macro"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -390,18 +388,18 @@ dependencies = [
 
 [[package]]
 name = "dwrote"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "either"
 version = "1.1.0"
@@ -449,17 +447,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "euclid"
 version = "0.15.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fallible"
 version = "0.0.1"
 dependencies = [
  "hashglobe 0.1.0",
@@ -476,26 +474,26 @@ name = "foreign-types"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "freetype"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fs2"
 version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fuchsia-zircon"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -534,17 +532,17 @@ dependencies = [
 
 [[package]]
 name = "geckoservo"
 version = "0.0.1"
 dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "nsstring 0.1.0",
  "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.0.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
@@ -608,17 +606,17 @@ dependencies = [
 name = "glob"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "hashglobe"
 version = "0.1.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "heapsize"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -629,27 +627,27 @@ name = "ident_case"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "idna"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "iovec"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "itertools"
 version = "0.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -672,66 +670,66 @@ dependencies = [
 
 [[package]]
 name = "khronos_api"
 version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
-version = "0.2.8"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazycell"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libc"
-version = "0.2.24"
+version = "0.2.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libcubeb-sys"
 version = "0.1.0"
 dependencies = [
  "cubeb-core 0.1.0",
 ]
 
 [[package]]
 name = "libloading"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libudev"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libudev-sys 0.1.3",
 ]
 
 [[package]]
 name = "libudev-sys"
 version = "0.1.3"
 dependencies = [
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "log"
 version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -753,60 +751,60 @@ version = "0.0.1"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "matches"
-version = "0.1.4"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "memchr"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "memmap"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "fs2 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mio"
 version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mio-uds"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "miow"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -818,44 +816,44 @@ dependencies = [
 
 [[package]]
 name = "mp4parse"
 version = "0.9.0"
 dependencies = [
  "bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mp4parse_fallible 0.0.1",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mp4parse-gtest"
 version = "0.1.0"
 
 [[package]]
 name = "mp4parse_capi"
 version = "0.9.0"
 dependencies = [
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mp4parse 0.9.0",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mp4parse_fallible"
 version = "0.0.1"
 
 [[package]]
 name = "net2"
 version = "0.2.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "netwerk_helper"
 version = "0.0.1"
 dependencies = [
@@ -891,41 +889,41 @@ dependencies = [
 name = "nsstring-gtest"
 version = "0.1.0"
 dependencies = [
  "nsstring 0.1.0",
 ]
 
 [[package]]
 name = "num-integer"
-version = "0.1.33"
+version = "0.1.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-traits"
-version = "0.1.39"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "num_cpus"
-version = "1.6.2"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ordered-float"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "owning_ref"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -943,17 +941,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "parking_lot_core"
 version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "peeking_take_while"
 version = "0.1.2"
@@ -1006,17 +1004,17 @@ source = "registry+https://github.com/ru
 [[package]]
 name = "plane-split"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "precomputed-hash"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1031,31 +1029,31 @@ dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pulse-ffi 0.1.0",
 ]
 
 [[package]]
 name = "pulse-ffi"
 version = "0.1.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "quote"
 version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rand"
 version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rayon"
 version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rayon-core 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1063,34 +1061,34 @@ dependencies = [
 
 [[package]]
 name = "rayon-core"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.1.16"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "regex"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "regex-syntax"
 version = "0.4.1"
@@ -1100,20 +1098,20 @@ source = "registry+https://github.com/ru
 name = "runloop"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rust_url_capi"
 version = "0.0.1"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
- "url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rustc-serialize"
 version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1135,17 +1133,17 @@ name = "selectors"
 version = "0.19.0"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_arc 0.0.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1254,37 +1252,37 @@ dependencies = [
  "hashglobe 0.1.0",
  "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
- "num-integer 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.0.1",
  "smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_derive 0.0.1",
  "style_traits 0.0.1",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "style_derive"
 version = "0.0.1"
 dependencies = [
@@ -1331,41 +1329,30 @@ name = "synstructure"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "term_size"
-version = "0.3.0"
+name = "textwrap"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread-id"
 version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread_local"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1374,39 +1361,39 @@ dependencies = [
 
 [[package]]
 name = "thread_profiler"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "time"
-version = "0.1.36"
+version = "0.1.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "toml"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "u2fhid"
 version = "0.1.0"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1414,20 +1401,20 @@ name = "uluru"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.3"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "unicode-normalization"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1450,21 +1437,21 @@ name = "unreachable"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "url"
-version = "1.5.1"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "utf8-ranges"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -1501,39 +1488,39 @@ dependencies = [
  "core-text 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "freetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "plane-split 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.55.0",
 ]
 
 [[package]]
 name = "webrender_api"
 version = "0.55.0"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender_bindings"
 version = "0.1.0"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1548,17 +1535,17 @@ dependencies = [
  "webrender 0.55.0",
 ]
 
 [[package]]
 name = "which"
 version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "winapi"
 version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1580,17 +1567,17 @@ name = "xml-rs"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
-"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
+"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
 "checksum app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ed0a4de09a3b8449515e649f3bb84f72ea15fc2d10639beb0776a09b7d308074"
 "checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e"
 "checksum bincode 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3fb369af639822830328794eba2501b3479652fcd021b2aeb1ed4984202afd"
 "checksum bindgen 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57253399c086f4f29e57ffd3b5cdbc23a806a00292619351aa4cfa39cb49d4ea"
@@ -1599,17 +1586,17 @@ dependencies = [
 "checksum bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8380105befe91099e6f69206164072c05bc92427ff6aa8a5171388317346dd75"
 "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
 "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6"
 "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d"
 "checksum cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c47d456a36ebf0536a6705c83c1cbbcb9255fbc1d905a6ded104f479268a29"
 "checksum clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00048189ee171715296dfe3b2fcfd439563c7bfec0d98d3976ce3402d62c8f07"
-"checksum clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "867a885995b4184be051b70a592d4d70e32d7a188db6e8dff626af286a962771"
+"checksum clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"
 "checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd"
 "checksum core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5909502e547762013619f4c4e01cc7393c20fe2d52d7fa471c1210adb2320dc7"
 "checksum core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41115a6aa5d3e1e5ef98148373f25971d1fad53818553f216495f9e67e90a624"
 "checksum core-foundation-sys 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bc9fb3d6cb663e6fd7cf1c63f9b144ee2b1e4a78595a0451dd34bff85b9a3387"
 "checksum core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5dc0a78ab2ac23b6ea7b3fe5fe93b227900dc0956979735b8f68032417976dd4"
 "checksum core-text 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcad23756dd1dc4b47bf6a914ace27aadb8fa68889db5837af2308d018d0467c"
 "checksum cose 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec10816629f38fa557f08e199a3474fab954f4c8d2645550367235afa6e5646b"
 "checksum cose-c 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "07cc8bb85ec2e93541ef9369b85a4b6fb7732bc7f4854d317eab20e726b0fc2f"
@@ -1642,35 +1629,35 @@ dependencies = [
 "checksum heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7593b1522161003928c959c20a2ca421c68e940d63d75573316a009e48a6d4"
 "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
 "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
 "checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
 "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc"
 "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
 "checksum khronos_api 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867c645cfeb8a7fec503731679eac03ac11b7105aa5a71cb8f8ee5271636add"
-"checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"
+"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
 "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
 "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
-"checksum libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"
+"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
-"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
-"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
+"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
+"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46f3c7359028b31999287dae4e5047ddfe90a23b7dca2282ce759b491080c99b"
 "checksum mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9e965267d4d58496fc4f740e9861118367f13570cadf66316ed2c3f2f14d87c7"
 "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
 "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
-"checksum num-integer 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "21e4df1098d1d797d27ef0c69c178c3fab64941559b290fcae198e0825c9c8b5"
-"checksum num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "1708c0628602a98b52fad936cf3edb9a107af06e52e49fdf0707e884456a6af6"
-"checksum num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584"
+"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
+"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
+"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 "checksum parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "37f364e2ce5efa24c7d0b6646d5bb61145551a0112f107ffd7499f1a3e322fbd"
 "checksum parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6c677d78851950b3aec390e681a411f78cc250cba277d4f578758a377f727970"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
 "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc"
 "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f"
@@ -1679,17 +1666,17 @@ dependencies = [
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum plane-split 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e57800a97ca52c556db6b6184a3201f05366ad5e11876f7d17e234589ca2fa26"
 "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
 "checksum procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f566249236c6ca4340f7ca78968271f0ed2b0f234007a61b66f9ecd0af09260"
 "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 "checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd"
 "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8"
 "checksum rayon-core 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2c21a92a5dca958fb030787c1158446c6deb7f976399b72fa8074603f169e2a"
-"checksum redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd35cc9a8bdec562c757e3d43c1526b5c6d2653e23e2315065bc25556550753"
+"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"
 "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
 "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd"
 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
 "checksum same-file 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d931a44fdaa43b8637009e7632a02adc4f2b2e0733c08caa4cf00e8da4a117a7"
 "checksum scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c79eb2c3ac4bc2507cda80e7f3ac5b88bd8eae4c0914d5663e6a8933994be918"
 "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
 "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
@@ -1702,31 +1689,30 @@ dependencies = [
 "checksum smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "79b776f00dfe01df905fa3b2eaa1659522e99e3fc4a7b1334171622205c4bdcf"
 "checksum smallvec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "872c0ff227000041c520cca51e883b858d388ab0ecf646bab76f065cebaec025"
 "checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9"
 "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
 "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
 "checksum synom 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "27e31aa4b09b9f4cb12dff3c30ba503e17b1a624413d764d32dab76e3920e5bc"
 "checksum synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cf318c34a2f8381a4f3d4db2c91b45bca2b1cd8cbe56caced900647be164800c"
-"checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
-"checksum textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f86300c3e7416ee233abd7cda890c492007a3980f941f79185c753a701257167"
+"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
 "checksum thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"
 "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7"
 "checksum thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf947d192a9be60ef5131cc7a4648886ba89d712f16700ebbf80c8a69d05d48f"
-"checksum time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "211b63c112206356ef1ff9b19355f43740fc3f85960c598a93d3a3d3ba7beade"
+"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
 "checksum toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "736b60249cb25337bc196faa43ee12c705e426f3d55c214d73a4e7be06f92cb4"
 "checksum uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "519130f0ea964ba540a9d8af1373738c2226f1d465eda07e61db29feb5479db9"
-"checksum unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a"
+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
 "checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3"
 "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
 "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
 "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"
-"checksum url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27"
+"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2"
 "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bb08f9e670fab86099470b97cd2b252d6527f0b3cc1401acdb595ffc9dd288ff"
 "checksum which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4be6cfa54dab45266e98b5d7be2f8ce959ddd49abd141a05d52dce4b07f803bb"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
--- a/toolkit/library/rust/Cargo.lock
+++ b/toolkit/library/rust/Cargo.lock
@@ -1,28 +1,28 @@
 [[package]]
 name = "aho-corasick"
 version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ansi_term"
-version = "0.9.0"
+version = "0.10.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "app_units"
 version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "arrayvec"
 version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -36,59 +36,59 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "atty"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc"
 version = "0.1.0"
 dependencies = [
  "bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb-core 0.1.0",
  "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc-client"
 version = "0.1.0"
 dependencies = [
  "audioipc 0.1.0",
  "cubeb-backend 0.2.0",
  "cubeb-core 0.1.0",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "audioipc-server"
 version = "0.1.0"
 dependencies = [
  "audioipc 0.1.0",
  "bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "cubeb 0.3.0",
  "cubeb-core 0.1.0",
  "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "binary-space-partition"
@@ -96,17 +96,17 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "bincode"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "bincode"
 version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -117,19 +117,19 @@ dependencies = [
 [[package]]
 name = "bindgen"
 version = "0.31.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -185,32 +185,30 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "clang-sys"
 version = "0.21.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "clap"
-version = "2.25.0"
+version = "2.29.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "coco"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -220,55 +218,55 @@ dependencies = [
 ]
 
 [[package]]
 name = "core-foundation"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation-sys 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-foundation-sys"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-foundation-sys"
 version = "0.4.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-graphics"
 version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "core-text"
 version = "8.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cose"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -282,17 +280,17 @@ dependencies = [
 [[package]]
 name = "cssparser"
 version = "0.23.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -355,17 +353,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "darling_core"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "darling_macro"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -390,18 +388,18 @@ dependencies = [
 
 [[package]]
 name = "dwrote"
 version = "0.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "either"
 version = "1.1.0"
@@ -449,17 +447,17 @@ source = "registry+https://github.com/ru
 
 [[package]]
 name = "euclid"
 version = "0.15.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fallible"
 version = "0.0.1"
 dependencies = [
  "hashglobe 0.1.0",
@@ -476,26 +474,26 @@ name = "foreign-types"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "freetype"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fs2"
 version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "fuchsia-zircon"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -534,17 +532,17 @@ dependencies = [
 
 [[package]]
 name = "geckoservo"
 version = "0.0.1"
 dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "nsstring 0.1.0",
  "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.0.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
@@ -607,17 +605,17 @@ dependencies = [
 name = "glob"
 version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "hashglobe"
 version = "0.1.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "heapsize"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -628,27 +626,27 @@ name = "ident_case"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "idna"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "iovec"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "itertools"
 version = "0.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -671,66 +669,66 @@ dependencies = [
 
 [[package]]
 name = "khronos_api"
 version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
-version = "0.2.8"
+version = "0.2.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazy_static"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "lazycell"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libc"
-version = "0.2.24"
+version = "0.2.33"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "libcubeb-sys"
 version = "0.1.0"
 dependencies = [
  "cubeb-core 0.1.0",
 ]
 
 [[package]]
 name = "libloading"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "libudev"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libudev-sys 0.1.3",
 ]
 
 [[package]]
 name = "libudev-sys"
 version = "0.1.3"
 dependencies = [
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "log"
 version = "0.3.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -752,60 +750,60 @@ version = "0.0.1"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "matches"
-version = "0.1.4"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "memchr"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "memmap"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "fs2 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mio"
 version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
  "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mio-uds"
 version = "0.6.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "miow"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -817,40 +815,40 @@ dependencies = [
 
 [[package]]
 name = "mp4parse"
 version = "0.9.0"
 dependencies = [
  "bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mp4parse_fallible 0.0.1",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mp4parse_capi"
 version = "0.9.0"
 dependencies = [
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mp4parse 0.9.0",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "mp4parse_fallible"
 version = "0.0.1"
 
 [[package]]
 name = "net2"
 version = "0.2.31"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "netwerk_helper"
 version = "0.0.1"
 dependencies = [
@@ -879,41 +877,41 @@ dependencies = [
 name = "nsstring"
 version = "0.1.0"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-integer"
-version = "0.1.33"
+version = "0.1.35"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "num-traits"
-version = "0.1.39"
+version = "0.1.41"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "num_cpus"
-version = "1.6.2"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ordered-float"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "owning_ref"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -931,17 +929,17 @@ dependencies = [
 ]
 
 [[package]]
 name = "parking_lot_core"
 version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "peeking_take_while"
 version = "0.1.2"
@@ -994,17 +992,17 @@ source = "registry+https://github.com/ru
 [[package]]
 name = "plane-split"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "precomputed-hash"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1019,31 +1017,31 @@ dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "pulse-ffi 0.1.0",
 ]
 
 [[package]]
 name = "pulse-ffi"
 version = "0.1.0"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "quote"
 version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rand"
 version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "fuchsia-zircon 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rayon"
 version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "rayon-core 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1051,34 +1049,34 @@ dependencies = [
 
 [[package]]
 name = "rayon-core"
 version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "futures 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)",
- "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.1.16"
+version = "0.1.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "regex"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "regex-syntax"
 version = "0.4.1"
@@ -1088,20 +1086,20 @@ source = "registry+https://github.com/ru
 name = "runloop"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "rust_url_capi"
 version = "0.0.1"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "nserror 0.1.0",
  "nsstring 0.1.0",
- "url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rustc-serialize"
 version = "0.3.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1123,17 +1121,17 @@ name = "selectors"
 version = "0.19.0"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_arc 0.0.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1246,37 +1244,37 @@ dependencies = [
  "hashglobe 0.1.0",
  "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
- "num-integer 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
- "num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.0.1",
  "smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_derive 0.0.1",
  "style_traits 0.0.1",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "style_derive"
 version = "0.0.1"
 dependencies = [
@@ -1304,17 +1302,17 @@ dependencies = [
 name = "stylo_tests"
 version = "0.0.1"
 dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "geckoservo 0.0.1",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "size_of_test 0.0.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
@@ -1343,41 +1341,30 @@ name = "synstructure"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "term_size"
-version = "0.3.0"
+name = "textwrap"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread-id"
 version = "3.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "thread_local"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1386,39 +1373,39 @@ dependencies = [
 
 [[package]]
 name = "thread_profiler"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "time"
-version = "0.1.36"
+version = "0.1.38"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
- "redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
+ "redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "toml"
 version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "u2fhid"
 version = "0.1.0"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
  "runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -1426,20 +1413,20 @@ name = "uluru"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.3"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "unicode-normalization"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1462,21 +1449,21 @@ name = "unreachable"
 version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "url"
-version = "1.5.1"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "utf8-ranges"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
@@ -1513,39 +1500,39 @@ dependencies = [
  "core-text 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "freetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
+ "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "plane-split 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.55.0",
 ]
 
 [[package]]
 name = "webrender_api"
 version = "0.55.0"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "dwrote 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)",
- "time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender_bindings"
 version = "0.1.0"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1560,17 +1547,17 @@ dependencies = [
  "webrender 0.55.0",
 ]
 
 [[package]]
 name = "which"
 version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)",
+ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "winapi"
 version = "0.2.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -1592,17 +1579,17 @@ name = "xml-rs"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
-"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
+"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
 "checksum app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ed0a4de09a3b8449515e649f3bb84f72ea15fc2d10639beb0776a09b7d308074"
 "checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2"
 "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21"
 "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
 "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
 "checksum bincode 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e103c8b299b28a9c6990458b7013dc4a8356a9b854c51b9883241f5866fac36e"
 "checksum bincode 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3fb369af639822830328794eba2501b3479652fcd021b2aeb1ed4984202afd"
 "checksum bindgen 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "57253399c086f4f29e57ffd3b5cdbc23a806a00292619351aa4cfa39cb49d4ea"
@@ -1611,17 +1598,17 @@ dependencies = [
 "checksum bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989"
 "checksum bitreader 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "80b13e2ab064ff3aa0bdbf1eff533f9822dc37899821f5f98c67f263eab51707"
 "checksum boxfnonce 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8380105befe91099e6f69206164072c05bc92427ff6aa8a5171388317346dd75"
 "checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23"
 "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6"
 "checksum cexpr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "393a5f0088efbe41f9d1fcd062f24e83c278608420e62109feb2c8abee07de7d"
 "checksum cfg-if 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c47d456a36ebf0536a6705c83c1cbbcb9255fbc1d905a6ded104f479268a29"
 "checksum clang-sys 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00048189ee171715296dfe3b2fcfd439563c7bfec0d98d3976ce3402d62c8f07"
-"checksum clap 2.25.0 (registry+https://github.com/rust-lang/crates.io-index)" = "867a885995b4184be051b70a592d4d70e32d7a188db6e8dff626af286a962771"
+"checksum clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"
 "checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd"
 "checksum core-foundation 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5909502e547762013619f4c4e01cc7393c20fe2d52d7fa471c1210adb2320dc7"
 "checksum core-foundation-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "41115a6aa5d3e1e5ef98148373f25971d1fad53818553f216495f9e67e90a624"
 "checksum core-foundation-sys 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bc9fb3d6cb663e6fd7cf1c63f9b144ee2b1e4a78595a0451dd34bff85b9a3387"
 "checksum core-graphics 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5dc0a78ab2ac23b6ea7b3fe5fe93b227900dc0956979735b8f68032417976dd4"
 "checksum core-text 8.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bcad23756dd1dc4b47bf6a914ace27aadb8fa68889db5837af2308d018d0467c"
 "checksum cose 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec10816629f38fa557f08e199a3474fab954f4c8d2645550367235afa6e5646b"
 "checksum cose-c 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "07cc8bb85ec2e93541ef9369b85a4b6fb7732bc7f4854d317eab20e726b0fc2f"
@@ -1654,35 +1641,35 @@ dependencies = [
 "checksum heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7593b1522161003928c959c20a2ca421c68e940d63d75573316a009e48a6d4"
 "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
 "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d"
 "checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
 "checksum itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4833d6978da405305126af4ac88569b5d71ff758581ce5a987dbfa3755f694fc"
 "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
 "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
 "checksum khronos_api 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867c645cfeb8a7fec503731679eac03ac11b7105aa5a71cb8f8ee5271636add"
-"checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf"
+"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
 "checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
 "checksum lazycell 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce12306c4739d86ee97c23139f3a34ddf0387bbf181bc7929d287025a8c3ef6b"
-"checksum libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)" = "38f5c2b18a287cf78b4097db62e20f43cace381dc76ae5c0a3073067f78b7ddc"
+"checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
-"checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
-"checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
+"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376"
+"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a"
 "checksum memmap 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "46f3c7359028b31999287dae4e5047ddfe90a23b7dca2282ce759b491080c99b"
 "checksum mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9e965267d4d58496fc4f740e9861118367f13570cadf66316ed2c3f2f14d87c7"
 "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
 "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce"
-"checksum num-integer 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "21e4df1098d1d797d27ef0c69c178c3fab64941559b290fcae198e0825c9c8b5"
-"checksum num-traits 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "1708c0628602a98b52fad936cf3edb9a107af06e52e49fdf0707e884456a6af6"
-"checksum num_cpus 1.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aec53c34f2d0247c5ca5d32cca1478762f301740468ee9ee6dcb7a0dd7a0c584"
+"checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
+"checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
+"checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
 "checksum parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "37f364e2ce5efa24c7d0b6646d5bb61145551a0112f107ffd7499f1a3e322fbd"
 "checksum parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6c677d78851950b3aec390e681a411f78cc250cba277d4f578758a377f727970"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
 "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc"
 "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f"
@@ -1691,17 +1678,17 @@ dependencies = [
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum plane-split 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e57800a97ca52c556db6b6184a3201f05366ad5e11876f7d17e234589ca2fa26"
 "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
 "checksum procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f566249236c6ca4340f7ca78968271f0ed2b0f234007a61b66f9ecd0af09260"
 "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
 "checksum rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6475140dfd8655aeb72e1fd4b7a1cc1c202be65d71669476e392fe62532b9edd"
 "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8"
 "checksum rayon-core 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2c21a92a5dca958fb030787c1158446c6deb7f976399b72fa8074603f169e2a"
-"checksum redox_syscall 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd35cc9a8bdec562c757e3d43c1526b5c6d2653e23e2315065bc25556550753"
+"checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"
 "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
 "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd"
 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
 "checksum same-file 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d931a44fdaa43b8637009e7632a02adc4f2b2e0733c08caa4cf00e8da4a117a7"
 "checksum scopeguard 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c79eb2c3ac4bc2507cda80e7f3ac5b88bd8eae4c0914d5663e6a8933994be918"
 "checksum semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537"
 "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
@@ -1714,31 +1701,30 @@ dependencies = [
 "checksum smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "79b776f00dfe01df905fa3b2eaa1659522e99e3fc4a7b1334171622205c4bdcf"
 "checksum smallvec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "872c0ff227000041c520cca51e883b858d388ab0ecf646bab76f065cebaec025"
 "checksum smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44db0ecb22921ef790d17ae13a3f6d15784183ff5f2a01aa32098c7498d2b4b9"
 "checksum stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "15132e0e364248108c5e2c02e3ab539be8d6f5d52a01ca9bbf27ed657316f02b"
 "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
 "checksum synom 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "27e31aa4b09b9f4cb12dff3c30ba503e17b1a624413d764d32dab76e3920e5bc"
 "checksum synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cf318c34a2f8381a4f3d4db2c91b45bca2b1cd8cbe56caced900647be164800c"
-"checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
-"checksum textwrap 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f86300c3e7416ee233abd7cda890c492007a3980f941f79185c753a701257167"
+"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
 "checksum thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"
 "checksum thread_local 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c85048c6260d17cf486ceae3282d9fb6b90be220bf5b28c400f5485ffc29f0c7"
 "checksum thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf947d192a9be60ef5131cc7a4648886ba89d712f16700ebbf80c8a69d05d48f"
-"checksum time 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "211b63c112206356ef1ff9b19355f43740fc3f85960c598a93d3a3d3ba7beade"
+"checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
 "checksum toml 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "736b60249cb25337bc196faa43ee12c705e426f3d55c214d73a4e7be06f92cb4"
 "checksum uluru 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "519130f0ea964ba540a9d8af1373738c2226f1d465eda07e61db29feb5479db9"
-"checksum unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a6a2c4e3710edd365cd7e78383153ed739fa31af19f9172f72d3575060f5a43a"
+"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
 "checksum unicode-segmentation 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18127285758f0e2c6cf325bb3f3d138a12fee27de4f23e146cd6a179f26c2cf3"
 "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
 "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
 "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"
-"checksum url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27"
+"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2"
 "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "bb08f9e670fab86099470b97cd2b252d6527f0b3cc1401acdb595ffc9dd288ff"
 "checksum which 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4be6cfa54dab45266e98b5d7be2f8ce959ddd49abd141a05d52dce4b07f803bb"
 "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
 "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"