Bug 1449087 part 1 - Upgrade cssparser to 0.23.4 for serialization fix. r?emilio draft
authorXidorn Quan <me@upsuper.org>
Tue, 03 Apr 2018 22:38:19 +1000
changeset 776599 8be60db7102b905572b80aab931631153023d532
parent 776393 7a090efebcf697662b424f3142abaf6dea419185
child 776600 4985ad63cdfc9ab3c5e2142342b3acce4deb081d
push id104918
push userxquan@mozilla.com
push dateTue, 03 Apr 2018 12:39:37 +0000
reviewersemilio
bugs1449087
milestone61.0a1
Bug 1449087 part 1 - Upgrade cssparser to 0.23.4 for serialization fix. r?emilio MozReview-Commit-ID: IJ2OqSjn1NM
Cargo.lock
third_party/rust/cssparser/.cargo-checksum.json
third_party/rust/cssparser/.travis.yml
third_party/rust/cssparser/Cargo.toml
third_party/rust/cssparser/build.rs
third_party/rust/cssparser/build/match_byte.rs
third_party/rust/cssparser/src/unicode_range.rs
third_party/rust/itoa-0.3.1/.cargo-checksum.json
third_party/rust/itoa-0.3.1/.travis.yml
third_party/rust/itoa-0.3.1/Cargo.toml
third_party/rust/itoa-0.3.1/LICENSE-APACHE
third_party/rust/itoa-0.3.1/LICENSE-MIT
third_party/rust/itoa-0.3.1/README.md
third_party/rust/itoa-0.3.1/benches/bench.rs
third_party/rust/itoa-0.3.1/performance.png
third_party/rust/itoa-0.3.1/src/lib.rs
third_party/rust/itoa-0.3.1/tests/test.rs
third_party/rust/itoa/.cargo-checksum.json
third_party/rust/itoa/.travis.yml
third_party/rust/itoa/Cargo.toml
third_party/rust/itoa/README.md
third_party/rust/itoa/benches/bench.rs
third_party/rust/itoa/performance.png
third_party/rust/itoa/src/lib.rs
third_party/rust/itoa/src/udiv128.rs
third_party/rust/itoa/tests/test.rs
third_party/rust/serde_derive/.cargo-checksum.json
third_party/rust/serde_derive/LICENSE-APACHE
third_party/rust/serde_derive/LICENSE-MIT
third_party/rust/serde_derive/README.md
third_party/rust/serde_derive_internals/.cargo-checksum.json
third_party/rust/serde_derive_internals/LICENSE-APACHE
third_party/rust/serde_derive_internals/LICENSE-MIT
third_party/rust/serde_derive_internals/README.md
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -356,28 +356,29 @@ name = "crossbeam-utils"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cssparser"
-version = "0.23.2"
+version = "0.23.4"
 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)",
+ "itoa 0.4.1 (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)",
+ "proc-macro2 0.2.2 (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)",
+ "quote 0.4.2 (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)",
+ "syn 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "cssparser-macros"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -693,17 +694,17 @@ dependencies = [
  "zip 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[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)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "nsstring 0.1.0",
  "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
@@ -852,16 +853,21 @@ dependencies = [
 ]
 
 [[package]]
 name = "itoa"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
+name = "itoa"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "js"
 version = "0.1.4"
 dependencies = [
  "bindgen 0.33.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cmake 0.1.29 (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)",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -958,17 +964,17 @@ dependencies = [
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "malloc_size_of"
 version = "0.0.1"
 dependencies = [
  "app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "hashglobe 0.1.0",
  "selectors 0.19.0",
  "servo_arc 0.1.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)",
  "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -1537,17 +1543,17 @@ name = "scopeguard"
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "selectors"
 version = "0.19.0"
 dependencies = [
  "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (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.1.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1647,17 +1653,17 @@ version = "0.0.1"
 dependencies = [
  "app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bindgen 0.33.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "fallible 0.0.1",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "hashglobe 0.1.0",
  "itertools 0.7.6 (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)",
@@ -1702,30 +1708,30 @@ dependencies = [
 ]
 
 [[package]]
 name = "style_traits"
 version = "0.0.1"
 dependencies = [
  "app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
  "selectors 0.19.0",
  "servo_arc 0.1.1",
 ]
 
 [[package]]
 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)",
+ "cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "geckoservo 0.0.1",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.1 (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)",
@@ -2249,17 +2255,17 @@ dependencies = [
 "checksum core-graphics 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb0ed45fdc32f9ab426238fba9407dfead7bacd7900c9b4dd3f396f46eafdae3"
 "checksum core-text 9.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd581c37283d0c23311d179aefbb891f2324ee0405da58a26e8594ab76e5748"
 "checksum cose 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "72fa26cb151d3ae4b70f63d67d0fed57ce04220feafafbae7f503bef7aae590d"
 "checksum cose-c 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "49726015ab0ca765144fcca61e4a7a543a16b795a777fa53f554da2fffff9a94"
 "checksum crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5d02c0aac6bd68393ed69e00bbc2457f3e89075c6349db7189618dc4ddc1d7"
 "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
 "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150"
 "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
-"checksum cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a807ac3ab7a217829c2a3b65732b926b2befe6a35f33b4bf8b503692430f223"
+"checksum cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b906ac3f6108d8d0bfd4158469abe5909df1497116c8400346b5e08944579edd"
 "checksum cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "079adec4af52bb5275eadd004292028c79eb3c5f5b4ee8086a36d4197032f6df"
 "checksum cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b6557bdb1dc9647eae1cf7f5601b14cd45fc3c7ccf2df618387416fe542da6ea"
 "checksum cstr-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f316203d1ea36f4f18316822806f6999aa3dc5ed1adf51e35b77e3b3933d78"
 "checksum cubeb 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7923bed2d5a1a64ba0c3e8b6badc360508ba488d1f2f59f16a688802e755bb85"
 "checksum cubeb-backend 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdcac95519416d9ec814db2dc40e6293e7da25b906023d93f48b87f0587ab138"
 "checksum cubeb-core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "169d9a36f5daa60f9c4597905132aef056cf62693addd4a3421492853ccad565"
 "checksum cubeb-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e405ad4dff2c1a7cbfa6998e5925e8ceafe900feeacfcad35a3e3790bea0f2aa"
 "checksum darling 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d3effd06d4057f275cb7858889f4952920bab78dd8ff0f6e7dfe0c8d2e67ed89"
@@ -2294,16 +2300,17 @@ dependencies = [
 "checksum httparse 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "af2f2dd97457e8fb1ae7c5a420db346af389926e36f43768b96f101546b04a07"
 "checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e"
 "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2"
 "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.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
 "checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
+"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
 "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 language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
 "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.39 (registry+https://github.com/rust-lang/crates.io-index)" = "f54263ad99207254cf58b5f701ecb432c717445ea2ee8af387334bdd1a03fdff"
 "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
 "checksum libudev 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea626d3bdf40a1c5aee3bcd4f40826970cae8d80a8fec934c82a63840094dcfe"
--- a/third_party/rust/cssparser/.cargo-checksum.json
+++ b/third_party/rust/cssparser/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"f1fb4b65964c81bc1240544267ea334f554ca38ae7a74d57066f4d47d2b5d568","Cargo.toml":"7807f16d417eb1a6ede56cd4ba2da6c5c63e4530289b3f0848f4b154e18eba02","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"b29fc57747f79914d1c2fb541e2bb15a003028bb62751dcb901081ccc174b119","build/match_byte.rs":"2c84b8ca5884347d2007f49aecbd85b4c7582085526e2704399817249996e19b","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"c60f1b0ab7a2a6213e434604ee33f78e7ef74347f325d86d0b9192d8225ae1cc","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"46c377e0c9a75780d5cb0bcf4dfb960f0fb2a996a13e7349bb111b9082252233","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"5c70fb542d1376cddab69922eeb4c05e4fcf8f413f27563a2af50f72a47c8f8c","src/parser.rs":"9ed4aec998221eb2d2ba99db2f9f82a02399fb0c3b8500627f68f5aab872adde","src/rules_and_declarations.rs":"be2c4f3f3bb673d866575b6cb6084f1879dff07356d583ca9a3595f63b7f916f","src/serializer.rs":"4ccfc9b4fe994aab3803662bbf31cc25052a6a39531073a867b14b224afe42dd","src/size_of_tests.rs":"e5f63c8c18721cc3ff7a5407e84f9889ffa10e66da96e8510a696c3e00ad72d5","src/tests.rs":"80b02c80ab0fd580dad9206615c918e0db7dff63dfed0feeedb66f317d24b24b","src/tokenizer.rs":"429b2cba419cf8b923fbcc32d3bd34c0b39284ebfcb9fc29b8eb8643d8d5f312","src/unicode_range.rs":"c1c4ed2493e09d248c526ce1ef8575a5f8258da3962b64ffc814ef3bdf9780d0"},"package":"8a807ac3ab7a217829c2a3b65732b926b2befe6a35f33b4bf8b503692430f223"}
\ No newline at end of file
+{"files":{".travis.yml":"e8f586288c39dbaebefdd391f68376e58f3a4c568a8dc3cd97c4a362194716dd","Cargo.toml":"efd6f23ab6df0f7bffa3b56a166aff55aa5d082fa4084ba3f443e86833e783e1","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"1068e899b617cf99eee953f745d83f88859cc0cef0297fcc3310b6bd24474761","build/match_byte.rs":"0f7d39170e746d59deebf7894086f63ee39ea61fb161d24b0c7a3c1db3945e0d","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"c60f1b0ab7a2a6213e434604ee33f78e7ef74347f325d86d0b9192d8225ae1cc","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"46c377e0c9a75780d5cb0bcf4dfb960f0fb2a996a13e7349bb111b9082252233","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"5c70fb542d1376cddab69922eeb4c05e4fcf8f413f27563a2af50f72a47c8f8c","src/parser.rs":"9ed4aec998221eb2d2ba99db2f9f82a02399fb0c3b8500627f68f5aab872adde","src/rules_and_declarations.rs":"be2c4f3f3bb673d866575b6cb6084f1879dff07356d583ca9a3595f63b7f916f","src/serializer.rs":"4ccfc9b4fe994aab3803662bbf31cc25052a6a39531073a867b14b224afe42dd","src/size_of_tests.rs":"e5f63c8c18721cc3ff7a5407e84f9889ffa10e66da96e8510a696c3e00ad72d5","src/tests.rs":"80b02c80ab0fd580dad9206615c918e0db7dff63dfed0feeedb66f317d24b24b","src/tokenizer.rs":"429b2cba419cf8b923fbcc32d3bd34c0b39284ebfcb9fc29b8eb8643d8d5f312","src/unicode_range.rs":"191d50a1588e5c88608b84cfe9279def71f495f8e016fa093f90399bbd2b635f"},"package":"b906ac3f6108d8d0bfd4158469abe5909df1497116c8400346b5e08944579edd"}
\ No newline at end of file
--- a/third_party/rust/cssparser/.travis.yml
+++ b/third_party/rust/cssparser/.travis.yml
@@ -7,11 +7,12 @@ rust:
 script:
   - cargo build --verbose
   - cargo test --verbose
   - cargo doc --verbose
   - cargo test --features heapsize
   - cargo test --features dummy_match_byte
   - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo test --features bench; fi
   - if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo test --features "bench dummy_match_byte"; fi
+  - cd macros && cargo build --verbose
 
 notifications:
   webhooks: http://build.servo.org:54856/travis
--- a/third_party/rust/cssparser/Cargo.toml
+++ b/third_party/rust/cssparser/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 = "cssparser"
-version = "0.23.2"
+version = "0.23.4"
 authors = ["Simon Sapin <simon.sapin@exyr.org>"]
 build = "build.rs"
 exclude = ["src/css-parsing-tests/**", "src/big-data-url.css"]
 description = "Rust implementation of CSS Syntax Level 3"
 documentation = "https://docs.rs/cssparser/"
 readme = "README.md"
 keywords = ["css", "syntax", "parser"]
 license = "MPL-2.0"
@@ -28,17 +28,17 @@ version = "0.3"
 [dependencies.dtoa-short]
 version = "0.3"
 
 [dependencies.heapsize]
 version = ">= 0.3, < 0.5"
 optional = true
 
 [dependencies.itoa]
-version = "0.3"
+version = "0.4"
 
 [dependencies.matches]
 version = "0.1"
 
 [dependencies.phf]
 version = "0.7"
 
 [dependencies.procedural-masquerade]
@@ -46,24 +46,28 @@ version = "0.1"
 
 [dependencies.serde]
 version = "1.0"
 optional = true
 
 [dependencies.smallvec]
 version = "0.6"
 [dev-dependencies.difference]
-version = "1.0"
+version = "2.0"
 
 [dev-dependencies.encoding_rs]
 version = "0.7"
 
 [dev-dependencies.rustc-serialize]
 version = "0.3"
+[build-dependencies.proc-macro2]
+version = "0.2"
+
 [build-dependencies.quote]
-version = "0.3"
+version = "0.4.1"
 
 [build-dependencies.syn]
-version = "0.11"
+version = "0.12"
+features = ["extra-traits", "fold"]
 
 [features]
 bench = []
 dummy_match_byte = []
--- a/third_party/rust/cssparser/build.rs
+++ b/third_party/rust/cssparser/build.rs
@@ -1,14 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#[macro_use]
 extern crate quote;
+#[macro_use]
 extern crate syn;
+extern crate proc_macro2;
 
 use std::env;
 use std::path::Path;
 
 
 #[cfg(feature = "dummy_match_byte")]
 mod codegen {
     use std::path::Path;
--- a/third_party/rust/cssparser/build/match_byte.rs
+++ b/third_party/rust/cssparser/build/match_byte.rs
@@ -1,271 +1,178 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-use quote::{ToTokens, Tokens};
+use quote::ToTokens;
 use std::fs::File;
 use std::io::{Read, Write};
 use std::path::Path;
-use std::vec;
-use std::iter;
 use syn;
+use syn::fold::Fold;
+
+use proc_macro2::TokenStream;
+
+struct MatchByteParser {
+}
 
 pub fn expand(from: &Path, to: &Path) {
     let mut source = String::new();
     File::open(from).unwrap().read_to_string(&mut source).unwrap();
-    let tts = syn::parse_token_trees(&source).expect("Parsing rules.rs module");
-    let mut tokens = Tokens::new();
-    tokens.append_all(expand_tts(tts));
+    let ast = syn::parse_file(&source).expect("Parsing rules.rs module");
+    let mut m = MatchByteParser {};
+    let ast = m.fold_file(ast);
 
-    let code = tokens.to_string().replace("{ ", "{\n").replace(" }", "\n}");
+    let code = ast.into_tokens().to_string().replace("{ ", "{\n").replace(" }", "\n}");
     File::create(to).unwrap().write_all(code.as_bytes()).unwrap();
 }
 
-fn expand_tts(tts: Vec<syn::TokenTree>) -> Vec<syn::TokenTree> {
-    use syn::*;
-    let mut expanded = Vec::new();
-    let mut tts = tts.into_iter();
-    while let Some(tt) = tts.next() {
-        match tt {
-            TokenTree::Token(Token::Ident(ident)) => {
-                if ident != "match_byte" {
-                    expanded.push(TokenTree::Token(Token::Ident(ident)));
-                    continue;
-                }
-
-                match tts.next() {
-                    Some(TokenTree::Token(Token::Not)) => {},
-                    other => {
-                        expanded.push(TokenTree::Token(Token::Ident(ident)));
-                        if let Some(other) = other {
-                            expanded.push(other);
-                        }
-                        continue;
-                    }
-                }
-
-                let tts = match tts.next() {
-                    Some(TokenTree::Delimited(Delimited { tts, .. })) => tts,
-                    other => {
-                        expanded.push(TokenTree::Token(Token::Ident(ident)));
-                        expanded.push(TokenTree::Token(Token::Not));
-                        if let Some(other) = other {
-                            expanded.push(other);
-                        }
-                        continue;
-                    }
-                };
-
-                let (to_be_matched, table, cases, wildcard_binding) = parse_match_bytes_macro(tts);
-                let expr = expand_match_bytes_macro(to_be_matched,
-                                                    &table,
-                                                    cases,
-                                                    wildcard_binding);
-
-                let tts = syn::parse_token_trees(&expr)
-                    .expect("parsing macro expansion as token trees");
-                expanded.extend(expand_tts(tts));
-            }
-            TokenTree::Delimited(Delimited { delim, tts }) => {
-                expanded.push(TokenTree::Delimited(Delimited {
-                    delim: delim,
-                    tts: expand_tts(tts),
-                }))
-            }
-            other => expanded.push(other),
-        }
-    }
-    expanded
+struct MatchByte {
+    expr: syn::Expr,
+    arms: Vec<syn::Arm>,
 }
 
-/// Parses a token tree corresponding to the `match_byte` macro.
+impl syn::synom::Synom for MatchByte {
+    named!(parse -> Self, do_parse!(
+        expr: syn!(syn::Expr) >>
+        punct!(,) >>
+        arms: many0!(syn!(syn::Arm)) >> (
+            MatchByte {
+                expr,
+                arms
+            }
+        )
+    ));
+}
+
+fn get_byte_from_expr_lit(expr: &Box<syn::Expr>) -> u8 {
+    match **expr {
+        syn::Expr::Lit(syn::ExprLit { ref lit, .. }) => {
+            if let syn::Lit::Byte(ref byte) = *lit {
+                byte.value()
+            }
+            else {
+                panic!("Found a pattern that wasn't a byte")
+            }
+        },
+        _ => unreachable!(),
+    }
+}
+
+
+/// Expand a TokenStream corresponding to the `match_byte` macro.
 ///
 /// ## Example
 ///
 /// ```rust
 /// match_byte! { tokenizer.next_byte_unchecked(),
 ///     b'a'..b'z' => { ... }
 ///     b'0'..b'9' => { ... }
 ///     b'\n' | b'\\' => { ... }
 ///     foo => { ... }
-/// }
-///
-/// Returns:
-///  * The token tree that contains the expression to be matched (in this case
-///    `tokenizer.next_byte_unchecked()`.
+///  }
+///  ```
 ///
-///  * The table with the different cases per byte, each entry in the table
-///    contains a non-zero integer representing a different arm of the
-///    match expression.
-///
-///  * The list of cases containing the expansion of the arms of the match
-///    expression.
-///
-///  * An optional identifier to which the wildcard pattern is matched (`foo` in
-///    this case).
-///
-fn parse_match_bytes_macro(tts: Vec<syn::TokenTree>) -> (Vec<syn::TokenTree>, [u8; 256], Vec<Case>, Option<syn::Ident>) {
-    let mut tts = tts.into_iter();
+fn expand_match_byte(body: &TokenStream) -> syn::Expr {
+    let match_byte: MatchByte = syn::parse2(body.clone()).unwrap();
+    let expr = match_byte.expr;
+    let mut cases = Vec::new();
+    let mut table = [0u8; 256];
+    let mut match_body = Vec::new();
+    let mut wildcard = None;
+
+    for (i, ref arm) in match_byte.arms.iter().enumerate() {
+        let case_id = i + 1;
+        let index = case_id as isize;
+        let name = syn::Ident::from(format!("Case{}", case_id));
 
-    // Grab the thing we're matching, until we find a comma.
-    let mut left_hand_side = vec![];
-    loop {
-        match tts.next() {
-            Some(syn::TokenTree::Token(syn::Token::Comma)) => break,
-            Some(other) => left_hand_side.push(other),
-            None => panic!("Expected not to run out of tokens looking for a comma"),
+        for pat in &arm.pats {
+            match pat {
+                &syn::Pat::Lit(syn::PatLit{ref expr}) => {
+                    let value = get_byte_from_expr_lit(expr);
+                    if table[value as usize] == 0 {
+                        table[value as usize] = case_id as u8;
+                    }
+                },
+                &syn::Pat::Range(syn::PatRange { ref lo, ref hi, .. }) => {
+                    let lo = get_byte_from_expr_lit(lo);
+                    let hi = get_byte_from_expr_lit(hi);
+                    for value in lo..hi {
+                        if table[value as usize] == 0 {
+                            table[value as usize] = case_id as u8;
+                        }
+                    }
+                    if table[hi as usize] == 0 {
+                        table[hi as usize] = case_id as u8;
+                    }
+                },
+                &syn::Pat::Wild(_) => {
+                    for byte in table.iter_mut() {
+                        if *byte == 0 {
+                            *byte = case_id as u8;
+                        }
+                    }
+                },
+                &syn::Pat::Ident(syn::PatIdent { ident, .. }) => {
+                    assert_eq!(wildcard, None);
+                    wildcard = Some(ident);
+                    for byte in table.iter_mut() {
+                        if *byte == 0 {
+                            *byte = case_id as u8;
+                        }
+                    }
+                },
+                _ => {
+                    panic!("Unexpected pattern: {:?}. Buggy code ?", pat);
+                }
+            }
         }
+        cases.push(quote!(#name = #index));
+        let body = &arm.body;
+        match_body.push(quote!(Case::#name => { #body }))
     }
-
-    let mut cases = vec![];
-    let mut table = [0u8; 256];
+    let en = quote!(enum Case {
+        #(#cases),*
+    });
 
-    let mut tts = tts.peekable();
-    let mut case_id: u8 = 1;
-    let mut binding = None;
-    while tts.len() > 0 {
-        cases.push(parse_case(&mut tts, &mut table, &mut binding, case_id));
+    let mut table_content = Vec::new();
+    for entry in table.iter() {
+        let name: syn::Path = syn::parse_str(&format!("Case::Case{}", entry)).unwrap();
+        table_content.push(name);
+    }
+    let table = quote!(static __CASES: [Case; 256] = [#(#table_content),*];);
 
-        // Allow an optional comma between cases.
-        match tts.peek() {
-            Some(&syn::TokenTree::Token(syn::Token::Comma)) => {
-                tts.next();
-            },
-            _ => {},
-        }
+    let expr = if let Some(binding) = wildcard {
+        quote!({ #en #table let #binding = #expr; match __CASES[#binding as usize] { #(#match_body),* }})
+    } else {
+        quote!({ #en #table match __CASES[#expr as usize] { #(#match_body),* }})
+    };
 
-        case_id += 1;
-    }
-
-    (left_hand_side, table, cases, binding)
+    syn::parse2(expr.into()).unwrap()
 }
 
-#[derive(Debug)]
-struct Case(Vec<syn::TokenTree>);
-
-/// Parses a single pattern => expression, and returns the case, filling in the
-/// table with the case id for every byte that matched.
-///
-/// The `binding` parameter is the identifier that is used by the wildcard
-/// pattern.
-fn parse_case(tts: &mut iter::Peekable<vec::IntoIter<syn::TokenTree>>,
-              table: &mut [u8; 256],
-              binding: &mut Option<syn::Ident>,
-              case_id: u8)
-              -> Case {
-    // The last byte checked, as part of this pattern, to properly detect
-    // ranges.
-    let mut last_byte: Option<u8> = None;
-
-    // Loop through the pattern filling with bytes the table.
-    loop {
-        match tts.next() {
-            Some(syn::TokenTree::Token(syn::Token::Literal(syn::Lit::Byte(byte)))) => {
-                table[byte as usize] = case_id;
-                last_byte = Some(byte);
-            }
-            Some(syn::TokenTree::Token(syn::Token::BinOp(syn::BinOpToken::Or))) => {
-                last_byte = None; // This pattern is over.
-            },
-            Some(syn::TokenTree::Token(syn::Token::DotDotDot)) => {
-                assert!(last_byte.is_some(), "Expected closed range!");
-                match tts.next() {
-                    Some(syn::TokenTree::Token(syn::Token::Literal(syn::Lit::Byte(byte)))) => {
-                        for b in last_byte.take().unwrap()..byte {
-                            if table[b as usize] == 0 {
-                                table[b as usize] = case_id;
-                            }
-                        }
-                        if table[byte as usize] == 0 {
-                            table[byte as usize] = case_id;
-                        }
-                    }
-                    other => panic!("Expected closed range, got: {:?}", other),
-                }
-            },
-            Some(syn::TokenTree::Token(syn::Token::FatArrow)) => break,
-            Some(syn::TokenTree::Token(syn::Token::Ident(ident))) => {
-                assert_eq!(last_byte, None, "I don't support ranges with identifiers!");
-                assert_eq!(*binding, None);
-                for byte in table.iter_mut() {
-                    if *byte == 0 {
-                        *byte = case_id;
-                    }
-                }
-                *binding = Some(ident)
-            }
-            Some(syn::TokenTree::Token(syn::Token::Underscore)) => {
-                assert_eq!(last_byte, None);
-                for byte in table.iter_mut() {
-                    if *byte == 0 {
-                        *byte = case_id;
-                    }
+impl Fold for MatchByteParser {
+    fn fold_stmt(&mut self, stmt: syn::Stmt) -> syn::Stmt {
+        match stmt {
+            syn::Stmt::Item(syn::Item::Macro(syn::ItemMacro{ ref mac, .. })) => {
+                if mac.path == parse_quote!(match_byte) {
+                    return syn::fold::fold_stmt(self, syn::Stmt::Expr(expand_match_byte(&mac.tts)))
                 }
             },
-            other => panic!("Expected literal byte, got: {:?}", other),
+            _ => {}
         }
+
+        syn::fold::fold_stmt(self, stmt)
     }
 
-    match tts.next() {
-        Some(syn::TokenTree::Delimited(syn::Delimited { delim: syn::DelimToken::Brace, tts })) => {
-            Case(tts)
+    fn fold_expr(&mut self, expr: syn::Expr) -> syn::Expr {
+        match expr {
+            syn::Expr::Macro(syn::ExprMacro{ ref mac, .. }) => {
+                if mac.path == parse_quote!(match_byte) {
+                    return syn::fold::fold_expr(self, expand_match_byte(&mac.tts))
+                }
+            },
+            _ => {}
         }
-        other => panic!("Expected case with braces after fat arrow, got: {:?}", other),
+
+        syn::fold::fold_expr(self, expr)
     }
 }
-
-fn expand_match_bytes_macro(to_be_matched: Vec<syn::TokenTree>,
-                            table: &[u8; 256],
-                            cases: Vec<Case>,
-                            binding: Option<syn::Ident>)
-                            -> String {
-    use std::fmt::Write;
-
-    assert!(!to_be_matched.is_empty());
-    assert!(table.iter().all(|b| *b != 0), "Incomplete pattern? Bogus code!");
-
-    // We build the expression with text since it's easier.
-    let mut expr = "{\n".to_owned();
-    expr.push_str("enum Case {\n");
-    for (i, _) in cases.iter().enumerate() {
-        write!(&mut expr, "Case{} = {},", i + 1, i + 1).unwrap();
-    }
-    expr.push_str("}\n"); // enum Case
-
-    expr.push_str("static __CASES: [Case; 256] = [");
-    for byte in table.iter() {
-        write!(&mut expr, "Case::Case{}, ", *byte).unwrap();
-    }
-    expr.push_str("];\n");
-
-    let mut tokens = Tokens::new();
-    let to_be_matched = syn::Delimited {
-        delim: if binding.is_some() { syn::DelimToken::Brace } else { syn::DelimToken::Paren },
-        tts: to_be_matched
-    };
-    to_be_matched.to_tokens(&mut tokens);
-
-    if let Some(ref binding) = binding {
-        write!(&mut expr, "let {} = {};\n", binding.to_string(), tokens.as_str()).unwrap();
-    }
-
-    write!(&mut expr, "match __CASES[{} as usize] {{", match binding {
-        Some(binding) => binding.to_string(),
-        None => tokens.to_string(),
-    }).unwrap();
-
-    for (i, case) in cases.into_iter().enumerate() {
-        let mut case_tokens = Tokens::new();
-        let case = syn::Delimited {
-            delim: syn::DelimToken::Brace,
-            tts: case.0
-        };
-        case.to_tokens(&mut case_tokens);
-        write!(&mut expr, "Case::Case{} => {},\n", i + 1, case_tokens.as_str()).unwrap();
-    }
-    expr.push_str("}\n"); // match
-
-    expr.push_str("}\n"); // top
-
-    expr
-}
--- a/third_party/rust/cssparser/src/unicode_range.rs
+++ b/third_party/rust/cssparser/src/unicode_range.rs
@@ -1,17 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 //! https://drafts.csswg.org/css-syntax/#urange
 
 use {Parser, ToCss, BasicParseError};
 use std::char;
-use std::cmp;
 use std::fmt;
 use tokenizer::Token;
 
 /// One contiguous range of code points.
 ///
 /// Can not be empty. Can represent a single code point when start == end.
 #[derive(PartialEq, Eq, Clone, Hash)]
 pub struct UnicodeRange {
@@ -161,38 +160,15 @@ fn consume_question_marks(text: &mut &[u
 impl fmt::Debug for UnicodeRange {
     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
         self.to_css(formatter)
     }
 }
 
 impl ToCss for UnicodeRange {
     fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
-        dest.write_str("U+")?;
-
-        // How many bits are 0 at the end of start and also 1 at the end of end.
-        let bits = cmp::min(self.start.trailing_zeros(), (!self.end).trailing_zeros());
-
-        let question_marks = bits / 4;
-
-        // How many lower bits can be represented as question marks
-        let bits = question_marks * 4;
-
-        let truncated_start = self.start >> bits;
-        let truncated_end = self.end >> bits;
-        if truncated_start == truncated_end {
-            // Bits not covered by question marks are the same in start and end,
-            // we can use the question mark syntax.
-            if truncated_start != 0 {
-                write!(dest, "{:X}", truncated_start)?;
-            }
-            for _ in 0..question_marks {
-                dest.write_str("?")?;
-            }
-        } else {
-            write!(dest, "{:X}", self.start)?;
-            if self.end != self.start {
-                write!(dest, "-{:X}", self.end)?;
-            }
+        write!(dest, "U+{:X}", self.start)?;
+        if self.end != self.start {
+            write!(dest, "-{:X}", self.end)?;
         }
         Ok(())
     }
 }
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/.cargo-checksum.json
@@ -0,0 +1,1 @@
+{"files":{".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/.travis.yml
@@ -0,0 +1,6 @@
+sudo: false
+
+language: rust
+
+rust:
+  - nightly
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "itoa"
+version = "0.3.1"
+authors = ["David Tolnay <dtolnay@gmail.com>"]
+license = "MIT/Apache-2.0"
+description = "Fast functions for printing integer primitives to an io::Write"
+repository = "https://github.com/dtolnay/itoa"
+documentation = "https://github.com/dtolnay/itoa"
+categories = ["value-formatting"]
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              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.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2016 Itoa 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.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/README.md
@@ -0,0 +1,70 @@
+itoa
+====
+
+[![Build Status](https://api.travis-ci.org/dtolnay/itoa.svg?branch=master)](https://travis-ci.org/dtolnay/itoa)
+[![Latest Version](https://img.shields.io/crates/v/itoa.svg)](https://crates.io/crates/itoa)
+
+This crate provides fast functions for printing integer primitives to an
+[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The
+implementation comes straight from
+[libcore](https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L201-L254)
+but avoids the performance penalty of going through
+[`fmt::Formatter`](https://doc.rust-lang.org/std/fmt/struct.Formatter.html).
+
+See also [`dtoa`](https://github.com/dtolnay/dtoa) for printing floating point
+primitives.
+
+## Performance
+
+![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/performance.png)
+
+## Functions
+
+```rust
+extern crate itoa;
+
+// write to a vector or other io::Write
+let mut buf = Vec::new();
+itoa::write(&mut buf, 128u64)?;
+println!("{:?}", buf);
+
+// write to a stack buffer
+let mut bytes = [b'\0'; 20];
+let n = itoa::write(&mut bytes[..], 128u64)?;
+println!("{:?}", &bytes[..n]);
+```
+
+The function signature is:
+
+```rust
+fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>
+```
+
+where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`,
+`i64`, `u64`, `isize` and `usize`. The return value gives the number of bytes
+written.
+
+## Dependency
+
+Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the
+following in `Cargo.toml`:
+
+```toml
+[dependencies]
+itoa = "0.3"
+```
+
+## 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 itoa by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/benches/bench.rs
@@ -0,0 +1,52 @@
+#![feature(test)]
+#![allow(non_snake_case)]
+
+extern crate itoa;
+extern crate test;
+
+macro_rules! benches {
+    ($($name:ident($value:expr),)*) => {
+        mod bench_itoa {
+            use test::{Bencher, black_box};
+            $(
+                #[bench]
+                fn $name(b: &mut Bencher) {
+                    use itoa;
+
+                    let mut buf = Vec::with_capacity(20);
+
+                    b.iter(|| {
+                        buf.clear();
+                        itoa::write(&mut buf, black_box($value)).unwrap()
+                    });
+                }
+            )*
+        }
+
+        mod bench_fmt {
+            use test::{Bencher, black_box};
+            $(
+                #[bench]
+                fn $name(b: &mut Bencher) {
+                    use std::io::Write;
+
+                    let mut buf = Vec::with_capacity(20);
+
+                    b.iter(|| {
+                        buf.clear();
+                        write!(&mut buf, "{}", black_box($value)).unwrap()
+                    });
+                }
+            )*
+        }
+    }
+}
+
+benches!(
+    bench_0u64(0u64),
+    bench_HALFu64(<u32>::max_value() as u64),
+    bench_MAXu64(<u64>::max_value()),
+
+    bench_0i16(0i16),
+    bench_MINi16(<i16>::min_value()),
+);
rename from third_party/rust/itoa/performance.png
rename to third_party/rust/itoa-0.3.1/performance.png
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/src/lib.rs
@@ -0,0 +1,101 @@
+// Copyright 2016 Itoa 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::{io, mem, ptr, slice};
+
+#[inline]
+pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> {
+    value.write(wr)
+}
+
+pub trait Integer {
+    fn write<W: io::Write>(self, W) -> io::Result<usize>;
+}
+
+const DEC_DIGITS_LUT: &'static[u8] =
+    b"0001020304050607080910111213141516171819\
+      2021222324252627282930313233343536373839\
+      4041424344454647484950515253545556575859\
+      6061626364656667686970717273747576777879\
+      8081828384858687888990919293949596979899";
+
+// Adaptation of the original implementation at
+// https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L188-L266
+macro_rules! impl_Integer {
+    ($($t:ident),* as $conv_fn:ident) => ($(
+    impl Integer for $t {
+        #[allow(unused_comparisons)]
+        fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
+            let is_nonnegative = self >= 0;
+            let mut n = if is_nonnegative {
+                self as $conv_fn
+            } else {
+                try!(wr.write_all(b"-"));
+                // convert the negative num to positive by summing 1 to it's 2 complement
+                (!(self as $conv_fn)).wrapping_add(1)
+            };
+            let mut buf: [u8; 20] = unsafe { mem::uninitialized() };
+            let mut curr = buf.len() as isize;
+            let buf_ptr = buf.as_mut_ptr();
+            let lut_ptr = DEC_DIGITS_LUT.as_ptr();
+
+            unsafe {
+                // eagerly decode 4 characters at a time
+                if <$t>::max_value() as u64 >= 10000 {
+                    while n >= 10000 {
+                        let rem = (n % 10000) as isize;
+                        n /= 10000;
+
+                        let d1 = (rem / 100) << 1;
+                        let d2 = (rem % 100) << 1;
+                        curr -= 4;
+                        ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                        ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
+                    }
+                }
+
+                // if we reach here numbers are <= 9999, so at most 4 chars long
+                let mut n = n as isize; // possibly reduce 64bit math
+
+                // decode 2 more chars, if > 2 chars
+                if n >= 100 {
+                    let d1 = (n % 100) << 1;
+                    n /= 100;
+                    curr -= 2;
+                    ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                }
+
+                // decode last 1 or 2 chars
+                if n < 10 {
+                    curr -= 1;
+                    *buf_ptr.offset(curr) = (n as u8) + 48;
+                } else {
+                    let d1 = n << 1;
+                    curr -= 2;
+                    ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                }
+            }
+
+            let mut len = buf.len() - curr as usize;
+            try!(wr.write_all(unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }));
+            if !is_nonnegative {
+                len += 1;
+            }
+            Ok(len)
+        }
+    })*);
+}
+
+impl_Integer!(i8, u8, i16, u16, i32, u32 as u32);
+impl_Integer!(i64, u64 as u64);
+#[cfg(target_pointer_width = "16")]
+impl_Integer!(isize, usize as u16);
+#[cfg(target_pointer_width = "32")]
+impl_Integer!(isize, usize as u32);
+#[cfg(target_pointer_width = "64")]
+impl_Integer!(isize, usize as u64);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa-0.3.1/tests/test.rs
@@ -0,0 +1,25 @@
+#![allow(non_snake_case)]
+
+extern crate itoa;
+
+macro_rules! test {
+    ($($name:ident($value:expr, $expected:expr),)*) => {
+        $(
+            #[test]
+            fn $name() {
+                let mut buf = [b'\0'; 20];
+                let len = itoa::write(&mut buf[..], $value).unwrap();
+                assert_eq!(&buf[0..len], $expected.as_bytes());
+            }
+        )*
+    }
+}
+
+test!(
+    test_0u64(0u64, "0"),
+    test_HALFu64(<u32>::max_value() as u64, "4294967295"),
+    test_MAXu64(<u64>::max_value(), "18446744073709551615"),
+
+    test_0i16(0i16, "0"),
+    test_MINi16(<i16>::min_value(), "-32768"),
+);
--- a/third_party/rust/itoa/.cargo-checksum.json
+++ b/third_party/rust/itoa/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
\ No newline at end of file
+{"files":{".travis.yml":"9d502b83053fa50b10c712dbb1c7356accf1cc2734f50ae5d75f7c8fdd7a6da5","Cargo.toml":"7a7c831ec60febe8ffdf8d56c436a2dfeb486c870d2f148a8849a2d06122b635","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"57b4b49c5ceea9cf94e3856537c01cc1a7e3d071b04d5f5d45155259bfcb83b3","benches/bench.rs":"4cce63083f2e362db65dfad767b777cc39e6555fe635b8551aa485c63080773e","src/lib.rs":"503dc2b0c33f1477f1b6744d103ead1456e91cd1147689a0d0c9e6569225feb4","src/udiv128.rs":"efafb66d62b8229478a448ffb3e11a8ad57f5b336aadd59d5b3bf945cfffba96","tests/test.rs":"55a4b5f21b0f1322d7a42d837ca9f2766eb25416cfcdd9514220fb3bebc0f586"},"package":"c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"}
\ No newline at end of file
--- a/third_party/rust/itoa/.travis.yml
+++ b/third_party/rust/itoa/.travis.yml
@@ -1,6 +1,19 @@
 sudo: false
-
 language: rust
 
-rust:
-  - nightly
+matrix:
+  include:
+    - rust: stable
+    - rust: beta
+    - rust: nightly
+      env:
+      - FEATURES="i128"
+      - BUILD_BENCH="true"
+
+script:
+  - cargo build --verbose --features "$FEATURES"
+  - cargo test --verbose --features "$FEATURES"
+  - cargo build --verbose --no-default-features --features "$FEATURES"
+  - cargo test --verbose --no-default-features --features "$FEATURES"
+  - if [ "$BUILD_BENCH" == "true" ]; then cargo bench --verbose --no-run --features "$FEATURES"; fi
+
--- a/third_party/rust/itoa/Cargo.toml
+++ b/third_party/rust/itoa/Cargo.toml
@@ -1,9 +1,28 @@
+# 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 = "itoa"
-version = "0.3.1"
+version = "0.4.1"
 authors = ["David Tolnay <dtolnay@gmail.com>"]
-license = "MIT/Apache-2.0"
+exclude = ["performance.png"]
 description = "Fast functions for printing integer primitives to an io::Write"
+documentation = "https://github.com/dtolnay/itoa"
+readme = "README.md"
+categories = ["value-formatting"]
+license = "MIT/Apache-2.0"
 repository = "https://github.com/dtolnay/itoa"
-documentation = "https://github.com/dtolnay/itoa"
-categories = ["value-formatting"]
+
+[features]
+default = ["std"]
+i128 = []
+std = []
--- a/third_party/rust/itoa/README.md
+++ b/third_party/rust/itoa/README.md
@@ -1,25 +1,26 @@
 itoa
 ====
 
 [![Build Status](https://api.travis-ci.org/dtolnay/itoa.svg?branch=master)](https://travis-ci.org/dtolnay/itoa)
 [![Latest Version](https://img.shields.io/crates/v/itoa.svg)](https://crates.io/crates/itoa)
 
 This crate provides fast functions for printing integer primitives to an
-[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The
+[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html) or a
+[`fmt::Write`](https://doc.rust-lang.org/core/fmt/trait.Write.html). The
 implementation comes straight from
 [libcore](https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L201-L254)
 but avoids the performance penalty of going through
 [`fmt::Formatter`](https://doc.rust-lang.org/std/fmt/struct.Formatter.html).
 
 See also [`dtoa`](https://github.com/dtolnay/dtoa) for printing floating point
 primitives.
 
-## Performance
+## Performance (lower is better)
 
 ![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/performance.png)
 
 ## Functions
 
 ```rust
 extern crate itoa;
 
@@ -27,36 +28,47 @@ extern crate itoa;
 let mut buf = Vec::new();
 itoa::write(&mut buf, 128u64)?;
 println!("{:?}", buf);
 
 // write to a stack buffer
 let mut bytes = [b'\0'; 20];
 let n = itoa::write(&mut bytes[..], 128u64)?;
 println!("{:?}", &bytes[..n]);
+
+// write to a String
+let mut s = String::new();
+itoa::fmt(&mut s, 128u64)?;
+println!("{}", s);
 ```
 
-The function signature is:
+The function signatures are:
 
 ```rust
-fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>
+fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>;
+
+fn fmt<W: fmt::Write, V: itoa::Integer>(writer: W, value: V) -> fmt::Result;
 ```
 
 where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`,
-`i64`, `u64`, `isize` and `usize`. The return value gives the number of bytes
-written.
+`i64`, `u64`, `i128`, `u128`, `isize` and `usize`. 128-bit integer support is
+only available with the nightly compiler when the `i128` feature is enabled for
+this crate. The return value gives the number of bytes written.
+
+The `write` function is only available when the `std` feature is enabled
+(default is enabled).
 
 ## Dependency
 
 Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the
 following in `Cargo.toml`:
 
 ```toml
 [dependencies]
-itoa = "0.3"
+itoa = "0.4"
 ```
 
 ## 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)
--- a/third_party/rust/itoa/benches/bench.rs
+++ b/third_party/rust/itoa/benches/bench.rs
@@ -1,52 +1,86 @@
+#![cfg_attr(feature = "i128", feature(i128_type, i128))]
+
+#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless))]
+
 #![feature(test)]
 #![allow(non_snake_case)]
 
 extern crate itoa;
 extern crate test;
 
 macro_rules! benches {
-    ($($name:ident($value:expr),)*) => {
-        mod bench_itoa {
+    (
+        $(
+            $(#[$attr:meta])*
+            $name:ident($value:expr)
+        ),*
+    ) => {
+        mod bench_itoa_write {
             use test::{Bencher, black_box};
             $(
+                $(#[$attr])*
                 #[bench]
                 fn $name(b: &mut Bencher) {
                     use itoa;
 
-                    let mut buf = Vec::with_capacity(20);
+                    let mut buf = Vec::with_capacity(40);
 
                     b.iter(|| {
                         buf.clear();
                         itoa::write(&mut buf, black_box($value)).unwrap()
                     });
                 }
             )*
         }
 
-        mod bench_fmt {
+        mod bench_itoa_fmt {
             use test::{Bencher, black_box};
             $(
+                $(#[$attr])*
+                #[bench]
+                fn $name(b: &mut Bencher) {
+                    use itoa;
+
+                    let mut buf = String::with_capacity(40);
+
+                    b.iter(|| {
+                        buf.clear();
+                        itoa::fmt(&mut buf, black_box($value)).unwrap()
+                    });
+                }
+            )*
+        }
+
+        mod bench_std_fmt {
+            use test::{Bencher, black_box};
+            $(
+                $(#[$attr])*
                 #[bench]
                 fn $name(b: &mut Bencher) {
                     use std::io::Write;
 
-                    let mut buf = Vec::with_capacity(20);
+                    let mut buf = Vec::with_capacity(40);
 
                     b.iter(|| {
                         buf.clear();
                         write!(&mut buf, "{}", black_box($value)).unwrap()
                     });
                 }
             )*
         }
     }
 }
 
-benches!(
-    bench_0u64(0u64),
-    bench_HALFu64(<u32>::max_value() as u64),
-    bench_MAXu64(<u64>::max_value()),
+benches!{
+    bench_u64_0(0u64),
+    bench_u64_half(<u32>::max_value() as u64),
+    bench_u64_max(<u64>::max_value()),
 
-    bench_0i16(0i16),
-    bench_MINi16(<i16>::min_value()),
-);
+    bench_i16_0(0i16),
+    bench_i16_min(<i16>::min_value()),
+
+    #[cfg(feature = "i128")]
+    bench_u128_0(0u128),
+    #[cfg(feature = "i128")]
+    bench_u128_max(<u128>::max_value())
+}
--- a/third_party/rust/itoa/src/lib.rs
+++ b/third_party/rust/itoa/src/lib.rs
@@ -1,101 +1,261 @@
 // Copyright 2016 Itoa 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::{io, mem, ptr, slice};
+#![doc(html_root_url = "https://docs.rs/itoa/0.4.1")]
+
+#![cfg_attr(not(feature = "std"), no_std)]
+
+#![cfg_attr(feature = "i128", feature(i128_type, i128))]
+
+#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, unreadable_literal))]
 
+#[cfg(feature = "i128")]
+mod udiv128;
+
+#[cfg(feature = "std")]
+use std::{fmt, io, mem, ptr, slice, str};
+
+#[cfg(not(feature = "std"))]
+use core::{fmt, mem, ptr, slice, str};
+
+/// Write integer to an `io::Write`.
+#[cfg(feature = "std")]
 #[inline]
 pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> {
     value.write(wr)
 }
 
-pub trait Integer {
+/// Write integer to an `fmt::Write`.
+#[inline]
+pub fn fmt<W: fmt::Write, V: Integer>(wr: W, value: V) -> fmt::Result {
+    value.fmt(wr)
+}
+
+// Seal to prevent downstream implementations of the Integer trait.
+mod private {
+    pub trait Sealed {}
+}
+
+/// An integer that can be formatted by `itoa::write` and `itoa::fmt`.
+///
+/// This trait is sealed and cannot be implemented for types outside of itoa.
+pub trait Integer: private::Sealed {
+    // Not public API.
+    #[doc(hidden)]
+    #[cfg(feature = "std")]
     fn write<W: io::Write>(self, W) -> io::Result<usize>;
+
+    // Not public API.
+    #[doc(hidden)]
+    fn fmt<W: fmt::Write>(self, W) -> fmt::Result;
+}
+
+trait IntegerPrivate<B> {
+    fn write_to(self, buf: &mut B) -> &[u8];
 }
 
 const DEC_DIGITS_LUT: &'static[u8] =
     b"0001020304050607080910111213141516171819\
       2021222324252627282930313233343536373839\
       4041424344454647484950515253545556575859\
       6061626364656667686970717273747576777879\
       8081828384858687888990919293949596979899";
 
 // Adaptation of the original implementation at
 // https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L188-L266
+macro_rules! impl_IntegerCommon {
+    ($max_len:expr, $t:ident) => {
+        impl Integer for $t {
+            #[cfg(feature = "std")]
+            #[inline]
+            fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
+                let mut buf: [u8; $max_len] = unsafe { mem::uninitialized() };
+                let bytes = self.write_to(&mut buf);
+                try!(wr.write_all(bytes));
+                Ok(bytes.len())
+            }
+
+            #[inline]
+            fn fmt<W: fmt::Write>(self, mut wr: W) -> fmt::Result {
+                let mut buf: [u8; $max_len] = unsafe { mem::uninitialized() };
+                let bytes = self.write_to(&mut buf);
+                wr.write_str(unsafe { str::from_utf8_unchecked(bytes) })
+            }
+        }
+
+        impl private::Sealed for $t {}
+    };
+}
+
 macro_rules! impl_Integer {
-    ($($t:ident),* as $conv_fn:ident) => ($(
-    impl Integer for $t {
-        #[allow(unused_comparisons)]
-        fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
-            let is_nonnegative = self >= 0;
-            let mut n = if is_nonnegative {
-                self as $conv_fn
-            } else {
-                try!(wr.write_all(b"-"));
-                // convert the negative num to positive by summing 1 to it's 2 complement
-                (!(self as $conv_fn)).wrapping_add(1)
-            };
-            let mut buf: [u8; 20] = unsafe { mem::uninitialized() };
-            let mut curr = buf.len() as isize;
-            let buf_ptr = buf.as_mut_ptr();
-            let lut_ptr = DEC_DIGITS_LUT.as_ptr();
+    ($($max_len:expr => $t:ident),* as $conv_fn:ident) => {$(
+        impl_IntegerCommon!($max_len, $t);
+
+        impl IntegerPrivate<[u8; $max_len]> for $t {
+            #[allow(unused_comparisons)]
+            #[inline]
+            fn write_to(self, buf: &mut [u8; $max_len]) -> &[u8] {
+                let is_nonnegative = self >= 0;
+                let mut n = if is_nonnegative {
+                    self as $conv_fn
+                } else {
+                    // convert the negative num to positive by summing 1 to it's 2 complement
+                    (!(self as $conv_fn)).wrapping_add(1)
+                };
+                let mut curr = buf.len() as isize;
+                let buf_ptr = buf.as_mut_ptr();
+                let lut_ptr = DEC_DIGITS_LUT.as_ptr();
+
+                unsafe {
+                    // need at least 16 bits for the 4-characters-at-a-time to work.
+                    if mem::size_of::<$t>() >= 2 {
+                        // eagerly decode 4 characters at a time
+                        while n >= 10000 {
+                            let rem = (n % 10000) as isize;
+                            n /= 10000;
 
-            unsafe {
-                // eagerly decode 4 characters at a time
-                if <$t>::max_value() as u64 >= 10000 {
-                    while n >= 10000 {
-                        let rem = (n % 10000) as isize;
-                        n /= 10000;
+                            let d1 = (rem / 100) << 1;
+                            let d2 = (rem % 100) << 1;
+                            curr -= 4;
+                            ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                            ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
+                        }
+                    }
+
+                    // if we reach here numbers are <= 9999, so at most 4 chars long
+                    let mut n = n as isize; // possibly reduce 64bit math
 
-                        let d1 = (rem / 100) << 1;
-                        let d2 = (rem % 100) << 1;
-                        curr -= 4;
+                    // decode 2 more chars, if > 2 chars
+                    if n >= 100 {
+                        let d1 = (n % 100) << 1;
+                        n /= 100;
+                        curr -= 2;
                         ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
-                        ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
+                    }
+
+                    // decode last 1 or 2 chars
+                    if n < 10 {
+                        curr -= 1;
+                        *buf_ptr.offset(curr) = (n as u8) + b'0';
+                    } else {
+                        let d1 = n << 1;
+                        curr -= 2;
+                        ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                    }
+
+                    if !is_nonnegative {
+                        curr -= 1;
+                        *buf_ptr.offset(curr) = b'-';
                     }
                 }
 
-                // if we reach here numbers are <= 9999, so at most 4 chars long
-                let mut n = n as isize; // possibly reduce 64bit math
+                let len = buf.len() - curr as usize;
+                unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }
+            }
+        }
+    )*};
+}
+
+const I8_MAX_LEN: usize = 4;
+const U8_MAX_LEN: usize = 3;
+const I16_MAX_LEN: usize = 6;
+const U16_MAX_LEN: usize = 5;
+const I32_MAX_LEN: usize = 11;
+const U32_MAX_LEN: usize = 10;
+const I64_MAX_LEN: usize = 20;
+const U64_MAX_LEN: usize = 20;
+
+impl_Integer!(
+    I8_MAX_LEN => i8,
+    U8_MAX_LEN => u8,
+    I16_MAX_LEN => i16,
+    U16_MAX_LEN => u16,
+    I32_MAX_LEN => i32,
+    U32_MAX_LEN => u32 
+    as u32);
+
+impl_Integer!(I64_MAX_LEN => i64, U64_MAX_LEN => u64 as u64);
+
+#[cfg(target_pointer_width = "16")]
+impl_Integer!(I16_MAX_LEN => isize, U16_MAX_LEN => usize as u16);
+
+#[cfg(target_pointer_width = "32")]
+impl_Integer!(I32_MAX_LEN => isize, U32_MAX_LEN => usize as u32);
+
+#[cfg(target_pointer_width = "64")]
+impl_Integer!(I64_MAX_LEN => isize, U64_MAX_LEN => usize as u64);
+
+#[cfg(all(feature = "i128"))]
+macro_rules! impl_Integer128 {
+    ($($max_len:expr => $t:ident),*) => {$(
+        impl_IntegerCommon!($max_len, $t);
 
-                // decode 2 more chars, if > 2 chars
-                if n >= 100 {
-                    let d1 = (n % 100) << 1;
-                    n /= 100;
-                    curr -= 2;
-                    ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
-                }
+        impl IntegerPrivate<[u8; $max_len]> for $t {
+            #[allow(unused_comparisons)]
+            #[inline]
+            fn write_to(self, buf: &mut [u8; $max_len]) -> &[u8] {
+                let is_nonnegative = self >= 0;
+                let n = if is_nonnegative {
+                    self as u128
+                } else {
+                    // convert the negative num to positive by summing 1 to it's 2 complement
+                    (!(self as u128)).wrapping_add(1)
+                };
+                let mut curr = buf.len() as isize;
+                let buf_ptr = buf.as_mut_ptr();
+
+                unsafe {
+                    // Divide by 10^19 which is the highest power less than 2^64.
+                    let (n, rem) = udiv128::udivmod_1e19(n);
+                    let buf1 = buf_ptr.offset(curr - U64_MAX_LEN as isize) as *mut [u8; U64_MAX_LEN];
+                    curr -= rem.write_to(&mut *buf1).len() as isize;
+
+                    if n != 0 {
+                        // Memset the base10 leading zeros of rem.
+                        let target = buf.len() as isize - 19;
+                        ptr::write_bytes(buf_ptr.offset(target), b'0', (curr - target) as usize);
+                        curr = target;
 
-                // decode last 1 or 2 chars
-                if n < 10 {
-                    curr -= 1;
-                    *buf_ptr.offset(curr) = (n as u8) + 48;
-                } else {
-                    let d1 = n << 1;
-                    curr -= 2;
-                    ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
+                        // Divide by 10^19 again.
+                        let (n, rem) = udiv128::udivmod_1e19(n);
+                        let buf2 = buf_ptr.offset(curr - U64_MAX_LEN as isize) as *mut [u8; U64_MAX_LEN];
+                        curr -= rem.write_to(&mut *buf2).len() as isize;
+
+                        if n != 0 {
+                            // Memset the leading zeros.
+                            let target = buf.len() as isize - 38;
+                            ptr::write_bytes(buf_ptr.offset(target), b'0', (curr - target) as usize);
+                            curr = target;
+
+                            // There is at most one digit left
+                            // because u128::max / 10^19 / 10^19 is 3.
+                            curr -= 1;
+                            *buf_ptr.offset(curr) = (n as u8) + b'0';
+                        }
+                    }
+
+                    if !is_nonnegative {
+                        curr -= 1;
+                        *buf_ptr.offset(curr) = b'-';
+                    }
+
+                    let len = buf.len() - curr as usize;
+                    slice::from_raw_parts(buf_ptr.offset(curr), len)
                 }
             }
-
-            let mut len = buf.len() - curr as usize;
-            try!(wr.write_all(unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }));
-            if !is_nonnegative {
-                len += 1;
-            }
-            Ok(len)
         }
-    })*);
+    )*};
 }
 
-impl_Integer!(i8, u8, i16, u16, i32, u32 as u32);
-impl_Integer!(i64, u64 as u64);
-#[cfg(target_pointer_width = "16")]
-impl_Integer!(isize, usize as u16);
-#[cfg(target_pointer_width = "32")]
-impl_Integer!(isize, usize as u32);
-#[cfg(target_pointer_width = "64")]
-impl_Integer!(isize, usize as u64);
+#[cfg(all(feature = "i128"))]
+const U128_MAX_LEN: usize = 39;
+#[cfg(all(feature = "i128"))]
+const I128_MAX_LEN: usize = 40;
+
+#[cfg(all(feature = "i128"))]
+impl_Integer128!(I128_MAX_LEN => i128, U128_MAX_LEN => u128);
new file mode 100644
--- /dev/null
+++ b/third_party/rust/itoa/src/udiv128.rs
@@ -0,0 +1,63 @@
+// Copyright 2009-2016 compiler-builtins Developers
+//
+// The compiler-builtins crate is dual licensed under both the University of
+// Illinois "BSD-Like" license and the MIT license.  As a user of this code you may
+// choose to use it under either license. As a contributor, you agree to allow
+// your code to be used under both.
+//
+// Full text of the relevant licenses is found here:
+// https://github.com/rust-lang-nursery/compiler-builtins/blob/master/LICENSE.TXT
+//
+//
+//
+// The following code is based on Rust’s [compiler-builtins crate]
+// (https://github.com/rust-lang-nursery/compiler-builtins) which
+// provides runtime functions for the Rust programs. The Rust
+// compiler will automatically link your programs against this crate.
+//
+// We copied the implementation of '__udivmodti4()' which is an intrinsic
+// implementing division with remainder for architectures without 128-bit integer support.
+// We have done this two reasons, to work around [bad optimization by LLVM]
+// (https://github.com/rust-lang/rust/issues/44545) and to allow function
+// inlining which doesn’t happen with the intrinsic.
+
+#[inline]
+pub fn udivmod_1e19(n: u128) -> (u128, u64) {
+    let d = 10_000_000_000_000_000_000_u64; // 10^19
+
+    let high = (n >> 64) as u64;
+    if high == 0 {
+        let low = n as u64;
+        return ((low / d) as u128, low % d);
+    }
+
+    let sr = 65 - high.leading_zeros();
+
+    // 2 <= sr <= 65
+    let mut q: u128 = n << (128 - sr);
+    let mut r: u128 = n >> sr;
+    let mut carry: u64 = 0;
+
+    // Don't use a range because they may generate references to memcpy in unoptimized code
+    //
+    // Loop invariants:  r < d; carry is 0 or 1
+    let mut i = 0;
+    while i < sr {
+        i += 1;
+
+        // r:q = ((r:q) << 1) | carry
+        r = (r << 1) | (q >> 127);
+        q = (q << 1) | carry as u128;
+
+        // carry = 0
+        // if r >= d {
+        //     r -= d;
+        //     carry = 1;
+        // }
+        let s = (d as u128).wrapping_sub(r).wrapping_sub(1) as i128 >> 127;
+        carry = (s & 1) as u64;
+        r -= (d as u128) & s as u128;
+    }
+
+    ((q << 1) | carry as u128, r as u64)
+}
--- a/third_party/rust/itoa/tests/test.rs
+++ b/third_party/rust/itoa/tests/test.rs
@@ -1,25 +1,50 @@
+#![cfg_attr(feature = "i128", feature(i128_type, i128))]
+
+#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, string_lit_as_bytes))]
+
 #![allow(non_snake_case)]
 
 extern crate itoa;
 
 macro_rules! test {
-    ($($name:ident($value:expr, $expected:expr),)*) => {
+    (
         $(
+            $(#[$attr:meta])*
+            $name:ident($value:expr, $expected:expr)
+        ),*
+    ) => {
+        $(
+            $(#[$attr])*
             #[test]
             fn $name() {
-                let mut buf = [b'\0'; 20];
-                let len = itoa::write(&mut buf[..], $value).unwrap();
-                assert_eq!(&buf[0..len], $expected.as_bytes());
+                #[cfg(feature = "std")]
+                {
+                    let mut buf = [b'\0'; 40];
+                    let len = itoa::write(&mut buf[..], $value).unwrap();
+                    assert_eq!(&buf[0..len], $expected.as_bytes());
+                }
+
+                let mut s = String::new();
+                itoa::fmt(&mut s, $value).unwrap();
+                assert_eq!(s, $expected);
             }
         )*
     }
 }
 
-test!(
-    test_0u64(0u64, "0"),
-    test_HALFu64(<u32>::max_value() as u64, "4294967295"),
-    test_MAXu64(<u64>::max_value(), "18446744073709551615"),
+test!{
+    test_u64_0(0u64, "0"),
+    test_u64_half(<u32>::max_value() as u64, "4294967295"),
+    test_u64_max(<u64>::max_value(), "18446744073709551615"),
+    test_i64_min(<i64>::min_value(), "-9223372036854775808"),
 
-    test_0i16(0i16, "0"),
-    test_MINi16(<i16>::min_value(), "-32768"),
-);
+    test_i16_0(0i16, "0"),
+    test_i16_min(<i16>::min_value(), "-32768"),
+
+    #[cfg(feature = "i128")]
+    test_u128_0(0u128, "0"),
+    #[cfg(feature = "i128")]
+    test_u128_max(<u128>::max_value(), "340282366920938463463374607431768211455"),
+    #[cfg(feature = "i128")]
+    test_i128_min(<i128>::min_value(), "-170141183460469231731687303715884105728")
+}
--- a/third_party/rust/serde_derive/.cargo-checksum.json
+++ b/third_party/rust/serde_derive/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"cca09c175616b8390468aae4db4cb82688934de6f9e8bb70d7765e775d1304c9","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"7dc6376a88195594cd6b43cb891aad10f57144ff737178b55d046aa04739b43a","src/bound.rs":"44373ac15601ad92d7862fa33b59219bce111a5d3d8a1de6386e3490a8e4fbf5","src/de.rs":"fbe74de7a3bbcfe2128f016782d24b0ba925f7976563766f728744889d107020","src/fragment.rs":"4e34eca12e6ac4bd89f55e85786cfb677e98182f21ce1f51c0573bca5a8bcd27","src/lib.rs":"389815c14539bc1b394a53fd838a2d97d10def55acf034b67e87435c9d8287fa","src/ser.rs":"190bd80a820cf05155506c34bf5f512c26bae10f67b5877929b0b859d70a8431"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"cca09c175616b8390468aae4db4cb82688934de6f9e8bb70d7765e775d1304c9","LICENSE-APACHE":"154397a08d0cb342110281129971868cd562542d0780b0d10722788cd11a1399","LICENSE-MIT":"72af89a828df52a9dcc42512ed64663b3b8d7961dd7a5586d44478eede82bc7a","README.md":"dbcc210d7f4962499db6d4cfa18658e26d05ee700c962a811cac911f095e22fd","src/bound.rs":"44373ac15601ad92d7862fa33b59219bce111a5d3d8a1de6386e3490a8e4fbf5","src/de.rs":"fbe74de7a3bbcfe2128f016782d24b0ba925f7976563766f728744889d107020","src/fragment.rs":"4e34eca12e6ac4bd89f55e85786cfb677e98182f21ce1f51c0573bca5a8bcd27","src/lib.rs":"389815c14539bc1b394a53fd838a2d97d10def55acf034b67e87435c9d8287fa","src/ser.rs":"190bd80a820cf05155506c34bf5f512c26bae10f67b5877929b0b859d70a8431"},"package":null}
\ No newline at end of file
--- a/third_party/rust/serde_derive/LICENSE-APACHE
+++ b/third_party/rust/serde_derive/LICENSE-APACHE
@@ -1,201 +1,1 @@
-                              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.
+../LICENSE-APACHE
\ No newline at end of file
--- a/third_party/rust/serde_derive/LICENSE-MIT
+++ b/third_party/rust/serde_derive/LICENSE-MIT
@@ -1,25 +1,1 @@
-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.
+../LICENSE-MIT
\ No newline at end of file
--- a/third_party/rust/serde_derive/README.md
+++ b/third_party/rust/serde_derive/README.md
@@ -1,102 +1,1 @@
-# Serde &emsp; [![Build Status]][travis] [![Latest Version]][crates.io]
-
-[Build Status]: https://api.travis-ci.org/serde-rs/serde.svg?branch=master
-[travis]: https://travis-ci.org/serde-rs/serde
-[Latest Version]: https://img.shields.io/crates/v/serde.svg
-[crates.io]: https://crates.io/crates/serde
-
-**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**
-
----
-
-You may be looking for:
-
-- [An overview of Serde](https://serde.rs/)
-- [Data formats supported by Serde](https://serde.rs/#data-formats)
-- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)
-- [Examples](https://serde.rs/examples.html)
-- [API documentation](https://docs.serde.rs/serde/)
-- [Release notes](https://github.com/serde-rs/serde/releases)
-
-## Serde in action
-
-<details>
-<summary>
-Click to show Cargo.toml.
-<a href="http://play.integer32.com/?gist=9003c5b88c1f4989941925d7190c6eec" target="_blank">Run this code in the playground.</a>
-</summary>
-
-```toml
-[dependencies]
-
-# The core APIs, including the Serialize and Deserialize traits. Always
-# required when using Serde.
-serde = "1.0"
-
-# Support for #[derive(Serialize, Deserialize)]. Required if you want Serde
-# to work for structs and enums defined in your crate.
-serde_derive = "1.0"
-
-# Each data format lives in its own crate; the sample code below uses JSON
-# but you may be using a different one.
-serde_json = "1.0"
-```
-
-</details>
-<p></p>
-
-```rust
-#[macro_use]
-extern crate serde_derive;
-
-extern crate serde;
-extern crate serde_json;
-
-#[derive(Serialize, Deserialize, Debug)]
-struct Point {
-    x: i32,
-    y: i32,
-}
-
-fn main() {
-    let point = Point { x: 1, y: 2 };
-
-    // Convert the Point to a JSON string.
-    let serialized = serde_json::to_string(&point).unwrap();
-
-    // Prints serialized = {"x":1,"y":2}
-    println!("serialized = {}", serialized);
-
-    // Convert the JSON string back to a Point.
-    let deserialized: Point = serde_json::from_str(&serialized).unwrap();
-
-    // Prints deserialized = Point { x: 1, y: 2 }
-    println!("deserialized = {:?}", deserialized);
-}
-```
-
-## Getting help
-
-Serde developers live in the #serde channel on
-[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
-good resource with generally faster response time but less specific knowledge
-about Serde. If IRC is not your thing or you don't get a good response, we are
-happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
-as well.
-
-## License
-
-Serde is 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 Serde by you, as defined in the Apache-2.0 license, shall be
-dual licensed as above, without any additional terms or conditions.
+../README.md
\ No newline at end of file
--- a/third_party/rust/serde_derive_internals/.cargo-checksum.json
+++ b/third_party/rust/serde_derive_internals/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{"Cargo.toml":"b9774130c25f51069e3d6d1617d9bbb63d89caf11a30dce332d4553f73f0d07c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"7dc6376a88195594cd6b43cb891aad10f57144ff737178b55d046aa04739b43a","src/ast.rs":"30d0f819638c1e7482529f3449980e116cd106ad5f1b5552f653390af5387ba3","src/attr.rs":"0a18342c91f03960620f7baa307937806c17d52564f3dbe234c3e67480242d6a","src/case.rs":"03a97fc3996614153cc5bbd33b5df9d55954407c4d37c5a656f70cbc76817708","src/check.rs":"a7f296d4ca97eee073c7104d888b15022d279a2a04c27dacd11afaf897858461","src/ctxt.rs":"30b38bc10c9d90ec1186ad4ab2159339d65bfaa5a1a51b5900b0ca52fbe526d1","src/lib.rs":"9e4fbabbdbd0a5c7fd486bfd0715eb8278cc2a07a8cf5e5fdbdf6a543d123081"},"package":null}
\ No newline at end of file
+{"files":{"Cargo.toml":"b9774130c25f51069e3d6d1617d9bbb63d89caf11a30dce332d4553f73f0d07c","LICENSE-APACHE":"154397a08d0cb342110281129971868cd562542d0780b0d10722788cd11a1399","LICENSE-MIT":"72af89a828df52a9dcc42512ed64663b3b8d7961dd7a5586d44478eede82bc7a","README.md":"dbcc210d7f4962499db6d4cfa18658e26d05ee700c962a811cac911f095e22fd","src/ast.rs":"30d0f819638c1e7482529f3449980e116cd106ad5f1b5552f653390af5387ba3","src/attr.rs":"0a18342c91f03960620f7baa307937806c17d52564f3dbe234c3e67480242d6a","src/case.rs":"03a97fc3996614153cc5bbd33b5df9d55954407c4d37c5a656f70cbc76817708","src/check.rs":"a7f296d4ca97eee073c7104d888b15022d279a2a04c27dacd11afaf897858461","src/ctxt.rs":"30b38bc10c9d90ec1186ad4ab2159339d65bfaa5a1a51b5900b0ca52fbe526d1","src/lib.rs":"9e4fbabbdbd0a5c7fd486bfd0715eb8278cc2a07a8cf5e5fdbdf6a543d123081"},"package":null}
\ No newline at end of file
--- a/third_party/rust/serde_derive_internals/LICENSE-APACHE
+++ b/third_party/rust/serde_derive_internals/LICENSE-APACHE
@@ -1,201 +1,1 @@
-                              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.
+../LICENSE-APACHE
\ No newline at end of file
--- a/third_party/rust/serde_derive_internals/LICENSE-MIT
+++ b/third_party/rust/serde_derive_internals/LICENSE-MIT
@@ -1,25 +1,1 @@
-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.
+../LICENSE-MIT
\ No newline at end of file
--- a/third_party/rust/serde_derive_internals/README.md
+++ b/third_party/rust/serde_derive_internals/README.md
@@ -1,102 +1,1 @@
-# Serde &emsp; [![Build Status]][travis] [![Latest Version]][crates.io]
-
-[Build Status]: https://api.travis-ci.org/serde-rs/serde.svg?branch=master
-[travis]: https://travis-ci.org/serde-rs/serde
-[Latest Version]: https://img.shields.io/crates/v/serde.svg
-[crates.io]: https://crates.io/crates/serde
-
-**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**
-
----
-
-You may be looking for:
-
-- [An overview of Serde](https://serde.rs/)
-- [Data formats supported by Serde](https://serde.rs/#data-formats)
-- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)
-- [Examples](https://serde.rs/examples.html)
-- [API documentation](https://docs.serde.rs/serde/)
-- [Release notes](https://github.com/serde-rs/serde/releases)
-
-## Serde in action
-
-<details>
-<summary>
-Click to show Cargo.toml.
-<a href="http://play.integer32.com/?gist=9003c5b88c1f4989941925d7190c6eec" target="_blank">Run this code in the playground.</a>
-</summary>
-
-```toml
-[dependencies]
-
-# The core APIs, including the Serialize and Deserialize traits. Always
-# required when using Serde.
-serde = "1.0"
-
-# Support for #[derive(Serialize, Deserialize)]. Required if you want Serde
-# to work for structs and enums defined in your crate.
-serde_derive = "1.0"
-
-# Each data format lives in its own crate; the sample code below uses JSON
-# but you may be using a different one.
-serde_json = "1.0"
-```
-
-</details>
-<p></p>
-
-```rust
-#[macro_use]
-extern crate serde_derive;
-
-extern crate serde;
-extern crate serde_json;
-
-#[derive(Serialize, Deserialize, Debug)]
-struct Point {
-    x: i32,
-    y: i32,
-}
-
-fn main() {
-    let point = Point { x: 1, y: 2 };
-
-    // Convert the Point to a JSON string.
-    let serialized = serde_json::to_string(&point).unwrap();
-
-    // Prints serialized = {"x":1,"y":2}
-    println!("serialized = {}", serialized);
-
-    // Convert the JSON string back to a Point.
-    let deserialized: Point = serde_json::from_str(&serialized).unwrap();
-
-    // Prints deserialized = Point { x: 1, y: 2 }
-    println!("deserialized = {:?}", deserialized);
-}
-```
-
-## Getting help
-
-Serde developers live in the #serde channel on
-[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
-good resource with generally faster response time but less specific knowledge
-about Serde. If IRC is not your thing or you don't get a good response, we are
-happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
-as well.
-
-## License
-
-Serde is 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 Serde by you, as defined in the Apache-2.0 license, shall be
-dual licensed as above, without any additional terms or conditions.
+../README.md
\ No newline at end of file