summaryrefslogtreecommitdiff
path: root/2020
diff options
context:
space:
mode:
Diffstat (limited to '2020')
-rw-r--r--2020/Cargo.lock3654
-rw-r--r--2020/Cargo.toml11
-rw-r--r--2020/inputs/day_1.txt200
-rw-r--r--2020/inputs/day_10.txt111
-rw-r--r--2020/inputs/day_11.txt90
-rw-r--r--2020/inputs/day_12.txt755
-rw-r--r--2020/inputs/day_2.txt1000
-rw-r--r--2020/inputs/day_3.txt323
-rw-r--r--2020/inputs/day_4.txt1023
-rw-r--r--2020/inputs/day_5.txt901
-rw-r--r--2020/inputs/day_6.txt2199
-rw-r--r--2020/inputs/day_7.txt594
-rw-r--r--2020/inputs/day_8.txt626
-rw-r--r--2020/inputs/day_9.txt1000
-rw-r--r--2020/src/bin/day_1.rs83
-rw-r--r--2020/src/bin/day_10.rs124
-rw-r--r--2020/src/bin/day_11.rs209
-rw-r--r--2020/src/bin/day_12.rs233
-rw-r--r--2020/src/bin/day_2.rs104
-rw-r--r--2020/src/bin/day_3.rs205
-rw-r--r--2020/src/bin/day_4.rs222
-rw-r--r--2020/src/bin/day_5.rs157
-rw-r--r--2020/src/bin/day_6.rs102
-rw-r--r--2020/src/bin/day_7.rs137
-rw-r--r--2020/src/bin/day_8.rs154
-rw-r--r--2020/src/bin/day_9.rs120
-rw-r--r--2020/src/lib.rs1
-rw-r--r--2020/src/main.rs3
28 files changed, 14341 insertions, 0 deletions
diff --git a/2020/Cargo.lock b/2020/Cargo.lock
new file mode 100644
index 0000000..dcd07c3
--- /dev/null
+++ b/2020/Cargo.lock
@@ -0,0 +1,3654 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "Inflector"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3"
+
+[[package]]
+name = "ab_glyph"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26a685fe66654266f321a8b572660953f4df36a2135706503a4c89981d76e1a2"
+dependencies = [
+ "ab_glyph_rasterizer",
+ "owned_ttf_parser",
+]
+
+[[package]]
+name = "ab_glyph_rasterizer"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff"
+
+[[package]]
+name = "addr2line"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c0929d69e78dd9bf5408269919fcbcaeb2e35e5d43e5815517cdc6a8e11a423"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"
+
+[[package]]
+name = "adler32"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
+
+[[package]]
+name = "advent-of-code-2020"
+version = "0.1.0"
+dependencies = [
+ "bevy",
+ "thiserror",
+]
+
+[[package]]
+name = "ahash"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4eb6ec8807cd25b59e6b8100815afc73f54e294f1a425a2e555971969889a8f8"
+dependencies = [
+ "getrandom 0.2.0",
+ "lazy_static",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alsa"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb213f6b3e4b1480a60931ca2035794aa67b73103d254715b1db7b70dcb3c934"
+dependencies = [
+ "alsa-sys",
+ "bitflags",
+ "libc",
+ "nix 0.15.0",
+]
+
+[[package]]
+name = "alsa-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5a0559bcd3f7a482690d98be41c08a43e92f669b179433e95ddf5e8b8fd36a3"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "android_log-sys"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e"
+
+[[package]]
+name = "android_log-sys"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e"
+
+[[package]]
+name = "android_logger"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8cbd542dd180566fad88fd2729a53a62a734843c626638006a9d63ec0688484e"
+dependencies = [
+ "android_log-sys 0.1.2",
+ "env_logger",
+ "lazy_static",
+ "log",
+]
+
+[[package]]
+name = "android_logger"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5027a747b8132dc36dc894415a300aab31d6489ee788e9ba07bc99558b1278ca"
+dependencies = [
+ "android_log-sys 0.2.0",
+ "env_logger",
+ "lazy_static",
+ "log",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7"
+
+[[package]]
+name = "anymap"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "ascii"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
+
+[[package]]
+name = "ash"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c69a8137596e84c22d57f3da1b5de1d4230b1742a710091c85f4d7ce50f00f38"
+dependencies = [
+ "libloading 0.6.5",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146"
+dependencies = [
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "once_cell",
+ "vec-arena",
+]
+
+[[package]]
+name = "async-task"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0"
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "backtrace"
+version = "0.3.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2baad346b2d4e94a24347adeee9c7a93f412ee94b9cc26e5b59dea23848e9f28"
+dependencies = [
+ "addr2line",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide 0.4.3",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base-x"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+
+[[package]]
+name = "base64"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "base64"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "bevy"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8de175e156277bf382d5212e4f580e74caaa62917b5554e12ab2addd87ae789"
+dependencies = [
+ "android_logger 0.9.0",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_audio",
+ "bevy_core",
+ "bevy_diagnostic",
+ "bevy_dynamic_plugin",
+ "bevy_ecs",
+ "bevy_gilrs",
+ "bevy_gltf",
+ "bevy_input",
+ "bevy_math",
+ "bevy_pbr",
+ "bevy_property",
+ "bevy_render",
+ "bevy_scene",
+ "bevy_sprite",
+ "bevy_tasks",
+ "bevy_text",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_ui",
+ "bevy_utils",
+ "bevy_wgpu",
+ "bevy_window",
+ "bevy_winit",
+ "ndk-glue",
+]
+
+[[package]]
+name = "bevy-glsl-to-spirv"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d5f2f58f0aec3c50a20799792c3705e80dd7df327e79791cacec197e84e5e61"
+
+[[package]]
+name = "bevy_app"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93cdf694a6d588bf46a2a7ae5623f176fc5c4ee4d0d71281fdc25bd263136a14"
+dependencies = [
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_utils",
+ "instant",
+ "log",
+ "serde",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_asset"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ed5c0dcf4262387a3917dcf4cd1a7bf9539bac843a6c9653bb56e9d5ef723c"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_tasks",
+ "bevy_type_registry",
+ "bevy_utils",
+ "crossbeam-channel",
+ "downcast-rs",
+ "js-sys",
+ "log",
+ "ndk-glue",
+ "notify",
+ "parking_lot",
+ "rand",
+ "ron",
+ "serde",
+ "thiserror",
+ "uuid",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_audio"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6198d842cc25f77dc828d0ba0ae9b313fd864e18af29f60e9d5319d056f8166"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_type_registry",
+ "bevy_utils",
+ "parking_lot",
+ "rodio",
+]
+
+[[package]]
+name = "bevy_core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bbe690bd67ba93067651604a3da5b314ec4de5417547ad0f1fbd93da541ea30"
+dependencies = [
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_tasks",
+ "bevy_type_registry",
+ "bevy_utils",
+ "instant",
+ "log",
+]
+
+[[package]]
+name = "bevy_derive"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c18d8de3b2f1c66dbac70fbf82bce0dcbeceecf2356eb1b542c735d5c17e0a0"
+dependencies = [
+ "Inflector",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_diagnostic"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e98868df99533447a6ad202e6826fe24cecab80c163c1dcac56b811ea69a9f7"
+dependencies = [
+ "bevy_app",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_utils",
+ "instant",
+ "parking_lot",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_dynamic_plugin"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc5672a27be1e38e11b6f2f1e1290fde2aa4f074628aad33303953ce881a5a78"
+dependencies = [
+ "bevy_app",
+ "libloading 0.6.5",
+ "log",
+]
+
+[[package]]
+name = "bevy_ecs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ad8a73ad248ed6c16b1ca53eaedd76ae5aa284aa5c4527f8cf3526b5e3a7fce"
+dependencies = [
+ "bevy_hecs",
+ "bevy_tasks",
+ "bevy_utils",
+ "downcast-rs",
+ "fixedbitset",
+ "log",
+ "parking_lot",
+ "rand",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_gilrs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "255ceb467ab2982a0bd1ef0c49ae557704f99fe11ab990a11492cea2e6d7fd7f"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "gilrs",
+ "log",
+]
+
+[[package]]
+name = "bevy_gltf"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44dfa912e7fb0ac140b46e2cdf4f6f5e66e6def8049dc8cee69de9a9bafd1836"
+dependencies = [
+ "anyhow",
+ "base64 0.12.3",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_pbr",
+ "bevy_render",
+ "bevy_scene",
+ "bevy_transform",
+ "bevy_type_registry",
+ "gltf",
+ "image",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_hecs"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18661dc92bcb6cc1f2f5ad630f3f3eae7b23942860ea6845a2a775b5a1f7564f"
+dependencies = [
+ "bevy_hecs_macros",
+ "bevy_utils",
+ "lazy_static",
+ "serde",
+]
+
+[[package]]
+name = "bevy_hecs_macros"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a85e43b7043183821aa62f09c91164a0aa6de771c5397a7a0d0eaf754cc042a"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "bevy_input"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "069dc814211aaf691c9aca9ce97210d3238c19e599dfc2bc50b183fe925f0a00"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_math"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71ff845326919ef68a796ae4740e33356683020756bc1d23b552b9b31a106fd3"
+dependencies = [
+ "glam",
+]
+
+[[package]]
+name = "bevy_pbr"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34e4185bf49b2cfd31a0aec90722b3e898b37de5d61ec4cc53e5df9ecae19d71"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_window",
+]
+
+[[package]]
+name = "bevy_property"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bd127fa915b12581aab82cf77ade4a29c1a7b00c19672b88c187c14d111227c"
+dependencies = [
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property_derive",
+ "bevy_utils",
+ "erased-serde",
+ "ron",
+ "serde",
+ "smallvec",
+]
+
+[[package]]
+name = "bevy_property_derive"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3c7a3bc30a90561dc05e662597d595d29a9a7171fb7e5fc34fdb09e4c60c10f"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "bevy_render"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c1e99851a90fba39994aa26887da114cb53388e1ba7324b60cea4156351ad23"
+dependencies = [
+ "anyhow",
+ "bevy-glsl-to-spirv",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "bevy_window",
+ "bitflags",
+ "downcast-rs",
+ "hex",
+ "hexasphere",
+ "image",
+ "log",
+ "once_cell",
+ "parking_lot",
+ "serde",
+ "shaderc",
+ "smallvec",
+ "spirv-reflect",
+ "thiserror",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_scene"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d00a586fa10ea919800eda837f98396b49b99a84ee1fc8d6ad4ede151d3b9e4"
+dependencies = [
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_type_registry",
+ "bevy_utils",
+ "parking_lot",
+ "ron",
+ "serde",
+ "thiserror",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_sprite"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15eb21af28740fcaf9bd4cec1df90a3015ffab1d33d51022ebc9f106f55210d8"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_render",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "guillotiere",
+ "rectangle-pack",
+ "thiserror",
+]
+
+[[package]]
+name = "bevy_tasks"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c39e34a30611a1c4a80a30d252f0c53afa27e9500fa73dae1dca2e41c85c765"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "event-listener",
+ "futures-lite",
+ "num_cpus",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "bevy_text"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61b128707cbbc841fa8aa3b41e29362d4a7ba38fb4450b7766d3ff9884389766"
+dependencies = [
+ "ab_glyph",
+ "anyhow",
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_math",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_type_registry",
+ "bevy_utils",
+]
+
+[[package]]
+name = "bevy_transform"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4b3c44fc53eb744fc16edc923655a50a01fd0e8e6edfe6f3b3065997e913f5"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_property",
+ "bevy_type_registry",
+ "bevy_utils",
+ "log",
+ "smallvec",
+]
+
+[[package]]
+name = "bevy_type_registry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aac65e5c297e547844cb5986da14975181a352f532c8d6fe95f7b62e5a40d32"
+dependencies = [
+ "bevy_app",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_property",
+ "bevy_utils",
+ "parking_lot",
+ "serde",
+ "uuid",
+]
+
+[[package]]
+name = "bevy_ui"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2994737dd6413028a2bcda7315ab6cbe8c30c1dab809fb3de4b1e1a8e2fbfabc"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_derive",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "bevy_render",
+ "bevy_sprite",
+ "bevy_text",
+ "bevy_transform",
+ "bevy_type_registry",
+ "bevy_utils",
+ "bevy_window",
+ "stretch",
+]
+
+[[package]]
+name = "bevy_utils"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "554cd4eba4b278f6cc0fe5da0b7dbe8deba51613e6769f93b0d5a8a32eac54b6"
+dependencies = [
+ "ahash",
+ "getrandom 0.2.0",
+]
+
+[[package]]
+name = "bevy_wgpu"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ba8d9ae1409735ddc2b83426849ba819699288d0ff1166b9caa352511300a1d"
+dependencies = [
+ "bevy_app",
+ "bevy_asset",
+ "bevy_core",
+ "bevy_diagnostic",
+ "bevy_ecs",
+ "bevy_render",
+ "bevy_utils",
+ "bevy_window",
+ "bevy_winit",
+ "crossbeam-channel",
+ "crossbeam-utils",
+ "futures-lite",
+ "log",
+ "parking_lot",
+ "wgpu",
+]
+
+[[package]]
+name = "bevy_window"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f15434d9c46bfc96d449a121e01139489ddc9e79b879edee73c58f90b6b2bbb3"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_math",
+ "bevy_utils",
+ "uuid",
+ "web-sys",
+]
+
+[[package]]
+name = "bevy_winit"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fd72a8a4b42e975c2cac508500471b468568f042d6bbaf6f200844eba3192b0"
+dependencies = [
+ "bevy_app",
+ "bevy_ecs",
+ "bevy_input",
+ "bevy_math",
+ "bevy_utils",
+ "bevy_window",
+ "log",
+ "wasm-bindgen",
+ "web-sys",
+ "winit",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.53.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c72a978d268b1d70b0e963217e60fdabd9523a941457a6c42a7315d15c7e89e5"
+dependencies = [
+ "bitflags",
+ "cexpr",
+ "cfg-if 0.1.10",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+]
+
+[[package]]
+name = "bit-set"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3"
+
+[[package]]
+name = "bitflags"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+
+[[package]]
+name = "block"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
+
+[[package]]
+name = "bumpalo"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
+
+[[package]]
+name = "bytemuck"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41aa2ec95ca3b5c54cf73c91acf06d24f4495d5f1b1c12506ae3483d646177ac"
+
+[[package]]
+name = "byteorder"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
+
+[[package]]
+name = "bytes"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
+
+[[package]]
+name = "cache-padded"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
+
+[[package]]
+name = "cc"
+version = "1.0.62"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1770ced377336a88a67c473594ccc14eca6f4559217c34f64aac8f83d641b40"
+dependencies = [
+ "jobserver",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cexpr"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chunked_transfer"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7477065d45a8fe57167bf3cf8bcd3729b54cfcb81cca49bda2d038ea89ae82ca"
+
+[[package]]
+name = "clang-sys"
+version = "0.29.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading 0.5.2",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "cmake"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "cocoa"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "core-foundation 0.9.1",
+ "core-graphics 0.22.1",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "cocoa-foundation"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318"
+dependencies = [
+ "bitflags",
+ "block",
+ "core-foundation 0.9.1",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "color_quant"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
+
+[[package]]
+name = "combine"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680"
+dependencies = [
+ "ascii",
+ "byteorder",
+ "either",
+ "memchr",
+ "unreachable",
+]
+
+[[package]]
+name = "combine"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9417a0c314565e2abffaece67e95a8cb51f9238cd39f3764d9dfdf09e72b20c"
+dependencies = [
+ "bytes",
+ "memchr",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
+dependencies = [
+ "cache-padded",
+]
+
+[[package]]
+name = "cookie"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5"
+dependencies = [
+ "time",
+ "url 1.7.2",
+]
+
+[[package]]
+name = "copyless"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536"
+
+[[package]]
+name = "core-foundation"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d"
+dependencies = [
+ "core-foundation-sys 0.6.2",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171"
+dependencies = [
+ "core-foundation-sys 0.7.0",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62"
+dependencies = [
+ "core-foundation-sys 0.8.2",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b"
+
+[[package]]
+name = "core-graphics"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.7.0",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc239bba52bab96649441699533a68de294a101533b0270b2d65aa402b29a7f9"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.1",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b"
+dependencies = [
+ "bitflags",
+ "core-foundation 0.9.1",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-video-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828"
+dependencies = [
+ "cfg-if 0.1.10",
+ "core-foundation-sys 0.7.0",
+ "core-graphics 0.19.2",
+ "libc",
+ "objc",
+]
+
+[[package]]
+name = "coreaudio-rs"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f229761965dad3e9b11081668a6ea00f1def7aa46062321b5ec245b834f6e491"
+dependencies = [
+ "bitflags",
+ "coreaudio-sys",
+]
+
+[[package]]
+name = "coreaudio-sys"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17f73df0f29f4c3c374854f076c47dc018f19acaa63538880dba0937ad4fa8d7"
+dependencies = [
+ "bindgen",
+]
+
+[[package]]
+name = "cpal"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05631e2089dfa5d3b6ea1cfbbfd092e2ee5deeb69698911bc976b28b746d3657"
+dependencies = [
+ "alsa",
+ "core-foundation-sys 0.6.2",
+ "coreaudio-rs",
+ "jni 0.17.0",
+ "js-sys",
+ "lazy_static",
+ "libc",
+ "mach 0.3.2",
+ "ndk",
+ "ndk-glue",
+ "nix 0.15.0",
+ "oboe",
+ "parking_lot",
+ "stdweb 0.1.3",
+ "thiserror",
+ "web-sys",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
+dependencies = [
+ "crossbeam-utils",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "d3d12"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a60cceb22c7c53035f8980524fdc7f17cf49681a3c154e6757d30afbec6ec4"
+dependencies = [
+ "bitflags",
+ "libloading 0.6.5",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "darling"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "deflate"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
+dependencies = [
+ "adler32",
+ "byteorder",
+]
+
+[[package]]
+name = "derivative"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dispatch"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b"
+
+[[package]]
+name = "downcast-rs"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650"
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "env_logger"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
+dependencies = [
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "erased-serde"
+version = "0.3.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ca8b296792113e1500fd935ae487be6e00ce318952a6880555554824d6ebf38"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "error-chain"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc"
+dependencies = [
+ "backtrace",
+ "version_check",
+]
+
+[[package]]
+name = "euclid"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5337024b8293bdce5265dc9570ef6e608a34bfacbbc87fe1a5dcb5f1dac2f4e2"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
+
+[[package]]
+name = "fastrand"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fetch_unroll"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5c55005e95bbe15f5f72a73b6597d0dc82ddc97ffe2ca097a99dcd591fefbca"
+dependencies = [
+ "libflate",
+ "tar",
+ "ureq",
+]
+
+[[package]]
+name = "filetime"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c122a393ea57648015bf06fbd3d372378992e86b9ff5a7a497b076a28c79efe"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "redox_syscall",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e08c8bc7575d7e091fe0706963bd22e2a4be6a64da995f03b2a5a57d66ad015"
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
+dependencies = [
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "fsevent"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97f347202c95c98805c216f9e1df210e8ebaec9fdb2365700a43c10797a35e63"
+dependencies = [
+ "bitflags",
+ "fsevent-sys",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a29c77f1ca394c3e73a9a5d24cfcabb734682d9634fc398f2204a63c994120"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "fuchsia-zircon"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
+dependencies = [
+ "bitflags",
+ "fuchsia-zircon-sys",
+]
+
+[[package]]
+name = "fuchsia-zircon-sys"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
+
+[[package]]
+name = "futures"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b3b0c040a1fe6529d30b3c5944b280c7f0dcb2930d2c3062bca967b602583d0"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4caa2b2b68b880003057c1dd49f1ed937e38f22fcf6c212188a121f08cf40a65"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb"
+
+[[package]]
+name = "futures-lite"
+version = "1.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6c079abfac3ab269e2927ec048dabc89d009ebfdda6b8ee86624f30c689658"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "futures-util"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "stdweb 0.4.20",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "gfx-auxil"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07cd956b592970f08545b9325b87580eb95a51843b6f39da27b8667fec1a1216"
+dependencies = [
+ "fxhash",
+ "gfx-hal",
+ "spirv_cross",
+]
+
+[[package]]
+name = "gfx-backend-dx11"
+version = "0.6.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52b0c3b8b2e0a60c1380a7c27652cd86b791e5d8312fb9592a7a59bd437e9532"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "gfx-auxil",
+ "gfx-hal",
+ "libloading 0.6.5",
+ "log",
+ "parking_lot",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "thunderdome",
+ "winapi 0.3.9",
+ "wio",
+]
+
+[[package]]
+name = "gfx-backend-dx12"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "375014deed24d76b03604736dd899f0925158a1a96db90cbefb9cce070f71af7"
+dependencies = [
+ "arrayvec",
+ "bit-set",
+ "bitflags",
+ "d3d12",
+ "gfx-auxil",
+ "gfx-hal",
+ "log",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "gfx-backend-empty"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2085227c12b78f6657a900c829f2d0deb46a9be3eaf86844fde263cdc218f77c"
+dependencies = [
+ "gfx-hal",
+ "log",
+ "raw-window-handle",
+]
+
+[[package]]
+name = "gfx-backend-metal"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60ba1c77c112e7d35786dbd49ed26f2a76ce53a44bc09fe964935e4e35ed7f2b"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "copyless",
+ "foreign-types",
+ "gfx-auxil",
+ "gfx-hal",
+ "lazy_static",
+ "log",
+ "metal",
+ "objc",
+ "parking_lot",
+ "range-alloc",
+ "raw-window-handle",
+ "smallvec",
+ "spirv_cross",
+ "storage-map",
+]
+
+[[package]]
+name = "gfx-backend-vulkan"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a3a63cf61067a09b7d1ac480af3cb2ae0c5ede5bed294607bbd814cb1666c45"
+dependencies = [
+ "arrayvec",
+ "ash",
+ "byteorder",
+ "core-graphics-types",
+ "gfx-hal",
+ "inplace_it",
+ "lazy_static",
+ "log",
+ "objc",
+ "raw-window-handle",
+ "smallvec",
+ "winapi 0.3.9",
+ "x11",
+]
+
+[[package]]
+name = "gfx-descriptor"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd8c7afcd000f279d541a490e27117e61037537279b9342279abf4938fe60c6b"
+dependencies = [
+ "arrayvec",
+ "fxhash",
+ "gfx-hal",
+ "log",
+]
+
+[[package]]
+name = "gfx-hal"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18d0754f5b7a43915fd7466883b2d1bb0800d7cc4609178d0b27bf143b9e5123"
+dependencies = [
+ "bitflags",
+ "raw-window-handle",
+]
+
+[[package]]
+name = "gfx-memory"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dccdda5d2b39412f4ca2cb15c70b5a82783a86b0606f5e985342754c8ed88f05"
+dependencies = [
+ "bit-set",
+ "fxhash",
+ "gfx-hal",
+ "log",
+ "slab",
+]
+
+[[package]]
+name = "gilrs"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b64ac678e1174eb012be1cfd409ff2483f23cb79bc880ce4737147245b0fbff"
+dependencies = [
+ "fnv",
+ "gilrs-core",
+ "log",
+ "stdweb 0.4.20",
+ "uuid",
+ "vec_map",
+]
+
+[[package]]
+name = "gilrs-core"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1024d4046c5c67d2adb8c90f6ed235163b58e05d35a63bf699b53f0cceeba2c6"
+dependencies = [
+ "core-foundation 0.6.4",
+ "io-kit-sys",
+ "libc",
+ "libudev-sys",
+ "log",
+ "nix 0.18.0",
+ "rusty-xinput",
+ "stdweb 0.4.20",
+ "uuid",
+ "vec_map",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "gimli"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
+
+[[package]]
+name = "glam"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8637c7ec4fd0776c51eeab3e0d5d1aa7e440ece3fc2ee7d674e13c957287bfc1"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
+
+[[package]]
+name = "gltf"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6fb0d1d772daf10ea74528c3aeb12215f6d5b820adf2ecfc93a6578d6779c3c"
+dependencies = [
+ "byteorder",
+ "gltf-json",
+ "lazy_static",
+]
+
+[[package]]
+name = "gltf-derive"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6636de7bf52227363554f1ca2d9cd180fc666129ddd0933097e1f227dfa7293"
+dependencies = [
+ "inflections",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "gltf-json"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3fc3deb81e6fa04bf808f6be7c3983229552a95b77f687ad96af00f6d3e7d6c"
+dependencies = [
+ "gltf-derive",
+ "serde",
+ "serde_derive",
+ "serde_json",
+]
+
+[[package]]
+name = "guillotiere"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7cccefbf418f663e11e9500326f46a44273dc598210bbedc8bbe95e696531f"
+dependencies = [
+ "euclid",
+ "svg_fmt",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35"
+
+[[package]]
+name = "hexasphere"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00ad921775e70efb68429688766ca130de39af65d5201db760b0e6558bfa8175"
+dependencies = [
+ "glam",
+ "lazy_static",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "image"
+version = "0.23.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4f0a8345b33b082aedec2f4d7d4a926b845cee184cbe78b703413066564431b"
+dependencies = [
+ "bytemuck",
+ "byteorder",
+ "color_quant",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+ "png",
+ "scoped_threadpool",
+]
+
+[[package]]
+name = "inflections"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
+
+[[package]]
+name = "inotify"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46dd0a94b393c730779ccfd2a872b67b1eb67be3fc33082e733bdb38b5fde4d4"
+dependencies = [
+ "bitflags",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4563555856585ab3180a5bf0b2f9f8d301a728462afffc8195b3f5394229c55"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "inplace_it"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd01a2a73f2f399df96b22dc88ea687ef4d76226284e7531ae3c7ee1dc5cb534"
+
+[[package]]
+name = "instant"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "io-kit-sys"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0"
+dependencies = [
+ "core-foundation-sys 0.6.2",
+ "mach 0.2.3",
+]
+
+[[package]]
+name = "iovec"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
+
+[[package]]
+name = "jni"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1981310da491a4f0f815238097d0d43d8072732b5ae5f8bd0d8eadf5bf245402"
+dependencies = [
+ "cesu8",
+ "combine 3.8.1",
+ "error-chain",
+ "jni-sys",
+ "log",
+ "walkdir",
+]
+
+[[package]]
+name = "jni"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36bcc950632e48b86da402c5c077590583da5ac0d480103611d5374e7c967a3c"
+dependencies = [
+ "cesu8",
+ "combine 4.4.0",
+ "error-chain",
+ "jni-sys",
+ "log",
+ "walkdir",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
+
+[[package]]
+name = "jobserver"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kernel32-sys"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+dependencies = [
+ "spin",
+]
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
+
+[[package]]
+name = "libflate"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9135df43b1f5d0e333385cb6e7897ecd1a43d7d11b91ac003f4d2c2d2401fdd"
+dependencies = [
+ "adler32",
+ "crc32fast",
+ "rle-decode-fast",
+ "take_mut",
+]
+
+[[package]]
+name = "libloading"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753"
+dependencies = [
+ "cc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libloading"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1090080fe06ec2648d0da3881d9453d97e71a45f00eb179af7fdd7e3f686fdb0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "libm"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
+
+[[package]]
+name = "libudev-sys"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "mach"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "mach"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "malloc_buf"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+
+[[package]]
+name = "metal"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c4e8a431536529327e28c9ba6992f2cb0c15d4222f0602a16e6d7695ff3bccf"
+dependencies = [
+ "bitflags",
+ "block",
+ "cocoa-foundation",
+ "foreign-types",
+ "log",
+ "objc",
+]
+
+[[package]]
+name = "minimp3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9684a8c55935322fdab159b5d7a6163b33f6e7d32c4a8a54fe53d1bcfad738db"
+dependencies = [
+ "minimp3-sys",
+ "slice-deque",
+]
+
+[[package]]
+name = "minimp3-sys"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e21c73734c69dc95696c9ed8926a2b393171d98b3f5f5935686a26a487ab9b90"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
+dependencies = [
+ "adler32",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.6.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430"
+dependencies = [
+ "cfg-if 0.1.10",
+ "fuchsia-zircon",
+ "fuchsia-zircon-sys",
+ "iovec",
+ "kernel32-sys",
+ "libc",
+ "log",
+ "miow",
+ "net2",
+ "slab",
+ "winapi 0.2.8",
+]
+
+[[package]]
+name = "mio-extras"
+version = "2.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
+dependencies = [
+ "lazycell",
+ "log",
+ "mio",
+ "slab",
+]
+
+[[package]]
+name = "miow"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
+dependencies = [
+ "kernel32-sys",
+ "net2",
+ "winapi 0.2.8",
+ "ws2_32-sys",
+]
+
+[[package]]
+name = "naga"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0873deb76cf44b7454fba7b2ba6a89d3de70c08aceffd2c489379b3d9d08e661"
+dependencies = [
+ "bitflags",
+ "fxhash",
+ "log",
+ "num-traits",
+ "spirv_headers",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73"
+dependencies = [
+ "jni-sys",
+ "ndk-sys",
+ "num_enum",
+ "thiserror",
+]
+
+[[package]]
+name = "ndk-glue"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241"
+dependencies = [
+ "android_logger 0.8.6",
+ "lazy_static",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-macro",
+ "ndk-sys",
+]
+
+[[package]]
+name = "ndk-macro"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d"
+dependencies = [
+ "darling",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "ndk-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d"
+
+[[package]]
+name = "net2"
+version = "0.2.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "nix"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+ "void",
+]
+
+[[package]]
+name = "nix"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055"
+dependencies = [
+ "bitflags",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+]
+
+[[package]]
+name = "nom"
+version = "5.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
+dependencies = [
+ "memchr",
+ "version_check",
+]
+
+[[package]]
+name = "notify"
+version = "5.0.0-pre.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8b946889dfdad884379cd56367d93b6d0ce8889cc027d26a69a3a31c0a03bb5"
+dependencies = [
+ "anymap",
+ "bitflags",
+ "crossbeam-channel",
+ "filetime",
+ "fsevent",
+ "fsevent-sys",
+ "inotify",
+ "libc",
+ "mio",
+ "mio-extras",
+ "walkdir",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "num-derive"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4"
+dependencies = [
+ "derivative",
+ "num_enum_derive",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d"
+dependencies = [
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "objc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1"
+dependencies = [
+ "malloc_buf",
+ "objc_exception",
+]
+
+[[package]]
+name = "objc_exception"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "object"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397"
+
+[[package]]
+name = "oboe"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6a13c9fe73346ff3cee5530b8dd9da1ce3e13cb663be210af3938a2a1dd3eab"
+dependencies = [
+ "jni 0.14.0",
+ "ndk",
+ "ndk-glue",
+ "num-derive",
+ "num-traits",
+ "oboe-sys",
+]
+
+[[package]]
+name = "oboe-sys"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68ff7a51600eabe34e189eec5c995a62f151d8d97e5fbca39e87ca738bb99b82"
+dependencies = [
+ "fetch_unroll",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
+
+[[package]]
+name = "owned_ttf_parser"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb477c7fd2a3a6e04e1dc6ca2e4e9b04f2df702021dc5a5d1cf078c587dc59f7"
+dependencies = [
+ "ttf-parser",
+]
+
+[[package]]
+name = "parking"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b"
+dependencies = [
+ "cfg-if 0.1.10",
+ "cloudabi",
+ "instant",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "percent-encoding"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pin-project"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
+
+[[package]]
+name = "png"
+version = "0.16.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfe7f9f1c730833200b134370e1d5098964231af8450bce9b78ee3ab5278b970"
+dependencies = [
+ "bitflags",
+ "crc32fast",
+ "deflate",
+ "miniz_oxide 0.3.7",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "qstring"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e"
+dependencies = [
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.15",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.15",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "range-alloc"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a871f1e45a3a3f0c73fb60343c811238bb5143a81642e27c2ac7aac27ff01a63"
+
+[[package]]
+name = "raw-window-handle"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "rectangle-pack"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e509b8eba9ca1884760ad1e2161cece724d4fd2b4cb47ddc01706920c6500cd7"
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+
+[[package]]
+name = "regex"
+version = "1.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+ "thread_local",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
+
+[[package]]
+name = "ring"
+version = "0.16.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b72b84d47e8ec5a4f2872e8262b8f8256c5be1c938a7d6d3a867a3ba8f722f74"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "rle-decode-fast"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cabe4fa914dec5870285fa7f71f602645da47c486e68486d2b4ceb4a343e90ac"
+
+[[package]]
+name = "rodio"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c9683532495146e98878d4948fa1a1953f584cd923f2a5f5c26b7a8701b56943"
+dependencies = [
+ "cpal",
+ "minimp3",
+]
+
+[[package]]
+name = "ron"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8a58080b7bb83b2ea28c3b7a9a994fd5e310330b7c8ca5258d99b98128ecfe4"
+dependencies = [
+ "base64 0.12.3",
+ "bitflags",
+ "serde",
+]
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustls"
+version = "0.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b25a18b1bf7387f0145e7f8324e700805aade3842dd3db2e74e4cdeb4677c09e"
+dependencies = [
+ "base64 0.10.1",
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rusty-xinput"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2aa654bc32eb9ca14cce1a084abc9dfe43949a4547c35269a094c39272db3bb"
+dependencies = [
+ "lazy_static",
+ "log",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped_threadpool"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.59"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
+
+[[package]]
+name = "shaderc"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50b8aeaae10b9bda5cba66736a7e265f67698e912e1cc6a4678acba286e22be9"
+dependencies = [
+ "libc",
+ "shaderc-sys",
+]
+
+[[package]]
+name = "shaderc-sys"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b12d7c62d6732884c9dfab587503fa3a795b108df152415a89da23812d4737e"
+dependencies = [
+ "cmake",
+ "libc",
+]
+
+[[package]]
+name = "shlex"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "slice-deque"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25"
+dependencies = [
+ "libc",
+ "mach 0.3.2",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spirv-reflect"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cecc7af6a7d3ca6d15f4d6b5077df89c77ad1f4b314d0cabee221656d041dad7"
+dependencies = [
+ "bitflags",
+ "cc",
+ "num-traits",
+ "serde",
+ "serde_derive",
+ "spirv_headers",
+]
+
+[[package]]
+name = "spirv_cross"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea964c42ce40326fe96111918abe71fa45076da1ea85769f3f1ab1cda9a1d496"
+dependencies = [
+ "cc",
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "spirv_headers"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f5b132530b1ac069df335577e3581765995cba5a13995cdbbdbc8fb057c532c"
+dependencies = [
+ "bitflags",
+ "num-traits",
+]
+
+[[package]]
+name = "stdweb"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e"
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version",
+ "serde",
+ "serde_json",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
+[[package]]
+name = "storage-map"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "418bb14643aa55a7841d5303f72cf512cfb323b8cc221d51580500a1ca75206c"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "stretch"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87"
+dependencies = [
+ "lazy_static",
+ "libm",
+]
+
+[[package]]
+name = "strsim"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c"
+
+[[package]]
+name = "svg_fmt"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2"
+
+[[package]]
+name = "syn"
+version = "1.0.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "take_mut"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60"
+
+[[package]]
+name = "tar"
+version = "0.4.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290"
+dependencies = [
+ "filetime",
+ "libc",
+ "redox_syscall",
+ "xattr",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "thunderdome"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7572415bd688d401c52f6e36f4c8e805b9ae1622619303b9fa835d531db0acae"
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b78a366903f506d2ad52ca8dc552102ffdd3e937ba8a227f024dc1d1eae28575"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "toml"
+version = "0.5.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75cf45bb0bef80604d001caaec0d09da99611b3c0fd39d3080468875cdb65645"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27"
+dependencies = [
+ "cfg-if 0.1.10",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "ttf-parser"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7622061403fd00f0820df288e5a580e87d3ce15a1c4313c59fd1ffb77129903f"
+
+[[package]]
+name = "typed-arena"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+dependencies = [
+ "matches",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1e9a0b71dba18b6fa17c7b3dcf1440bb3522552deb2f84bf47dabd9fb7e5570"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "unreachable"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
+dependencies = [
+ "void",
+]
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "ureq"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "801125e6d1ba6864cf3a5a92cfb2f0b0a3ee73e40602a0cd206ad2f3c040aa96"
+dependencies = [
+ "base64 0.11.0",
+ "chunked_transfer",
+ "cookie",
+ "lazy_static",
+ "qstring",
+ "rustls",
+ "url 2.2.0",
+ "webpki",
+ "webpki-roots",
+]
+
+[[package]]
+name = "url"
+version = "1.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"
+dependencies = [
+ "idna 0.1.5",
+ "matches",
+ "percent-encoding 1.0.1",
+]
+
+[[package]]
+name = "url"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
+dependencies = [
+ "form_urlencoded",
+ "idna 0.2.0",
+ "matches",
+ "percent-encoding 2.1.0",
+]
+
+[[package]]
+name = "uuid"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
+dependencies = [
+ "rand",
+ "serde",
+]
+
+[[package]]
+name = "vec-arena"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d"
+
+[[package]]
+name = "vec_map"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
+
+[[package]]
+name = "version_check"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
+
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "walkdir"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
+dependencies = [
+ "same-file",
+ "winapi 0.3.9",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42"
+dependencies = [
+ "cfg-if 0.1.10",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da"
+dependencies = [
+ "cfg-if 0.1.10",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307"
+
+[[package]]
+name = "web-sys"
+version = "0.3.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91cd5736df7f12a964a5067a12c62fa38e1bd8080aff1f80bc29be7c80d19ab4"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "wgpu"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "549160f188eef412ac978499ddf0ceadad4c9159bb1160f9e6b9d4cc8ee977dc"
+dependencies = [
+ "arrayvec",
+ "futures",
+ "gfx-backend-vulkan",
+ "js-sys",
+ "objc",
+ "parking_lot",
+ "raw-window-handle",
+ "smallvec",
+ "tracing",
+ "typed-arena",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "wgpu-core",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-core"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea487deeae90e06d77eb8e6cef945247774e7c0a0a226d238b31e90633594365"
+dependencies = [
+ "arrayvec",
+ "bitflags",
+ "copyless",
+ "fxhash",
+ "gfx-backend-dx11",
+ "gfx-backend-dx12",
+ "gfx-backend-empty",
+ "gfx-backend-metal",
+ "gfx-backend-vulkan",
+ "gfx-descriptor",
+ "gfx-hal",
+ "gfx-memory",
+ "naga",
+ "parking_lot",
+ "raw-window-handle",
+ "smallvec",
+ "thiserror",
+ "tracing",
+ "wgpu-types",
+]
+
+[[package]]
+name = "wgpu-types"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e3529528e608b54838ee618c3923b0f46e6db0334cfc6c42a16cf4ceb3bdb57"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "winapi"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-build"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "winit"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5bc559da567d8aa671bbcd08304d49e982c7bf2cb91e10288b9188931c1b772"
+dependencies = [
+ "bitflags",
+ "cocoa",
+ "core-foundation 0.9.1",
+ "core-graphics 0.22.1",
+ "core-video-sys",
+ "dispatch",
+ "instant",
+ "lazy_static",
+ "libc",
+ "log",
+ "mio",
+ "mio-extras",
+ "ndk",
+ "ndk-glue",
+ "ndk-sys",
+ "objc",
+ "parking_lot",
+ "percent-encoding 2.1.0",
+ "raw-window-handle",
+ "wasm-bindgen",
+ "web-sys",
+ "winapi 0.3.9",
+ "x11-dl",
+]
+
+[[package]]
+name = "wio"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5"
+dependencies = [
+ "winapi 0.3.9",
+]
+
+[[package]]
+name = "ws2_32-sys"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
+dependencies = [
+ "winapi 0.2.8",
+ "winapi-build",
+]
+
+[[package]]
+name = "x11"
+version = "2.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ecd092546cb16f25783a5451538e73afc8d32e242648d54f4ae5459ba1e773"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "maybe-uninit",
+ "pkg-config",
+]
+
+[[package]]
+name = "xattr"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
+dependencies = [
+ "libc",
+]
diff --git a/2020/Cargo.toml b/2020/Cargo.toml
new file mode 100644
index 0000000..8a7f35d
--- /dev/null
+++ b/2020/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "advent-of-code-2020"
+version = "0.1.0"
+authors = ["Justin Wernick <justin@worthe-it.co.za>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+bevy = "0.3.0"
+thiserror = "1.0.22" \ No newline at end of file
diff --git a/2020/inputs/day_1.txt b/2020/inputs/day_1.txt
new file mode 100644
index 0000000..fbbfa17
--- /dev/null
+++ b/2020/inputs/day_1.txt
@@ -0,0 +1,200 @@
+1337
+1906
+2007
+1939
+818
+1556
+2005
+1722
+1484
+1381
+1682
+1253
+1967
+1718
+2002
+1398
+1439
+1689
+1746
+1979
+1985
+1387
+1509
+1566
+1276
+1625
+1853
+882
+1750
+1390
+1731
+1555
+1860
+1675
+1457
+1554
+1506
+1639
+1543
+1849
+1062
+1869
+1769
+1858
+1916
+1504
+1747
+1925
+1275
+1273
+1383
+1816
+1814
+1481
+1649
+1993
+1759
+1949
+1499
+1374
+1613
+1424
+783
+1765
+1576
+1933
+1270
+1844
+1856
+1634
+1261
+1293
+1741
+668
+1573
+1599
+1877
+1474
+1918
+476
+1515
+1029
+202
+1589
+1867
+1503
+1582
+1605
+1557
+587
+1462
+1955
+1806
+1834
+1739
+1343
+1594
+1622
+1972
+1527
+1798
+1719
+1866
+134
+2000
+1992
+1966
+1909
+1340
+1621
+1921
+1256
+1365
+1314
+1748
+1963
+1379
+1627
+1848
+1977
+1917
+1826
+1716
+1631
+1404
+1936
+1677
+1661
+1986
+1997
+1603
+1932
+1780
+1902
+2009
+1257
+1871
+1362
+1662
+1507
+1255
+1539
+1962
+1886
+1513
+1264
+1873
+1700
+807
+1426
+1697
+1698
+1519
+1791
+1240
+1542
+1497
+1761
+1640
+1502
+1770
+1437
+1333
+1805
+1591
+1644
+1420
+1809
+1587
+1421
+1540
+1942
+470
+1940
+1831
+1247
+1632
+1975
+1774
+1919
+1829
+1944
+1553
+1361
+1483
+1995
+1868
+1601
+1552
+1854
+1490
+1855
+1987
+1538
+1389
+1454
+1427
+1686
+1456
+1974
diff --git a/2020/inputs/day_10.txt b/2020/inputs/day_10.txt
new file mode 100644
index 0000000..fa8ea01
--- /dev/null
+++ b/2020/inputs/day_10.txt
@@ -0,0 +1,111 @@
+71
+183
+111
+89
+92
+142
+25
+101
+52
+86
+18
+22
+70
+2
+135
+163
+34
+143
+153
+35
+144
+24
+23
+94
+100
+102
+17
+57
+76
+182
+134
+38
+7
+103
+66
+31
+11
+121
+77
+113
+128
+82
+99
+148
+137
+41
+32
+48
+131
+60
+127
+138
+73
+28
+10
+84
+180
+63
+125
+53
+176
+165
+114
+145
+152
+72
+107
+167
+59
+164
+78
+126
+118
+136
+83
+79
+58
+14
+106
+69
+51
+39
+157
+42
+177
+173
+93
+141
+3
+33
+13
+19
+45
+154
+95
+170
+54
+181
+6
+151
+1
+112
+96
+115
+85
+108
+166
+160
+40
+122
+12
diff --git a/2020/inputs/day_11.txt b/2020/inputs/day_11.txt
new file mode 100644
index 0000000..977ae5f
--- /dev/null
+++ b/2020/inputs/day_11.txt
@@ -0,0 +1,90 @@
+LLLLL.LLLLLL.LLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL
+LLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+L.LL.L.L.LL.....L.L..L.LL.L.L.L.....L..LLL.L.....L.L...LL..L.....L...L..L.LLLL..L.LL......L.L.L.
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL.
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+......LL..LLLL.L...LL.....L.L.......L..L.LL....L.LLL........L.L.L.LL.....L.........L....L......L
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+.L...L...L.....L...L....L.LL.LLL.LL...LL.L..L...L......L..LL..L..LL..L.L......L.L.LLL......L.L..
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+...........LLL.....LLL.....LL.L..........L..L.L.L...L.L.....L........L......L..L..L...LL....L.L.
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL
+L.......LL...LL...L..L.....L..LL..L.L.LLL.L.L..L.LL.L.........L....LLLL..LL..L.L..L..LLLL..LL.L.
+LLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+....LLL.LL....L.L.........L.L............L..L...L.LLLL......L...L.L..L....L.......L..L..........
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LL.L.LLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.L..LLL..LLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLL.LLLLLLLLL.LLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+.L..LLLL..L.L.LLL.......LL.LL.LL......L.L....L.LLL.......L...L.L.LL...LL.....L.L....L.L...L.L...
+LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLL
+LLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LL
+LLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL
+LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL
+.L..L..LLL....LL......LL.L.L..LL..LL....L...L..L.L.L...L..L..L.LLLL.L....L.....L..L...L...LLL...
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+..LL.LL.L.LL.L...L..L..L..L...LL........L......LL.LLLL.......L..LLL.L.L....L.....L..LL..L.LL.LL.
+LLLLL.LLLL.L.LLLLL.LLL.LLLLLL.LLLLLLL.LL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLL.LLLL.LLLLLLLLLLL.LLLL..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLL
+LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LL.LL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+.LL..LL.L.LL......L.L.LL...L..LL..LL...L..L.L..LL...L.L..L.....L.LLL..L..LL.L..L.......L..LLL...
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL..LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLL.LLLLL.LLLLLL.LL.L.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+.L.L....LLL.L.L........L..L....L..L...LL..L..LLL..L.L....L..L.LL....LL.L.L.....L........L..L.L..
+LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLL
+LLLLL.LLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLL.LL..LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL
+LLLL..L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL
+LLLLL..LLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLL
+LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.L.LL..LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL
diff --git a/2020/inputs/day_12.txt b/2020/inputs/day_12.txt
new file mode 100644
index 0000000..d7bc269
--- /dev/null
+++ b/2020/inputs/day_12.txt
@@ -0,0 +1,755 @@
+F93
+R90
+F81
+E3
+F80
+R90
+W4
+R90
+F64
+N1
+R90
+W4
+F11
+W1
+L180
+F28
+R90
+W4
+L180
+F95
+N3
+F71
+L90
+W1
+F1
+E2
+L90
+F85
+W3
+L90
+F28
+E3
+N5
+F47
+S2
+R90
+N2
+L90
+W4
+L180
+W3
+F51
+F77
+L90
+W5
+N5
+W3
+S5
+W5
+R180
+N1
+W3
+S5
+F36
+W1
+F34
+N4
+F40
+E2
+S3
+R90
+W5
+S2
+N4
+R90
+S2
+L90
+N4
+L90
+S2
+E1
+F2
+N4
+F65
+N1
+F46
+R180
+F60
+N4
+F45
+R90
+S3
+L90
+F70
+W4
+L270
+N4
+F49
+E3
+F52
+R180
+F5
+E5
+R90
+F43
+L90
+S4
+F54
+N1
+F7
+S2
+F91
+S4
+N3
+E3
+S4
+L180
+F15
+S2
+F90
+W5
+S2
+F80
+N4
+L90
+R90
+N4
+E2
+R180
+E5
+F62
+L90
+N5
+F77
+N5
+F75
+E2
+L90
+S4
+F55
+E1
+N5
+F57
+R90
+F6
+L90
+N3
+E5
+L180
+N2
+L270
+N5
+F8
+E2
+F88
+E3
+N3
+E4
+R90
+N1
+W5
+R90
+N4
+E3
+S3
+R90
+N1
+E2
+F4
+N4
+R90
+N3
+W5
+L180
+E1
+F2
+N4
+W5
+F80
+S4
+F7
+L180
+F96
+L90
+F16
+L90
+E4
+F78
+W2
+R90
+S3
+F29
+W4
+R90
+E4
+F39
+N1
+F48
+E4
+L180
+E1
+R180
+E2
+R90
+N3
+R180
+W2
+N5
+W5
+E3
+F25
+E1
+L180
+N5
+F44
+L90
+N4
+W4
+L90
+F72
+L90
+S1
+E5
+N5
+R90
+N1
+W3
+S5
+R90
+W1
+F14
+L90
+W2
+R90
+W3
+F76
+S5
+W5
+F93
+W4
+R90
+F57
+E3
+R90
+S3
+W1
+R90
+S3
+F8
+R90
+N2
+F46
+W4
+S1
+L90
+E4
+W5
+L90
+W2
+F69
+N5
+W5
+F80
+N3
+E4
+L90
+E4
+F25
+S3
+R180
+F77
+R90
+W2
+F19
+E4
+L180
+W2
+F37
+S2
+F68
+L90
+E2
+F66
+S1
+R90
+F66
+E2
+L180
+F97
+N3
+W4
+F43
+S4
+R180
+N1
+R270
+E3
+N2
+N3
+F65
+L90
+S2
+L90
+N3
+L90
+S3
+F23
+L270
+W3
+S5
+E2
+R90
+S1
+F85
+N3
+R90
+W4
+F58
+E1
+L90
+N3
+L90
+E2
+S1
+F14
+E2
+N5
+W1
+N3
+E1
+L90
+E3
+F43
+E3
+N3
+F21
+E4
+F53
+E2
+L180
+E4
+F20
+E2
+N2
+E5
+L90
+N4
+W3
+N4
+S2
+L90
+W3
+F96
+L90
+S3
+R90
+N1
+E3
+S5
+L270
+F41
+N5
+W5
+S1
+W5
+R90
+F79
+W3
+L90
+E3
+F22
+N1
+L90
+E2
+L90
+R90
+F20
+L90
+W3
+R90
+W2
+L180
+W4
+F57
+R180
+N3
+L90
+F36
+L90
+E2
+R90
+N2
+E3
+N1
+W4
+W4
+N3
+E5
+F54
+R180
+F98
+W1
+R90
+F21
+S1
+L90
+S2
+L90
+S2
+F90
+E4
+S2
+R90
+N5
+F25
+N4
+W3
+N2
+F27
+S3
+E3
+N3
+F15
+L180
+S4
+F62
+W2
+L180
+E2
+N2
+L90
+R90
+F97
+R90
+S1
+R90
+E2
+F16
+W2
+E1
+F89
+W1
+L180
+S3
+W2
+S3
+E1
+F92
+F30
+N1
+E2
+S1
+F76
+E1
+S5
+W5
+F28
+W4
+L90
+F44
+E4
+N5
+F25
+R90
+F59
+S4
+F58
+S2
+F19
+W5
+S4
+E5
+N3
+F37
+E1
+L90
+F40
+E5
+F56
+S2
+W5
+F73
+N5
+F2
+L90
+F18
+E2
+N5
+L90
+F56
+R90
+F18
+W1
+S5
+E1
+N1
+L90
+W2
+E4
+N4
+E1
+W4
+N4
+L90
+N3
+R90
+W5
+S5
+F2
+R180
+F96
+R90
+W3
+F26
+L90
+S4
+E2
+F43
+S2
+R90
+F61
+W5
+F93
+R90
+F95
+L90
+E4
+R90
+N4
+F47
+R90
+W5
+L90
+F42
+L90
+W5
+F87
+R90
+N1
+N2
+E4
+F64
+S5
+L270
+F86
+S4
+W3
+S1
+L90
+F72
+R270
+W1
+F17
+S1
+E2
+R90
+W1
+N1
+F42
+N5
+L90
+F87
+F66
+L90
+N2
+W2
+L90
+S5
+F7
+R90
+N4
+L270
+F2
+W1
+N4
+F94
+W5
+R180
+S4
+F15
+E4
+F76
+N1
+E2
+F68
+S3
+F50
+R270
+E5
+F77
+R90
+S3
+E2
+N3
+S4
+F39
+S1
+E5
+S3
+L90
+E4
+S2
+W3
+F54
+R90
+F44
+L90
+W3
+F59
+R90
+N3
+F37
+E1
+F75
+R90
+F31
+W3
+F70
+S5
+L90
+E1
+F67
+W4
+L90
+S1
+W5
+S1
+S4
+W2
+E2
+S3
+R90
+S2
+E5
+L90
+F43
+R90
+E1
+S5
+F42
+L90
+W1
+N2
+E1
+L180
+S4
+W1
+L90
+F81
+E1
+R180
+N5
+R180
+N5
+L180
+F65
+R90
+F64
+W4
+S4
+R90
+F70
+E1
+S1
+F50
+E2
+S4
+E4
+N2
+S1
+R90
+E4
+R90
+F70
+R90
+N4
+F71
+R180
+F80
+S3
+L90
+N5
+L180
+F11
+N1
+R90
+W2
+N1
+R90
+W4
+R90
+F67
+W3
+R90
+W5
+L90
+E4
+F90
+L90
+N4
+L180
+F48
+R90
+W2
+F94
+R90
+N4
+L90
+W2
+F2
+L90
+W1
+E5
+S2
+W5
+S5
+E2
+N3
+W5
+N1
+F98
+S3
+W3
+L90
+S3
+W4
+R90
+W1
+F64
+N5
+R90
+S5
+W5
+F84
+S1
+E3
+L90
+S3
+E5
+F6
+N4
+W1
+R90
+E4
+F14
+N1
+R90
+F31
+L90
+F24
+F4
+N4
+F54
+S3
+R270
+F98
+E1
+L180
+F2
+E4
+F70
+W1
+R180
+N5
+F23
diff --git a/2020/inputs/day_2.txt b/2020/inputs/day_2.txt
new file mode 100644
index 0000000..3a0963f
--- /dev/null
+++ b/2020/inputs/day_2.txt
@@ -0,0 +1,1000 @@
+15-16 l: klfbblslvjclmlnqklvg
+6-13 h: pghjchdxhnjhjd
+4-13 n: nnznntzznqnzbtzj
+10-16 r: nrrrrkrjtxwrrrwx
+1-6 t: rttftttttttttmdttttt
+4-12 l: zhllfxlmvqtnhx
+6-8 d: wxpwgdbjtffddkb
+7-9 q: rqcqxjqhsm
+6-8 x: xxxfxdxxx
+5-9 d: dwnwnbsddfmc
+2-6 j: jvdrrjchml
+8-10 x: xxxcxxxzxxxxx
+15-16 f: ffffffffffffffnfc
+3-12 v: vgvvvvvvvvfqvvvv
+2-5 p: tknppm
+11-12 r: frrnrfqtshrgw
+13-16 f: rfjmkrqkqrxmfnqj
+3-5 f: ffffxffn
+2-4 f: fffwf
+11-13 s: srslssshssssx
+1-6 c: cccdcn
+2-6 t: tthhnc
+12-17 w: wwwwwwwwwwwmwwwwg
+5-6 k: kqkksskkp
+4-5 p: ppppx
+5-12 h: hbjhqhdwnqxhhsh
+6-8 p: ppgzpppw
+3-4 z: zzcz
+6-15 x: hfvxxsqbfxxlhpxtb
+4-7 m: qmxzhgt
+18-20 b: fvzbbrbcvskxrpkwnmwb
+1-11 c: ccccccccccggccc
+1-3 p: dppp
+2-6 j: fjbmljmdb
+2-4 l: slpmqpk
+3-5 b: stbpbbndtgzxlsnbdk
+6-11 h: hlzkdhhhrhchmhbhl
+1-4 w: wwpv
+10-12 p: pmpppkpppgph
+11-14 f: fbdxffpffffffkfffjvf
+4-9 v: vkvfhfvvrvvv
+16-17 t: tmtbztrptdlvttvkt
+2-6 w: wwwwphwwwwnwwj
+6-11 x: xxxxxxxxxxkxx
+9-10 t: ttftchttnd
+2-9 w: wkwwwwwwlww
+2-4 g: ggvcgggggggggg
+5-6 d: dldddsddddddd
+5-8 j: jddjjnld
+9-12 l: xldxlklvlkll
+2-3 w: xwnrwdwndlvl
+16-18 m: mmmmrmmmmmrvvmmvmm
+3-4 t: ctts
+11-12 b: ndgjdbppcdbhhssw
+2-11 s: nssksssnssxvq
+2-5 g: qggwcvf
+10-14 l: llxlllrjlmlllwllll
+8-9 w: wwwwfpwtvtjwjw
+8-10 m: mmmmmmmmmmm
+1-11 z: rldjzzzpzzs
+16-17 v: qvsrnvvvwxgmvjjcvhcx
+14-18 k: kkkkkkkkkkkkkkkkklk
+2-3 q: qqrqqqxqqqq
+4-9 c: lclckhcgn
+2-3 b: nbbbbldlbbb
+15-18 v: vtvvrvxvvnvxhvnvvv
+4-7 q: qqqnqqqq
+3-13 j: svjjdcnkwnbpl
+4-11 q: blnqvqsngwj
+3-4 j: dxdkj
+5-7 c: dzxbsctqwclcgc
+3-4 f: jfhffff
+3-5 t: sttwk
+7-8 t: tnqtvsztqwpvtftknt
+1-12 r: grrrrrrrrrrrrrrr
+7-8 k: kkkkkkqkk
+3-4 l: llls
+1-14 h: khhhjhhhhhhhhh
+3-5 d: ttcdddd
+1-7 w: dqwhwkww
+4-5 p: pppqppppp
+10-14 l: lqlltwlllllllzjk
+15-17 d: ddddddddddddddddcdd
+1-8 z: xpbbjxrzlzznxlz
+1-2 v: vrvv
+7-11 l: llllllclllslll
+3-14 h: hhvhhhhhhhhhhhh
+6-7 m: mmgpbjmgqmm
+9-13 h: hhhhhhhhhhhhfnhhhhwh
+12-17 c: cccpfcccccnccccqscc
+6-12 x: kqfxbhxbdxxxl
+6-8 z: zqkbtzzb
+6-8 l: llllllllllllll
+6-13 d: wdzdxdddddlzdtbd
+3-8 h: gzcknrxkjgtggnqwqjs
+1-6 t: tttttvtt
+5-8 x: fjxnxrtn
+6-9 z: zzzzzzzzszzz
+2-4 v: vpvvtv
+1-7 w: wcwrxgf
+2-3 t: vxftld
+1-2 n: nnxmntsqzk
+5-11 l: nmvllllnlckl
+7-13 c: cwchccjcrfsccc
+2-3 z: dzdz
+7-8 s: sddgbhws
+3-11 w: qqsqrgmwwmwgfdhpsct
+16-17 q: qqqqzqqqqqqqqqqqh
+7-15 h: thqthdphmbhhjphhh
+6-10 k: gcflljjwkk
+9-17 f: ffffffffffffffffdf
+10-12 q: qqqqbqlpqqfdqq
+3-16 x: dbxmwtlqdmvldxlgxdhk
+1-2 x: xxjxh
+10-11 p: ppqpppkpptp
+3-5 w: wwwwwwwww
+10-11 j: xjmhqgdznjf
+9-11 n: dxnnnnnnnnmnnn
+1-5 l: mlllvllwlrblllll
+14-16 q: tqqqqqqwqqqqqmqqqqq
+2-3 b: nvbbbcf
+5-8 x: xmkxxgxq
+1-4 x: xxxfx
+1-6 n: nnnrnm
+9-17 p: pppppppppppppppppp
+2-4 d: ddqd
+13-14 p: fmpkxpprppppzhpp
+5-6 t: tttttgrttt
+10-12 r: rrrrrrrrrlrrrrrrrr
+4-7 h: gnmqvqrhwhh
+4-5 m: smsmmmm
+4-5 q: qgzqb
+6-12 c: rdnnsccnrjkcnm
+4-16 k: gfkxktpwhxzkgcdnb
+4-5 f: ffgvf
+6-13 n: nfslcrnkksfmnmvcfnnz
+15-18 s: sssqsssssmshmsmsss
+1-15 v: vvvvwvvxvvvcvvwvvvvv
+2-8 h: gphlnhph
+4-13 t: vtjvrcxqwbsrk
+2-10 t: tvttftzttttqttt
+12-13 t: dvsbstlkfpztdqs
+7-8 w: rvwncwww
+13-16 v: vlqzjlvxljrvvjvvzp
+12-13 w: wwwwwwwwnwdwwgwwwx
+14-15 d: dcpdddddddddddmdbd
+1-3 b: bbdbbbb
+11-12 t: rkdtncbtkktzmvtghb
+3-7 n: nzbfgbnnx
+5-13 v: vsvbkvvvvvvvv
+3-8 n: nltdrmbn
+14-15 p: mzkmmqdfpcptzbzc
+4-6 q: qtqkgqfmqwm
+9-10 v: vvdvvxvvxvwd
+5-7 m: mmmmmmkm
+6-7 k: kkkkkgkk
+8-9 h: shhhhhhhh
+8-11 p: pppppppppczplbwcpb
+11-17 k: kkkkkkkkkkkkkktkc
+9-17 w: mwtfbvsfnhwxqqvxw
+8-12 j: jhjjjjjrkjnjjjjjjjj
+3-5 g: sgfgqgg
+12-14 j: jjjjjjjjjjjjjjjjjjjj
+1-11 f: jsffffzfffffxffftf
+16-17 f: fffffffffftfffffff
+2-4 k: klkwkk
+5-8 g: gtjngzkhgb
+4-7 b: bbbmbbbb
+4-5 w: wwwdw
+5-15 g: tplhhgmggbhggrllqg
+9-13 v: jvvbqvsbvzhxvh
+1-3 d: ddsddn
+2-5 w: cfwds
+7-11 x: xxxxjxvvxvxhxvml
+5-6 v: jwqxvb
+3-15 s: ssqsssssssssssss
+5-9 d: dddddddddddddddd
+5-8 l: vklnlclj
+10-13 s: sltdlfbssxsss
+11-18 j: hxjxjnjcpmkppnpjpjk
+4-6 t: ttbzhvt
+2-17 v: rzmhrssrjvpncwqwl
+2-4 x: mtcxz
+11-12 d: dddddddwddbd
+2-13 h: whgpdxvkfxrhg
+5-7 d: ddddddxdtddddddhdddq
+4-8 b: lhcfbkbbdmb
+8-15 l: lvtmkgwllqttgplbgjj
+3-5 n: nqngjvw
+12-19 m: mmmmmmmmmmmmmmmmmmgm
+5-9 g: grhgsdcwgmdt
+6-9 j: msgrcrfvzksfxxjq
+6-10 s: xdssssssssssssssg
+8-9 h: hhhnhhnfhh
+12-15 f: fffffffffffffffwfff
+3-7 p: pzzpbjkfcczbmnpkf
+6-7 r: cnjlbhr
+2-5 f: dwxcftrbljgstf
+5-11 h: hhhhjhhhhhqh
+16-18 r: rrrrrrrrrrrrrrrrrmrr
+2-4 r: rxmrd
+7-9 c: ccccczccccc
+7-13 d: ddddddddddddfd
+3-11 k: mmkspkltjwm
+8-11 c: rvccccgtclc
+1-3 v: vvhhv
+4-7 t: jttnttgx
+4-16 n: nnnjnfnnnnnnnnnnnn
+5-6 m: mmmdmqmm
+9-10 x: xxxxxxxkxrx
+2-4 m: tmcmzjmvtcghlgm
+6-7 q: lqqjqqnzqqmq
+16-19 k: kjwkhkkjhkskskpnkfk
+19-20 b: pbbpsbnbbmnntbnbbbbn
+4-5 p: ppppmp
+3-4 d: grlqndd
+4-7 n: nnnnnnsn
+9-12 k: kkkkkkkkfkkkkk
+4-10 h: hfhhhxhfhd
+4-9 t: ttttxbbbcdmxsrhjj
+4-11 l: npxwbsmklbls
+17-20 d: dddddwdhdkddjdddtfdd
+3-4 s: nldssq
+4-8 s: sssdsssgs
+5-16 t: ttttprtcttttttzt
+9-17 j: tjjtjjjjgljjjcjjfj
+7-8 b: bbbbtbkbb
+2-13 l: szllllllllxllll
+8-11 n: bmpnwrnngnmsfw
+1-5 d: jddqtdwddxddjd
+10-11 s: hqgnvslssstqdnvs
+14-16 p: ppppppppvpplpgpp
+2-8 h: khhjfcqp
+6-7 d: fxdpdwvdjkd
+5-7 n: bnnprnf
+9-13 f: vfffwfffffffkfxff
+2-10 j: vjhcggzrjqt
+5-7 g: gggfggzwgg
+5-6 d: ddbsjddfsdnddxfpgdd
+12-13 g: gggqjgxgzpgsggxggxk
+1-8 l: hlslllllll
+12-13 f: sbfftpvbjsmff
+6-7 s: hqcthsb
+5-11 s: qsstnssssqsrsskdss
+2-6 x: hxrfnjfclx
+1-2 w: swwwwwwwwwwwjwmwwwww
+7-12 s: whsbkgsmvnfjnnkq
+10-12 l: fllllllllsllll
+8-9 s: lsssssssqs
+1-7 p: pdpppghqppxpppppp
+1-3 x: jhxmjhkdrxgd
+1-7 b: lbxbbbvbwbbbbt
+4-5 c: cdckcbcmqcc
+5-9 k: kkmklhlmkkgkrld
+12-18 x: dvjxqxxxxxdxxxzxhp
+5-8 h: nhfhnfqx
+15-16 k: kkkkktrkkkkkpkhqxkkd
+1-13 j: dcnbwjxllpksj
+11-13 v: wvqhznrrfgmnvz
+2-5 m: bpjbmbrmfh
+10-15 t: mgtttttqspthnttkktt
+9-10 n: nnpnnnnpnh
+8-10 b: bjbzhbbbcq
+4-12 n: nnnvnnnnnnnnnn
+13-14 v: zbkchmmvjvsgkvhcz
+2-9 j: jdqjgnnjjjvjt
+11-16 g: ggggxqglgglfhvgggn
+1-2 b: bsbm
+8-11 v: lvvvjhvmxvvvv
+5-7 x: xxsxxxpr
+2-15 t: stwqdkrqcwbmngtd
+5-8 r: rcrrvndr
+5-6 v: vvvvvr
+4-5 x: qpxxr
+1-2 k: nkkkkkd
+10-13 r: znlqhvwdvrqbrrrfzwc
+1-2 h: hwhhhchhhhhhhhhhhh
+3-6 b: bbbbbvbbbvbb
+13-14 s: ssssssssmssssdss
+7-11 x: cwxhmnhzxrxdrzzxbw
+5-16 m: rgjtmrqqmfmmckxm
+17-18 b: bbbbbbbbbbbbbbbbbk
+11-20 k: kppkqkftkgkkknbtglkb
+13-14 t: rtcfrkjvtgnrtf
+5-6 z: kdzjxzjgmd
+2-3 p: rxppj
+9-12 b: mtpbbbbbbbbgp
+8-9 b: rbbbbbsbbbbxb
+13-17 r: rxgbrrnrrrrrrkrrlrrr
+8-11 w: pzqswqwcfln
+3-4 x: xxxx
+6-9 j: fjhkjjklc
+6-7 m: ctmzmfm
+8-9 l: lllllllgllpts
+8-9 t: hgpwblqkvqtb
+4-7 d: dddpddd
+4-5 c: ccccwcccg
+1-7 q: lvvtpqqvnsqbzqpr
+8-15 q: qqqqqqqqqqpqqqlqqq
+4-8 f: frfffffffxf
+7-12 r: rrrrrrrrrrrkprrtrrrp
+14-15 j: jsjjjjjjjjjjjjl
+6-17 b: khgflbrbrjbgzjtjt
+5-7 j: jjknjpw
+2-9 h: rhlqbdklh
+5-7 j: lrtvccjbzgjh
+12-14 t: tltwtxtctttnttttft
+8-9 q: qqqqqqqqx
+4-15 p: ppppppppppppppc
+2-3 v: vvvvv
+5-7 h: djvplxb
+11-12 g: gjxlvggsgggxsgfgp
+5-6 g: gggggfg
+1-6 x: wxtxxxxxxxxxx
+1-4 r: rqrcrvrzbrxrwjr
+9-10 w: wwwmwwwwpww
+7-15 z: pzrbrxpzzzzzntzv
+4-5 q: qjqwqqnlqhclq
+12-16 g: ggccgzggggsggjgg
+11-13 b: phbmbsgkvszbbrbb
+2-3 l: xhlbhl
+1-7 q: qwdqmtv
+5-9 x: xxxxjxxxxx
+6-8 p: kvpwqbdp
+11-13 t: tqttttttttttmt
+9-16 l: wzdxdmlxlkfjknnz
+1-11 j: vjjjjjjjjjjj
+2-18 t: tsttttttttttttttthtt
+6-7 n: fnnncnl
+3-5 s: lssvgfssgsshsvstsss
+3-5 h: hhhbhhh
+4-10 x: tsxxxxxxbls
+2-4 n: nnjw
+17-18 p: bptpftnxjchrwthtppk
+14-15 d: dddddddddddddddd
+10-14 m: mmmwnmmgmdmmmmmmmmm
+8-9 k: pkpqffpkktbgkbk
+7-11 l: lllllllllqplllllllll
+11-15 n: nnnzngknbnzdnsnnn
+2-4 l: vbqm
+10-11 w: wwwwwwwwwwq
+3-5 x: xxtxxxxx
+3-15 b: spbcxjlbbbrbbbbb
+4-5 n: nvfsn
+13-16 n: bppjnncnbgjndnnntwgs
+1-8 t: mttttttttt
+6-9 d: jvmssdkdhxsd
+9-10 d: gdrllcfdnd
+7-11 c: cscxccccnztccccz
+15-16 p: pppppkphpppppspg
+2-4 n: vnkjlwwsswscmxktnj
+9-11 r: rrrrrkrzslr
+7-10 t: tttgqtnttttttttt
+4-10 b: bbrzbzpbsbnbbjnbsb
+7-8 j: jlljxtsj
+5-15 z: lzzzfqzzzzzqzzzzzz
+10-11 r: rrrrrrrrrrcrrrr
+6-8 t: tztpbttttt
+2-9 c: vcgtfxfbr
+9-16 r: vgjrwcxhrrhbzxnj
+17-18 r: bczjtmjwrtzwvmgbrl
+5-6 d: dqgddvd
+1-2 r: krzrkr
+8-9 j: rxjjjjgbj
+8-9 c: cjccccccc
+13-14 b: bbbbgbbbbbbbbvb
+5-6 p: hbhwtp
+1-2 w: wfhrfsfbjtpkqcjrwdb
+10-13 q: qqqqqqqnqrqqzqq
+3-4 m: xcmcz
+11-15 d: dldddcddddjddqd
+4-10 h: khhlhhhhhhhhhhhh
+2-4 d: bdfpmxzqzbzmxmmwg
+4-5 l: lgrbl
+9-13 s: ssssssssfsssss
+7-8 p: pplkpmkppppppxp
+3-8 j: jjjjjjjj
+7-8 f: jfffffhzfff
+2-5 p: pppppppp
+8-9 l: tlclllmlz
+4-5 m: mtrmx
+13-16 x: xxxxsxmxxxxvwxxw
+5-8 n: jknnngnv
+4-7 p: ppptppgpppp
+12-15 r: rrrrrrrrrrrxrrrhr
+2-9 s: sssssssssss
+5-6 z: zphzzr
+13-17 m: mmlmmsmzmsddbxmkb
+5-7 g: gggggggg
+8-9 f: ndzfvfkfz
+2-10 g: wtngwdkcxgrth
+6-13 r: rrqrrqrrqrrrcrrrr
+1-6 z: hfzzzz
+10-13 j: jjjjjjjjjjjjdj
+5-11 m: wfqvmhbjhhnmzdlmpjc
+6-8 d: clddzxcdghn
+8-12 n: qfqbbvkpjbznrz
+3-6 r: rrbrrrrrrx
+9-10 r: rrrrrrrrrrr
+4-5 m: chltmcm
+7-8 r: rrrnprrzrhr
+3-4 j: jfcj
+16-17 n: nnnnnnnnnnnnnnnnwnnn
+7-8 r: rrrrrrnfr
+4-12 n: nnnnspnlcnmsnnnn
+11-12 v: vvvvvvfvvvhvvv
+2-8 h: hlhhkhhchhhghh
+4-5 t: stntztttmp
+3-5 v: vvvmbvhvvvlvn
+9-14 x: srxmtbtgxgmqxxxc
+4-5 z: zrlgz
+10-11 p: phxkvklpmdp
+8-15 m: mmmmmmmpmmmmmmm
+1-13 h: mzwqkhhhphsgh
+17-19 s: qssssmssgfmssmmpssk
+6-8 b: bbbbbbbjbb
+3-4 l: rllr
+2-4 j: kvjj
+2-5 n: lnnkrm
+15-16 w: wwwkwwwwwwwwwwwc
+1-3 c: ccncc
+2-5 s: bhppmsttzcscss
+1-4 t: tttxtttt
+1-9 r: rfrrrbhtxrrbrmrmr
+12-13 s: qplrssssmfswrsswss
+2-4 h: zrhhhhzhzhch
+1-5 g: rgjgg
+11-14 t: ttttvftttttqlsttt
+3-4 s: sskss
+5-15 m: mmmmnmmmmmvmmmm
+1-8 j: sjjjjjjj
+1-4 c: ccclcc
+5-7 d: ddddhdd
+2-8 z: tczzjzzzzzzzgz
+1-5 s: qsqdz
+8-11 z: zhzpzrvzhzkzzgm
+5-9 g: nvdfgshgbgltlqggbp
+1-12 r: rrrrrrrrrrrrr
+3-4 m: xmmb
+8-10 j: jjjjdjmjshqjzk
+2-4 t: tptttftt
+4-13 t: ggqscfggftnxgjpn
+4-12 q: hvzjzqsqwqjlqx
+7-8 q: qqqlqqqkqq
+9-10 f: ffffffffdfff
+2-7 k: kgkkkkkk
+7-11 t: xbpdkrtplmfbtkwgp
+4-7 c: ccccccccc
+12-14 d: dddddddddddqdddddd
+6-7 k: xhnntkpnbkfwlr
+3-5 q: qqxxq
+13-17 d: ddddddddddddvddddd
+2-3 g: smglpgpflsrbwxcjctb
+5-9 z: zjzzznfzf
+7-13 l: lmrkvvxtltcnj
+15-16 r: vjrrrkzxrrrqrtrpzv
+2-7 x: xsxxxxxx
+7-14 m: npmnmgdvnqmgrmm
+2-4 x: pxxl
+7-15 k: nkkkckgwdkffkmb
+7-11 n: dznnmcnssmcn
+8-10 s: skssgswssmsss
+14-16 n: nnnnnnnncdnjnnhwnnn
+4-7 g: kggmgggbggggwggcqgng
+4-7 g: gggqggggg
+1-2 c: cccc
+4-8 j: mzzvwjgrbrv
+11-12 x: pksjnwlltskxlj
+1-9 k: zfkkkksrkkkkkkz
+1-6 k: xkkkkknkk
+1-6 c: gccccncbccccc
+14-15 h: hhhhhrhhgkhhhmhh
+7-8 f: qffgnfhf
+2-6 m: vmqwxzgsm
+5-8 k: kkzjkwkvk
+3-4 s: dcsss
+2-4 p: jjbps
+2-11 z: zjzzzzzzzzzz
+4-7 f: bnkhvjfff
+13-16 m: mmmmmmmmmmmmjmmmmmm
+5-10 t: kdwjmcgtvtdttmtvw
+3-12 j: jjljwjfjjjjjnhjjjjc
+13-14 f: fffffflffxfffbf
+2-6 m: zmhmsm
+4-18 n: nnnvnnnnnhnnnfnnnhnn
+3-6 n: xznnsnn
+7-11 g: ggggpgggggggsg
+6-8 l: llllltllll
+4-5 s: ssnttsrs
+6-14 w: wwwwwwwwwwwpwlwwww
+9-12 q: pxqvswnqqbsqvgsd
+1-4 j: mjjjjz
+9-19 f: fffffffflfffffffffff
+2-6 t: rttqtstct
+6-9 d: dddddtddddd
+7-12 l: lllllllllllllll
+1-12 p: gppppppplpppppp
+1-4 s: fslssssssfcd
+6-7 v: wvvzffggdfvbvvv
+2-7 t: kkwgspt
+6-16 n: nncbnnnntwrxlzzwdrsj
+3-4 z: zzszzhrqwngprjt
+4-5 v: vkvvvcfjc
+4-5 j: hcjtj
+2-4 k: kqkkkkkkkksk
+7-9 g: gzgmgpgkv
+5-9 s: kjnwsrjrzssssdlnsqs
+2-8 j: jtjxxgmjkjx
+5-12 r: bfrcrtjkzqffsjtvwj
+1-2 v: xvvvmvvvv
+5-9 v: vzrgdldfvx
+3-5 m: mqsfmmlmvdfj
+12-15 v: wswvvbqqhlvqvwx
+6-7 b: bbmjdhb
+2-4 b: hbjmjr
+6-7 n: pnnnnln
+13-15 z: zzlgzpmztfzqzzl
+5-6 c: pcppscccccc
+6-7 z: zzzzzzz
+6-14 l: lllllllllllllqllqlll
+13-16 r: rrrrrwrrrrrrhrrr
+11-12 r: rrrrhrvhqmqrwr
+15-19 w: wwwwwwwwwwwwwwwwwwdw
+3-6 w: wwqxkw
+17-18 z: zzzzzzzzszzzzzzczvz
+3-4 g: lgxx
+4-5 x: nsdxdskjxtrz
+11-12 w: wvdgqppfwwdf
+2-3 w: qgrz
+7-8 w: wwrppwfwwrcwr
+2-6 n: gtspnngz
+3-7 j: jjpjjjzjjjjj
+1-2 l: pllblvgmfjvv
+15-18 r: rrlgctrrrcrqqgldpr
+3-6 v: vvvvvt
+2-10 s: vslltcxpbg
+5-8 j: blvzjtjnfmjnjtsrzmc
+9-13 b: bbbbbbbbbbbbsb
+3-4 w: wwfjw
+6-7 x: xxxxxxmx
+7-15 g: ggggggrgggggggfggg
+16-18 f: zffffffffffffffwfff
+3-4 q: qcqn
+3-4 k: kvzqk
+4-18 z: wpclkbsxwbmbmkdpzzcm
+1-8 z: zkzzzzzgzzzzz
+7-16 x: xxxxxxxxxxxxxxjkxxx
+3-6 t: xwcjztz
+8-9 r: rdrprrtrs
+1-7 v: dvvvvvcvvd
+6-8 t: tttttkttt
+1-5 w: xzwww
+6-7 c: ctdjbwcc
+3-4 t: ttnttt
+9-10 q: qmcqqqsqqqvqqq
+11-12 d: dpftdmdmdmld
+7-8 j: tbjmbjlj
+3-6 t: tttttqtt
+6-8 t: tdttthbnqt
+2-5 q: qqqqp
+1-3 t: ttht
+13-17 n: nnnnnnnnnnnnnnnndnn
+4-6 j: ftkvjj
+5-10 c: hvccfcsccb
+7-11 v: vmqvqnnnvzglvvvv
+5-8 k: kkkkkksckkk
+1-12 z: rzzzzzzzzzzzzzzzvzz
+17-18 t: tttttmtttmttttttpttt
+16-17 z: xljjnngmjmhprcqzw
+4-11 d: dtddbpddlhn
+17-18 t: tptttttttttttttttbtt
+9-12 w: wwwwwwwwwwwcw
+3-4 z: zdzj
+1-8 q: qlqqkqqhqtqhxqbbwcp
+6-8 r: rkrrlrrmzrcnnrk
+13-17 b: dbsbbbbbbbsbmkbbb
+5-16 q: gqnvqwwgqshmtrdbplfb
+7-9 c: mcvccccczc
+10-11 p: pppxppppppc
+1-6 v: vvvvvmvvvvv
+5-6 s: ssssks
+6-14 r: prgrbvrjrgrkrrr
+2-11 c: qbnxcvxgldcvdd
+11-15 d: ddddddddddsddddd
+13-14 w: rwwwwwwwwwwwwsw
+12-15 t: ttttttttttttttt
+5-8 g: skjgxsjpgvsgr
+5-11 g: ggddglggxgqgg
+2-4 c: cccc
+2-3 h: rvdg
+9-13 r: rrrrrrrrsrrrjrrr
+2-7 f: dflmgzsdftgkgc
+1-5 f: jffffffnfcff
+3-4 c: cccrqc
+2-7 m: kblcghm
+3-4 r: rscrnbbpfkr
+2-3 d: wdtqpd
+5-6 q: qqqpqnqq
+13-15 d: ddddsdddddddddjd
+3-4 c: cmcw
+2-7 q: qqqqqqjqqqqbqfqq
+11-14 x: txxxxpxdxxkxqcv
+10-11 b: bbbbbbbbbkbb
+7-11 p: ppppppppppmpv
+5-6 r: dnxrcvrrr
+1-4 d: rdddddd
+5-9 f: lxgfvffdf
+8-16 k: vmfksjkwkrkkkhkkvknk
+15-16 v: vvvvvqvvvvvvvvgv
+2-5 p: xpctr
+11-15 w: wfwwwwwkwwwwwpr
+11-13 x: xxxxxxxlxrfxxs
+18-19 b: bbbbbbbbbbqbbbbbbbb
+2-4 l: fgwl
+8-11 m: xmjnmmmmnmh
+4-6 g: lgvpksgq
+5-7 t: jtgtvttjlfhpljtzzstd
+7-11 p: mjcgvcmxgqpntxkpb
+2-3 r: rrgrrnr
+6-7 r: rrrrrcr
+4-14 d: dddjdddddddddpdddd
+5-7 q: qqqqkqqqq
+1-4 t: qttqt
+4-10 f: hbfjbzrfgvffq
+16-17 j: wjjwjwpsjjdvfjnhv
+3-4 v: vvtwv
+5-6 s: ssdswspdss
+1-2 r: rnrrmskrr
+4-7 h: rqxbjjhsfh
+4-9 l: llllllllhl
+4-6 w: sgtwwmcpwd
+4-11 l: fjdllznlllmdnll
+4-5 k: kkklk
+4-6 s: sszrssssssss
+12-14 w: wwwwwwwwwwwvwww
+2-4 b: vnzb
+7-18 g: ggggggggggggggggggg
+1-13 s: srjdvvpqnrsnnkzfj
+14-15 g: bmhbclmqcgtqxgg
+8-12 g: gggfhxgglgzb
+3-5 c: scrkcshctccmhm
+7-12 q: qklqqqhqvxqqqqw
+1-6 m: mlmxzwkmm
+3-16 r: rswggrrrrczxfpjt
+14-16 l: llldlblllqllllns
+2-5 w: wwwwmw
+7-9 r: rrrhrprrr
+2-3 j: zjmdfcth
+3-8 w: xwgwwwwww
+1-5 l: plllllll
+2-4 b: fbqp
+2-3 p: jwpmp
+3-4 c: kscm
+2-5 b: mbpbnfkvh
+4-15 m: qrswmmmgmvmfqtmrrn
+12-15 r: rxrrrrrdrhpfrrrrcrrr
+10-13 j: jjljjjjjjnjjjjj
+8-20 w: gjccptmwtrwxjtskrdfp
+11-14 j: jjjjjxjjjjgjjk
+1-4 g: gggzzgg
+4-8 q: wqqqqblsmsk
+1-11 h: lhhhfhhhhbvhhtjwrbh
+4-8 x: xlxqxxtxxxxx
+13-14 x: xxxxsxxxxxxxqxxx
+12-16 b: bxvbbbqbbbbfzbblb
+1-4 j: jzbd
+5-6 q: qqqqwqkkqqq
+2-5 x: xxxxgx
+8-10 n: nnnnnnnnnhn
+5-10 m: mmmmrmmmmmmmm
+2-3 c: qwcz
+3-5 n: cckvz
+18-19 q: qqqqqqlqtqqqqqqqjqv
+5-13 k: kkpkkkkkkkkklkkk
+5-10 q: jfjgqllmqzv
+15-17 l: llllllllllllllhll
+4-10 b: pgqbfrsnvbhzfmtbtw
+1-4 c: mccc
+6-16 f: fffffpfffffffcfffff
+4-9 j: qjbjlcsgljtbvv
+11-12 z: dstqbtxxvdchsg
+3-8 d: jvdpnvqs
+2-3 n: nfvnnnn
+6-12 r: zdbfdrvtmpkrjkr
+1-15 k: kbdckwtkfhvrbjk
+6-8 v: fvhsvgcv
+2-3 p: ppkppp
+2-14 r: drclhnrdhtcbmnr
+7-10 p: vchpmlpjfxbfnwsdxjr
+1-3 v: lvvv
+1-3 b: bbjbb
+2-12 q: qmxbbbgqlscqvdtpq
+7-9 l: lllllkllqlllclll
+16-17 r: hrrrrrrrrrrrrrrrr
+8-9 g: gggggggfg
+6-8 v: zvqffmkv
+9-12 t: tttttznttjtfrtsjxtd
+5-12 q: bqhbltqnjlhqqhtkq
+8-9 d: ddddddddkd
+2-8 q: tvpqmrrq
+13-16 q: qqqgmqqqqqsqmqqpqqqs
+7-9 p: pppppplppp
+4-6 h: hhxhlhhhxhp
+6-8 g: gggggdggggg
+4-5 j: jjjkjj
+4-5 x: xxxfg
+2-13 x: xxhrhxwbrgrdskghtkj
+12-19 x: cxxxxxxxxxxhxxxxxxx
+1-4 m: tmmmm
+5-11 x: mgqnkjxxscxdxr
+3-4 t: tttctt
+4-13 b: bfkbfbbwbcbpvcbkdqww
+5-7 d: dwddddqd
+4-15 l: lvvlfclwbssvsdl
+9-14 d: ndkfnddtdddfjpvdqt
+8-9 s: ssssssssk
+9-13 l: dlljknlsllbslhlml
+4-5 n: lnnwn
+8-12 v: rlvbqlwvfhvv
+6-7 f: rcpfwfvffqfcpf
+10-11 g: rnqgxbtnxqfzgggtn
+8-11 d: ntdzzddkbdhcdddrgdld
+5-6 s: xkmssxscvbpwj
+1-3 r: rrmr
+9-14 p: pvppppppppppppppp
+11-15 t: vhftnbtmwpgbcvt
+2-7 t: pmbwnrj
+10-11 c: cccccccdcvcc
+9-14 s: ssksssssssssslsss
+2-5 t: ctrtqpn
+4-6 t: mttjftttt
+4-5 z: zfbzz
+2-3 x: xwxlwstzmvvt
+4-5 b: vbsbjwpbsbbb
+3-4 x: cwxxlmdf
+5-6 z: zzzqszzzzzz
+1-4 c: ncczc
+3-6 k: kkkkkkk
+2-3 z: rjzkpxxdvzlzxjzz
+8-10 z: fzjzszzdnzbzkzzfz
+1-9 c: ccccxccjpccccc
+3-12 j: jjjjjjjjjjjcj
+10-14 l: llplllvbllllsp
+8-12 r: hnrcrxfzrkcjcprrzjbr
+17-20 q: qqkqqqqqqqqqqqqbqqqh
+6-9 l: lllljlrlpxllllll
+8-9 v: vzzmtwfgv
+3-7 v: fqdbsshw
+12-13 f: fwffnjfbfffzzqfxfffx
+1-3 m: zjmdvjjg
+5-7 r: nrswrlbw
+8-11 c: crzfvzpcbcbchgxbln
+9-17 g: ggggggzgwwjpggpgvgrk
+6-9 k: hhkrvkkqfhqwbdb
+10-16 q: mzzjqfmtkqwvgdfttj
+11-13 m: mmmmmmmmmmtmm
+1-2 j: jjhrrj
+3-12 h: hhhhhhhhhhhhh
+8-11 w: zwkrwznrppw
+7-14 d: dpxjnddbvdbcllqr
+5-8 c: ccccfcccccc
+12-16 p: tnptbppgwxxpppjb
+1-14 t: qktttttttttttttt
+9-12 t: tttttcttgjtt
+3-5 p: tcpdgwhrkxkzjjhvsgqp
+13-14 k: kkkkkkkkkkkkklk
+11-13 x: xxxxxxsxxxxxt
+5-12 n: nxxnnznnnnmlnnn
+12-14 h: hhlhhhhhhhzcnnhhhhkh
+8-10 j: jbjbjmjvjj
+6-9 c: ccccccccsc
+5-12 j: jjjjjjjjjjjcj
+1-2 f: fhffff
+13-17 x: xnlxxxxsxxxxxxxxp
+2-5 d: sddzn
+2-4 q: qqqt
+2-6 p: fmxfxnkp
+9-11 k: nkdgncqkkgwjp
+2-5 p: hpmgcfcmz
+1-3 f: ffczf
+5-9 r: rtrrprrrrrr
+2-4 p: pnpprdn
+9-11 l: ltllbllvllc
+4-5 x: xxxmxxx
+5-9 x: xxxxxxxxxx
+16-20 b: hgcbhbbhbgbbdxhdgjwb
+10-15 c: qcccpcccdcccccfccwcf
+10-11 x: xndsgkwqpxb
+15-17 f: wwbqxrffgfvffdmdffw
+5-6 q: qqqhqvqqqq
+3-4 h: hhhchc
+7-9 x: xxxxxxxxgx
+7-8 f: fmfflfgf
+12-13 v: vvvvvvvvvvvcvvvv
+3-7 g: gggbggsgg
+1-5 w: wpswsggtw
+3-5 h: hhhhkhhhhhdhw
+6-7 w: wwwwwmwwwww
+5-11 m: mfdmcwmlvpmfc
+14-15 j: jjjjjjjjjjjjjjrjj
+3-5 v: rvtvkdvqv
+3-6 p: frppxpdpg
+3-5 t: ttttrt
+2-7 x: xxwxxkfxxxxxxxxxxgxr
+6-8 k: kkkkkpkgkkkk
+10-11 f: fffffpfffkfdf
+11-12 g: gggghgnggflg
+1-7 x: xxnxxxxkxx
+3-4 h: rhhx
+6-8 r: bcwrrrrrhrxmqgrhrzm
+2-6 l: mpdlnnp
+2-4 j: jbjjdhx
+2-15 d: dfdddddddnddddfzddjd
+5-12 h: gbngwvffshph
+1-2 t: txcpth
+14-15 f: ffffkfflfffffgf
+8-9 b: bbbbbbpbj
+5-6 f: zffhfz
+8-15 j: qjjfrtjllqfjjcj
+3-5 l: llxllll
+10-15 z: tpdzhnzkzrtzrzzzrfrz
+3-5 q: qqlqq
+3-4 d: vmzddpm
+8-11 c: cmvzlxtqxcvckxqm
+2-13 r: drpppdsqsmvnlkjb
+7-9 w: wwwwwwkww
+3-6 s: svfspfnpzq
+3-4 b: fqpbbbbzpgqf
+2-4 s: smssm
+8-9 q: qqqqqlqbq
+4-7 s: stcssbw
+15-16 k: kkkkkkkkkkkkkkkk
+10-13 x: xxsxxzxzxxsxphxxxxx
+4-5 p: drpsx
+7-11 v: vvvvvvvvvvvvv
+14-15 n: nnnnnnnnnpnnnbnn
+5-8 k: blgkkkkc
+12-16 g: ggggggggggvggggggg
+1-8 c: cccccccdc
+3-9 p: ppqppppppp
+7-9 q: cxqqqbhqqzhjqv
+1-12 m: mrkvwmmsjmkmw
+2-4 s: xrrj
+2-4 w: mbww
+7-14 v: vvvvvvvvvvvvvbv
+3-8 p: kppjprpxppb
+4-10 n: znncndnnjncnrnkn
+5-7 k: kktnkks
+10-13 r: rrrrrrrrrrrrnr
+1-6 k: kkkkkrvk
+3-5 k: jhjzkbqsjwkxsvd
+5-8 p: pcqpprckrp
+2-5 f: fsjwf
+6-9 l: jxhtplclr
+4-13 x: gdxdcdmmxlfxxs
+2-10 v: vvvrvvvvvhvvvvvvvv
+11-12 v: wqnwrlvjsxvs
+1-4 m: mfqm
+3-5 d: bmddv
+8-10 h: hbhhdhfchh
+4-5 s: sssdb
+2-3 l: lsll
+10-11 k: kkkkdcpnkkgkk
+6-8 r: vrrrrxrrrrr
+3-4 s: gxsbfr
+17-18 p: ptppppppbbpbprpcqpp
+16-17 s: gpgwvvnjbdqpksnsd
+5-10 f: gfkfzqflfzffvf
+6-18 m: kxxfrxjmwmltdvxwmmb
+5-6 d: ddntbd
+11-15 b: bbbrbhbgbbltbbhb
+6-7 r: krbrrrp
+5-6 q: qqqqqkqqqqq
+3-6 k: kfkmjt
+8-10 d: drbwtrdshdbg
+13-15 n: tqnprfnndhplcjn
+2-4 w: wjwg
+10-11 p: xprpnpvhppp
+9-10 r: rrrrrrrrqrrr
+2-8 w: wjwnwhwwwwwww
+12-13 g: gggggggggggwggg
+1-6 s: sssssss
+1-9 k: xkkkkkkkkkkkkkv
+2-4 c: ccccc
+3-7 s: ftssfrm
+12-13 k: kkkkkkkkbkksk
+9-16 q: qqqmqbbqhzqwtlwqb
+7-9 p: ppppppppdppp
+4-6 b: pcvbvkhb
+9-10 g: qmchkfggmgpqgxxgxq
+2-9 t: sthtnttthtlsq
+3-4 x: xxxx
+8-14 s: ssssssssdssssssss
+1-3 m: gmbmvbmqbxvm
+10-15 s: sgwkdvnsswsszwrn
+3-4 s: gmgs
+5-11 f: fffffffffffffffff
+7-9 v: vvfvsvzdhvv
+4-8 l: lllllllpllllllllll
+11-16 x: xxxplxxxxxpxxxxxxxxx
+9-13 t: tdtftttjdtttc
+9-13 g: rknsckngkvdxg
+3-4 d: sdqwddmr
+1-3 l: lljl
+7-17 r: trhrpmrqswrmnrbrrhb
+7-8 g: ghkxwgttgk
+5-7 b: fbnbtbndb
+6-7 v: vnxlvgv
+1-6 t: txtkttg
+2-13 n: ljnnnnlpsnscfnnnnnnf
+4-11 b: bbbbbbbbbbfb
+6-9 x: wxdkxxnnnx
+2-4 w: wswww
+5-13 j: jjsjjjjjjjjjkjjjj
+1-4 f: fszhf
+5-9 z: wzgfpzzzzjszfvfpwz
+5-9 x: xxxxhxxxsx
+15-17 b: bbbbbbbbbbbbbbkbqb
+2-7 x: xvdmgxxwgxx
+3-4 q: qqqq
+6-7 m: mqmlltc
+8-10 k: kkkfkhkkkpkkkk
+2-6 n: cnxnts
+1-6 s: gsssssssssscssss
+1-9 n: bbvkmnkdn
+2-5 p: nmlhpv
+4-6 g: vnggdpgm
+7-12 b: bbbbbbvwsbbbbbbbbbbx
+2-3 b: lgbjjr
+7-12 n: chqccgnwsznngz
+4-6 v: nntkvvv
+2-5 g: qkrjgkqgljh
+1-5 f: rffffsfzxfjfzffff
+15-16 z: zpzzzzzzzzzhzzkszz
+3-4 l: lmflkl
+7-8 f: fffvzxff
+2-4 r: rrrgrrrr
+12-14 w: tjwgwkkwwwwwwwwww
+2-12 m: mzmkmmmmmhmmcmmmrmf
+5-7 q: nfqbgqqqpqqgjq
+1-4 r: ktpr
+5-6 j: jjjgbj
+9-13 d: ddpbdddwbbdmd
+8-9 r: rphfrrrsrr
+10-12 f: fffffffffffbffpff
+5-12 b: xhbbcbbbbxtbbb
+9-10 j: jjjjjjjjqjjj
+3-4 q: qqqn
+3-9 r: srrtqqprjmqgnp
+2-3 c: gcqc
+3-4 c: bclc
+3-6 n: jnxhshghnnqncgncn
+2-4 h: ckhh
+9-12 t: tdjjqcdbtkbtmb
+11-13 x: cxxkxbxktxxxkxxxpxxh
+4-14 m: hjqmqjvqgjdjzsssdkm
+6-12 r: rrrrrlrrrrrrrr
+14-16 g: gngggggkfglzgggv
+9-13 h: hvhhdzhhmhhhh
+3-15 x: xxjxxxxxxxxxxxbxx
+10-12 z: zzzzzzzzzpzzz
+3-4 h: dnhv
+13-14 g: gggggggggggggg
+7-11 r: rrrrrrrrrrr
+6-9 x: czxxlsxxx
+3-5 h: hhchh
+1-9 j: jjjjjgdjjjjjjjf
+7-10 b: ctsbpxrvwbkbjklghnbn
+10-11 g: gggggggggglg
+1-7 x: xnpsxfm
+9-10 q: xxxzqbpdqj
+4-10 q: pqsqbqcvllfn
+11-12 x: xxxkxxxxxxgxxxx
+3-12 s: pstrsssntsssssbssj
+9-12 s: wnsdfrtssllsfbsssccb
+1-6 r: nrrrrmrc
+11-13 k: kkskkkbkkkzkkk
+4-5 h: hhhhshh
+5-19 f: ffffffffffffffffffcf
+3-4 z: zczzz
+5-8 l: ghlllsllfw
+3-9 g: ggpngglkkf
+7-9 b: xwbbbhhbmgjhbbbhnbb
+4-5 c: cjmgczcccpzqr
+15-16 j: jqfqsnnvffpjjjqj
+5-6 z: zzzztvws
+3-7 t: tftxtvfzs
+1-5 l: tlllll
+5-18 n: nnnngnnnnnnnnnnnnnn
+5-6 m: bchzqm
+9-10 p: lmpsbqgzpxggltl
+2-9 h: hqdpjwpxhg
+4-6 n: nqbnbnknnzd
+2-7 q: qbqqqvq
+7-8 c: cccccclc
+8-12 r: rrkrrrprvrcqnr
+14-15 j: jkpjjnjjjwjjjjjjhjwj
+7-9 s: stsstspsn
+8-11 h: hhhhbhhhhjhhhh
+5-6 d: dddtpdd
diff --git a/2020/inputs/day_3.txt b/2020/inputs/day_3.txt
new file mode 100644
index 0000000..0fe60b0
--- /dev/null
+++ b/2020/inputs/day_3.txt
@@ -0,0 +1,323 @@
+...........#..............##...
+...#....................#......
+.....####...........#.#..#.#...
+....##.#.......................
+.......#.##......#.###.........
+.#.....#.......##.......#.....#
+...........##....##.#....#.....
+......#.........#....#.........
+..###....#.........#....#.#....
+....#....#.#..#..#.........#.#.
+..........................#...#
+.##...........#...#.#.......#..
+#....##...#.#....#.............
+....#..##......##..#.#....#....
+#..........#.............#..#.#
+...#.####.....#..#.#.#..#...#..
+..........#......#........#..#.
+............#.....#..#..#....#.
+.................#...#.........
+..#...#...................#....
+..............##...#...........
+..........................#..#.
+#...#...#............#...#.....
+.................#..##.......#.
+............#....#.............
+.#......#.#...#....#...#.......
+.....#.....##..##.....#.......#
+.#..#..##...............#..#...
+#...#...##............#........
+.......#....#.......#..........
+...............................
+#................#...#.........
+...#...#..#..#.............##.#
+......#........#..............#
+...#.....##.#...#...#..........
+.........#..#........##.#...##.
+#.........##..#.......#........
+........##.#.#.................
+.#....#............###....#....
+...#.##....#.....##..#..#....#.
+....#..#........##..#...#..##..
+..........#............#.......
+.........#........##....#..##..
+#....#.........#.#.......#..#..
+...#....#......##.#............
+........#..#...............#...
+..............#.....#........#.
+......#..#.#........#..#..#.##.
+..#........###....#.#..........
+...#..#...#.#....##..#........#
+........#..#..............#....
+#.####.................#....##.
+.#................#............
+....#....#....#................
+#......#........##....#...#....
+......#..##..#..###...#.#.#....
+.#..........##.................
+...#...#....#...#.....#.....#..
+............#......##.........#
+..............##...............
+##....#....#...#...#....#..###.
+...................#.......##..
+#.....##........#....#.........
+...#.......#...........#.......
+...............##..............
+##.......#......#.....#........
+#....#..#..##..#.......#..#..#.
+.....#.............#.......#...
+......#..#........#.......#.#..
+..#...#...........#.##.........
+..#................####.#..#...
+......##....#.........#........
+..#..#.......#...##....#......#
+#.#..........#..............#.#
+.#.#..............#.##...#.....
+................#.....#.#......
+##.........#.........#.....#...
+....#.#.....................#..
+..#..#..#........#.......#.....
+.....#..#.#....#....#.....#....
+..####....#.#.........#........
+#..##...##..#.#............#..#
+.#........#..##.#.....#......##
+.##.##.....##....#.#...........
+....#..#.#..##............#.#..
+........#.#...#....#.........#.
+.....#.#.#.....#....#.....##...
+#...#..#....##..#..............
+..#...#....#...##..#.......#...
+.#....##.......................
+.........#............##.#..#..
+....#................#...#.#...
+...................#..#...#....
+#..#...................#.......
+..##..............#..........##
+...#.##......#.............#...
+.........#.#.........#.........
+...###......#.................#
+..........#....##..............
+.##..#....#.........#.#........
+.........#.......#.......#.#...
+#........#............#......#.
+....................#..........
+.......#...##..........#...#...
+....#.#.......#.#...##..#.#....
+...#..........#..............#.
+........##..............#......
+......#...##......#....##......
+....#.....#.#.##..............#
+...#...........#.#.............
+...........#......#.#..........
+...#.#......#......#...#...#...
+..#.......................#....
+...#...#..#..................#.
+##.....#.....#..#..#.....#...#.
+.#..#.......##.#.#.............
+......##.......##............#.
+.......#..#..#.......#....#.#..
+......#.....##..##...#........#
+.....#........#.##..........#..
+#....##............#........#..
+.....#..#...#............#...#.
+##.#....#........#.............
+.##...............##......#.#..
+###..#..#.......#.#..........#.
+.....#...........#...##........
+..#.#.#.........#.....#....#...
+.....#....##.......#..#.#......
+......#.....#...#..#...##..#...
+.....#....#................#...
+......#....#.#...##......##.#.#
+.....###.............#.........
+.................#......#####..
+.#.......#..........#.#....##..
+..#..#.......#.....#..#......##
+..........#.#.##.......##....#.
+##...#...##.##......#..###.....
+..#..#..#......#....#..........
+..#...#....#......#....#....#.#
+.#...#........#.....#......#..#
+#.........#......#.##.##.......
+#.##..#.............#.....#....
+....#.......#..#..##...##......
+...#.............#.#......#....
+#.....#..........##...##.....#.
+...............#........#....#.
+#.....#...#..#.............##..
+.#....##.#.......#.#..........#
+....#....#.#.....#....#......#.
+......#......#.................
+.#.#..#.#.#...#...#..#.##.#..##
+.............#.....#...........
+............#...#..#..#.....#..
+.#..........#.......#....#.....
+......#..###.#...#.............
+......#..........#.............
+....#.................#..#.#.#.
+...##.##.#....##.##............
+####......#........###......#..
+..#.......#.#..#.##............
+.....#.....#.#.......#.....#...
+.....#..........#.#............
+#.....#.............#......##..
+......##..........##....#......
+.#..............#..........#...
+......#..#...#........#..#....#
+.#......#.......#..#...........
+..#..#....#.#.......#....##..#.
+........#.#................#...
+#.......#.##.#......#...#.....#
+..#...#.#.....##...............
+..........#.....##.............
+.......#............#........#.
+...#............#......#......#
+.#..#.......#...#...#..#..#....
+#....#.#...#......#...#......#.
+.#.......#..#.#...........#....
+...##.#...#.......#..........#.
+.....#..............#..#...#...
+...........................#...
+.............#.....#...........
+....#.#..#..#...#..#...........
+.....#.#.#..#.#....#.#.#.......
+.......#..............#.....##.
+........#..#..#.#..#...#.#.....
+.....#.#...#.#.#.....#..#...#..
+.....#....#.......#......#.#...
+.#.#...........#........#......
+.##..##......#......#......#.#.
+.....#.###.#.......##.#..#.....
+#.......##..#.........#....#...
+.#.............#.........#.#.#.
+..........#..#..#....#....#....
+#....#...........##..#.....#..#
+......#....#...###..#...#......
+.....#....#........#....#..#...
+...##..............#.##...#....
+.#............#........##......
+..##........#.#...........#...#
+..#.#...##...#..#..........##..
+.................#.......#.....
+......#.....#............#.....
+.#.....#.........#.#..#.#......
+.............#.#.#..#.......#.#
+#......#.....#..##...#.......#.
+.......#.#..#...#.........#....
+...#..##...#.........#.#....#..
+........................#..#...
+....##..##................#....
+.......#..#.......#........##..
+.....#....#.##....#............
+.#....#............#.....#...#.
+..##.....#......#......#.#....#
+...#...........#...##....#.....
+......#.##.#..##...##.#.#..##..
+.......##....#......#....#.#...
+.....####..#............#..##..
+......##..##..##.........#...#.
+.#.#...............#.........#.
+......#......#...........#.....
+.....#.......##.....#..#.......
+.....##..#..#....#.#.......#...
+...........###.###.##..#.#..#..
+.#...............##.........#..
+......##..........#..#.....##.#
+.............#....#....#..##...
+.#..............#........#.....
+.#..#.........................#
+.##..............#..........#..
+..#..#.#.#.#......#............
+....#...#.#.#....#........#..#.
+.....#........#....#.....#.....
+.#...#.#......#..#........#.##.
+.......#.....#................#
+.#.#........................#..
+............#..#.......#.......
+....##.#........#...#.#.#.#.#..
+.....#.......##................
+...##...#....#.....#.#.........
+#...#..............#.......#...
+...#.#.#.#..##....##...........
+.....##...#....#.....#.........
+#......#.....#....#............
+....#..###....#.##.......#...#.
+..................##.#......#..
+.....##..............##.#....#.
+.........#...#........#..#....#
+.##..#.........#....#..##...#..
+#.#.##................#.##.....
+..#.#....#.#.......#....#......
+..#.#.##.#.......#.............
+..#....#.#..##.#..........#.#..
+#.....#.....#.....#.........#..
+#.......##.....#....##.....#...
+..#...#.........##.#..##.......
+..#.#.........#.......#........
+#.....#.....##.#.#..#...#..#.##
+.........................#.##..
+..#.#..#..#..#........#......#.
+..#..............#.............
+.....#.......##.##.....#.......
+....#...#...............#..#...
+....#......#.#........##.#..#.#
+....................#..#.......
+.....#.......#......#.##.......
+#.......##..........#.....#....
+.#.......#....#.#......#.......
+......#...#...............#.##.
+....##.#.....#.............#.##
+#..#................##...#.....
+....###......#.#.........#..#..
+...#...#......#...##....#...#.#
+..#...#.#.##.#.................
+.....##......#..#.#....#.......
+##.......#......#.#..#.#.......
+.#.#.#.........#...#.#..#......
+#...#.#........#....#.#.....#..
+....#.......##....#......##....
+.....#..........#......#....#..
+#...#....#...#.....#.#.........
+...#..##.....##....#.....#.#...
+..................#.....##.....
+.....#............#............
+...#.....#..#........#.#..##...
+.......#.#.....................
+......#...#.......#..#...#..#..
+.#..#...#.....##.....#.#.#....#
+....##...#.#............#..#..#
+...........#............#..#...
+.......#.....#................#
+..#......#.#.......#.#.........
+.....#..#.#.##.................
+.....#..#......................
+...#....#...#..#.#..#....#.....
+.#............#.....#..........
+#.##..#..#.......#......#.....#
+.#.........#....#....#.........
+...#.#.#........#.#....#...#...
+#........#..#..#..........#..#.
+.....#..#.....##......##..##.#.
+..............#.......#..#..#..
+....#........#.##.#...#........
+..#.#..#....#........##.....##.
+...##.....#...#.......#.#....#.
+#.....#..##.##.#...##.......#..
+.....#........#.#.#....#.......
+.#................#####..#.#...
+..........##..#..###....#......
+.....#.......#..........#..#...
+..#....#....................#..
+#.....#..#.....#...##.#.....#.#
+...#..##............#.....#....
+##.#..#.......##...............
+........##...#.#.....#......#..
+........#...#..................
+#......#................#.#....
+...........#...#..#.........#..
+...#.##..#.##..................
+.....#......###......#..#......
+..#.#.....#...#..#.##........#.
+....#..........#.#.....#.......
+..#..........#..........#.#....
+..#.##.......#......#..........
diff --git a/2020/inputs/day_4.txt b/2020/inputs/day_4.txt
new file mode 100644
index 0000000..b17cdcd
--- /dev/null
+++ b/2020/inputs/day_4.txt
@@ -0,0 +1,1023 @@
+ecl:#eef340 eyr:2023 hcl:#c0946f pid:244684338 iyr:2020 cid:57 byr:1969 hgt:152cm
+
+pid:303807545 cid:213 ecl:gry hcl:#fffffd
+eyr:2038 byr:1951
+hgt:171cm iyr:2011
+
+hcl:#c0946f byr:1933 eyr:2025 pid:517067213 hgt:173cm
+ecl:hzl
+iyr:2018
+
+pid:5253256652 byr:2009 hgt:152cm iyr:1989 eyr:1968 hcl:64cb63 ecl:hzl
+
+iyr:2013
+pid:862607211 eyr:2020
+hgt:174cm
+byr:1990
+ecl:blu hcl:#888785
+
+ecl:grn byr:1955
+pid:608098408 eyr:2027 iyr:2020 hcl:#b6652a cid:264
+hgt:181cm
+
+byr:1998 ecl:hzl eyr:2021
+hcl:#866857 hgt:189cm iyr:2030
+pid:013735467
+
+pid:075417314 hcl:#b6652a byr:1957
+iyr:2011
+hgt:154cm
+eyr:2025
+ecl:amb
+
+iyr:1993 hgt:74cm eyr:1960
+byr:2029
+hcl:293244 ecl:#3cb5e5 pid:4861232363
+
+hgt:153cm hcl:#6b5442 pid:065240897 byr:1932
+cid:196 ecl:blu eyr:2028 iyr:2019
+
+eyr:2024 ecl:amb
+hcl:#866857 byr:1922 pid:496904942 hgt:164cm iyr:2020
+
+pid:847705161 byr:1951 cid:124 iyr:1991
+eyr:2028 ecl:dne
+hcl:6b2d28 hgt:172cm
+
+byr:2007 iyr:2029 ecl:hzl eyr:2026 hgt:168in
+hcl:z
+pid:63151612
+
+iyr:2027 hgt:172in
+cid:174 byr:2014 hcl:z eyr:1921
+ecl:grt pid:#cebdc2
+
+ecl:amb hcl:#d09c0f
+iyr:2015 hgt:156cm eyr:2026 byr:1962
+pid:086120872
+
+cid:125
+pid:837849996
+byr:1958 ecl:brn hgt:166cm hcl:#ceb3a1 eyr:2028 iyr:2012
+
+ecl:gry hgt:180cm
+pid:939059935 eyr:2023 byr:1977 hcl:#b6652a
+
+hgt:190in byr:2029 eyr:1984
+ecl:gry hcl:z pid:055092916 iyr:2010
+
+hgt:63in ecl:blu byr:1940 iyr:2012 eyr:2029 hcl:#7d3b0c
+pid:163033394
+
+eyr:2040 pid:181cm
+iyr:1928 hgt:76cm hcl:d8aafb byr:1949 cid:275 ecl:xry
+
+hcl:#cfa07d ecl:oth byr:1948 eyr:2021
+pid:719690182 hgt:179cm iyr:2020
+
+byr:1939 cid:266
+eyr:2026 iyr:2017 hcl:#f116d2
+ecl:hzl pid:522421825
+hgt:68in
+
+hcl:z hgt:61in
+cid:115 pid:180cm iyr:2030 byr:2014 eyr:2032 ecl:hzl
+
+ecl:xry
+eyr:2028 pid:191cm iyr:2015 hgt:150cm byr:2029
+
+eyr:2027
+hcl:#a97842 pid:997937480 hgt:61in iyr:2019
+byr:1921
+ecl:grn
+
+hgt:163cm
+pid:912318455 iyr:2016 byr:1988 ecl:brn hcl:#a97842 cid:221 eyr:2029
+
+cid:333 hcl:#c0946f
+hgt:163cm iyr:2018 eyr:2027 ecl:oth
+
+cid:70 hcl:#c0946f
+pid:961507902 byr:1949 ecl:grn iyr:2017 eyr:2029 hgt:69in
+
+hgt:169cm ecl:amb
+iyr:2013 pid:496169901
+byr:1943 eyr:2028 hcl:#ceb3a1
+cid:249
+
+ecl:blu cid:343
+iyr:1998 hgt:154in hcl:#efcc98 byr:1972
+
+pid:508213120 iyr:2012 eyr:2025 hcl:z hgt:70cm byr:1976
+ecl:brn
+
+iyr:1924
+eyr:2005
+hcl:z
+hgt:167 pid:154cm
+byr:2007
+
+pid:761333244 hgt:180cm iyr:2017 hcl:#18171d eyr:2021
+byr:1983
+cid:67 ecl:oth
+
+eyr:1993
+byr:2003
+hcl:#602927
+ecl:grt
+cid:84 hgt:178
+pid:1847086637 iyr:2026
+
+hcl:#866857 hgt:162cm pid:483774485 iyr:2010
+byr:1946 eyr:2028 ecl:gry
+
+pid:726639691 eyr:2028
+hgt:171cm hcl:#ff65a6
+iyr:2011 byr:1989
+
+hcl:z iyr:2026 ecl:xry
+eyr:2037 byr:2005 pid:#f09a0f
+hgt:68 cid:156
+
+hgt:71in ecl:blu eyr:2026 hcl:#18171d
+byr:1981 iyr:2017
+pid:698636544
+
+eyr:2021
+byr:1957 ecl:brn pid:365378126 cid:93 iyr:2019 hcl:#18171d hgt:179cm
+
+byr:1996 iyr:2014 hgt:64cm
+eyr:2034
+hcl:z
+
+pid:629486472 cid:140
+hgt:192cm eyr:2020 hcl:#b6652a iyr:1988 byr:2021 ecl:brn
+
+byr:1955 iyr:2015 eyr:2030
+ecl:gry hcl:z pid:6550198754
+hgt:158cm cid:305
+
+ecl:gry hcl:#a97842
+hgt:176cm eyr:2022 pid:810146585 iyr:2020
+
+byr:2027 hcl:#cfa07d
+iyr:2011 ecl:#f07598
+cid:293
+hgt:150cm pid:#fa948d eyr:2029
+
+eyr:2028 iyr:2013 hgt:69in ecl:gry pid:317170371
+cid:147 hcl:#bfe1f1
+
+byr:1976
+pid:059341891 hgt:174cm
+ecl:oth
+eyr:2029 iyr:2017 hcl:#733820
+
+iyr:2018 hcl:#ceb3a1 hgt:188cm cid:308
+pid:792826885 byr:1948 ecl:blu eyr:2028
+
+iyr:2017 cid:94 hcl:#95c7dc
+pid:231757803 eyr:2022
+byr:1992 hgt:153cm ecl:amb
+
+eyr:2027
+iyr:2011 hgt:186cm
+ecl:brn pid:996347346 hcl:#866857
+byr:1960
+
+eyr:2025 byr:2001
+ecl:blu pid:755715478 iyr:2019 hgt:61in
+
+ecl:gry
+eyr:2038
+hgt:81 hcl:z iyr:2028
+cid:214 byr:1965
+
+pid:412744447 byr:1979 hcl:#cfa07d ecl:blu
+eyr:2029 cid:157
+hgt:180in iyr:1948
+
+hgt:170cm
+pid:623557081 byr:1924 eyr:2024 hcl:98d623 iyr:2012 ecl:amb
+
+cid:311 ecl:grn
+iyr:2011 byr:1982
+eyr:2002 hcl:#ef318a
+pid:0548169957
+hgt:87
+
+eyr:2030 hcl:#733820 iyr:2016 pid:558470391
+byr:1936 ecl:oth hgt:185cm
+
+iyr:2019
+ecl:amb byr:1949
+pid:376468392
+hgt:178cm
+
+pid:019195245
+ecl:grn hgt:171cm
+byr:1978 iyr:2011 eyr:2022 hcl:#733820
+cid:134
+
+hcl:#623a2f hgt:192cm eyr:2026 byr:1977
+ecl:grn cid:308
+
+ecl:hzl pid:715816358 hgt:69in iyr:2014 hcl:#623a2f
+byr:1996
+eyr:2027
+
+iyr:1947
+ecl:#39a697
+hgt:183cm byr:2029
+eyr:2022 pid:7951883913
+hcl:z
+
+ecl:gry byr:1950
+hcl:#18171d hgt:168cm iyr:2020 pid:677187333 eyr:2027
+
+byr:1969 ecl:blu hcl:#18171d iyr:2011
+hgt:162cm
+pid:701349891
+
+cid:269 byr:1966
+iyr:2011
+pid:905940527 eyr:2023 hgt:190cm
+ecl:brn hcl:#ceb3a1
+
+eyr:2027 pid:454627395 ecl:brn
+hcl:#ceb3a1 cid:302 hgt:184cm
+byr:1959
+iyr:2015
+
+iyr:2011
+eyr:2028
+hgt:166cm
+hcl:#733820 byr:1938 ecl:blu pid:857984986
+
+hcl:#c0946f ecl:brn pid:226877822
+hgt:182cm byr:1998
+cid:160
+
+hgt:186in pid:26499164 byr:2017
+hcl:z
+iyr:1998 eyr:2026
+cid:331 ecl:#236556
+
+pid:328866543
+hgt:165cm eyr:2039 iyr:1987 ecl:amb byr:2018 hcl:z
+
+iyr:2016 eyr:2036 hcl:#888785 byr:1976 pid:160402352 hgt:76cm ecl:blu
+
+ecl:blu
+hcl:#fffffd eyr:2025 hgt:66in pid:979788527
+byr:1957 iyr:2013
+
+ecl:grn pid:279357265 iyr:2019 eyr:2021 byr:1953
+hgt:177cm hcl:#c0946f
+
+ecl:oth hcl:z eyr:2025 byr:1949 hgt:189cm iyr:2020 pid:901383503
+
+byr:2019 hcl:#733820
+pid:31022828 eyr:1929
+hgt:75cm iyr:2012 ecl:grn
+
+pid:080462937
+ecl:blu hcl:#866857
+cid:102
+iyr:2013 eyr:2025 byr:1975 hgt:64in
+
+iyr:2016
+eyr:2028
+cid:125
+byr:1979 hcl:#866857
+ecl:brn hgt:173cm pid:814947616
+
+hcl:z byr:2020 pid:#c3b54b hgt:174in eyr:2038
+iyr:2016
+ecl:gmt
+
+cid:132
+iyr:1958
+pid:61543452 hcl:z
+ecl:zzz eyr:2039 byr:2006
+
+cid:55 eyr:2022 byr:1954 iyr:2015
+hgt:188cm hcl:#a97842 pid:49143631 ecl:amb
+
+hgt:152cm
+byr:1982
+iyr:2013 ecl:blu
+hcl:#341e13
+eyr:2026 pid:440841976
+
+iyr:2019 ecl:blu pid:553456616 hcl:#733820 hgt:160cm byr:1932 eyr:2030
+
+byr:1980 hgt:169cm hcl:#7d3b0c cid:312 iyr:2010
+eyr:2026 pid:028550304 ecl:grn
+
+ecl:amb eyr:2021 iyr:2014 hgt:71in pid:986053283 byr:1981
+
+ecl:oth
+eyr:2023 hcl:#888785
+byr:1949
+iyr:2016 pid:699325656
+
+hgt:63cm cid:297 eyr:2020 pid:990390922
+hcl:#602927 ecl:lzr
+iyr:2012 byr:2016
+
+hcl:9ea2fa eyr:2023 pid:088680493
+byr:1998 iyr:2017 ecl:utc hgt:170cm cid:175
+
+cid:316 iyr:2016 eyr:2026 hcl:#79ff1d hgt:65in
+byr:1997 pid:215466710 ecl:oth
+
+cid:213 byr:1983 hcl:#888785 iyr:2016 pid:767747981 eyr:2025
+ecl:hzl hgt:168cm
+
+eyr:2030 byr:1972
+cid:282
+ecl:gry hgt:178cm
+hcl:#a97842
+iyr:2018
+
+hcl:#6b5442 ecl:amb
+eyr:2028 cid:104 hgt:159cm pid:446429120 iyr:2012
+byr:1938
+
+byr:1940 hgt:178cm ecl:oth
+hcl:#ceb3a1
+pid:845683663 iyr:2015 eyr:2024
+
+byr:1940 pid:496262233
+hgt:184cm hcl:#b6652a
+ecl:grn cid:152 iyr:2012 eyr:2029
+
+hgt:185cm pid:455744229 byr:1954 eyr:2022 ecl:gry hcl:#6b5442 iyr:2012
+
+hgt:182cm byr:1966 eyr:2028 ecl:#a5b7fc
+iyr:2029
+
+pid:343591896
+cid:58
+ecl:hzl
+eyr:2022 hgt:180in byr:2021
+hcl:#6b5442
+
+ecl:utc hcl:#b6652a
+pid:635147657 byr:2020
+eyr:2022 hgt:157cm iyr:2018
+
+ecl:grt cid:312 iyr:1959 pid:154262836
+hgt:171cm
+hcl:#fffffd
+eyr:2024
+byr:1982
+
+hcl:#7a12b4 pid:223424149 ecl:hzl hgt:175cm
+byr:1930 iyr:2010 eyr:2028
+
+hcl:#c0946f pid:633476454 eyr:2026 iyr:2011
+byr:1934
+hgt:186cm
+cid:289 ecl:gry
+
+hcl:#fffffd pid:376300524 hgt:155cm byr:1964 iyr:2017 eyr:2021 ecl:grn
+
+hcl:a5d4dc byr:2006 cid:165 ecl:#db800f iyr:2029 pid:0199789970 eyr:1961 hgt:61cm
+
+eyr:2027 hgt:170cm iyr:2010
+hcl:#c0946f
+ecl:grn pid:415726530
+byr:1985
+
+cid:197 byr:1957 hgt:192in hcl:#a97842 ecl:hzl eyr:2029 pid:958973455 iyr:2011
+
+iyr:2015 pid:933689314 hgt:162cm ecl:amb
+cid:122 eyr:2021
+hcl:#6b5442 byr:1973
+
+eyr:2026 hgt:172cm
+iyr:2012
+ecl:brn hcl:#733820 pid:004474632
+byr:2000
+
+hgt:191cm eyr:2030 byr:1999 pid:9155071477 iyr:2026 hcl:#602927 cid:315
+ecl:grn
+
+iyr:2010 pid:182884251 hcl:#18171d hgt:154cm
+eyr:2020
+byr:1926 ecl:oth
+
+iyr:2019 eyr:1920 pid:132839546
+cid:283 hgt:188in hcl:#efcc98 byr:2027
+
+iyr:2011 hgt:177cm
+cid:117 byr:1976
+ecl:gry
+hcl:#623a2f eyr:2030 pid:134592046
+
+byr:1968 hgt:146
+iyr:2013 hcl:eefdc4 eyr:2028
+ecl:xry pid:722120008
+
+iyr:2016 byr:1941 hgt:67cm cid:51 hcl:#b6652a ecl:hzl eyr:2034 pid:994005715
+
+hcl:#cfa07d ecl:oth
+hgt:182cm eyr:2021 pid:612583941
+byr:1983
+iyr:2019
+
+byr:1922
+hcl:#602927 hgt:161cm ecl:gry eyr:2020 pid:190170808 iyr:2013
+
+hgt:63cm cid:136
+iyr:1999
+pid:8235748647 hcl:z
+byr:2022 eyr:1933
+ecl:#304383
+
+cid:273 ecl:blu hcl:z
+iyr:2011 byr:2007
+eyr:2020
+pid:942473857 hgt:178in
+
+ecl:grt byr:2029 hgt:187in eyr:2030 cid:160
+hcl:#efcc98 pid:#39f22b
+iyr:1966
+
+byr:1978 ecl:oth iyr:2011 hgt:164cm eyr:2027 hcl:#cfa07d
+
+hgt:75cm hcl:#1e8137 byr:1986 ecl:blu eyr:2022 pid:796688423
+iyr:2012
+
+eyr:2026
+ecl:#3013af hcl:z pid:#e8597f hgt:123 iyr:2025 byr:1942
+
+hcl:z hgt:177in
+iyr:1993 pid:#4c9348 byr:2008 eyr:1989
+
+pid:123524366 byr:1935
+hgt:156cm hcl:#7d3b0c
+iyr:2020 ecl:brn eyr:2020
+
+hcl:z eyr:2038 pid:7663741757 ecl:gmt hgt:174
+byr:2008 iyr:1939
+cid:225
+
+hcl:#888785 hgt:172cm
+ecl:oth pid:500711541 eyr:2027
+byr:1931 iyr:2012
+
+pid:575447108 ecl:amb byr:1943
+hcl:#888785 hgt:173cm eyr:2024
+
+eyr:2021 iyr:2010 pid:178773264 hgt:157cm byr:1965 hcl:#bb7bcf ecl:amb
+
+iyr:2023 ecl:#35bd84 byr:2020
+hgt:72in
+eyr:2037
+hcl:#6b5442
+pid:421311669
+
+byr:1921 iyr:2011
+pid:146088688
+eyr:2023 hcl:#15ed24 hgt:183cm
+ecl:brn
+
+hcl:#b6652a cid:243
+byr:1993 eyr:2024
+iyr:2014 hgt:172cm
+pid:771275594
+
+eyr:2024
+hcl:#cfa07d pid:858807920 cid:293 hgt:157cm ecl:hzl iyr:2013 byr:1984
+
+ecl:blu hgt:193cm cid:73 hcl:#18171d eyr:2026
+iyr:2016 pid:124151812 byr:1945
+
+ecl:amb iyr:2018
+pid:214555737 hgt:157cm
+eyr:2028
+byr:1925 hcl:#866857
+
+pid:5633250409
+hcl:4ef7d8
+byr:2004 iyr:1958
+hgt:96
+eyr:2038 ecl:xry cid:274
+
+byr:1972 pid:401239851 hgt:184in hcl:z iyr:2017
+eyr:2030 ecl:#cb289a cid:140
+
+hgt:175cm
+byr:1926 hcl:#cfa07d eyr:2029 ecl:gry pid:325039730 iyr:2017
+
+cid:101 hgt:166cm byr:1986 ecl:amb
+hcl:#7d3b0c iyr:2013
+pid:413769688 eyr:2024
+
+hgt:159cm cid:311
+byr:1993 eyr:2028 pid:188cm ecl:oth hcl:#602927 iyr:2013
+
+pid:565831038
+ecl:amb
+hgt:155cm hcl:#fffffd cid:335 iyr:2016
+eyr:2029 byr:1997
+
+hgt:122
+byr:2022
+eyr:2028 ecl:blu iyr:2017 pid:269710626 hcl:#b6652a
+
+cid:196
+byr:1953 hcl:#6b5442 iyr:2010
+pid:216121215 hgt:188cm ecl:blu
+
+iyr:2011 hcl:98166c hgt:62cm
+byr:2028
+eyr:2024
+pid:792478385 ecl:grn
+
+hcl:#efcc98 iyr:2012 pid:020039675 eyr:2021 byr:1974 hgt:156cm
+ecl:hzl
+
+cid:123 hcl:#7d3b0c
+byr:2026 eyr:2004 iyr:2012 ecl:oth pid:349203133 hgt:160cm
+
+pid:085461475
+byr:1962 iyr:2020 hcl:#623a2f
+eyr:2024
+cid:80 ecl:brn
+hgt:154cm
+
+ecl:oth hgt:156cm iyr:2016
+hcl:#6b5442
+byr:1973
+eyr:2021 pid:539898580
+
+iyr:2026 hgt:191cm
+hcl:z
+byr:1930 pid:#abc2f0 ecl:blu cid:242 eyr:2024
+
+cid:167
+hgt:179cm
+iyr:2017 eyr:2021 pid:756797571 byr:1949 ecl:brn hcl:#a97842
+
+byr:1975 eyr:2030
+ecl:oth hgt:169in pid:4031206183 hcl:#733820 iyr:2017 cid:244
+
+ecl:#54cfeb hgt:152cm
+iyr:2026 hcl:36b4b9
+byr:2030
+pid:#fa1cb9 eyr:1964
+
+byr:1974 cid:99 hcl:9e3296
+eyr:2032
+pid:686747414
+iyr:1995
+ecl:amb
+
+iyr:2030 ecl:oth hcl:z byr:1979
+pid:114661006 hgt:191cm eyr:1941
+
+hcl:#341e13 iyr:2014 byr:1953
+pid:188326193 ecl:gry hgt:189cm cid:283
+eyr:2030
+
+byr:1975
+pid:092061576 hgt:73in eyr:2023
+ecl:brn cid:227 hcl:#5e9d91
+iyr:2011
+
+hcl:#7d3b0c hgt:167cm cid:141
+eyr:1957 byr:2012 ecl:gmt iyr:2019 pid:#1b7c8a
+
+hgt:168cm hcl:#c0946f pid:599500784 byr:1930 eyr:2023 ecl:hzl cid:113
+iyr:2013
+
+eyr:2030 hcl:#b4cb4f
+hgt:68in
+ecl:brn byr:1923 pid:699162086
+
+iyr:2013
+ecl:dne hcl:z eyr:1971
+pid:#580add byr:2020
+hgt:190cm
+
+hcl:#ceb3a1
+byr:1976 eyr:2020
+cid:162 iyr:2016
+hgt:168cm
+ecl:hzl
+
+pid:050478613 hgt:59cm
+iyr:2017
+ecl:grn byr:2030 hcl:#cfa07d eyr:2025
+
+pid:352943968 eyr:2025 byr:1980 iyr:2014 ecl:gry hcl:#c0946f
+hgt:193cm
+
+pid:328621931 cid:310 hgt:170cm
+hcl:#733820 byr:1955
+iyr:2016
+eyr:2028 ecl:hzl
+
+hcl:#866857
+pid:095858739 byr:1956
+iyr:2018 hgt:193cm
+ecl:hzl
+eyr:2029
+
+pid:70973661 eyr:2039 ecl:gry
+iyr:2016
+cid:291
+hcl:#623a2f hgt:97
+
+hcl:4d51a8
+eyr:1978
+ecl:gmt
+byr:2029 iyr:2022
+pid:34507041 hgt:61cm
+
+byr:1989 ecl:brn pid:769582914
+eyr:2026 cid:218
+iyr:2020 hcl:#866857 hgt:184cm
+
+ecl:brn
+iyr:1998 cid:227
+hgt:162in
+byr:2026
+hcl:#602927 eyr:2027 pid:236998728
+
+ecl:gry byr:1984 hgt:157 cid:295
+eyr:2020
+iyr:2018 hcl:#733820
+pid:037871534
+
+hgt:166cm hcl:#c0946f pid:412146401
+iyr:2011
+eyr:2022
+byr:1938
+ecl:brn
+
+ecl:brn cid:95 byr:1981 eyr:2030 hcl:#efcc98 pid:777041035 hgt:152cm iyr:2011
+
+eyr:2024 hgt:89 pid:3761913749 iyr:1939 byr:1967 hcl:a222f6 cid:165 ecl:#7fe574
+
+cid:339 hgt:156cm
+ecl:brn iyr:2013 byr:1951 hcl:#efcc98 eyr:2026
+pid:863566946
+
+ecl:brn hcl:#6b5442 eyr:2023
+pid:787129723 byr:1949 iyr:2015
+
+pid:#7f615a
+cid:202 hcl:#6b5442 eyr:2028
+ecl:#a5419c
+hgt:75cm
+iyr:2011
+byr:2001
+
+pid:864001133
+cid:236
+byr:1943 hcl:#733820 ecl:dne eyr:2025 hgt:171cm iyr:1989
+
+pid:193073684 ecl:grn byr:1962 iyr:2014
+hcl:#cfa07d hgt:189cm
+cid:321 eyr:2029
+
+byr:1959
+hcl:#b6652a
+eyr:2026
+hgt:159cm pid:815014918 iyr:2011 ecl:amb
+
+iyr:2017 hgt:182cm
+hcl:#a97842 eyr:2023 ecl:grn pid:656177536
+byr:1973
+
+eyr:1923 ecl:grn
+cid:138 iyr:2020
+hgt:164cm byr:1958 hcl:#c0946f pid:783366277
+
+iyr:1932 hgt:172 ecl:blu
+hcl:#733820 byr:1962 pid:554221464
+
+cid:169 pid:922622614
+byr:1942 hcl:#ceb3a1 hgt:169cm eyr:2024
+ecl:gry iyr:2017
+
+cid:219 ecl:grn
+hgt:156cm byr:1998 eyr:2021
+iyr:2017 hcl:#ceb3a1 pid:450186263
+
+ecl:amb hgt:179cm pid:768428582 iyr:2010 eyr:2023 byr:1952 hcl:#fffffd
+
+eyr:2024
+hgt:193cm
+iyr:2017 pid:469033795 byr:1979 hcl:#18171d cid:67 ecl:amb
+
+iyr:2016 byr:1937 pid:798267514 hgt:155cm hcl:#866857 eyr:2026
+ecl:oth
+
+hgt:172cm hcl:#866857 iyr:2018 pid:662186551
+byr:1996
+eyr:2025 ecl:amb
+
+pid:2854521962
+iyr:2021
+ecl:zzz
+hcl:12f1ba eyr:2037 hgt:159cm
+byr:1937
+
+ecl:oth pid:488050418 byr:1927 hcl:#a97842 hgt:153cm iyr:2013 eyr:2024
+
+pid:119536312 ecl:#2036ad
+hcl:543178 iyr:2020
+byr:2013
+hgt:177cm
+eyr:2022
+
+pid:788908662 hcl:#602927 eyr:2029
+ecl:oth byr:1930
+iyr:2020
+hgt:179cm
+
+byr:1972
+pid:053386972 iyr:2014 ecl:grn hgt:65in hcl:#cfa07d
+
+pid:9828921035 ecl:blu
+hcl:z hgt:152in
+eyr:1949 byr:2010
+
+cid:157 pid:097910554 byr:1999
+hgt:159cm hcl:#6b5442 ecl:blu eyr:2024
+iyr:2010
+
+hcl:#a97842
+eyr:2040 ecl:#f8ad77
+hgt:173cm
+byr:2019 iyr:2010
+pid:#d16a6e
+
+ecl:dne hgt:191cm iyr:2020 hcl:#b6652a
+eyr:2021 pid:571971509 byr:1983
+
+hcl:#18171d iyr:2016 pid:159074622
+eyr:2027 hgt:163cm byr:1954
+cid:257
+
+pid:243560302 cid:58
+hcl:53a4cf byr:2012
+ecl:#fdbfb8 eyr:1920 hgt:179 iyr:2026
+
+pid:040606106 eyr:2030 hgt:188cm
+byr:1969
+iyr:2012 hcl:#ceb3a1 ecl:amb
+
+eyr:2022
+hgt:175cm hcl:#b6652a byr:1967 pid:269969031
+iyr:2018
+
+hcl:#18171d cid:278 byr:1931
+pid:134809791
+eyr:2035 ecl:#44e6cd iyr:1993
+
+hgt:177in
+ecl:utc cid:289
+iyr:1923
+hcl:13a67a pid:3045345984 byr:2030 eyr:1944
+
+pid:839901650 eyr:2030
+ecl:grn
+byr:2015 iyr:2017 hgt:168 hcl:131f4e
+
+iyr:2015 pid:529736732 ecl:brn hgt:176cm
+eyr:2026 byr:1952 hcl:#6b5442
+
+hcl:#c0946f
+cid:323 pid:303966428 iyr:2019
+eyr:2027 hgt:170cm
+byr:2001
+ecl:brn
+
+pid:193678728 hgt:72in eyr:2027 iyr:2015 byr:1951 ecl:gry hcl:#18171d
+
+eyr:2026 cid:283
+iyr:1938 pid:687430885
+hgt:186cm
+byr:1949 ecl:#521638 hcl:d13b2f
+
+eyr:2024 hcl:#ceb3a1 iyr:2013 ecl:brn
+hgt:168cm pid:792088241
+
+hcl:#888785 ecl:amb
+byr:2009 iyr:2015
+hgt:151cm
+eyr:2020 pid:223927808
+
+byr:1926
+pid:717704850
+hcl:#623a2f eyr:2022 hgt:64in iyr:2018 ecl:gry
+
+eyr:2023 byr:1954
+hgt:169cm
+ecl:hzl
+iyr:2010 pid:116868997 hcl:#18171d
+
+ecl:hzl byr:1965 hcl:#a97842 iyr:2011 pid:506354451 hgt:172cm eyr:2029
+
+eyr:2022 pid:994565705
+iyr:2013 ecl:brn hcl:#623a2f
+byr:1979
+
+iyr:2011
+byr:1931 hgt:183cm hcl:#284f26 cid:306
+ecl:amb eyr:2021
+pid:977533079
+
+eyr:2027
+iyr:2011 ecl:gry
+byr:1993
+pid:272334781 hgt:161cm hcl:#9a35b6
+
+eyr:2026
+hcl:#602927 ecl:blu
+pid:212300161 byr:1946
+cid:193 iyr:2020 hgt:157cm
+
+pid:538594567 byr:1976 eyr:2027 hcl:#efcc98 iyr:2011 hgt:154cm ecl:oth
+
+byr:1949
+hcl:z ecl:#ce67aa
+eyr:1942 pid:7978941589 iyr:2025 hgt:161in
+
+hcl:#c0946f
+cid:55
+byr:1963 ecl:blu hgt:161cm
+pid:547120453 iyr:2015 eyr:2021
+
+hgt:173cm eyr:2022
+iyr:2016 byr:2001
+ecl:hzl pid:239803460
+
+hcl:#b6652a ecl:oth eyr:2021 hgt:167cm pid:401266644 iyr:1969 byr:1974
+
+eyr:2030 pid:581963885
+hcl:#64cb23
+ecl:blu
+byr:1928 hgt:181cm iyr:2018
+
+pid:186338247
+ecl:hzl hgt:193cm hcl:#ceb3a1
+eyr:2022 iyr:2010
+
+iyr:2015 ecl:gry hgt:159cm eyr:2027 hcl:#ceb3a1
+byr:1925 pid:715902111 cid:149
+
+iyr:2018 hcl:#623a2f eyr:2020 hgt:162cm ecl:grn cid:135
+byr:1922
+pid:373216777
+
+eyr:2020 pid:749899012 hcl:#888785 ecl:brn
+iyr:2010 cid:225 hgt:172cm
+byr:1972
+
+iyr:2020 hgt:178cm ecl:grn hcl:#18171d pid:613792489 cid:240
+eyr:2028
+byr:1972
+
+iyr:2015 byr:1938 eyr:2026
+cid:113 ecl:grn
+pid:846231640 hgt:161cm
+hcl:#b6652a
+
+ecl:gry
+hcl:#ceb3a1
+byr:1956 cid:338 pid:936012518
+hgt:62in
+eyr:2029 iyr:2016
+
+pid:730866353 ecl:brn byr:1986
+iyr:2014
+hgt:190cm
+eyr:2021 hcl:#a97842 cid:126
+
+eyr:2021
+cid:180 pid:958310635 ecl:brn iyr:2015 hgt:189cm hcl:#efcc98
+
+hgt:188cm ecl:hzl pid:179001863 iyr:2016 eyr:2029 hcl:#341e13 byr:1932
+
+cid:77 eyr:2027 hcl:#623a2f iyr:2016 ecl:brn hgt:170cm
+byr:1947
+
+hgt:66in pid:617518313 iyr:2013 byr:1977 hcl:#b6652a ecl:brn eyr:2025
+
+pid:787861420
+iyr:2014 hcl:#623a2f hgt:61in
+ecl:oth cid:78
+eyr:2022 byr:1975
+
+ecl:hzl
+iyr:2017 eyr:2028 hcl:#602927
+byr:1958 pid:985208714
+hgt:160cm
+
+byr:2002
+iyr:2013
+hcl:#341e13 pid:188110633 ecl:gry hgt:169cm
+eyr:2025
+
+byr:1981
+eyr:2028
+hcl:#341e13 ecl:amb hgt:160cm cid:121
+iyr:2015 pid:963848397
+
+iyr:2013 hcl:#866857 pid:#db8648 eyr:2021 ecl:gry
+byr:1975
+hgt:153cm cid:114
+
+hgt:109
+cid:287 hcl:#6b5442
+iyr:2028 byr:1926 eyr:2036 pid:2378208387
+ecl:#245a62
+
+pid:857722366
+byr:1975 eyr:2027
+ecl:grn iyr:2019 hcl:#0afad1
+hgt:66in
+
+byr:1935 hcl:#cfa07d hgt:173cm ecl:brn eyr:2021 iyr:2019
+
+cid:66 eyr:2024 hcl:#efcc98 byr:2002 iyr:2010
+hgt:176cm pid:697153153 ecl:amb
+
+iyr:2019
+hcl:#cfa07d ecl:blu
+pid:695914972
+eyr:2024
+hgt:158cm
+byr:1943
+
+ecl:xry hgt:62in
+pid:14733148 cid:148
+iyr:2016 byr:1925 hcl:#6b5442
+eyr:2028
+
+iyr:2025
+cid:53 hgt:132 ecl:gmt hcl:159b19
+pid:156cm
+byr:2025 eyr:2001
+
+hcl:#623a2f ecl:oth byr:1974 iyr:2018 hgt:161cm eyr:2029 pid:6826285172
+
+ecl:gry
+byr:1956 hcl:#7d3b0c hgt:170cm iyr:2020
+
+eyr:2020
+pid:#946a88 hgt:186cm hcl:#733820 byr:1946 ecl:#016645 iyr:2015
+
+hgt:181cm hcl:#888785 iyr:2013 pid:634152817
+byr:1982 cid:245 ecl:grn eyr:2021
+
+ecl:brn
+pid:737531770 iyr:2010
+eyr:2020
+byr:1929 hgt:189cm hcl:#c0946f
+
+cid:158 iyr:2019 hcl:#341e13 eyr:2027 ecl:amb
+byr:1986 pid:834976623
+
+pid:976934668 cid:61 eyr:2020 iyr:2020
+hgt:76in byr:1927 ecl:amb
+hcl:#e05ee3
+
+pid:526042518 iyr:2019 eyr:2027 hcl:#623a2f byr:1976 ecl:amb
+
+pid:279367290 hcl:#a97842 hgt:158cm
+eyr:2027
+byr:1959
+iyr:2020
+
+ecl:xry byr:2028
+pid:357216861 hcl:#a97842 eyr:2024 hgt:66cm
+iyr:2012
+
+hgt:188in
+ecl:lzr cid:64 eyr:1958 byr:2014 hcl:z pid:285207570 iyr:2026
+
+eyr:1973 iyr:2017 ecl:oth cid:282 pid:695814158
+hcl:z
+
+iyr:2010 pid:661168409
+hcl:#53c696
+hgt:186cm ecl:amb
+byr:1960
+eyr:2029
+
+eyr:1982 hgt:169cm
+iyr:2002 byr:2025 hcl:327f93 pid:831648100
+
+byr:1967 ecl:oth
+eyr:2021
+hcl:#602927 iyr:2014
+pid:274974402 hgt:183cm
diff --git a/2020/inputs/day_5.txt b/2020/inputs/day_5.txt
new file mode 100644
index 0000000..11800ca
--- /dev/null
+++ b/2020/inputs/day_5.txt
@@ -0,0 +1,901 @@
+BBFBBBBRRL
+FBFFFFBLRL
+FBFBBFFRLR
+FBFFFBFRLR
+FFBBFFFLRR
+FFBBBFFRRR
+BFBBFBFLRL
+BFFFBFFLRR
+FBBBFFBLLR
+BBFFBBFRRL
+BFBBBBBRLR
+FBBBBFFLLR
+FFBFFFBLLR
+FFBBFBFRRR
+BBFBFFFRRR
+FFBFFBBLLR
+FBBFFBBLRL
+FFBBBFBLLL
+FFBFFBBLRR
+FBFFBFBLLR
+FFFBBBFLLL
+BFBBFBFRLR
+BBFBBBFLLL
+FBBBFBBRLL
+FFBBBBFRRL
+BFBBBBFLRR
+BBFBBFBLRL
+FFBFFFBLRL
+BFBBBBBRRR
+FFFBFBFLLR
+BFBFBBBLLR
+FFBFBBBLRL
+FFFBFBBLRR
+BFFBFFFLLL
+BFFFBFBLRL
+BFBFFFBRLL
+BBFFFFBRLR
+FBBFFFBLRR
+BFFFFBFLLL
+BBBFFFFLLL
+BFBFFBBRLL
+BBFBFFFRRL
+BFBBFFFRLR
+BBFBFBFRRL
+FBBFFBFRRL
+BFBFBFFRRL
+FFBFFFFLLR
+FBBBFBBLLR
+BBFFBFBRLL
+BFFBFBBRLL
+FBBFFFFRRR
+BFFFBBBLRL
+FFBBFFBLLL
+FFFBBFFRRL
+FBFBBBBLRR
+FFBBBFFLLL
+FBFBFFBRRR
+FBBFFBBLLR
+FBFFBFFRLL
+BFBBBFFRLR
+FBFFBBBLRR
+FBFFFFBRLR
+BBFFBBFLRL
+FBFFBBFLRL
+FBFBBFFRRR
+BFBBBFBLRL
+FBFBFFFLLR
+FFFFBBBLLR
+BFBFFBBLLR
+BFFBBBFRLR
+BFBBBFFLRR
+BBFFFBBLLR
+BFFFBBFLRL
+FBFFBFBLRL
+FBBBFFFRRL
+FBFFFFBLLL
+BFBFFBBRLR
+BFBFBBBLRL
+BFFBFBBRLR
+FBBFBBBLLR
+FFBFBFFRLL
+FFFBBBBLRR
+BFBFFFFLLL
+BBFBFBBLLR
+BFFFBBBRLR
+FFBFFBFRLR
+FBBFBBBLRL
+BBFFFBBLLL
+FFBFFBBRRR
+FBBBBFBLLR
+BBFBBFFRLL
+BFBBBBFRLR
+BBFBFFBRLR
+FFBFFFFLLL
+BBFBFBFRLL
+FFBFFBBRLL
+FBBFFFFRLR
+FFBBBBBRRR
+BBFFBBBLRL
+BFFBBFBRLL
+BFFFBBFRLL
+BFFBFBFLRL
+FBFFFFFRRR
+BFFBFBBRRL
+FBFBBBFLLR
+FBFBFBBRLL
+BBBFFFFRRR
+BFBFBFFLRL
+FFFFBFBRLL
+FFBBFFBLRL
+BBFFBFBLLL
+BFFBBBBRLL
+BFFBBBBRRR
+BFBBBBFRRL
+BBBFFFBLRL
+FFBBFFFRRR
+BFFFFFBRLR
+FFFBBFBLLL
+BFBFBBFRLR
+FBBBFBFLRL
+BFBFBFFRLR
+BBFBBFFLRL
+BFFFBFBLLL
+BFFFFBBRLL
+FFBFFFFRRL
+BFFBFBBLLR
+FFFFBBBLLL
+FBBFFBBRRL
+BFBFFFFLLR
+FBFBFBFRLL
+FBBBBBBLRR
+BBFFFFBLRR
+FFFFBFBRRR
+FBBBBFBRLL
+BBFBFBBLRR
+FFBBFBFLLL
+BFBBFFBLRL
+FFFBBBBRRR
+BFBBFFFRLL
+BFBBBFBRRR
+FFFFBBFRLR
+FFBBFBFLRR
+FFFFFBBLLR
+BBFBBFBRLL
+FBFBBBBRLR
+BBFFFFBLRL
+FBBFFFBLLR
+FFBFFBBLLL
+FFFBBBFLLR
+FFFBBBFRRR
+FFBBBFBRRR
+FFFBBFFRRR
+FFBBFFBLLR
+BFBFFBFRRR
+FFBFBBFLLR
+BFFFFFFRRR
+FFBFFBFLRL
+BFFBFBBRRR
+FBFBFFFRLL
+BBBFFFBLLL
+BFBBFBFRRL
+BFFFFFBLRR
+FBBBBBFRRR
+FFBBBBFLRR
+BBFBBBBLRR
+BBFBFBFLLR
+FFFFBBFRRR
+FFBBBBBLLR
+BFFFBFBRLR
+FBBBFFBLLL
+FFFFFFFRRR
+FFFBFBFRRL
+BFBBFBBLRR
+FBBBBFBLRL
+FBBBBFBRRR
+BFFFFBFRRR
+BFFBBFFLLL
+FBBFBFBLRL
+BFBBFFFRRL
+FBFBFFBRLR
+FBFFBFFLRR
+BFFFBFBLLR
+BFBBFFBRRR
+BBFBBFBLLL
+BFFBFFFLRR
+FFFBBFFRLL
+BFBBFFFLLL
+BFFFBBBRLL
+FBFFBBFRRR
+FFBFBFBLLR
+FBFFFFBLRR
+FFBBFFFLLL
+FFFBBBBRRL
+BBFBFFFLLL
+BBFFBBFLLR
+BFBFBBBRRR
+FBBBBFBRRL
+FBFFFBFLLR
+FBFBBBFRRR
+BFFFBFBRRL
+FBFBBBFLRL
+BBFFBFFLRL
+BBFBBFFLLR
+FFFFBFFRLL
+FFFBBBBLRL
+FBBBFBFRLL
+BBFFFBBLRL
+FFFBFFBLRR
+BBFBFBBRRL
+FFFFBBBRRR
+FFBBBBBLRL
+FFFFFFBLLL
+FBFFFFFRRL
+FFFFFBBLRR
+BFFFBBBRRL
+FBBFFFFLRL
+FFFFFBBRLR
+FFBFFBFRLL
+FFFBBBFRRL
+BFBBBFFLRL
+FFFFFBFLRR
+BFBFBBBRLR
+FBFBBBFLLL
+BFBFFBFLRL
+FFBFBFFRRR
+FFBBFFFRLL
+BFBFBFFLLL
+FBFBFBBRLR
+BFFBBBFRRL
+FBFFBBBRRR
+FBFBFBBLRR
+BFBBBBFLLR
+FFFBFFFRLR
+BFBBFFBRRL
+BFFFBFFLRL
+BFBFBBFRRR
+FBBFFBFLLL
+FFFFFFBLRR
+FBFFBFBLRR
+FFBBBFFLRR
+FBBBFFBRLL
+BFFFBBBRRR
+FFBFFFFRLL
+BBFFFBFRRR
+BFFBFBBLLL
+BFBBFFBRLR
+FFBFBBBLRR
+FFFBFBBLLL
+FFFBBFFLLL
+FBBBBBBLRL
+BFBFBBBLLL
+BFBFFFFRRL
+FFBFBBFRRR
+FFBFBFBRRL
+FFFBBBBRLL
+BFFBFFBRLL
+BBFFFFBRRL
+FFBFBFBLLL
+FFBFBFBRLL
+FBFBBBFRRL
+FBFFBBFRLR
+BBBFFFFLRL
+FBFBFFFRRL
+FFFBFBFRLR
+FBFBFBBRRL
+BFBBFBBLLL
+FFBBBBBRLL
+BBFFBFBRRL
+FFFBFFFRRR
+FBBFBFBLLL
+BFFFBFFRLR
+FBFBFFBRLL
+BBFBBFFLLL
+FBBBBFFLRR
+FFBBBFFLRL
+FBBBFFBRRR
+FFBBFBBRLR
+FBFBBFFLLR
+BFBBBFFLLR
+FFFBBFFLRR
+FBFFBFFLRL
+BFBFBFFLRR
+BBFBFFFLLR
+FFFBBBBLLR
+FFBBFFBRLL
+BBBFFFBRLL
+FBFFBFBRRL
+BFBFFFFRLL
+FBFBFBFRLR
+BBFFFFFLLL
+FFBFBBBLLR
+FFBFBFFLRR
+FBBBBFBRLR
+FFBFBBBRLR
+BFFBBBBLRL
+FFBBBBBRLR
+BFBBBFFRRR
+FBFBBFBRLL
+FFBFFFBRRL
+BBFBFBFLLL
+BFBBBFBRLR
+BFBBFBFLLR
+FBBFBFFRLL
+FFBFBBFLRR
+BFFBFBFRLL
+FFBBFBBLRL
+FBFBFBBLRL
+BBFFFBFLLR
+BFBFBBBLRR
+BBFFBBBLLR
+BBFFFFBRRR
+BFFFFFBLRL
+FBBBFBBRRR
+BFBFFFBLLL
+FFFBBFFLLR
+BFFBBFFLLR
+BBFBBBBLRL
+FBBFBFFLRR
+FBFBFFBLLR
+BFFFFFFLLL
+BFFBBFFRLL
+BBFFFFFLLR
+FBFFBBFRRL
+FBBFFFFLLR
+BFBFFBBRRL
+FFBFFFBLLL
+BFFFFFBLLR
+FFBBBFBRRL
+FFBBBBFLLR
+BFBFFFBLLR
+FFFFBFFRLR
+BFBBFFBRLL
+FFBBBBBLLL
+FBBFBFFRRR
+BFFFFFFLLR
+FFBBBBBLRR
+FFFFFBFRRR
+BFFFBBBLLL
+BFFFBFFRRR
+FFBBBFBRLR
+BFFBBBBLRR
+BFBBBFFRRL
+BFBFBFFRRR
+BFBBFBBRLR
+BFBBBBFRLL
+FFBBBBFLLL
+FFFBBFBLRR
+FBBFBBFRLR
+BBFBBFFLRR
+FBBFBBBRRL
+BFFBFFFRRL
+BFFFFBFLRR
+FFBFBBFLLL
+FFBFBBBLLL
+FBFFBFBRRR
+FFFBFFBRLL
+BFFFFBFLRL
+FFFFBFFLLR
+BBFBBBBRLL
+FBFBBFBRRR
+BFFFBBBLRR
+FBFFFBFRLL
+FFBBBFBLRL
+FBFFFBBLRR
+FFBBFBFRLR
+FBBBBBFLRL
+FFFFBFBLRR
+BFBFBFBLRR
+FFBBFFFLRL
+BFFBBBFLLR
+FFFFFFBRLR
+FFBBBFBLRR
+FBFBBFFRLL
+BBFBFBFRLR
+FBBFFFFLLL
+BFBBFBFRRR
+BFFBBBFRRR
+FBFFFBFLRR
+FBBFFBFLRL
+BFBBFFFLRR
+FFBFFFFLRL
+BFFBFFBLLL
+FFFBFBBRRR
+BBFFBFFLRR
+BBBFFFFRRL
+FBBBFFBLRL
+FBBFFBBLRR
+FFBFBFFLLR
+FFFBBFFRLR
+FBBBFBBRLR
+FFFFBBBLRR
+BBFFBFBRRR
+FBFBBFFLRL
+FBBBBFFLLL
+FFBFFBBRLR
+BBFFFFFLRR
+FFBFBFBRLR
+FFBFBFBLRL
+FBBBFBBLRL
+FFFBFBBLRL
+FBFBFFFRRR
+BFFBFFFRLR
+BFBBFFBLLR
+BFBFFBFRLL
+FBFBFBFRRR
+FBFFFFBRLL
+FFFFFBBRRR
+FBBBFFFLRL
+FFFBFFBRLR
+BFBFFBFLRR
+FBBFBBFRRL
+BFBBBBFRRR
+BFFFFBBLRR
+FBFFFFFLLL
+BFBFFFBRRL
+FFFBFFBLRL
+FFBFFFBLRR
+FBBFFBFRLL
+BBFBFFBLLL
+BBFFBBFLLL
+FFBBBFFRLL
+BFBBFFFLRL
+FBBFBFFLLR
+FBFBFFBLLL
+FFBBBFFLLR
+FBBFFBFLRR
+FBBFBBFRRR
+BFFFFBBLLL
+FFFBFFBLLR
+FBFBFFFRLR
+FBFBFBBRRR
+FBFBBFBRRL
+BBFBBFBRRR
+FFFFBBBRLL
+FBFFBBBLRL
+BBBFFFFRLL
+FBFFFBFLRL
+BFFFFBFLLR
+FBFBBFFRRL
+BFFBFBBLRR
+FBFBBBBRRL
+FBFBFBBLLR
+FBFFBBFLRR
+FFFFBFFLLL
+BFBFFFFRRR
+BBFFBBBLRR
+FBFFFFFLLR
+BBFBFFFRLR
+BFFFFBBRLR
+FBFFFFFLRL
+FBBBFBBLRR
+BFFBBFBLLL
+BFFBFBBLRL
+BFFBBBFRLL
+FFBFFBFRRR
+BFBFBFBRLL
+BBFBBFBLLR
+FBFBBFBLRL
+FBFFFBBRLR
+BBFBFFBRLL
+BBFFFBFRLR
+FBBFFFBLLL
+BBFBBBBLLL
+BFFFFFFLRR
+FBBBBBFRLL
+BFFFBFBRRR
+BFFFFFFLRL
+FBBBBFBLRR
+FBFFBBBRLR
+FFBBFBFRRL
+FFBBFBBRRL
+FFFBFBFRRR
+FFBBBBFLRL
+BFBBFFFRRR
+FBFBBBBRLL
+FBFFBBFRLL
+FFBFFFFRRR
+BFFFFBBLLR
+FBFBBFBLLR
+BBFFBBBRRR
+FBBFBBBRLR
+BFBFBFFRLL
+BFFBBFBLRL
+BFFBFFFRRR
+FFBBBFBRLL
+FBFFBFFRRL
+FBBBBFFRRR
+FFFBBBFRLL
+BBFFFBBRLL
+BBFFFBBRLR
+FFBBFFFRRL
+BBFFBFBLRR
+BBFBFFBRRR
+BFBBBBBLRR
+BFFBBFFLRL
+BBFFFFBLLL
+FFFFBFBRRL
+FBBFFBBRRR
+FBBBFFFLRR
+FBBFBBFLRR
+FBBBFBBLLL
+FFFFBBFLRL
+FFFFFBBLLL
+BFBBBBBLLR
+BFBFFFFLRR
+FBFFFFBLLR
+BBFFBBBRLL
+FBFFBFFRRR
+FFBBFBFLLR
+BBFBBBFLRR
+FBBBBBBRLL
+FFFFFFBLLR
+FFFFFBFRLR
+FBFFBFBRLL
+BBFFBFFRRR
+BFFBFFFLLR
+FFBBFBBLRR
+BBFFBBBRLR
+FFBBFFBRRL
+FBBBBFFRRL
+BFBFFFFRLR
+BFBBBFBLLL
+BFBFFFBRRR
+FBBBFFFRLR
+BFBBFFBLRR
+BBFBBFFRLR
+BBFFFBBRRR
+FFFFBBBRRL
+FFBFBBFRLL
+FBFFFFBRRL
+FBBBFFBRLR
+FFBFFFBRRR
+FBBBBBBLLL
+BFFBFFBLRL
+FBFFBBBRLL
+BBFBBBFRLR
+BFBFBFBRLR
+BBFFFFBRLL
+FFBBFBBLLR
+FFBBFFBRLR
+BBFBBBBRLR
+BFBBBFBLLR
+FFFFBFFRRR
+BBFFFBFRRL
+FBBFBBBLLL
+FFFBFFFLRL
+BFFFFBBRRR
+FFFBFBFLRL
+BBFFBBFRRR
+FBBFFFFLRR
+FFFBBBFLRL
+BFFBBBFLLL
+BFBBFFBLLL
+FFFFFFBLRL
+FBFFBFFLLL
+FBBBBBBRRR
+FBBFFBBRLR
+BFFFBBBLLR
+BBFBBBBRRR
+BFBFBFFLLR
+BFBFFBFRLR
+FBBBFFFRRR
+FFBFBBFRLR
+FFFFFBFRLL
+FFBFBBBRRR
+BFBFFBBLLL
+FBBBBBFRLR
+FFBBFBBLLL
+BFBFFBBLRL
+FBBFBFBRRL
+BFFBBBBRRL
+FBBFFFBLRL
+FBBFBFBLLR
+FBBFBBBLRR
+BFBBBFBRRL
+FBBBFBFLLL
+BFFFBFFLLR
+FBBBFBFLRR
+FFBFFBBLRL
+BBFBBBBLLR
+BFFFBFFLLL
+FBFFFFFLRR
+BBFBFBBLRL
+BFBFBBFRRL
+FBFBFFBLRR
+BFFFFFFRRL
+BFFFFBFRLR
+BFBBFBBRLL
+BBFFFFFRLL
+FFBBFFFLLR
+FFFBFFFLRR
+FFFBFFBRRR
+BBFBFFBLLR
+BFFBFFFRLL
+FBFBFFBRRL
+BFBBBFFLLL
+BBFFBFBLRL
+FBFBBFFLRR
+FBBFBBBRRR
+FFFBBFBRLL
+FBBFBFBRRR
+BFFFBBFLLL
+FBBBFFBLRR
+BFBFFBBRRR
+FFFFFFBRLL
+BBFFFBFLRL
+BFBFBFBRRR
+BFFFBBFRLR
+BFBFFFBLRR
+FFFBFFBRRL
+BBFFFBBRRL
+BFBBBFBRLL
+BFBFFFBLRL
+FFFBFFFLLR
+BFFBFFFLRL
+BBFBBFBLRR
+FBBBFBBRRL
+FBBFBFFRLR
+FBFFFFFRLR
+FBBBBFFRLR
+BFBFBBFRLL
+BBFBFBFRRR
+BFBFBFBRRL
+FBBBBBBRLR
+BFBFBBFLLR
+BFFFBBFRRL
+BBBFFFFRLR
+BBBFFFBLLR
+FBFBBBFLRR
+FBFFFBBLRL
+FBFFBBBLLR
+BFBFBBFLRR
+BFBBFBBLRL
+BFFFFFBRRL
+FFBBFFFRLR
+BFFBBFFRLR
+BFBFBFBLRL
+BFFBFBFRLR
+FFBBFFBRRR
+BFBBBBBLLL
+BBFFFFFRRL
+BBFFFFFLRL
+FFFBBFFLRL
+BFBBFBFRLL
+FFFBBBBLLL
+FFFFFBFLRL
+FFFFBBFLRR
+FBFFFBFRRR
+BFFBBBBLLL
+BBFBBFFRRL
+BFFFBBFLLR
+FBBBFFFLLL
+FFBFFBBRRL
+BFBBBFBLRR
+BFFBBBFLRL
+BFBBBBBRLL
+FFFBBBFRLR
+FFFFBFFRRL
+FFBFBFFLLL
+BBFBFFFLRL
+BFFFBBFLRR
+FFFBFBFRLL
+BFBFFBBLRR
+FFFBFBBLLR
+BBFFFFFRLR
+FFBFBFFRRL
+FFFFFBBLRL
+FBBBFBFRRL
+FBBBBFBLLL
+FFFFBBBRLR
+FBBBBFFLRL
+BFBBBBBRRL
+BBFFBFBLLR
+FBFBFFFLRL
+FBFFFBFRRL
+FFFBBFBLRL
+BFFFFFBLLL
+BFFBFBFLLL
+FFFFBBFRRL
+FFFBFBBRLR
+FBFBBBBRRR
+FBFFBBBLLL
+FFBBBBFRRR
+BFFFFBFRLL
+BBFBFBBRLR
+BFFBBBFLRR
+FBBFBFFRRL
+FFFFFBFLLL
+BBFBFBFLRR
+FFBFBBFLRL
+BFFBBFBRLR
+FFBBBFFRLR
+FFFBBFBRLR
+FBFBBBBLLR
+BFFBBBBLLR
+BBFBFBFLRL
+BBFFFFFRRR
+FFFBFFFRRL
+FBBFFBFRRR
+BBFFBFFRLL
+FFBBFBFRLL
+FFFFBFBLLR
+BBFFBBFRLL
+BFBBBBFLRL
+FBFFBFFRLR
+BFBFBBFLLL
+FFFFBBFLLL
+BFBBBBBLRL
+FFBFBFBLRR
+BFFFFFBRRR
+FBFBBBBLRL
+FBBFBBFLLR
+FBBFFFFRRL
+FBFFFBFLLL
+FBFFBBBRRL
+FFBFFFFRLR
+FBBFBBBRLL
+FFFFBFBRLR
+FFBFBBBRRL
+BFFBFBFRRL
+FFBFFBFLLL
+BFFBFBFLRR
+BBFBFFBLRL
+BBFFBFFLLR
+BFBBBBFLLL
+BBFBBFFRRR
+BBFFFBBLRR
+BFBFFBFRRL
+FBBFBFBLRR
+BBFBBBFRRR
+FFFBBFBLLR
+FFFBFFFLLL
+FBBBFBFLLR
+BFBBFBFLLL
+BFBFBFBLLL
+BBFFBBFLRR
+FFFBFBFLRR
+BFFFFFFRLR
+BBFBFBBRRR
+BBFFFBFRLL
+FFFFBBFRLL
+FBBFBBFRLL
+FBFFFFBRRR
+FBFFBBFLLR
+BFFBFFBLLR
+FFBFFBFLRR
+FBFFBFBRLR
+FBFBBFFLLL
+FBBFFFBRRL
+FBFBFBFRRL
+FFBFBFBRRR
+FBFBFBFLRL
+FFFBFBBRLL
+FBBBFFFLLR
+FFBBBBFRLL
+FBFFFBBRLL
+BFFBFFBLRR
+FBBFBBFLRL
+FBFFFBBRRR
+FBFFFBBLLR
+BFFBFFBRRR
+FBBBFBFRRR
+FBFFFFFRLL
+BBFBBBFRLL
+FFFBFFBLLL
+FFBFFFFLRR
+FBFFFBBRRL
+BBFFBFFRLR
+FBFBFBBLLL
+FBBBBBBLLR
+FBFBBFBLLL
+BBFBFFFLRR
+BFFFFBBRRL
+BBFFFBFLRR
+FFBFFFBRLL
+FFFFBBBLRL
+BFBBBFFRLL
+BBFBFFFRLL
+FBFBBBBLLL
+BBFBBFBRLR
+BBFFBFBRLR
+BFBFFFFLRL
+FBBBFBFRLR
+FFBFFFBRLR
+FBBBBBFLLR
+FFBBBFBLLR
+BFFBBFBRRL
+BBFFBFFRRL
+FFFFFFBRRR
+FFBBFBBRRR
+FBBBBBBRRL
+BFFBBFFRRL
+FBBFBFBRLR
+FBBFFFFRLL
+FBBBBBFLLL
+FBBFFFBRRR
+BFFFFBBLRL
+FFFFBFBLLL
+FBFBFFFLLL
+FBFBBFBLRR
+FFFFBFFLRR
+FFFBBBFLRR
+FBFFBFFLLR
+BBFFBFFLLL
+FFBFFBFRRL
+BFBBFBBRRR
+BBFFFBFLLL
+FBFFBFBLLL
+BFFBFFBRRL
+BBFBFFBLRR
+FBFBFFFLRR
+BFBBFBBLLR
+BFFBBFFRRR
+FFFFFFBRRL
+BBBFFFFLLR
+BFBFFBFLLL
+FBBBBBFRRL
+BFFBBBBRLR
+FFBBFBFLRL
+FBFBFFBLRL
+FFBBBBFRLR
+BBFBBFBRRL
+FFFFFBFLLR
+FBFBFBFLLL
+BFBFBFBLLR
+FFFBFFFRLL
+BFFBBFBLLR
+FFBBFBBRLL
+FFFBBFBRRL
+FBBFFBBLLL
+FFFBBBBRLR
+FFFBBFBRRR
+BBFFBBBRRL
+FBBFBFFLRL
+FBBBBBFLRR
+BBFBFFBRRL
+FFFBFBFLLL
+FBBBFFFRLL
+BFFBFBFLLR
+FFBBBBBRRL
+BFFBBFFLRR
+FBBFBFBRLL
+BFFFBFFRRL
+BBFFFFBLLR
+BBFFBBFRLR
+BFFFBBFRRR
+FBFBBFBRLR
+FFFFFBBRLL
+FBBFFFBRLL
+BFFFFFBRLL
+BFFFBFBLRR
+BFFBFFBRLR
+FFFFBFBLRL
+FFBFFBFLLR
+FBBFBFFLLL
+BFFBFBFRRR
+BBFBBBFLRL
+BBBFFFFLRR
+BFBBFFFLLR
+FBBFFFBRLR
+FFFFFBFRRL
+FFFBFBBRRL
+BBBFFFBLRR
+FFBFBBFRRL
+FFBBFFBLRR
+BBFFBBBLLL
+BFBFBBBRRL
+BFFFBFBRLL
+FFBFBBBRLL
+FBFBFBFLRR
+FBFFFBBLLL
+FBBFFBFLLR
+BFFFFBFRRL
+FFBBBFFRRL
+FFBFBFFLRL
+BBFBBBFLLR
+FBBFFBFRLR
+FBBFFBBRLL
+BFBFFFBRLR
+BFFFBFFRLL
+BBFBFBBRLL
+BFFFFFFRLL
+FBFBBBFRLL
+BFBBFBFLRR
+BFBFBBBRLL
+BBFBBBFRRL
+BFFBBFBRRR
+BFBFFBFLLR
+FBFBFBFLLR
+FFFFFBBRRL
+FBFBBBFRLR
+FBFFBBFLLL
+FFBFBFFRLR
+BBFBFBBLLL
+FFFFBFFLRL
+FBBFBBFLLL
+BFBFBBFLRL
+FFFFBBFLLR
+BFBBFBBRRL
+FBBBFFBRRL
+FBBBBFFRLL
diff --git a/2020/inputs/day_6.txt b/2020/inputs/day_6.txt
new file mode 100644
index 0000000..ae67ede
--- /dev/null
+++ b/2020/inputs/day_6.txt
@@ -0,0 +1,2199 @@
+nvlyak
+nyvha
+yaen
+qynia
+
+kend
+endk
+
+atxcykpvmb
+pcvmthyxbak
+ayvpcbtkxm
+cvpkyabtmx
+typbmvckxa
+
+s
+s
+s
+s
+
+on
+aoqc
+owq
+coa
+
+pw
+wpi
+pwxlhqor
+pw
+
+nx
+xn
+
+dlevrzpucfmsq
+pceimlrfsquvd
+dpceruqsfmlv
+hgxudfpqyvbcslrjname
+
+kczmswvorg
+uryvlqaogmdixs
+rmostvg
+gsrmovb
+
+ref
+fer
+
+vmwdhgnlfiyoepsujbk
+epudykjwhignmfbovsl
+fjvuimnwbkogsldhpey
+ibmhuscpgeolfkynvdwj
+psjgubfvlhaknodeiywm
+
+fmnpljusix
+vqrefngyjdahclk
+lfjons
+
+y
+uiwl
+
+lsuqkmjinrzhgevfpwto
+gkmodihnsjtful
+ciguflhkojmtsn
+thkjnoufsimgl
+oskgmdfljntuhi
+
+gaktdwxhmqvfrpsuc
+hmtwkgipdvaurxqf
+akrmpxtughdqwfbv
+gumqniswhrdkvftaxp
+hagouqxpzrjlmedftywkv
+
+zkbyecw
+kczeybw
+wbeyakuzc
+
+iwdkjlarzfynvechgbxsq
+jetfxrzdbcksnavilmwgyh
+wvexlryjbizfgkhanqdcs
+
+vk
+kv
+kv
+vk
+
+yrguw
+rguyw
+pwuryg
+gnuwry
+
+dyhkusanvjwc
+ukaywncj
+uyqjknwac
+aknyjcuw
+jnukwaytxc
+
+toczmkldrevywiajgn
+jyldmgewcvrozinkat
+iynkmatdjerlogzwvc
+
+pthyrfjgqelxa
+qfejxtrynlh
+xwdfkuziyhejtqovrmlc
+
+osjrgc
+vohfpa
+goc
+gjo
+
+j
+jon
+j
+xdj
+
+bpqhmgwzakfrtjvuno
+eafupgombqnwrkzth
+frwqtdngpbhuaklzmo
+wgtnuchpkqibfzmravso
+mfbtvkghauzopnrwq
+
+xiocgdwpastbmyj
+rdzgcbtfaomsy
+dstgbcymozkqal
+
+xvc
+cvx
+xvc
+xvc
+
+dhvtlqkeniymjzoa
+eoazjnhvtkyqdlm
+koltmeyqjhzdva
+doumkhrlyzjqeagtcv
+
+mn
+mfhw
+
+kx
+x
+jm
+
+x
+xv
+
+tdhyubvwqfxejslpringc
+xqhvtbfwrygsdapjiulnec
+vnwbsurdiexghpjtlycqf
+
+pqtdgsmkolzryca
+qjguxdratfeclpmoy
+
+twnviyzmlk
+gknjmyqvziwl
+
+deoabzihqvycxn
+iqcxadpehvry
+
+dbflcxvnapwgei
+pchmodnafl
+hadcflpn
+dlcfanp
+
+tk
+kt
+
+peuroxtzyg
+iwdcnlqfskmbavjh
+
+mjfh
+ynkbrsdpwoqtagci
+lvx
+ujxez
+xl
+
+gyuszwb
+sioduawzrglb
+tsbumxwzg
+zwgeuxbs
+
+tujvkwpy
+tyvrpmjfk
+vwpkuyjt
+
+wdkqailvjmfcshugy
+qugwvlxdsikhfmyjac
+dkiscawvyfqhmjlug
+
+noblsu
+snloub
+sulobn
+lonubsm
+
+osecqjbfg
+fljbmiose
+ojesfbt
+
+zmctviabre
+ajzmicetrvb
+ctmivabzre
+yrztbmieavc
+mivcbtazer
+
+tyql
+osmjgxzrcakn
+iwftdbl
+
+nmqflphkvyjcatgbzd
+jxzemtvdknwqr
+
+ilxrytkdpmsevfjchozqw
+tpdrjxwihvlycozemsfkq
+hitwfmzvjpylcodbqxsrke
+
+flhp
+pflh
+
+ao
+a
+o
+o
+gljzn
+
+ajmkvwqu
+ogvjzwta
+whalvuj
+
+mhktpynfrjgblaqueox
+anmjxplvibukhztqersy
+tabljcpemkyrxhunwq
+
+lnkvfawqo
+nofpsqwavylz
+vofwalqen
+hcnowiaqlfv
+
+dofxbaqrtnyvkpljmhsu
+uklstfynmbxhapojqi
+tufmnpaqyojsklxhb
+oanlusqmxftkpjbhy
+
+tpjle
+the
+vtpez
+ytern
+ouecxwfkt
+
+jbna
+xepqbmufn
+ybjni
+
+jklhaxoqysbt
+tzwpcf
+tenfcvdmpzu
+
+kyqumgfrdiapzwojtvch
+fvczqjrgadiwhnpluomk
+dpwkmrjzauiqvfgcho
+nkpwrmzidfahcvjuogq
+azrkxioghpvcudmwqfj
+
+udjshwgpeaozimcl
+fylwnoevcza
+evlakborcfwz
+
+xhued
+iubgewo
+
+lywovcemagd
+ahveyomxsl
+oqzyfljavbe
+
+pkyn
+befycqpi
+pysk
+yp
+
+mgi
+mgi
+digm
+gmi
+
+cgdqeoyfjranxuv
+lwnkzeptsdqihvcujmg
+
+wzqrhgibdxuyl
+ludbwqxgiyr
+yruxibwdgql
+bgtwqxruylid
+buyrwlidgxq
+
+gqwvxspbl
+xvbwpsgql
+bspgxwvql
+cwlxsvqgpb
+sgpxqblwv
+
+camqk
+onaslperix
+jauw
+yatm
+
+z
+z
+z
+z
+z
+
+fx
+fxe
+
+goemcr
+roegm
+sgmxiero
+ogmert
+germo
+
+czgdxtiprhnwqeujkfl
+dyhmkanzwbv
+
+n
+e
+
+dkcjqbw
+o
+gp
+h
+
+zbwcu
+ubf
+mveurnab
+
+tqwbxuc
+qcwutxb
+ucbxwqt
+xqwutbc
+xqtuwcba
+
+uwhqrt
+wrtq
+trwq
+crtqw
+wrtqc
+
+rqfntm
+nrqm
+rqmn
+
+limsht
+alstikh
+ilhst
+uhitls
+lsahti
+
+oaex
+vsgyo
+lziu
+
+cwqdlxbst
+cdxtlwbsq
+
+hgqc
+hgdq
+qhg
+
+eh
+he
+eh
+
+zfutalwkxms
+ukxltsfzmwa
+
+zpklocsqgwyhb
+zobyqhlcksgpw
+zhspqwovjylkgbc
+
+ymkudfqethwgji
+emtuyfwghjdqki
+zwyeumktfhjdirgq
+wymqgifkudjteh
+
+edhqnrxtpz
+tqdxznrhep
+qzepndrthx
+exzrhnqptds
+zetyhrpdqunx
+
+vmleax
+valxum
+vpmlax
+axlpvumz
+clvamxbn
+
+ebt
+xr
+rl
+u
+
+vzny
+nz
+nz
+
+ywebzj
+ywefjzb
+bxwnjcyzkep
+zjeywfpb
+yldrbhsizajewvu
+
+hfd
+dmf
+fadh
+dvmf
+fcousnld
+
+egar
+hwnrgzcp
+bgofedjr
+jkruvsylg
+rdvgue
+
+jsge
+hesqg
+esug
+
+xaoz
+ocuqev
+fwgrlp
+otxv
+
+fzemjdhwb
+xhdmjzbe
+
+ytsfpumedxqvzhl
+fdteschymvxqlpz
+phyrfwtqlaxgvznesd
+hvlextsbqpzyfd
+jydlhetzoqfpsvix
+
+jxkrobp
+rsplxbgk
+yxmbpkorhj
+
+injbuyktrcs
+bcsriktuny
+skyrhbtnucxe
+
+duck
+cykuv
+osfcurnlwax
+uvmc
+
+vpt
+tpv
+pvt
+vpt
+vtp
+
+dacxvsi
+icaxsd
+xdihcneas
+
+nf
+nkf
+fn
+
+yrewaxckd
+wtydesfcr
+erdftwqyc
+
+hmfezapkqjyri
+ekqajhyzfpmri
+raikjeqmhfypz
+qjmyrekfzphai
+frtjeqkimhazpys
+
+ryxmsbqovuidphfwecajnz
+hdjmiqbxnpvouyfcewsazr
+vubyrcmqeswafxjzhinpdo
+cbjmnaoqurlhsifvwzdexyp
+
+iu
+ui
+isutlr
+iu
+iu
+
+lftaziorb
+rvamfeyjgqnx
+frtak
+aifr
+aftzr
+
+us
+schk
+
+bjafywgieth
+tifbhyjgwade
+imhwefbgatjy
+wgtyifejbah
+
+a
+yj
+b
+iab
+
+qkgazumerlhb
+syritxopfvd
+
+gdiakrne
+ygdpcwqfbmikzanver
+dolarkigen
+gtkanierdh
+
+axv
+axdvl
+
+erpjfh
+prgjfeh
+hrejpf
+pejfhr
+ejrhfp
+
+zijsrtcqdxmy
+mtxdfyji
+timydgxj
+jtmhvakxidyn
+iyjmwdvxnt
+
+rh
+har
+
+tdoyugpljirwenzx
+nurlzgjtyopide
+jnrlitgpzdoyue
+zlptnudjryogie
+pzgyeoliturnjd
+
+ivcyexsotkzqmr
+sgfjhqnpy
+
+omw
+joq
+mop
+
+welbhpzftgjinqyk
+gwpdjqacitshlbykfzmrx
+
+sygqwn
+fwyqsdg
+scgwqy
+
+gdjzwbhltxs
+dlkojzbq
+jfavyipcembun
+
+cydkuqlhan
+uavstnychbqxk
+azqntcuyhk
+
+k
+bf
+z
+w
+
+gyh
+e
+
+rhmpg
+pmhgr
+rpmhg
+
+pas
+vhtsaqfgnu
+kpjsa
+sab
+jcopska
+
+tsjabirpehudncx
+custniapedhxrb
+cepnuastxhdirb
+shbpetcdaxuinr
+dbtiepaucrshnx
+
+tuswfrqpgxk
+kprjsdtqxunf
+pxwfrtuqske
+xwskmfprqut
+pfrtxqskhu
+
+szirxjtu
+zuxjtsi
+jutsxiz
+usjitxz
+ijstxuz
+
+zqesxfbmrivokl
+mevkzirbfol
+fbkomeyvilrz
+
+rlwoeckxnh
+xebkornwcl
+xcoknwler
+wnlkrcoex
+kecronwxl
+
+fmdbraihnpxytkcgezu
+kbeyxmadczhritnpuf
+pnhfmubicxteadrzyk
+updrybtmhzefcnxkia
+kbezfjwmhytnixacudpr
+
+w
+w
+w
+w
+
+fgwdoctvpzymhbrkjxn
+yaqjctxvsrozmwk
+xkwozitrvmeqjcyl
+cwkazxtrmlijyov
+
+vnym
+bvmy
+yvm
+byvm
+vym
+
+mxjblongrfahycqvpu
+ncywhdpxefajbrgloqu
+
+sgukdmfqvbwcei
+zigahlxojdnpc
+
+fudobaklngyjqpstmiz
+psflydzmbtkiqaojgnu
+itgzqsfdyabnolpjkum
+sitlkyuqnjodzmpbagf
+ytdijopqublaksmngzf
+
+vhaobfn
+ohbnfav
+vahofbn
+naovhfb
+
+tfhsqwcbrv
+iqrbzspnwyhtfc
+
+pfbwotesuyhkvgx
+vnrlcxayzdmih
+
+nbyhpfklvtqo
+qbtjopfyk
+qpoeybfkt
+
+uvmgzs
+pvsmizrug
+ghvmszu
+mugszcv
+kusmvzg
+
+mua
+amu
+uma
+mua
+
+d
+m
+
+s
+s
+yuk
+s
+
+gtjqp
+pfotsh
+pshgbt
+wpeztyr
+bqjtplo
+
+zwbvestiaoljy
+gmnzshupfqre
+
+anvsdkbltiugc
+tqsdcanuibgvkl
+stkrvabegidclxun
+takcsgnuvmdibl
+cvqsklngiubadt
+
+txvfnuwcljpqkeryoamigd
+jgarvmodftpniekquxszcyhb
+
+htu
+hegb
+whf
+
+jn
+nj
+jn
+
+vcjlxekmqzoduphynw
+hkyeojlvndumcwzx
+ozhdnvjeckwlmuxy
+ujxdyznvlcmokhew
+vdywzekucjnhoxlm
+
+blxuhyvjrzow
+uzlwokmsripy
+
+rum
+mrl
+rbwfmz
+durmq
+
+obcpqvkitduelwf
+ahcrwiltpuedfobxkv
+cvijgzoukptwdfble
+kpqjduetilovfcbw
+
+irfqsp
+wifas
+
+xvgyrpq
+yrpqvhgzx
+fspxmrivkwgycnequ
+axhyqrpvgz
+xdygqvrpa
+
+xrlmcsibvea
+bdcveasxzip
+esvbclaxi
+vaxsbcei
+xaeibsvc
+
+songrtmwhpydqizlf
+halvzroefxcsubt
+
+uqozritygam
+kmtryqvz
+qfmjstkyrz
+
+rqtepcofhuylnxaj
+xoptqwruhijsmnzcylfe
+hxqcpyfjntleuro
+brjyuoetfxpndlvcqh
+
+prltixwohdmfjukgqzsv
+orluxtzpvjafdqwkhsgbe
+
+iyhuarewvbfjmlz
+vramijyfzhbew
+zyehbmwvifjra
+vjmweybazihrf
+
+duixtbqyhomsla
+suinmaxtlqdoyhb
+htiquxmaybosld
+
+pselyhov
+zhwpovekt
+snheopv
+ivxophe
+nhpoeuv
+
+amqcriebkojlwyuxnhfdptgzvs
+uovdszkygbjhanefqxplimtwcr
+
+ozngukih
+nvksbd
+
+grkotivmcxnyubwleqspjzhfad
+ekmqxnfabwiduopjsgclzvyhtr
+
+jzv
+wzxfivmjb
+zjvp
+zjv
+jzvs
+
+js
+evqis
+qxs
+swyct
+s
+
+n
+n
+zn
+
+udjtxws
+usdwixj
+
+lf
+l
+
+cdsaxzlv
+jcsxlnydtrzvk
+lvdqamzsxhc
+udlxwczvgs
+
+gutwbrhjxyeam
+jrleawgbsnxthimyu
+rbjexdythumwag
+hrwjmoexytqaubg
+uwymabxrhjqgdect
+
+vipjrlbsmcogxznty
+vetpngyzsbmoxcrijl
+hoxvbsnjlfygmrczpti
+pmlgzyasvxticjbrknod
+
+xzakbvtehnlciswmyufjdrgo
+kocmslwbgvuxijernzydfhat
+vcdxgkslnzoarmjwutyiefbh
+tzhugvbcnokyxsfliwardmej
+
+up
+u
+pu
+fu
+
+cbzjelmqivw
+ickezvjlqm
+
+srwnt
+nwrtj
+rswnt
+
+hfjxoskd
+dlpzeyjai
+
+mt
+tm
+mt
+mt
+tm
+
+rpxenfzmhwdvacbygiujkqot
+lhbvkwmpfyazrtojcquxind
+qtcjdairznhuwxmpsvyfkob
+
+apvk
+qvapk
+
+ujscpqtgbyezdfhnwoil
+bftognyujilpwhsqzdce
+zbhslwipdjeqntcfouyg
+tyuqdlfepgzshcoiwnbj
+dzqxjblenucpwshtoiyfg
+
+cdxtsaunbwkezlrp
+vbdpsuktlxczerwan
+pnxudwaclrtebksz
+
+tq
+t
+zt
+t
+jtqg
+
+fvmhiloanbgjzptryucdkxw
+jzhwtkbdpoxfacirngluyvm
+pwnybcjmgxurfzivoklhdta
+brtavopdklnhxwgzmifyjcu
+ncifvypdtgwxbzakhjrmulo
+
+kwhiguft
+uxyo
+ux
+
+ruyoe
+ezqhbi
+clndewsfta
+e
+qrke
+
+doa
+doa
+doa
+
+xt
+tx
+xt
+xt
+xt
+
+roxwktbmgiyc
+qtbejyxzlpcaighfod
+oscgtuyiwvrbkxn
+
+agcdevxkmbnzqjl
+jrdzmnclbgkvexqwa
+
+pqjtyenfmxdaorw
+qayjpxmfdterwon
+frdtlawxmjnoeqpy
+
+aze
+zea
+veaz
+yzxdequoa
+
+eq
+uetqs
+
+jsmezrk
+zskmer
+zmkers
+krezsm
+
+mfzqsukgcw
+cmskguzfqw
+gksucwfmqz
+uwqsgfzmck
+wfzucmgsqk
+
+wftx
+fwtd
+twf
+
+bizwg
+gzwosd
+afzqrwun
+cjpzwb
+
+qjntchmdbgpe
+nqtephjgmdbc
+qjeltdcphgbmn
+nqtbcjhepmdg
+
+g
+g
+gr
+g
+g
+
+yulnpwc
+uplcwn
+nplemufywc
+calkisogupw
+
+sigh
+igsh
+ghski
+
+naqpd
+xydrsjwlibzm
+qdevh
+cd
+
+mraejinsdp
+mierdjansp
+qpsmrianjde
+npirjedams
+ridpaejmns
+
+o
+o
+o
+o
+
+lhfqsxm
+xlmsqfh
+slfqmxh
+
+jhivsoabqlfpeuw
+fvxrelbhuncowqjtsz
+
+yajhetclfk
+jnqbylmpwgxcf
+azchyrsivjeltdf
+
+n
+n
+n
+n
+n
+
+hkuaq
+hkqua
+uakqh
+khqtalu
+ahxkuqy
+
+tguprf
+pfu
+ufp
+uofp
+
+lnmtjo
+njolmt
+
+qymzdw
+vjckmtl
+oipreghfausnxb
+
+niswjectqkldzyg
+wunjdetklisczyqg
+gldcysiqznjtekw
+iqwdczjsytkleng
+lgyiezdncjqktws
+
+dntm
+atm
+tma
+tm
+txm
+
+ntpcwask
+skcna
+nksac
+
+prai
+pria
+arpi
+irpa
+
+mzldgbrtovj
+tbjgldozmvr
+ogzvdlrjtbm
+
+ft
+fq
+
+jgstdlzarcemiopynukfw
+ywlhakgzeoxdnjmsirc
+moicgebadzlwkysrnxj
+
+jpeiqxbz
+xipjebzt
+
+rnpf
+fqhu
+agprm
+wedyzci
+bxur
+
+aynswjoklfeqzcitxudbrvh
+ihrbxwvdqsyoejpnfkzc
+
+hrqliwxtfbk
+qiwfrxbtkhl
+kihqxrftlwb
+wrhlxbtqkif
+tfbqriwlkhx
+
+bwdhnqk
+wbhkqtd
+qwbkhdx
+
+fpcboialrdgqkejntyzm
+lmieayocqpkznbrtdfgj
+mbtdrpozfljkeyangiqc
+pmdjlerfkybgnaoqzitc
+pganmcfbtedkrzloyqij
+
+zfrvn
+zfnr
+znrf
+
+nuq
+ltiuacgjs
+aug
+
+xj
+lyzixn
+eaxwuf
+
+aeywqjkl
+eanklwju
+kjelzaw
+ealjwtk
+azklwej
+
+ncqxulrmfvedao
+eodqxlvmrncu
+elrmnuqpcdoxv
+qloxudmvnecahr
+lcdxqwmurvznjeo
+
+aijnhvxemsqztfk
+xnvkehsiqmzft
+tehvxnfskiwqzm
+epsmzhixqvtnkfr
+htkinzvqefxmrs
+
+wgfzomlbhujxs
+ezvrxmkycafwob
+
+lhyrq
+ylfherq
+hlreyq
+wqlyerh
+hgsqlyru
+
+acnkurdevm
+duernacvm
+nteaducorvs
+
+hxvqtsjzgn
+iakeoyr
+
+id
+i
+di
+hkxi
+
+fqunm
+funxikw
+xfiuknz
+
+wvgpqlzxnui
+livzmwyqgpnu
+
+eanbkcjlxpsm
+ofmdwrqe
+
+w
+ws
+wr
+w
+w
+
+aylsbi
+lyaiqsgb
+vyeblmasuhi
+yblsia
+ylbsiaq
+
+fpbhozqdljytwcnxsvr
+zarwdgqhtvyxcnpbsofji
+dbzhsfwrvqnyjxtpoc
+qwxpbnycrfjsozvhtd
+tsoypwnmzfjhbvdxcqr
+
+bezfskqut
+egbpkdflqtmouzs
+kxzenfustqb
+tsebufkzq
+
+hoekryzuqt
+oreuqhyktz
+teorhukzqy
+kyqehortuz
+
+d
+uqwgitdaj
+dz
+vod
+fvd
+
+smjqnlt
+jsqmlnt
+ntsqlmj
+jqntslm
+
+saxdlkjwvyctqenrio
+wqnvsoyaextcilkrjd
+krdqwevyliojxcntas
+ywlnkcafdoirsvjxetq
+
+ryae
+yaq
+ya
+ya
+ya
+
+epvy
+nvyqu
+vnxy
+oyvh
+
+kschegfmla
+lgfmscaehk
+gshfalcemk
+lcgemshkfa
+mkgaselhctf
+
+bfxqtegnoismrk
+mnuivtxasgbjqyfkp
+mkxgrnltfiqbhsw
+
+s
+s
+s
+
+zoe
+eoz
+oze
+eoz
+
+q
+kuprd
+gvmbn
+vctx
+oi
+
+nbrjveycdlw
+jyhfcwnglerv
+
+vkoxqwfhubrcsnme
+bqkexhovswmntfrc
+
+aidoznexygkjlqs
+neysaiudmoqklgxzc
+
+ypsn
+eyp
+yp
+iyp
+
+gol
+olg
+
+rypjohwvxkisnldatuzfb
+btpxvolknwdhuryiafjsz
+vkahgbsitwdoyjplfruznx
+
+mipqtk
+nikqpvu
+
+kztifpne
+yzit
+rigtz
+zait
+
+jxgvt
+gfjoky
+kvygh
+dmwgqsrcp
+ounalgyze
+
+nypvuiseqtjwxchlbfogdamzr
+apqnbzhwmjldotfsvexruicyg
+bpyjzomwahcrgsutlefxkqdivn
+
+qumcbsvlpthfwyda
+hagwiucnvfdypqlzs
+
+tog
+otg
+gfto
+gto
+
+ctp
+uda
+
+vlbi
+swmiujf
+
+xbi
+upsdbi
+bizr
+
+ltw
+we
+wzavnymh
+iw
+wfe
+
+caqjdphelmtvyfbxo
+acxmtljedhoqbsfyp
+
+fyqthpe
+bmrceljqy
+eyqt
+
+frjdhuyqsgon
+krouhsfgydnj
+
+ltopekjnacgbms
+elngjotmpsca
+splcgnatmoej
+egjctspmlaon
+jtealcmpongs
+
+fvsmiotkb
+fbnupmcsxd
+fmkvjysb
+qbksmywrtf
+
+mklqnp
+mqnlk
+mwqnlke
+
+jykqrlaocvunfpix
+rcymsnwuafdtvgbqoieh
+
+c
+c
+ct
+c
+
+mlv
+lyfpq
+vsli
+vrdwl
+
+srtaq
+nuptlr
+
+hcfjdaqwo
+qmoefalzdh
+
+zxyksijbeahgvc
+xgvjhsczeyikba
+yxickjesbhgavz
+sjvgibeczxhkay
+hvgizjmaxsybcke
+
+wjmypxi
+jipmx
+pjmix
+bjivamxp
+
+dytnalmqkbpruef
+qplfuynbdaertm
+rbnetqdupamlwyf
+
+e
+e
+m
+p
+e
+
+b
+eb
+b
+b
+b
+
+yieovwqukxcnbfjpdg
+qjvunkgywpfoidbxec
+jupowqfbiknvdgeycx
+dqeicgjfpxonbukwvy
+gociquxvjbfdwnpkye
+
+lwrch
+huosc
+
+somiywgdbf
+fbmvdwgzsy
+ufrltkydsnwm
+
+epvfduyh
+vfpeyuhd
+epdchvyuf
+udeohyvpf
+evhpyufd
+
+b
+b
+
+szfgmlxwd
+eapoqydvi
+
+puedtjkqbwfznhvycxrolamsgi
+cvqeyszrwdfnkutjihxmlapbgo
+nfdpoukvizgctxwmeaqjrhlbys
+
+nuf
+je
+uieq
+ctodh
+sbx
+
+psrwqlgd
+lrwdqgpzs
+
+qheijmngzsrdawbvucolxpy
+vhqnlcouibjdarzxpmeygs
+edlixjhrquamovnpbsgycz
+
+jkphyr
+urycxn
+
+snbcyoe
+nuewpy
+
+gbnsoirkwyhp
+iogsqbkymwp
+fzbwkeyutdxp
+
+w
+w
+w
+
+jsbp
+bjsp
+jspb
+
+jfbdpv
+pfjvb
+
+wfhvsjloznb
+gmupxcnrakelfsvzqd
+
+dbsuoriacgnwxtzveyhqfkmp
+adwcifzvsgnkphyburtexomq
+wzbkmsdpfrhiaqxyecuonvgt
+athzyrgbwckvomqudsnexfip
+vidbhyqesancrzugkxfopwmt
+
+nl
+ln
+nl
+osnl
+
+iewcxgqtf
+gtwmfieqc
+icfvqwyhadgkn
+qcgwerfli
+
+wyj
+jy
+atycnje
+qyjg
+yzjsg
+
+ivjwfeuz
+jvcw
+mbhvwj
+rswvhjd
+
+zmjlpeia
+eimrlpzaj
+jmealyqpi
+
+zgkf
+gkz
+
+zuosdlvkxm
+tlxskcvpumo
+kuyomrxlvs
+uvosxmldyk
+
+yuilcqhgmazts
+swhvdcigltmakzuy
+stojxiflyghnazcpum
+gkhqtyciuwszmal
+
+nzhlyu
+hngc
+ngcah
+anch
+nvkhj
+
+xhfvwbkn
+nahwxfo
+fhgnwx
+dmfuxnht
+
+vbhpedluncftoxys
+cydfsolpejhbntux
+
+vkilx
+pvxskd
+
+hvwuecgs
+guvwcsh
+sgrwculmvhb
+wcpznuqsvghi
+vhwcsulg
+
+ndfapjlztc
+npoacfjtld
+
+jzd
+xaulvyksp
+zeh
+
+ck
+ck
+ck
+kc
+
+kiroh
+rh
+
+euxdrkvtfbqon
+ytfvurxwheokqn
+
+sirznatbxkghm
+skaiqzrmhnx
+ztgmhrsikanx
+hksxmairnez
+ywdiracnfsuzhjxmpk
+
+bacgwvmxrdfne
+pdcofwbza
+cfqdwuptzabo
+
+dqmp
+dqpm
+qvmpd
+
+kczxnlerm
+vqrzjmf
+
+qmuorwspx
+dywcxarilegkh
+
+gqzph
+qhapozk
+zhqp
+
+fastkjnl
+jsnafkt
+jfnacskt
+
+fxgpiadjrvhs
+smfwbejadh
+hjmfyaods
+fzdqsjham
+hlcbyfjkaunsdt
+
+dqlevpahscoyi
+iypldavhsqoce
+clhvyaisoepdq
+eayqiosdlpvch
+epodliqvhcsay
+
+nhxbmlqv
+qylkhmnxvbj
+xbnlvqmh
+vxmbhqln
+lbvhxsqmn
+
+exrtdq
+tderq
+djretq
+
+lwqj
+jmwlr
+zbswtx
+
+pxi
+ipx
+ixp
+xip
+
+vgfscwrqzdojxhe
+xfvqhzsjecgownd
+qdopyzjwegfsxchv
+gosqeckhvzdjfxw
+gszxpfveocjhqmdw
+
+gvlyuiscaewfpx
+gfwjtapuoynvqzi
+
+ycsdnbzjoki
+wfpvogmqhautlx
+
+tbjliqdfzgny
+zjwilpghqdyekc
+
+yftcnao
+ncfytaio
+conyfta
+
+yslactbwhjfvnomiue
+mbyiavojlwtunces
+eontumvircsalbjwy
+jguvcxylitsbmwenazo
+bayolijwqcevpmsktdun
+
+ynmki
+ykinm
+inymk
+iykmn
+yimnk
+
+vzjnpybg
+vjqfyno
+rnvity
+
+ilxkjhcfpdmeb
+hwdjleirc
+aiulechdj
+dljiwehc
+
+rptom
+ife
+nuli
+yized
+
+loe
+eg
+
+fprtvcgkwnasljebhm
+nvbltrckumfhpgjew
+grpuefzknmblovjw
+bjwgykpinqlemrd
+mrlegnjwbkp
+
+xtquyrjnszl
+ysrqzj
+zsqyjpr
+
+ft
+fjt
+ft
+tf
+
+ejli
+l
+l
+rl
+
+lwgrihbdvno
+ydbrvhgolniw
+rivdongwhlb
+ndhbrgwilov
+dwvrnlhbgio
+
+fc
+fc
+cqfo
+fc
+fc
+
+nhaoi
+nioha
+osijah
+
+hgrec
+gchre
+cehrg
+
+higmvfbtjre
+ikhxjbrefvq
+brjiefhvl
+ivfeqblhrj
+hrkifjvbe
+
+vsgqmibordtznkl
+dehupjlcxtsrnfawy
+
+t
+crfi
+
+nrai
+hjcmpzla
+dveria
+
+krp
+achvofx
+kbp
+
+vfdzhuskanm
+lhucb
+uh
+
+qu
+uqj
+quh
+qu
+
+tokmzyuxjsbvic
+zegday
+
+wqfxlhyapcdtv
+vctalwmjdpqyfh
+
+nqge
+vneiqt
+hqvfenwj
+nksqcrlmde
+vqgbone
+
+f
+w
+w
+f
+oq
+
+qziwcdjyepvhn
+wvypijednqzc
+
+uwjflbhoq
+dwxublig
+
+c
+lc
+ec
+c
+txcjrkd
+
+cglvpyadf
+rqfvgaplc
+kgpatsxuelvh
+oapgvliwc
+
+ln
+st
+bs
+
+sfra
+dskrnf
+mzhjrfpx
+
+phu
+uph
+uph
+hpu
+phu
+
+pcxhvbf
+hxbtyk
+
+jdzsaiwbphmftqxrlngcyoe
+mqbrsplojgyheznxcdtfwia
+pitajxzhsonwygrfblecmqd
+nyliauzgfbcprewhdtjmsxoq
+taxnylhvgjqewcksfpmzdbior
+
+h
+c
+om
+
+ruplsfnhyjqigwkzexbtoc
+newjivhyckdagob
+ywocjmnkbghie
+
+jdrtpbvohaxy
+dnjxyrfsv
+
+lq
+nsulxvmhj
+l
+lk
+
+fdsxhvqaiblt
+fihykrdlsoaqx
+laqgpznecjiuxfsdhmw
+
+capkzueqjmdv
+ckdvymqazu
+fklcmdbuxqarzv
+zkcsvmqhiadgeu
+jotqkuzndvciwam
+
+lzqbrgkp
+grvpntoz
+ozwvpg
+suefagcp
+pkjygd
+
+zbangyoqjlkdevrxti
+gzniebarjloykqtdxv
+
+xviqehycstgjladuoznfwp
+odwplyiqnxghutezcvsj
+ersxgqtcjouvdiznlyhwp
+cpshuoijtxvelqynwmdgz
+
+tnzkdmgqci
+mqkzgydtijn
+mtikzqdng
+
+d
+ad
+d
+
+k
+iof
+
+otkvualrqdsixf
+nkhwid
+dbkiwpj
+ikd
+ekziydgm
+
+wjvgqsxinfburh
+wxgqsurjvflnhbi
+
+hebmgftkpcq
+owektbpfhqcmg
+egtfbpckhmdq
+qmcetgpfkhb
+
+exukswmlgznjoqhvabid
+dkgmeoahtxpzflnwru
+
+lf
+fl
+lf
+fle
+
+zblhfjqpr
+rzp
+uprzo
+
+wmktipjq
+twmikp
+jmtwikyp
+azcempwtkiv
+itkmpw
+
+qwodjmelanykpxuh
+weqnajoxmupklyihd
+pjodermlyuknwxhqa
+mqbaoxylgdshtnjpwuvkfe
+lnaxijmwqhukodpye
+
+azxw
+xazw
+zwax
+wafqztx
+zaxw
+
+ydzmvpskfjiqneluabgtrw
+vyfdpqrkbistwlaxzjum
+ukortizjvdwhlpafycmqsb
+
+cno
+y
+no
+y
+bqe
+
+zlcotxyhfeij
+xtlvhifkszoj
+
+kczqegopj
+qupzjod
+
+hpclqaktjmbnyxw
+iqphxcamk
+
+rebc
+qcbra
+brc
+crb
+
+flkoiavp
+aduhjeqtyrmzkn
+cslwgfaokp
+
+qmnzcjb
+bmeqzjsc
+jxochgfbmwzvq
+zqcbmja
+
+deyifvsxw
+evdyw
+edbhzyuqv
+
+xmhknbcwdaztvl
+mruslxozyangpj
+xgszalnm
+aoqmleunizxs
+
+eh
+he
+eh
+nxeh
+eh
+
+cjbx
+jxsub
+
+yusezdlpgxtm
+dyrkmstuegpx
+pdxmyeutvkjsrhgaw
+
+ruz
+rzu
+zur
+zru
+
+wgbdctzlsmh
+peglstyhcd
+adtqlhcgvs
+tylndgrcujhsbx
+odltpshecg
+
+ylntchparijwfo
+wtrjpiaohylcf
+wlfyvrehcutapgko
+
+tkbpfhjzravmquxewgl
+goxphazbfvrqkijlwtm
+mkrbzqphvawtyjfxilg
+plhcnwgqmrxfvdzabjkt
+
+pfhtlqawckegij
+wjpaksdctfghlo
+
+jqctpgrvu
+qkvgjuprtc
+vutcqpgrj
+gpruvjtcq
+gvqprujct
+
+dkevisf
+kfei
+mlukicwfje
+
+nsoyjcwzife
+spnocteji
+
+cfuzsbtvdkq
+rcasmqzkpdxuo
+drxzwqckus
+zqsrndeukxic
+
+vkgpbz
+zkpvg
+zkvpg
+
+eqhpyasvnumzgclitofjw
+ofsgpaijzqmtvcuwhlbe
+ujiewctamfxqdghslpvzo
+qivnwtlfcmpgaeouhjzs
+
+lfahbowz
+ryxcwtvs
+mytucdivw
+
+lqetdskgyznojharxvufpwimbc
+kpcoqugdvxibftjmywzslnreh
+mxjgcinhobeldrwfukyvptqsz
+
+jxhc
+fjsqglzwhu
+mhcj
+hecj
+
+ihdsbckn
+
+siponk
+sikonp
+psinkfo
+
+qbvdrutoan
+qbcftunvoi
+qvkoxzbtushny
+qtwojubnv
+
+eu
+u
+xtujdms
+ehu
+
+jkqdoner
+eyxnkuaoqfg
+kqenxmyo
+
+wk
+wk
+ykw
+kw
+kw
+
+gvrebwq
+erkflnbjhagv
+givrybues
+itpvegsrbz
+
+hlykfbqnexots
+tqhgfonkzeyxsbl
+qkcybxtsnloefh
+fxalqkntsuobyech
+hvyjefkbitrqoplwxns
+
+paxu
+parnkxu
+pxua
+xupa
+uxpa
+
+ytzjokcqlmviha
+sykbmizchvq
+aocvizymhkq
+ivhkcqlzym
+iayelkzqmtchv
+
+aekxzstuc
+czetkxsau
+zqpakexsuct
+zuxtacske
+kuszetcax
+
+czlkiprvydnmsoxqwajgb
+byszdijkplawcvnm
+ikmwandcjzlvybsp
+nbvwlikjscdmpzay
+
+fpuxqtigly
+hpuqkfxigyt
+tifpygqkux
+uygqftwpxi
+
+gvdwnrefpj
+nwgapvedr
+egdvwnrp
+xshwezgipdvr
+
+joefgnu
+tknuhvfy
+
+rjo
+rpjyos
+rjo
+roj
+jro
+
+zxvatmfbujgryinokwehsc
+xjzdusehibgtvncmkflyao
+
+fpnkyo
+nopfky
+kpnyof
+ponkfy
+tnpfoyk
+
+mevhflgowbkqdjutrzys
+qrgmkeohvstnbwfdjluy
+
+pejhrgwtmcny
+hjangqtbprsmwe
+umiegvdprwtznhj
+nhgptresjwlm
+
+ohgmls
+othljm
+jmhtlso
+mhxlcnp
+
+dtufxjrbq
+rdfjxtqbu
+qjtdufbrx
+
+iexvaok
+kexu
+xkje
+xkfe
+
+dpursykgo
+ugkrsqpody
+sokpgyrdnu
+kwsuoyrpdg
+sovjiydkagmuptbrhcf
+
+mwxcqs
+mcwxqs
+mwxqsc
+tcswmxq
+
+cqatfowbvmirly
+woibncaylqgvsf
+
+bico
+izdt
+tiz
+
+af
+fkq
+f
+fyb
+f
+
+wxftpjclsrhm
+sdzuvanek
+
+jr
+rjp
+rj
+
+zhpknlosiadcfbjweuqvy
+ulbkhapqzisefdyonjc
+
+oivjy
+djvwbofy
+kvlqyxrj
+bsivdyjf
+
+kifcamqwgy
+amfkgicyq
+miygkcafq
+
+egslifrtvcnhk
+vymgiprjzcxasbqn
+
+gji
+g
+oar
+jgk
+
+gxtkohsqcvmrjzie
+jfghvuxokznqwsdmarcl
+
+xvlnpjdar
+vldnopxaj
+dtnpsayjvlc
+dgjvalnmp
+mfnvjdpal
+
+mnaxd
+xmda
+kdaxm
+
+szpeac
+ezpsac
+aesxpcz
+
+vgpldyruqmfbsehzkxjwa
+wrxmvtqgyjsdazlkbofeuhc
+ablmzyevqgswfnxkdrphuj
+
+aoedxnzjqsbyihtpkcfuwl
+dsbeyathwxjupozlqncikf
+
+mwzkrnhp
+okqj
+
+s
+s
+
+erjyvcwhuitdaogsnfb
+dculesyjotbwhavfirn
+swfbohtjdciaurenyv
+ubsvfamrjoynwchitdke
+
+yb
+yb
+by
+
+pbrhzvjcsgeylfxt
+sjcyezvxfgbhtplr
+
+rphvaxw
+zhjapvrxw
+xahvwspr
+lpdqrvwahmx
+
+rpmild
+vlrpswnb
+ylrezfpi
+pbraslm
+utxgqhpjkorl
+
+pizbmcxreftywhdq
+pqyezcxtidgmhfrw
+ixrctphwqydzfme
+fxdhpyctwrinmazqe
+pctzyrhdiqwmxef
+
+wasjdyzgfu
+zfdyujgwsa
+wbyzjgadufs
+afzswydguj
+
+zqanmksjruhx
+qljaunzmkrshx
+jrxqsmzknhua
+rjazknumxqhs
+kuzqxhjmasrn
+
+virdpbztchkgo
+hdiopebvzaw
+
+ziwscmotk
+jwmas
+
+h
+h
+h
+h
+h
+
+qhywbkuvnst
+zmynwxvufqarkbeht
+
+onfvrqxa
+xrvqnofa
+fiuarnvoxq
+qvzafonrx
+fqvxebnaolr
+
+kmfulryg
+bkswufgylmr
+myulgjrfk
+gouyxrlkmf
+
+skerjmgbvtcphdzafniyxo
+ljybizemsvhokxrdcagptnf
+
+oyt
+hytx
+mdtyjrslkczu
+bvyto
+
+mpwv
+acvbp
+
+m
+ftz
+
+kvtmidlngo
+edznioyvkx
+kofvirdn
diff --git a/2020/inputs/day_7.txt b/2020/inputs/day_7.txt
new file mode 100644
index 0000000..04950b5
--- /dev/null
+++ b/2020/inputs/day_7.txt
@@ -0,0 +1,594 @@
+striped white bags contain 4 drab silver bags.
+drab silver bags contain no other bags.
+pale plum bags contain 1 dark black bag.
+muted gold bags contain 1 wavy red bag, 3 mirrored violet bags, 5 bright gold bags, 5 plaid white bags.
+muted teal bags contain 2 pale beige bags, 5 clear beige bags, 2 dotted gold bags, 4 posh cyan bags.
+posh coral bags contain 1 light silver bag, 2 dull blue bags, 3 dim fuchsia bags, 2 dotted magenta bags.
+faded black bags contain 4 light silver bags.
+muted lavender bags contain 1 pale gold bag.
+clear fuchsia bags contain 1 dull gray bag, 2 shiny indigo bags, 3 posh olive bags, 5 vibrant plum bags.
+shiny olive bags contain 1 dotted gold bag, 5 bright violet bags.
+vibrant lavender bags contain 3 dotted aqua bags, 4 pale chartreuse bags, 5 mirrored blue bags.
+pale fuchsia bags contain 5 pale crimson bags, 2 dull teal bags.
+clear lavender bags contain 5 shiny fuchsia bags, 5 wavy teal bags.
+light chartreuse bags contain 5 mirrored yellow bags, 3 bright maroon bags.
+mirrored white bags contain 1 bright gray bag, 4 plaid blue bags.
+dark teal bags contain 4 bright maroon bags, 5 plaid bronze bags, 1 dark brown bag.
+wavy yellow bags contain 4 dim silver bags, 1 striped tomato bag, 5 clear chartreuse bags.
+dark turquoise bags contain 4 clear plum bags.
+posh gray bags contain 2 faded purple bags, 2 faded orange bags.
+wavy tomato bags contain 1 dark purple bag.
+vibrant gray bags contain 3 muted gray bags, 1 dark fuchsia bag, 5 posh white bags, 5 posh tomato bags.
+light crimson bags contain 2 dotted chartreuse bags.
+dull gray bags contain 4 muted brown bags, 2 shiny blue bags, 4 dim crimson bags.
+drab red bags contain 2 bright cyan bags, 1 pale brown bag.
+dotted salmon bags contain 5 mirrored indigo bags.
+vibrant green bags contain 2 dark coral bags.
+light magenta bags contain 4 clear bronze bags, 4 dull teal bags, 4 posh salmon bags.
+vibrant purple bags contain 4 posh plum bags, 2 bright gray bags.
+posh lime bags contain 3 plaid yellow bags, 4 posh salmon bags.
+bright white bags contain 4 dull aqua bags, 1 shiny silver bag.
+faded blue bags contain 5 muted cyan bags, 2 mirrored coral bags.
+dim green bags contain 2 posh lavender bags.
+faded gray bags contain 2 dark gold bags, 1 drab turquoise bag.
+wavy black bags contain 4 dim fuchsia bags, 1 muted orange bag, 4 drab salmon bags.
+plaid plum bags contain 5 dotted tomato bags, 1 shiny beige bag.
+bright tan bags contain 2 posh salmon bags.
+wavy gold bags contain 1 faded olive bag, 5 vibrant black bags, 3 dull orange bags.
+dull fuchsia bags contain 1 faded crimson bag, 5 vibrant white bags.
+shiny maroon bags contain 5 dull lavender bags, 1 dim white bag.
+wavy white bags contain 5 light teal bags, 4 dim salmon bags, 3 dotted red bags, 5 dark red bags.
+dim cyan bags contain 1 muted orange bag.
+muted cyan bags contain 4 dull turquoise bags, 5 posh gray bags, 5 clear turquoise bags, 1 shiny plum bag.
+posh violet bags contain 5 plaid crimson bags, 5 muted purple bags, 1 wavy beige bag, 2 mirrored orange bags.
+faded purple bags contain 3 plaid blue bags, 1 dull lavender bag, 1 muted orange bag, 2 dotted tomato bags.
+wavy beige bags contain 1 dotted beige bag.
+dim black bags contain 1 wavy blue bag, 1 plaid black bag, 3 pale lavender bags, 2 light violet bags.
+dotted lavender bags contain 1 plaid blue bag, 5 dim crimson bags.
+dark yellow bags contain 3 posh green bags.
+wavy salmon bags contain 1 clear aqua bag, 3 mirrored crimson bags, 3 pale magenta bags, 2 dull teal bags.
+clear silver bags contain 3 faded tan bags, 5 faded aqua bags, 1 clear tomato bag.
+vibrant bronze bags contain 1 faded maroon bag, 4 plaid indigo bags, 2 bright purple bags, 5 dim violet bags.
+pale brown bags contain 1 dull lavender bag, 2 clear turquoise bags.
+faded salmon bags contain 1 pale silver bag.
+dark gray bags contain 2 pale teal bags.
+posh red bags contain 3 faded black bags, 2 dull red bags.
+dim indigo bags contain 3 bright green bags, 2 dotted tomato bags, 5 bright magenta bags.
+dull maroon bags contain 5 light green bags.
+wavy teal bags contain 5 faded tan bags, 4 clear orange bags.
+pale chartreuse bags contain 5 bright blue bags, 3 light indigo bags, 3 shiny white bags, 3 wavy bronze bags.
+mirrored gray bags contain 4 vibrant tomato bags, 1 dark red bag, 5 drab silver bags, 3 posh magenta bags.
+dark lavender bags contain 4 dotted white bags, 5 vibrant chartreuse bags, 2 dim teal bags.
+shiny turquoise bags contain 3 dim lime bags, 5 bright cyan bags, 2 pale green bags.
+shiny indigo bags contain 2 dark fuchsia bags, 4 posh chartreuse bags.
+pale crimson bags contain 5 mirrored silver bags, 2 posh black bags.
+light salmon bags contain 2 vibrant orange bags, 2 dotted red bags.
+plaid orange bags contain 1 dotted turquoise bag, 4 vibrant brown bags.
+dim maroon bags contain 5 shiny gold bags, 4 mirrored maroon bags.
+muted green bags contain 1 plaid plum bag.
+faded indigo bags contain 3 faded purple bags, 4 vibrant indigo bags, 1 light coral bag.
+dull blue bags contain 5 dull salmon bags, 2 wavy magenta bags.
+vibrant black bags contain 1 light coral bag, 5 vibrant cyan bags, 3 dim magenta bags.
+striped lime bags contain 1 striped maroon bag, 2 vibrant brown bags.
+drab brown bags contain 1 faded olive bag, 5 dotted beige bags.
+dark plum bags contain 5 faded brown bags.
+clear olive bags contain 3 dull aqua bags, 5 drab yellow bags.
+wavy crimson bags contain 2 posh plum bags, 2 dull aqua bags, 5 shiny teal bags, 2 vibrant purple bags.
+mirrored olive bags contain 2 wavy gold bags.
+dim crimson bags contain no other bags.
+faded plum bags contain 1 plaid indigo bag.
+light maroon bags contain 3 vibrant orange bags, 2 clear olive bags, 3 clear brown bags, 1 pale black bag.
+posh white bags contain 3 dull green bags, 3 clear brown bags.
+drab black bags contain 2 shiny turquoise bags.
+light purple bags contain 2 pale black bags, 5 light silver bags, 1 drab coral bag.
+pale yellow bags contain 2 vibrant orange bags, 5 posh black bags, 2 vibrant tomato bags, 3 dotted lavender bags.
+dull cyan bags contain 5 wavy beige bags, 1 dull yellow bag, 3 drab lime bags, 3 drab chartreuse bags.
+drab lavender bags contain 2 plaid black bags, 4 dotted gray bags, 1 dim silver bag, 2 shiny gold bags.
+striped brown bags contain 5 light maroon bags, 3 light red bags, 3 clear indigo bags.
+drab tomato bags contain 2 light black bags, 2 clear salmon bags.
+dotted red bags contain 4 dim salmon bags, 5 striped indigo bags.
+vibrant teal bags contain 5 bright black bags, 1 dark purple bag, 2 bright turquoise bags.
+striped teal bags contain 4 mirrored silver bags.
+dull beige bags contain 4 clear olive bags, 4 light teal bags, 3 bright plum bags, 4 dotted lavender bags.
+light violet bags contain 2 dull lavender bags, 4 bright gray bags, 5 vibrant orange bags, 3 wavy magenta bags.
+dim brown bags contain 2 clear plum bags, 2 shiny teal bags, 2 posh salmon bags.
+striped magenta bags contain 4 posh turquoise bags, 3 pale cyan bags, 3 faded indigo bags.
+bright orange bags contain 4 plaid gray bags, 4 dark black bags, 4 faded red bags, 4 bright black bags.
+muted olive bags contain 2 dotted crimson bags, 4 faded lavender bags, 2 vibrant gray bags.
+plaid teal bags contain 2 light yellow bags, 4 drab cyan bags, 3 light green bags.
+faded fuchsia bags contain 1 posh silver bag, 4 drab chartreuse bags, 4 drab teal bags.
+dim silver bags contain 1 pale turquoise bag.
+bright lime bags contain 1 striped silver bag, 5 muted teal bags, 1 shiny tan bag, 1 dark silver bag.
+dotted green bags contain 3 posh green bags, 1 drab yellow bag.
+drab purple bags contain 5 bright violet bags, 1 posh tomato bag.
+dull bronze bags contain 4 mirrored black bags.
+striped tomato bags contain 1 posh gray bag, 2 posh magenta bags.
+bright crimson bags contain 2 light olive bags, 4 clear tan bags, 3 drab fuchsia bags.
+bright turquoise bags contain 4 pale teal bags, 3 drab silver bags.
+shiny lavender bags contain 2 striped lime bags, 2 plaid tomato bags, 1 faded orange bag, 5 wavy magenta bags.
+light tomato bags contain 5 dotted olive bags.
+wavy magenta bags contain no other bags.
+vibrant fuchsia bags contain 5 posh brown bags, 5 plaid indigo bags.
+dark tomato bags contain 3 shiny plum bags.
+pale bronze bags contain 5 plaid black bags, 5 vibrant brown bags, 2 dim lime bags, 4 muted bronze bags.
+striped fuchsia bags contain 3 muted brown bags, 2 pale chartreuse bags, 1 dim magenta bag.
+dark brown bags contain 4 clear bronze bags.
+posh teal bags contain 5 dotted plum bags, 2 drab gray bags, 3 dull fuchsia bags.
+wavy turquoise bags contain 1 dull lavender bag.
+striped maroon bags contain 4 muted yellow bags, 4 clear orange bags, 4 vibrant orange bags.
+shiny green bags contain 3 muted brown bags, 1 vibrant black bag, 4 wavy cyan bags, 3 posh brown bags.
+plaid salmon bags contain 4 mirrored indigo bags, 2 wavy white bags, 5 mirrored bronze bags, 3 light coral bags.
+dotted magenta bags contain 2 light olive bags, 2 dark red bags, 4 clear green bags, 3 dim plum bags.
+light orange bags contain 5 dark plum bags, 3 bright maroon bags, 2 dotted lime bags.
+clear brown bags contain 3 dim white bags, 2 posh magenta bags.
+vibrant turquoise bags contain 2 striped yellow bags, 1 mirrored crimson bag.
+muted coral bags contain 4 wavy gold bags, 2 dim tan bags, 1 shiny green bag.
+plaid crimson bags contain 1 dull aqua bag.
+vibrant plum bags contain 4 striped tomato bags, 1 striped turquoise bag.
+dark coral bags contain 5 posh black bags, 1 shiny beige bag, 3 pale brown bags.
+mirrored brown bags contain 1 clear blue bag, 1 dull indigo bag.
+bright blue bags contain 2 light violet bags, 1 dotted tomato bag.
+drab cyan bags contain 2 dim turquoise bags, 5 clear violet bags.
+dotted coral bags contain 3 dotted aqua bags.
+shiny yellow bags contain 1 wavy cyan bag.
+shiny red bags contain 5 shiny beige bags, 3 dotted lime bags, 5 dotted plum bags.
+muted lime bags contain 3 dark turquoise bags, 3 bright chartreuse bags.
+pale gray bags contain 5 dotted coral bags, 4 wavy teal bags, 2 clear aqua bags.
+pale blue bags contain 5 dull salmon bags, 3 posh bronze bags, 2 vibrant tomato bags.
+dim turquoise bags contain 4 posh aqua bags, 2 dark turquoise bags.
+pale turquoise bags contain 5 vibrant brown bags, 2 shiny maroon bags.
+dim gray bags contain 2 faded tomato bags, 2 faded indigo bags.
+clear aqua bags contain 1 light turquoise bag, 3 dotted turquoise bags.
+faded turquoise bags contain 5 muted lime bags.
+clear plum bags contain 2 plaid indigo bags, 5 drab yellow bags.
+vibrant white bags contain 2 bright violet bags, 4 dark plum bags, 1 dim plum bag, 4 plaid indigo bags.
+dark orange bags contain 3 posh purple bags, 5 clear orange bags, 1 dim white bag.
+light olive bags contain 3 drab green bags.
+muted salmon bags contain 4 muted cyan bags.
+clear maroon bags contain 2 muted yellow bags, 5 plaid crimson bags, 1 clear turquoise bag.
+wavy orange bags contain 4 vibrant blue bags, 4 posh brown bags, 2 pale turquoise bags, 5 shiny orange bags.
+dotted gold bags contain 3 posh magenta bags, 1 faded crimson bag, 3 dotted olive bags, 3 plaid olive bags.
+dull purple bags contain 5 drab salmon bags, 4 dim lavender bags.
+light bronze bags contain 2 wavy indigo bags.
+muted turquoise bags contain 5 clear turquoise bags, 4 plaid violet bags, 4 clear orange bags, 2 posh maroon bags.
+mirrored blue bags contain 4 clear chartreuse bags.
+drab tan bags contain 3 striped violet bags, 2 bright silver bags, 2 dark bronze bags, 1 mirrored black bag.
+dark maroon bags contain 1 vibrant orange bag.
+drab yellow bags contain 1 vibrant blue bag, 2 dim violet bags.
+light cyan bags contain 4 posh beige bags.
+vibrant salmon bags contain 3 wavy gold bags.
+muted orange bags contain 3 dotted tomato bags, 4 vibrant tomato bags, 5 dull lavender bags.
+dull turquoise bags contain 1 wavy white bag.
+dotted indigo bags contain 3 wavy bronze bags.
+dark red bags contain 4 wavy bronze bags, 5 wavy turquoise bags.
+light coral bags contain 4 clear tan bags, 2 vibrant beige bags, 1 dull lavender bag, 5 shiny white bags.
+mirrored turquoise bags contain 5 clear fuchsia bags, 3 mirrored black bags, 4 plaid tan bags.
+mirrored yellow bags contain 4 pale turquoise bags, 2 wavy orange bags, 3 drab coral bags, 4 dim chartreuse bags.
+dotted fuchsia bags contain 4 dim bronze bags, 4 striped indigo bags.
+dotted purple bags contain 5 posh maroon bags, 1 dim yellow bag.
+clear coral bags contain 5 dark olive bags, 2 wavy bronze bags, 3 light red bags.
+mirrored teal bags contain 3 drab yellow bags.
+faded green bags contain 2 dark purple bags.
+light lime bags contain 4 bright chartreuse bags, 5 clear tomato bags, 2 bright green bags, 2 faded teal bags.
+bright yellow bags contain 4 dull purple bags, 3 faded beige bags.
+bright maroon bags contain 2 vibrant blue bags, 5 bright violet bags, 5 plaid indigo bags, 3 vibrant orange bags.
+faded red bags contain 5 pale brown bags, 4 striped tomato bags, 2 bright green bags.
+muted maroon bags contain 1 dark tan bag, 5 drab teal bags, 4 dull maroon bags.
+plaid coral bags contain 5 bright blue bags, 1 dotted indigo bag.
+dotted brown bags contain 1 dull beige bag, 2 bright indigo bags, 2 striped chartreuse bags, 1 muted silver bag.
+wavy coral bags contain 2 clear cyan bags, 2 muted teal bags, 1 faded red bag, 2 mirrored silver bags.
+faded coral bags contain 3 bright green bags, 1 bright cyan bag, 3 plaid blue bags, 5 wavy lavender bags.
+dim gold bags contain 5 dim teal bags, 1 vibrant tomato bag, 5 pale chartreuse bags, 3 bright indigo bags.
+bright salmon bags contain 5 plaid chartreuse bags, 5 light tan bags, 5 vibrant maroon bags.
+wavy violet bags contain 4 bright green bags.
+mirrored lavender bags contain 5 drab plum bags, 2 drab turquoise bags, 2 dark magenta bags.
+faded aqua bags contain 3 faded teal bags, 1 dark red bag.
+muted yellow bags contain 1 mirrored silver bag, 1 striped white bag, 3 mirrored gold bags, 1 muted gray bag.
+pale coral bags contain 2 striped gray bags, 2 clear beige bags.
+mirrored cyan bags contain 1 pale beige bag, 4 dim crimson bags.
+dotted aqua bags contain 4 dim crimson bags, 3 vibrant beige bags.
+dark white bags contain 4 dim maroon bags, 1 light olive bag, 3 dull fuchsia bags, 4 mirrored maroon bags.
+dotted chartreuse bags contain 5 clear tan bags, 2 clear white bags, 2 dark coral bags, 4 faded brown bags.
+mirrored red bags contain 5 faded violet bags, 2 dark chartreuse bags.
+drab maroon bags contain 3 bright violet bags.
+dark violet bags contain 5 dark turquoise bags, 1 muted blue bag, 4 plaid bronze bags.
+dull silver bags contain 4 dotted lime bags, 3 dotted silver bags, 4 dull red bags, 3 pale white bags.
+striped lavender bags contain 5 drab silver bags.
+light yellow bags contain 3 posh plum bags, 3 bright olive bags, 4 wavy crimson bags.
+posh chartreuse bags contain 2 bright violet bags.
+pale green bags contain 5 shiny lime bags, 3 faded teal bags, 5 posh gray bags, 1 posh chartreuse bag.
+shiny lime bags contain 1 dull beige bag, 4 light aqua bags, 4 dotted tomato bags.
+plaid tan bags contain 1 mirrored chartreuse bag.
+drab coral bags contain 5 posh gray bags, 2 dull black bags.
+drab salmon bags contain 4 drab yellow bags, 3 mirrored green bags.
+faded yellow bags contain 2 mirrored beige bags, 1 bright turquoise bag, 1 vibrant black bag.
+bright tomato bags contain 4 clear brown bags.
+muted beige bags contain 1 clear turquoise bag.
+striped black bags contain 1 plaid chartreuse bag.
+bright cyan bags contain 5 clear tomato bags.
+striped coral bags contain 2 muted red bags.
+posh bronze bags contain 5 striped yellow bags.
+mirrored maroon bags contain 4 vibrant tomato bags, 5 bright green bags, 4 vibrant maroon bags, 4 striped violet bags.
+dotted turquoise bags contain 1 posh beige bag, 5 muted silver bags.
+bright purple bags contain 5 drab silver bags, 5 shiny blue bags, 2 plaid bronze bags, 4 faded magenta bags.
+posh plum bags contain 5 striped white bags, 2 pale brown bags, 1 wavy turquoise bag.
+dark crimson bags contain 1 dull black bag, 2 dull yellow bags, 1 posh white bag, 3 dotted lime bags.
+plaid bronze bags contain 5 striped indigo bags, 5 light indigo bags, 4 wavy magenta bags, 3 vibrant blue bags.
+clear red bags contain 4 posh silver bags, 1 dim aqua bag.
+striped salmon bags contain 3 bright violet bags, 4 faded olive bags, 5 dim turquoise bags.
+dim bronze bags contain no other bags.
+wavy brown bags contain 4 vibrant turquoise bags.
+wavy maroon bags contain 1 mirrored bronze bag, 2 posh fuchsia bags, 1 mirrored indigo bag.
+mirrored salmon bags contain 2 faded lavender bags.
+dark aqua bags contain 4 faded teal bags, 1 dim tomato bag.
+pale violet bags contain 5 clear blue bags, 3 plaid blue bags, 5 dim teal bags, 2 pale black bags.
+mirrored crimson bags contain 2 posh magenta bags, 2 dotted aqua bags, 1 dim bronze bag.
+bright indigo bags contain 4 bright violet bags.
+muted violet bags contain 4 mirrored maroon bags, 2 dull red bags, 4 plaid tomato bags, 1 pale yellow bag.
+shiny gold bags contain 3 vibrant blue bags, 5 plaid blue bags, 2 dark red bags, 1 dull green bag.
+clear green bags contain 4 dotted lavender bags.
+dark indigo bags contain 2 light lime bags, 3 wavy brown bags.
+muted fuchsia bags contain 3 plaid green bags.
+bright silver bags contain 4 dim tomato bags, 3 clear olive bags, 1 dull teal bag.
+plaid purple bags contain 4 dark silver bags, 1 vibrant crimson bag, 4 dark black bags, 3 faded magenta bags.
+clear chartreuse bags contain 4 posh plum bags.
+plaid tomato bags contain 2 wavy aqua bags, 3 striped indigo bags, 1 wavy magenta bag.
+posh cyan bags contain 3 drab green bags, 3 bright chartreuse bags, 3 muted gray bags, 2 light black bags.
+posh turquoise bags contain 5 wavy teal bags, 3 light tan bags, 1 dull gold bag.
+plaid olive bags contain 2 dim chartreuse bags.
+shiny orange bags contain 4 pale brown bags, 3 dim salmon bags.
+clear gray bags contain 4 bright salmon bags, 5 vibrant crimson bags.
+shiny brown bags contain 1 bright gold bag, 3 clear tomato bags.
+muted aqua bags contain 2 mirrored indigo bags, 1 dim tan bag.
+plaid red bags contain 1 clear plum bag.
+muted bronze bags contain 4 clear white bags, 3 dotted plum bags.
+plaid blue bags contain 2 dull lavender bags, 5 wavy magenta bags, 1 light indigo bag.
+shiny salmon bags contain 2 dotted black bags, 1 light magenta bag.
+shiny cyan bags contain 5 faded violet bags, 3 mirrored bronze bags, 4 dark maroon bags, 2 wavy lavender bags.
+drab magenta bags contain 2 light blue bags, 1 wavy orange bag, 5 posh chartreuse bags.
+dim violet bags contain 5 dark red bags, 4 light violet bags, 2 dotted fuchsia bags, 2 plaid tomato bags.
+faded crimson bags contain 3 clear silver bags, 1 vibrant beige bag.
+plaid fuchsia bags contain 3 plaid red bags, 4 drab purple bags, 4 clear lime bags, 3 dim turquoise bags.
+dull green bags contain 5 dotted beige bags, 4 drab silver bags, 4 posh magenta bags, 1 muted orange bag.
+wavy indigo bags contain 2 pale tan bags.
+plaid lavender bags contain 1 dark black bag.
+clear bronze bags contain 3 pale teal bags.
+clear blue bags contain 2 light teal bags, 5 dotted olive bags, 3 bright indigo bags.
+posh aqua bags contain 2 light violet bags, 2 dull salmon bags, 1 vibrant violet bag.
+dark gold bags contain 2 striped maroon bags.
+vibrant chartreuse bags contain 3 wavy silver bags.
+dark magenta bags contain 1 clear silver bag.
+dim red bags contain 3 wavy indigo bags, 2 muted teal bags.
+muted silver bags contain 5 pale crimson bags, 2 dotted tomato bags.
+mirrored tan bags contain 1 pale salmon bag.
+dull violet bags contain 2 dull black bags.
+striped beige bags contain 4 dark maroon bags, 2 wavy orange bags.
+striped turquoise bags contain 3 light indigo bags, 5 bright maroon bags, 1 light teal bag.
+pale gold bags contain 5 dotted teal bags.
+wavy olive bags contain 3 dotted fuchsia bags.
+clear violet bags contain 1 dotted lavender bag, 5 bright tan bags, 5 dim violet bags, 5 drab salmon bags.
+pale maroon bags contain 4 drab red bags, 1 wavy yellow bag, 1 muted green bag, 1 striped fuchsia bag.
+drab bronze bags contain 4 light gray bags, 3 posh magenta bags, 1 dull yellow bag.
+vibrant gold bags contain 4 dull violet bags, 3 clear white bags, 5 wavy chartreuse bags, 4 pale turquoise bags.
+clear beige bags contain 4 plaid blue bags, 3 shiny plum bags, 1 light silver bag.
+faded silver bags contain 5 drab turquoise bags, 4 plaid green bags, 4 posh yellow bags, 1 plaid blue bag.
+light brown bags contain 1 dark red bag, 1 dotted gray bag.
+shiny violet bags contain 5 posh cyan bags, 5 vibrant plum bags, 5 mirrored chartreuse bags, 4 plaid green bags.
+dark bronze bags contain 4 bright gold bags, 2 striped maroon bags, 4 dark aqua bags, 5 pale chartreuse bags.
+dull black bags contain 2 vibrant tomato bags, 1 vibrant blue bag, 3 pale yellow bags.
+dotted beige bags contain 5 dotted tomato bags, 1 striped indigo bag.
+clear indigo bags contain 3 dark violet bags.
+bright coral bags contain 1 dark indigo bag.
+drab turquoise bags contain 5 drab plum bags, 3 pale magenta bags, 5 drab red bags, 4 dull olive bags.
+shiny fuchsia bags contain 2 dull lavender bags, 5 striped tomato bags.
+dull indigo bags contain 3 pale turquoise bags, 3 faded tomato bags, 5 dim magenta bags, 3 drab indigo bags.
+dim aqua bags contain 4 faded brown bags, 1 mirrored lime bag.
+muted purple bags contain 3 dim salmon bags, 4 light violet bags, 2 striped turquoise bags, 2 shiny teal bags.
+dotted black bags contain 3 dotted cyan bags, 4 wavy magenta bags, 4 posh chartreuse bags.
+drab violet bags contain 4 dark gray bags, 5 dull chartreuse bags, 4 plaid gray bags.
+plaid green bags contain 3 dark red bags, 1 wavy crimson bag, 4 light coral bags, 4 striped indigo bags.
+faded brown bags contain 3 dark orange bags.
+light teal bags contain 3 striped indigo bags, 4 dim bronze bags.
+plaid black bags contain 2 mirrored crimson bags, 5 dim silver bags, 4 posh purple bags.
+shiny blue bags contain 2 plaid green bags, 4 plaid crimson bags, 2 faded plum bags.
+plaid lime bags contain 2 striped maroon bags.
+pale lavender bags contain 2 mirrored indigo bags, 1 pale green bag, 5 dim chartreuse bags, 3 pale white bags.
+drab chartreuse bags contain 1 bright salmon bag, 4 vibrant brown bags, 1 muted violet bag.
+light indigo bags contain no other bags.
+plaid violet bags contain 2 dim white bags, 4 faded lavender bags.
+drab gold bags contain 5 dotted aqua bags, 3 muted beige bags, 4 faded black bags, 5 dark red bags.
+mirrored bronze bags contain 2 plaid blue bags, 1 light orange bag.
+dim olive bags contain 1 striped silver bag.
+plaid white bags contain 5 pale turquoise bags, 4 mirrored orange bags, 2 vibrant aqua bags.
+wavy purple bags contain 3 dark silver bags, 1 dull white bag, 3 dotted magenta bags, 2 dim salmon bags.
+clear orange bags contain 5 striped indigo bags, 1 wavy bronze bag, 4 vibrant blue bags.
+plaid gray bags contain 1 dull aqua bag, 3 dull olive bags, 3 posh black bags.
+vibrant violet bags contain 2 vibrant maroon bags.
+pale olive bags contain 2 vibrant fuchsia bags.
+muted brown bags contain 5 pale teal bags, 2 light brown bags, 4 light tomato bags.
+posh lavender bags contain 4 bright indigo bags, 1 striped indigo bag, 5 dark purple bags.
+dotted blue bags contain 4 muted salmon bags, 3 mirrored red bags, 5 pale white bags, 3 clear red bags.
+dim purple bags contain 4 muted cyan bags.
+bright fuchsia bags contain 5 muted black bags.
+vibrant lime bags contain 3 posh purple bags, 1 drab aqua bag.
+wavy green bags contain 3 drab red bags, 2 faded brown bags, 2 wavy cyan bags.
+dull lime bags contain 3 bright salmon bags, 4 posh crimson bags, 1 drab salmon bag, 4 pale yellow bags.
+mirrored aqua bags contain 4 striped violet bags, 1 striped indigo bag, 2 striped tomato bags.
+striped tan bags contain 4 light blue bags, 4 dull beige bags.
+drab green bags contain 5 muted silver bags, 1 vibrant orange bag, 2 striped indigo bags, 4 striped tomato bags.
+dotted orange bags contain 5 mirrored white bags, 5 muted orange bags, 2 drab tomato bags, 2 dull white bags.
+dim tomato bags contain 2 dull lavender bags.
+dull magenta bags contain 3 faded brown bags, 5 faded teal bags.
+faded maroon bags contain 4 posh brown bags, 2 dotted aqua bags.
+plaid cyan bags contain 4 faded crimson bags, 4 light chartreuse bags, 1 light crimson bag, 1 posh fuchsia bag.
+dim salmon bags contain 1 dotted olive bag, 4 light indigo bags.
+faded chartreuse bags contain 4 bright gold bags, 4 clear silver bags.
+light plum bags contain 2 dotted chartreuse bags, 1 drab white bag.
+posh silver bags contain 3 mirrored black bags, 4 dull blue bags.
+dull salmon bags contain 4 dim white bags, 5 clear tomato bags, 2 mirrored maroon bags.
+light green bags contain 4 plaid chartreuse bags, 5 vibrant aqua bags.
+posh indigo bags contain 2 dull olive bags, 2 dotted lime bags, 1 drab red bag.
+dark blue bags contain 5 dotted green bags, 3 wavy crimson bags, 4 clear silver bags.
+bright black bags contain 5 posh bronze bags, 3 bright cyan bags, 5 muted black bags.
+bright lavender bags contain 1 shiny indigo bag, 1 dim yellow bag, 1 wavy yellow bag.
+faded white bags contain 1 dotted black bag, 5 wavy red bags.
+muted black bags contain 1 mirrored aqua bag, 4 dark red bags, 5 dull yellow bags.
+light turquoise bags contain 3 shiny plum bags.
+vibrant coral bags contain 2 shiny orange bags, 4 bright olive bags.
+vibrant aqua bags contain 2 wavy crimson bags, 2 muted orange bags.
+dotted tan bags contain 1 light indigo bag, 2 dim magenta bags.
+posh yellow bags contain 4 faded lavender bags.
+pale lime bags contain 4 mirrored orange bags, 3 dull gray bags, 1 muted magenta bag.
+drab white bags contain 2 faded tan bags, 3 wavy aqua bags.
+shiny tomato bags contain 4 dim coral bags, 3 dotted lime bags.
+wavy plum bags contain 1 bright orange bag.
+dull crimson bags contain 2 pale silver bags, 1 light beige bag, 4 wavy violet bags.
+dotted violet bags contain 4 light indigo bags, 1 dark black bag, 3 pale green bags.
+dark salmon bags contain 5 light tan bags, 4 dim chartreuse bags, 5 faded green bags, 3 light brown bags.
+dull brown bags contain 5 mirrored aqua bags, 5 dim magenta bags, 4 light brown bags, 5 plaid black bags.
+shiny chartreuse bags contain 5 wavy yellow bags, 3 faded aqua bags, 1 bright fuchsia bag, 5 drab plum bags.
+muted red bags contain 3 drab white bags, 5 dim beige bags, 4 bright olive bags.
+posh blue bags contain 1 dotted beige bag, 1 vibrant cyan bag, 4 vibrant brown bags, 2 clear turquoise bags.
+wavy bronze bags contain 4 wavy turquoise bags, 4 dim bronze bags, 3 shiny beige bags, 2 dull lavender bags.
+posh beige bags contain 3 muted gray bags, 4 light salmon bags, 5 striped turquoise bags.
+vibrant red bags contain 5 muted blue bags.
+dark olive bags contain 5 dark maroon bags.
+dotted gray bags contain 3 wavy magenta bags.
+vibrant cyan bags contain 5 dotted lavender bags, 3 vibrant orange bags.
+dark chartreuse bags contain 3 pale white bags, 1 dull lavender bag.
+faded lime bags contain 4 clear green bags, 3 shiny plum bags, 2 light green bags.
+vibrant blue bags contain 1 wavy turquoise bag, 4 dim salmon bags.
+dull tan bags contain 3 dim chartreuse bags, 1 plaid tomato bag, 4 dark brown bags.
+muted gray bags contain 4 clear tan bags, 3 wavy aqua bags, 5 dim white bags.
+clear yellow bags contain 1 drab white bag, 5 dark salmon bags, 2 dull yellow bags.
+clear tomato bags contain 2 dotted gray bags, 5 vibrant beige bags, 1 bright maroon bag, 2 drab green bags.
+shiny tan bags contain 5 posh lavender bags, 5 pale yellow bags.
+dark black bags contain 4 muted purple bags, 5 light gray bags, 5 drab red bags.
+striped plum bags contain 3 dull red bags, 1 dark tomato bag, 4 dark yellow bags, 5 plaid cyan bags.
+light gray bags contain 3 plaid chartreuse bags.
+light aqua bags contain 4 wavy magenta bags, 3 light black bags.
+vibrant brown bags contain 1 bright blue bag, 1 posh black bag.
+posh tomato bags contain 5 wavy magenta bags.
+dotted bronze bags contain 4 mirrored chartreuse bags.
+mirrored violet bags contain 2 clear maroon bags, 1 light red bag, 4 mirrored gray bags.
+dark purple bags contain 5 bright blue bags, 3 plaid blue bags.
+faded beige bags contain 4 plaid bronze bags, 5 vibrant turquoise bags, 3 pale orange bags, 5 mirrored aqua bags.
+mirrored green bags contain 1 dotted fuchsia bag, 5 light indigo bags, 3 shiny beige bags.
+striped violet bags contain 5 drab silver bags, 2 dim crimson bags, 3 plaid blue bags.
+mirrored tomato bags contain 5 light lavender bags.
+posh purple bags contain 3 pale orange bags.
+dim blue bags contain 5 dotted plum bags, 1 light orange bag, 4 dim maroon bags.
+dark cyan bags contain 4 vibrant white bags, 4 dull white bags, 1 posh purple bag.
+drab beige bags contain 5 dull purple bags.
+vibrant olive bags contain 5 light silver bags.
+plaid beige bags contain 3 muted silver bags, 4 vibrant orange bags.
+wavy silver bags contain 2 dim crimson bags, 4 shiny maroon bags, 4 pale indigo bags.
+posh crimson bags contain 2 light violet bags, 4 pale coral bags, 3 plaid bronze bags.
+vibrant crimson bags contain 3 dull red bags.
+dotted olive bags contain no other bags.
+mirrored beige bags contain 2 plaid gray bags, 5 mirrored yellow bags.
+bright brown bags contain 2 faded aqua bags, 1 dim tomato bag, 5 posh magenta bags.
+bright magenta bags contain 2 posh gray bags, 3 dim salmon bags.
+clear magenta bags contain 2 dim cyan bags, 3 clear red bags, 1 dull fuchsia bag, 4 wavy coral bags.
+clear lime bags contain 5 dull green bags, 2 shiny bronze bags, 2 faded orange bags, 1 bright beige bag.
+muted tan bags contain 4 vibrant maroon bags, 3 vibrant black bags, 5 shiny maroon bags, 5 vibrant turquoise bags.
+pale beige bags contain 3 light tomato bags.
+dark fuchsia bags contain 2 faded brown bags, 3 dotted lavender bags, 4 shiny teal bags, 2 bright blue bags.
+dim magenta bags contain 4 posh chartreuse bags.
+bright aqua bags contain 5 drab violet bags.
+striped crimson bags contain 2 bright green bags.
+dull chartreuse bags contain 4 plaid bronze bags, 2 shiny gray bags, 4 dull lavender bags.
+wavy chartreuse bags contain 1 vibrant tomato bag, 1 dim tomato bag, 3 pale green bags, 1 posh plum bag.
+dotted white bags contain 1 dark teal bag, 4 dotted violet bags, 5 bright beige bags, 3 dim silver bags.
+mirrored purple bags contain 1 posh green bag.
+faded bronze bags contain 4 dotted indigo bags.
+faded lavender bags contain 3 muted purple bags.
+clear turquoise bags contain 4 muted orange bags, 1 striped violet bag, 5 clear tan bags, 5 dim white bags.
+shiny plum bags contain 4 dim crimson bags.
+wavy fuchsia bags contain 3 dotted brown bags, 5 dark magenta bags, 2 dark bronze bags.
+faded olive bags contain 5 plaid indigo bags.
+mirrored orange bags contain 4 striped violet bags, 2 light violet bags, 4 shiny orange bags.
+pale indigo bags contain 3 shiny indigo bags.
+faded tan bags contain 3 shiny maroon bags, 5 posh aqua bags, 1 striped violet bag, 2 dim white bags.
+bright chartreuse bags contain 1 posh black bag, 5 bright gray bags, 3 plaid chartreuse bags.
+drab blue bags contain 1 pale violet bag, 4 vibrant green bags.
+posh tan bags contain 4 shiny lime bags.
+plaid maroon bags contain 2 dotted black bags.
+dull coral bags contain 4 posh coral bags, 1 dotted silver bag, 5 drab beige bags, 1 plaid red bag.
+striped yellow bags contain 1 plaid tomato bag, 1 dotted lavender bag.
+muted magenta bags contain 4 muted black bags.
+dotted cyan bags contain 1 vibrant tomato bag, 3 light indigo bags, 1 wavy turquoise bag.
+dim lavender bags contain 1 muted black bag, 4 pale white bags, 2 mirrored coral bags, 5 pale brown bags.
+bright gold bags contain 5 vibrant green bags.
+light white bags contain 2 striped lime bags, 2 muted lime bags, 5 muted brown bags, 4 bright green bags.
+wavy lavender bags contain 2 vibrant purple bags, 5 posh white bags.
+clear black bags contain 2 posh turquoise bags, 3 dotted orange bags, 3 faded teal bags.
+muted crimson bags contain 1 pale violet bag, 5 drab lavender bags.
+posh green bags contain 4 vibrant beige bags, 5 dark purple bags, 3 dim salmon bags, 3 light black bags.
+vibrant silver bags contain 3 posh coral bags, 4 posh white bags.
+dim coral bags contain 2 posh violet bags, 1 dark cyan bag, 3 shiny green bags, 3 vibrant cyan bags.
+striped red bags contain 5 muted olive bags, 4 wavy teal bags, 3 shiny gray bags, 1 mirrored coral bag.
+bright violet bags contain 3 shiny beige bags, 1 wavy magenta bag, 5 light indigo bags.
+vibrant magenta bags contain 4 striped salmon bags, 1 light tan bag.
+faded gold bags contain 5 light tomato bags, 1 wavy black bag, 4 faded maroon bags.
+muted plum bags contain 1 vibrant brown bag, 2 muted cyan bags, 4 muted salmon bags.
+plaid gold bags contain 5 shiny beige bags, 3 faded fuchsia bags, 5 vibrant cyan bags, 5 shiny gold bags.
+striped indigo bags contain no other bags.
+wavy gray bags contain 2 plaid indigo bags, 3 clear tomato bags, 4 dull blue bags.
+plaid silver bags contain 5 clear salmon bags, 5 faded lime bags, 4 shiny tan bags, 5 mirrored chartreuse bags.
+plaid yellow bags contain 4 shiny chartreuse bags, 1 light lime bag, 2 dull green bags.
+plaid turquoise bags contain 3 dotted aqua bags, 3 posh magenta bags.
+striped olive bags contain 2 faded aqua bags, 5 dotted orange bags, 5 dull turquoise bags, 1 pale violet bag.
+faded teal bags contain 3 striped indigo bags.
+dull red bags contain 1 mirrored gray bag, 4 drab coral bags, 2 bright plum bags, 1 dull green bag.
+dull gold bags contain 5 bright blue bags.
+shiny magenta bags contain 1 light white bag.
+striped green bags contain 1 clear blue bag.
+dull teal bags contain 3 dark purple bags, 4 dim lime bags, 5 clear chartreuse bags.
+faded magenta bags contain 4 shiny gray bags, 5 pale crimson bags, 5 light coral bags, 2 pale white bags.
+pale tomato bags contain 4 dull black bags, 1 posh chartreuse bag, 1 faded cyan bag.
+muted blue bags contain 5 striped white bags, 1 faded orange bag.
+light blue bags contain 4 posh white bags.
+plaid chartreuse bags contain 2 bright gray bags.
+dull aqua bags contain 5 clear tan bags, 5 dotted red bags, 5 vibrant tomato bags.
+light lavender bags contain 5 clear fuchsia bags, 1 striped olive bag.
+bright green bags contain 4 vibrant violet bags, 2 vibrant maroon bags.
+light beige bags contain 1 striped maroon bag.
+drab indigo bags contain 4 posh tomato bags, 5 faded brown bags.
+dotted yellow bags contain 3 wavy violet bags, 4 bright violet bags, 4 vibrant lime bags, 1 pale beige bag.
+striped gold bags contain 2 light indigo bags, 3 dull red bags, 5 vibrant beige bags.
+muted indigo bags contain 5 bright purple bags, 1 pale plum bag, 5 wavy black bags.
+dark lime bags contain 2 faded blue bags.
+shiny white bags contain 4 clear tan bags, 3 pale yellow bags, 5 plaid tomato bags, 4 wavy turquoise bags.
+vibrant maroon bags contain 4 dark red bags, 2 dull aqua bags, 5 wavy aqua bags.
+drab teal bags contain 3 shiny indigo bags.
+bright plum bags contain 2 plaid chartreuse bags.
+vibrant yellow bags contain 3 posh purple bags.
+posh salmon bags contain 4 dim plum bags, 1 pale yellow bag, 2 shiny gold bags.
+shiny black bags contain 3 dim magenta bags.
+bright gray bags contain no other bags.
+dull orange bags contain 3 dotted purple bags.
+pale purple bags contain 2 bright cyan bags, 2 drab teal bags, 2 dotted gold bags, 4 mirrored fuchsia bags.
+dull yellow bags contain 3 posh gray bags.
+muted tomato bags contain 3 faded orange bags.
+drab olive bags contain 4 dim maroon bags, 1 bright turquoise bag, 3 shiny indigo bags, 5 vibrant lavender bags.
+clear salmon bags contain 2 dim chartreuse bags, 2 shiny black bags, 5 dotted indigo bags, 3 dotted aqua bags.
+posh black bags contain 2 wavy turquoise bags, 2 shiny plum bags, 2 mirrored gold bags.
+light gold bags contain 5 shiny tomato bags, 4 light cyan bags.
+shiny coral bags contain 3 faded silver bags.
+plaid magenta bags contain 1 vibrant black bag, 2 bright blue bags.
+dotted teal bags contain 4 faded olive bags, 5 vibrant brown bags, 3 clear salmon bags.
+striped purple bags contain 5 shiny bronze bags.
+dim tan bags contain 2 light tan bags, 1 dotted gold bag, 3 shiny white bags.
+light silver bags contain 5 dotted cyan bags, 4 dotted aqua bags.
+dull white bags contain 5 striped turquoise bags.
+plaid aqua bags contain 3 dim bronze bags, 5 dull brown bags, 3 faded plum bags, 2 mirrored crimson bags.
+dotted silver bags contain 1 faded teal bag.
+dull olive bags contain 1 dark turquoise bag, 3 muted orange bags.
+clear purple bags contain 3 drab salmon bags.
+mirrored plum bags contain 1 vibrant lavender bag.
+bright beige bags contain 4 plaid magenta bags, 1 dull turquoise bag, 4 dim white bags, 1 light aqua bag.
+pale red bags contain 1 muted lavender bag, 2 vibrant teal bags, 4 plaid cyan bags, 5 dull orange bags.
+drab orange bags contain 3 bright plum bags, 5 vibrant chartreuse bags.
+mirrored gold bags contain 2 wavy magenta bags.
+posh maroon bags contain 3 dotted lime bags, 2 muted black bags, 3 faded green bags.
+clear white bags contain 4 pale black bags.
+pale silver bags contain 2 dim coral bags, 2 dull lavender bags, 2 dark teal bags, 3 wavy green bags.
+vibrant tomato bags contain 5 dull lavender bags.
+striped orange bags contain 5 shiny salmon bags, 1 pale gold bag, 4 mirrored gray bags, 1 plaid black bag.
+dim beige bags contain 5 dim salmon bags, 2 striped yellow bags, 5 shiny orange bags, 5 light salmon bags.
+clear gold bags contain 2 dim salmon bags, 4 vibrant cyan bags.
+dim teal bags contain 3 light indigo bags, 3 pale green bags, 5 muted bronze bags.
+shiny silver bags contain 3 drab red bags, 1 pale magenta bag, 3 plaid blue bags, 4 pale white bags.
+dark beige bags contain 4 posh black bags, 1 dark maroon bag.
+bright bronze bags contain 4 mirrored yellow bags, 1 vibrant salmon bag, 2 mirrored teal bags, 1 shiny beige bag.
+dotted maroon bags contain 1 clear tomato bag.
+bright olive bags contain 3 striped tomato bags, 3 plaid indigo bags, 3 posh magenta bags.
+faded tomato bags contain 5 bright violet bags.
+mirrored magenta bags contain 3 wavy coral bags, 4 dull tan bags, 3 wavy chartreuse bags.
+striped aqua bags contain 3 drab teal bags, 3 drab crimson bags, 5 plaid gold bags, 2 vibrant aqua bags.
+clear crimson bags contain 5 striped chartreuse bags, 5 vibrant blue bags.
+striped blue bags contain 4 dull red bags, 3 vibrant white bags, 4 posh black bags.
+posh olive bags contain 5 muted cyan bags.
+plaid indigo bags contain 5 dotted fuchsia bags, 2 plaid chartreuse bags, 3 vibrant blue bags.
+mirrored lime bags contain 2 dotted lavender bags, 2 wavy bronze bags.
+wavy blue bags contain 5 mirrored green bags, 5 faded tomato bags, 1 posh turquoise bag.
+light fuchsia bags contain 3 faded tomato bags, 5 muted beige bags, 2 faded beige bags, 4 wavy indigo bags.
+dull plum bags contain 4 dark blue bags, 5 shiny maroon bags, 3 pale gray bags, 5 drab lime bags.
+drab fuchsia bags contain 3 dark maroon bags.
+pale teal bags contain 4 vibrant blue bags, 1 bright green bag, 3 dim crimson bags, 1 posh salmon bag.
+dull tomato bags contain 3 dim maroon bags, 4 plaid gray bags, 5 striped gold bags, 5 striped white bags.
+pale orange bags contain 4 drab yellow bags.
+wavy aqua bags contain 1 dim bronze bag.
+dim chartreuse bags contain 2 bright violet bags.
+dotted crimson bags contain 5 vibrant orange bags, 4 wavy magenta bags.
+faded cyan bags contain 3 mirrored blue bags, 3 shiny fuchsia bags, 4 bright indigo bags.
+pale salmon bags contain 2 pale cyan bags, 2 muted lime bags, 2 vibrant plum bags.
+drab lime bags contain 2 drab yellow bags, 2 light magenta bags, 3 dotted fuchsia bags.
+shiny bronze bags contain 1 posh lavender bag.
+dim fuchsia bags contain 5 dotted gold bags, 5 vibrant indigo bags, 4 shiny teal bags, 2 dotted silver bags.
+dark green bags contain 2 shiny blue bags.
+bright red bags contain 2 pale brown bags, 3 plaid blue bags, 4 drab bronze bags, 3 dim yellow bags.
+clear teal bags contain 2 drab white bags, 3 muted beige bags.
+pale aqua bags contain 4 light tan bags.
+dull lavender bags contain 1 dim bronze bag, 5 dim crimson bags, 1 dotted olive bag.
+dotted plum bags contain 1 light black bag.
+shiny teal bags contain 3 light indigo bags.
+dotted lime bags contain 1 shiny gold bag, 3 plaid crimson bags.
+dark tan bags contain 5 faded tan bags.
+vibrant indigo bags contain 3 shiny fuchsia bags.
+light tan bags contain 4 pale yellow bags, 1 pale crimson bag, 3 light gray bags.
+drab plum bags contain 2 shiny turquoise bags, 2 vibrant yellow bags, 4 muted brown bags, 2 drab lavender bags.
+dim white bags contain 5 dark red bags, 5 dotted olive bags.
+light red bags contain 2 vibrant indigo bags, 1 wavy salmon bag, 3 dull brown bags.
+mirrored fuchsia bags contain 5 dotted tomato bags.
+mirrored indigo bags contain 5 pale lime bags, 5 light magenta bags, 4 light gray bags, 2 dull red bags.
+dim yellow bags contain 2 muted beige bags, 2 plaid olive bags, 3 faded aqua bags.
+shiny gray bags contain 1 drab yellow bag, 3 shiny lavender bags, 1 posh white bag.
+faded violet bags contain 2 bright olive bags, 5 clear gray bags, 2 dark orange bags, 1 pale magenta bag.
+mirrored black bags contain 4 clear blue bags.
+drab aqua bags contain 1 vibrant crimson bag, 4 clear fuchsia bags.
+pale black bags contain 5 pale turquoise bags, 4 striped yellow bags, 4 dotted beige bags.
+wavy cyan bags contain 1 vibrant brown bag.
+dark silver bags contain 3 light tomato bags, 5 dotted lavender bags, 3 bright turquoise bags.
+faded orange bags contain 3 clear turquoise bags, 3 mirrored gold bags, 2 plaid bronze bags, 2 dotted fuchsia bags.
+drab crimson bags contain 5 clear blue bags.
+posh magenta bags contain 1 bright violet bag, 2 dotted beige bags, 2 bright gray bags.
+posh brown bags contain 3 dim tomato bags, 1 dim chartreuse bag, 5 shiny orange bags.
+drab gray bags contain 3 striped violet bags.
+pale cyan bags contain 5 dotted aqua bags, 3 striped tomato bags.
+wavy tan bags contain 3 pale indigo bags.
+plaid brown bags contain 2 dotted indigo bags, 1 dull indigo bag, 2 light brown bags.
+vibrant beige bags contain 1 shiny teal bag, 3 vibrant cyan bags, 2 posh gray bags, 3 striped tomato bags.
+shiny aqua bags contain 2 vibrant black bags, 2 muted coral bags, 4 vibrant coral bags.
+mirrored silver bags contain 3 drab silver bags, 1 clear turquoise bag.
+pale tan bags contain 3 pale magenta bags.
+striped cyan bags contain 5 drab tomato bags.
+mirrored coral bags contain 1 mirrored crimson bag, 1 bright maroon bag.
+pale white bags contain 4 shiny beige bags, 1 shiny maroon bag, 5 dim bronze bags.
+shiny beige bags contain 3 mirrored gold bags.
+mirrored chartreuse bags contain 1 dotted tomato bag, 2 bright cyan bags.
+wavy red bags contain 1 posh lavender bag, 1 vibrant blue bag, 3 muted brown bags.
+muted chartreuse bags contain 3 dim lavender bags, 4 pale plum bags, 4 light magenta bags.
+shiny purple bags contain 4 muted green bags, 5 light white bags, 2 faded tan bags, 5 light beige bags.
+clear tan bags contain 3 dotted red bags, 1 striped violet bag, 4 plaid chartreuse bags.
+bright teal bags contain 1 faded black bag, 3 faded maroon bags.
+posh orange bags contain 5 light gold bags, 3 posh aqua bags.
+striped gray bags contain 2 bright plum bags, 2 shiny gray bags.
+dim lime bags contain 1 plaid blue bag.
+posh fuchsia bags contain 1 dull indigo bag, 2 plaid blue bags.
+dotted tomato bags contain no other bags.
+dim plum bags contain 1 dim chartreuse bag.
+dim orange bags contain 2 muted magenta bags, 5 faded aqua bags.
+posh gold bags contain 5 light maroon bags, 4 dark turquoise bags, 1 posh white bag, 5 wavy beige bags.
+striped bronze bags contain 1 dark magenta bag.
+wavy lime bags contain 4 mirrored lavender bags, 3 pale bronze bags, 1 dull white bag.
+pale magenta bags contain 2 dim crimson bags, 4 plaid plum bags, 5 muted silver bags, 2 dim yellow bags.
+striped chartreuse bags contain 5 light black bags, 3 bright fuchsia bags, 4 pale black bags.
+vibrant tan bags contain 2 dim tan bags.
+shiny crimson bags contain 5 pale beige bags, 3 clear purple bags, 2 pale violet bags, 4 dotted chartreuse bags.
+vibrant orange bags contain no other bags.
+striped silver bags contain 5 clear orange bags, 2 dotted fuchsia bags.
+clear cyan bags contain 5 muted gray bags, 3 wavy aqua bags.
+light black bags contain 1 striped yellow bag.
+muted white bags contain 3 muted tomato bags, 5 light black bags, 4 pale black bags, 5 shiny gold bags.
diff --git a/2020/inputs/day_8.txt b/2020/inputs/day_8.txt
new file mode 100644
index 0000000..5ef799e
--- /dev/null
+++ b/2020/inputs/day_8.txt
@@ -0,0 +1,626 @@
+acc +48
+nop +308
+acc +33
+acc +48
+jmp +379
+acc +27
+acc +23
+acc +29
+acc +3
+jmp +326
+acc -12
+nop +248
+nop +146
+jmp +293
+acc +8
+acc -16
+acc +18
+jmp +255
+jmp +390
+jmp +442
+acc +38
+jmp +451
+jmp +499
+acc +41
+acc +44
+nop +298
+acc +31
+jmp +337
+acc -3
+acc +34
+nop +266
+acc -19
+jmp +281
+jmp +232
+acc -9
+acc +25
+acc -8
+nop +228
+jmp +79
+jmp +58
+acc +38
+nop +318
+jmp +17
+acc +44
+jmp +298
+acc -4
+jmp +196
+jmp +249
+acc -9
+acc -3
+acc +17
+jmp +556
+jmp +1
+acc -15
+jmp +166
+acc +23
+acc +10
+acc +39
+jmp +475
+acc +28
+jmp +41
+jmp +322
+acc +48
+acc -11
+acc -13
+acc +12
+jmp +92
+jmp +1
+acc +9
+jmp -26
+acc +4
+acc -8
+nop +484
+acc -14
+jmp +526
+acc -13
+acc -2
+acc -13
+jmp +419
+acc +22
+acc -17
+jmp +1
+jmp +151
+acc +3
+acc +2
+acc -13
+acc -11
+jmp +352
+acc +24
+jmp -27
+nop +206
+acc +22
+nop +225
+jmp +360
+acc +48
+jmp +105
+jmp +80
+acc -16
+jmp +89
+acc +0
+jmp +339
+acc +37
+acc +41
+nop +156
+jmp +452
+jmp +208
+nop +60
+jmp +155
+acc -16
+jmp +274
+nop -77
+acc -16
+acc +21
+jmp +508
+acc -7
+acc -1
+jmp -83
+acc -11
+jmp +28
+acc +3
+acc +32
+acc -18
+jmp -89
+acc +4
+acc -14
+acc -1
+acc +33
+jmp -75
+nop +185
+acc +8
+acc +22
+acc +26
+jmp +164
+acc -19
+jmp +260
+jmp +174
+acc +2
+acc +34
+jmp -120
+acc -15
+acc +48
+jmp +165
+acc +5
+nop +240
+jmp -121
+jmp +114
+jmp -36
+nop +432
+jmp +1
+acc -18
+jmp +429
+acc +44
+nop +110
+jmp +198
+acc -18
+acc +32
+acc +41
+jmp +102
+nop +177
+acc +35
+acc +24
+acc +46
+jmp +121
+acc +20
+jmp +1
+jmp +407
+jmp +1
+acc +35
+acc +46
+nop -18
+jmp +6
+jmp +422
+acc -19
+jmp -85
+acc +33
+jmp -116
+nop +79
+jmp +284
+acc +3
+acc +49
+nop +317
+jmp +6
+acc +6
+jmp +295
+nop -141
+acc -4
+jmp -44
+nop +155
+acc +48
+acc -17
+jmp +188
+acc +22
+jmp +286
+nop +103
+acc -2
+acc +45
+jmp +20
+acc +21
+acc +37
+jmp +235
+jmp +42
+acc -11
+nop -15
+acc -5
+jmp +235
+jmp +178
+acc +12
+acc -15
+jmp +25
+acc +9
+acc +11
+nop +389
+acc +50
+jmp +146
+acc +26
+jmp +144
+acc -14
+jmp +304
+nop +254
+jmp +337
+jmp +17
+jmp +1
+acc +6
+acc -4
+acc +42
+jmp +117
+acc +25
+acc +50
+acc +45
+jmp -112
+acc +14
+acc +27
+jmp +347
+nop +15
+jmp +14
+acc +29
+jmp +236
+jmp -71
+acc -11
+acc +21
+nop +32
+jmp -162
+acc -15
+jmp +322
+acc -4
+acc +16
+jmp +1
+jmp +100
+jmp +1
+jmp -77
+acc +21
+nop -199
+acc +49
+acc -1
+jmp -231
+jmp +230
+acc -19
+jmp +1
+jmp -49
+jmp -11
+acc +6
+jmp -110
+jmp +331
+acc +44
+jmp +292
+acc -7
+acc -18
+acc +50
+jmp +221
+acc +33
+acc +7
+jmp -45
+jmp +342
+acc -19
+acc +36
+acc +15
+jmp -229
+nop -5
+jmp +57
+acc +26
+acc +43
+nop -175
+jmp +82
+acc +45
+jmp -161
+acc -16
+acc +35
+acc +46
+acc +43
+jmp +1
+nop +195
+acc +39
+acc +27
+acc +32
+jmp +227
+jmp -272
+nop +201
+acc +6
+acc +13
+acc +12
+jmp -177
+acc -9
+acc +46
+nop +199
+acc -1
+jmp +1
+jmp +3
+acc +42
+jmp +75
+jmp +305
+acc +49
+acc -16
+jmp -92
+acc +3
+nop +279
+jmp +54
+jmp +31
+acc +50
+jmp -125
+acc +21
+nop -178
+acc +40
+jmp +193
+acc +39
+acc -5
+jmp +261
+nop -3
+acc -13
+jmp -310
+acc +6
+acc -17
+acc +12
+acc +38
+jmp +267
+jmp -311
+acc -2
+jmp -7
+nop +77
+acc -2
+acc +39
+acc -16
+jmp +10
+nop +59
+jmp -296
+acc -4
+acc +41
+jmp -249
+acc +43
+nop +35
+jmp +95
+jmp +171
+acc +10
+nop +169
+acc -17
+jmp +47
+acc +49
+acc +38
+nop +199
+jmp +249
+jmp -53
+nop -194
+acc +19
+acc +18
+jmp -16
+acc +33
+jmp +194
+nop -194
+acc +49
+jmp +85
+acc +50
+nop -318
+acc -7
+jmp -49
+acc -6
+acc +48
+acc -13
+acc -14
+jmp +67
+acc +12
+acc +19
+acc +3
+jmp -371
+jmp -149
+acc +49
+nop -202
+jmp -315
+acc -6
+jmp -171
+acc -7
+jmp +113
+acc +34
+acc +36
+acc +17
+jmp -97
+acc +3
+jmp -244
+acc +25
+acc +30
+acc +25
+acc -19
+jmp +44
+nop +84
+jmp +124
+nop +17
+acc -11
+acc -8
+acc +4
+jmp +193
+jmp -388
+acc +36
+acc +17
+jmp +1
+acc -5
+jmp +166
+acc +39
+acc -10
+jmp -280
+acc +15
+jmp +1
+jmp -396
+jmp +113
+acc +37
+acc +13
+jmp -35
+nop +109
+acc +8
+acc +6
+acc +19
+jmp +39
+jmp +1
+jmp +1
+acc +39
+acc -14
+jmp -291
+acc +39
+acc +31
+jmp -231
+acc +41
+jmp -55
+nop -167
+jmp +105
+acc -8
+acc +34
+jmp -114
+nop +58
+jmp +1
+nop -270
+acc +31
+jmp -135
+acc +8
+acc +33
+jmp +1
+jmp -64
+acc +24
+acc +16
+jmp +117
+acc +35
+acc -11
+nop +44
+acc +18
+jmp +1
+jmp +88
+acc +29
+nop +34
+jmp +1
+nop -118
+jmp -404
+jmp -144
+acc -12
+nop -372
+acc -14
+jmp -209
+acc +12
+jmp +1
+acc -1
+jmp +132
+nop -93
+jmp -130
+acc +23
+acc +30
+acc +3
+jmp -209
+nop -381
+acc -19
+jmp +23
+nop +87
+jmp -277
+acc +39
+jmp -391
+acc +14
+acc +18
+acc +24
+nop -459
+jmp -267
+acc +35
+nop +84
+jmp -231
+acc +5
+acc +0
+acc +45
+jmp -210
+jmp -211
+acc +7
+acc +8
+nop -249
+jmp -8
+jmp -105
+nop -455
+acc -19
+acc +36
+jmp -368
+acc +33
+acc +10
+acc +9
+jmp -259
+nop +41
+acc -14
+acc +2
+jmp -336
+acc +46
+jmp -261
+nop -284
+acc +21
+nop -154
+jmp -485
+jmp -505
+acc +32
+nop -327
+acc +1
+nop +43
+jmp -23
+acc -7
+jmp -88
+acc +10
+jmp -440
+acc +12
+jmp -430
+jmp +1
+acc +46
+nop -105
+jmp -87
+acc +49
+acc -10
+acc -6
+jmp -411
+jmp -268
+acc +35
+acc +15
+jmp +45
+acc -14
+acc +0
+jmp -234
+nop -67
+acc +32
+acc +1
+jmp -476
+jmp -297
+nop -274
+jmp -435
+acc +36
+acc -2
+acc +33
+acc +9
+jmp -26
+jmp +50
+acc +23
+jmp -172
+jmp +1
+acc +34
+acc +32
+acc -4
+jmp -312
+acc -11
+acc +26
+jmp -150
+acc +41
+nop -79
+acc +25
+jmp -76
+acc -2
+acc +29
+acc +12
+jmp -549
+nop -357
+nop -438
+jmp -320
+acc +7
+acc -6
+jmp -149
+nop -74
+acc +7
+acc +45
+jmp -383
+acc -8
+acc +5
+acc +12
+jmp -463
+acc -17
+acc +5
+jmp -34
+jmp +1
+acc +18
+jmp -523
+acc +38
+acc +35
+nop -222
+jmp -424
+nop -365
+jmp -188
+acc +0
+acc +7
+nop -167
+acc +27
+jmp -351
+acc +26
+jmp -201
+nop -208
+nop -466
+acc +50
+nop -531
+jmp -273
+acc +21
+acc +25
+nop -397
+acc +29
+jmp +1
diff --git a/2020/inputs/day_9.txt b/2020/inputs/day_9.txt
new file mode 100644
index 0000000..31690cc
--- /dev/null
+++ b/2020/inputs/day_9.txt
@@ -0,0 +1,1000 @@
+37
+7
+16
+34
+48
+24
+5
+40
+30
+35
+2
+45
+19
+33
+36
+49
+32
+1
+44
+21
+25
+3
+11
+38
+15
+4
+6
+7
+8
+16
+9
+10
+5
+12
+13
+17
+14
+35
+18
+19
+20
+23
+36
+53
+22
+21
+41
+28
+11
+24
+15
+25
+26
+27
+29
+64
+50
+31
+30
+34
+32
+44
+33
+47
+74
+35
+66
+37
+36
+38
+45
+39
+40
+41
+42
+57
+51
+55
+68
+70
+71
+72
+61
+88
+65
+75
+140
+77
+73
+82
+110
+81
+74
+116
+86
+80
+112
+83
+92
+128
+141
+106
+120
+146
+126
+147
+133
+134
+138
+139
+156
+209
+162
+160
+154
+155
+233
+216
+163
+313
+298
+273
+189
+198
+226
+253
+232
+265
+259
+260
+316
+267
+272
+277
+449
+428
+314
+309
+471
+318
+379
+430
+458
+387
+683
+475
+415
+421
+486
+525
+544
+575
+532
+519
+632
+539
+590
+739
+586
+623
+627
+688
+696
+697
+804
+1072
+1119
+940
+808
+896
+836
+990
+907
+1107
+1436
+1114
+1129
+1051
+1058
+1754
+1385
+1644
+1459
+1250
+2686
+1324
+2442
+1504
+1501
+1612
+1704
+1915
+1715
+1732
+1826
+1897
+2048
+2431
+2109
+3004
+2165
+2825
+2301
+3039
+2862
+3145
+2574
+2709
+2751
+3447
+4043
+3005
+4198
+3113
+3612
+4910
+3629
+3541
+4306
+4157
+4466
+4349
+4274
+5113
+5027
+5446
+6186
+7889
+8522
+5436
+5854
+5283
+5864
+6292
+6118
+6546
+6617
+6742
+6654
+7241
+7170
+7698
+8431
+11231
+8506
+8623
+9301
+9387
+10140
+10310
+12518
+11137
+10719
+11147
+11290
+11401
+11575
+12156
+12410
+12664
+16757
+13271
+13396
+19611
+14411
+14868
+17129
+16937
+29793
+17807
+17924
+18688
+27532
+23665
+21029
+21866
+23954
+22009
+22976
+30217
+34022
+25986
+27807
+29601
+30400
+26667
+27682
+28264
+40602
+29279
+31805
+34066
+41472
+45606
+41589
+47696
+48711
+55214
+43038
+57543
+69154
+45963
+77223
+66588
+68866
+55265
+115299
+58207
+54349
+95816
+68284
+62330
+115750
+61084
+100312
+90012
+116995
+100820
+84627
+139841
+94674
+89001
+97387
+98303
+190490
+178080
+109614
+112556
+113472
+115433
+116349
+225364
+116679
+122633
+194241
+123414
+145711
+158471
+150085
+173628
+268085
+179301
+198099
+182014
+183675
+186388
+391499
+207001
+207917
+222170
+223086
+229235
+323350
+228905
+530351
+233028
+239312
+262390
+304647
+308556
+389397
+295796
+344859
+415293
+352929
+380113
+430087
+405100
+365689
+370063
+393389
+545520
+431003
+530726
+445256
+456114
+462263
+533552
+524701
+472340
+846296
+535108
+674245
+763452
+604352
+640655
+758059
+697788
+718618
+733042
+1129053
+759078
+838645
+876259
+824392
+918090
+887117
+893266
+907519
+901370
+1591316
+934603
+1469711
+1359500
+1742482
+1139460
+1175763
+1245007
+1302140
+1362411
+1338443
+1571687
+1416406
+1963852
+1557434
+1583470
+1597723
+1663037
+1769525
+2032726
+1780383
+1827869
+3212193
+1808889
+2351009
+2908044
+2538174
+2384467
+3385303
+3352070
+2315223
+2420770
+2547147
+2640583
+2778817
+3886910
+2973840
+2999876
+4336251
+3140904
+3181193
+5009062
+4606686
+4229659
+5601963
+3589272
+3636758
+4124112
+4159898
+4666232
+4699690
+4735993
+4805237
+6183905
+4862370
+4955806
+4967917
+5187730
+5419400
+7370563
+5973716
+6589148
+7226030
+6322097
+10580402
+6817951
+7713384
+11509827
+7749170
+7760870
+7796656
+8824488
+8860105
+8895891
+10281770
+12554407
+15536208
+9667607
+16645061
+13548127
+9923723
+13692660
+10607130
+22222014
+12295813
+14531335
+12911245
+20092469
+19476293
+14567121
+15678056
+15462554
+15510040
+18356300
+30972594
+19141875
+34623804
+17755996
+18563498
+19591330
+25386277
+20274737
+20530853
+27240787
+22902943
+22219536
+30198460
+30667241
+25207058
+26827148
+27442580
+43742577
+32323117
+30029675
+34158451
+33218550
+33266036
+33866340
+36112296
+37347326
+36319494
+52721949
+44977607
+38154828
+39866067
+40805590
+42494273
+43433796
+68014567
+45122479
+55485572
+58425608
+52034206
+52649638
+76652724
+57472255
+128686930
+95216222
+73666820
+66484586
+67084890
+69378332
+91338595
+72431790
+137710495
+74474322
+78020895
+127917362
+84988546
+84239386
+83299863
+85928069
+111607065
+132899930
+135078332
+186342970
+104683844
+109506461
+110121893
+123956841
+124557145
+161700808
+256917030
+186081387
+146906112
+136463222
+141810122
+150452685
+158713708
+207374252
+157774185
+167539249
+168288409
+193421756
+169227932
+269381250
+197535134
+229240989
+214190305
+244584793
+214805737
+219628354
+177777905
+246585115
+286915907
+261020367
+278273344
+311038054
+335827658
+283369334
+292262807
+360961005
+396780238
+437669659
+325313434
+365074383
+448869343
+361710165
+347005837
+608295280
+392583642
+422362698
+391968210
+397406259
+424363020
+456051249
+503091339
+461147239
+893720908
+561642678
+589311398
+570536151
+675337544
+619196992
+575632141
+639268644
+707966842
+708716002
+672319271
+687023599
+821769279
+754293807
+738974047
+739589479
+1483032306
+1031683390
+789374469
+1036779380
+1233961949
+880414269
+1133466510
+964238578
+1022789917
+1809594090
+2272406775
+1164943539
+1209804795
+1214900785
+1194829133
+1247951412
+1461693740
+1359342870
+1791073187
+1411908750
+1651262177
+1478563526
+1493883286
+1821057859
+1776368859
+1753613047
+1954318008
+2156256427
+1844652847
+1903204186
+3010605047
+1987028495
+2129182117
+2187733456
+3196833290
+3284956473
+2359772672
+2404633928
+2409729918
+2442780545
+2607294282
+2771251620
+2837906396
+3920255304
+2905792036
+3747857033
+3323216373
+3247496333
+4630514001
+4802553217
+3598265894
+4510498468
+4307838114
+3831681342
+4174761951
+4116210612
+7346122927
+4316915573
+4597463374
+5652130261
+4847414473
+4764406600
+6236315270
+5050074827
+5214032165
+7618666093
+6369517514
+8918763829
+6153288369
+6229008409
+6570712706
+6921482267
+7422258284
+7714476506
+7906104008
+7915181467
+8148596915
+11663038500
+8679095815
+8290972563
+8433126185
+8914378947
+9081322173
+11168176080
+9611821073
+13362629080
+9814481427
+10264106992
+11203363196
+12382296778
+14284698981
+12522805883
+12724001075
+16834819698
+23726169079
+13492194973
+17995701120
+15136734790
+15620580514
+15821285475
+22196778205
+16439569478
+16724098748
+23306676400
+17514448358
+17347505132
+18728860374
+18693143246
+19426302500
+19875928065
+21467470188
+21017844623
+32651183148
+24905102661
+28002877292
+31949108383
+31860833538
+40450267827
+29313480448
+28628929763
+38018063680
+33616281634
+34238547106
+31441865989
+59143411073
+33163668226
+36040648378
+34071603880
+48956314347
+36243308732
+60070795752
+49020721915
+55083751822
+39302230565
+40893772688
+70744096554
+45922947284
+52907979953
+54218583109
+59951985675
+63385084328
+57942410211
+62477148674
+93101815502
+61792597989
+65680413095
+64605534215
+93919014663
+67235272106
+69204316604
+69406976958
+70112252258
+70314912612
+75545539297
+110813319904
+88322952480
+80196003253
+150800101154
+118824117324
+110098089292
+98830927237
+100141530393
+112160993320
+114170568784
+129027870095
+157729929438
+199136272384
+124269746663
+186062344652
+127473011084
+130285947310
+133809850819
+136439588710
+183374885388
+138611293562
+139519229216
+250332549120
+194366572037
+204465749916
+316348291962
+168518955733
+210481950563
+314563839208
+232640778056
+238752823955
+198972457630
+212302523713
+250610157494
+438833585871
+251742757747
+266992240300
+266084304646
+705825826171
+257758958394
+270249439529
+264095798129
+272421144381
+404848522600
+441133843782
+278130522778
+308038184949
+362885527770
+367491413363
+379000906296
+380821479446
+502352915241
+409454408193
+411274981343
+431613235686
+437725281585
+478386828359
+484723668094
+633575718009
+509501716141
+703809586231
+523843263040
+852408825125
+521854756523
+528008397923
+534345237658
+766448713370
+653242623827
+778766394706
+586168707727
+641016050548
+688859664395
+730376941133
+869844328604
+889661809702
+790275887639
+820729389536
+841067643879
+842888217029
+955456498726
+1110011970767
+1070892375821
+1573265158162
+1227184758275
+1031356472664
+1056199994181
+1045698019563
+1252231697656
+1162870807071
+1169024448471
+1264722178791
+1479135552034
+1239411331554
+1275028372122
+1427236351606
+1510860379152
+2589147522801
+2054998066430
+2180904346588
+1611005277175
+1631343531518
+1776185888262
+1683955860908
+1798344715755
+2077054492227
+2087556466845
+2116590395384
+3761010353135
+2101898013744
+2194227279735
+2208568826634
+2402282138625
+3878083902006
+2331895255542
+4408949747769
+3458949458526
+2514439703676
+2666647683160
+2702264723728
+2938096730758
+3121865656327
+3460141749170
+3242348808693
+4325159222018
+5090292990044
+3315299392426
+3482300576663
+5330434482961
+3992571995490
+4631030099060
+6603177027504
+4218488409128
+4296125293479
+6148948259823
+4402796106369
+6364214465020
+5884582715288
+4846334959218
+4998542938702
+5181087386836
+6017564116154
+5216704427404
+9033826205429
+5640361454486
+8698921399848
+6582007405497
+6557648201119
+9936627949262
+7718095498795
+9199882107714
+7307871387916
+9961464582021
+8838906954708
+10215247366106
+9477365058278
+8514613702607
+20151875315368
+9142460252697
+9401339045071
+9583883493205
+15142551968857
+19249073571535
+11234268543558
+10179630325538
+10397791814240
+15983346450568
+26198593816674
+12198009655605
+12948232842402
+15781889513211
+15724467658194
+13865519589035
+15025966886711
+17679560080816
+15822485090523
+16146778342624
+25939715024300
+30924441482068
+24924349765908
+17657073955304
+18098497195812
+18543799297768
+28913828624374
+18985222538276
+19763513818743
+20577422139778
+31707814108762
+21413898869096
+34325688810979
+27922477313799
+25146242498007
+38256982220594
+32409318886803
+31545079669851
+28891486475746
+53838178390282
+29688004679558
+30848451977234
+39957698166864
+50472467153603
+33803852297928
+68570964349415
+57805315100120
+37083719734088
+35755571151116
+36642296493580
+63239517435353
+38748736357019
+66735007697782
+44909756316750
+79219213969216
+46560141367103
+49336376182895
+57555561384810
+64647057626862
+78706434523883
+115861510462796
+62097323566361
+114974785120332
+78227862658641
+60536456656792
+66771724413646
diff --git a/2020/src/bin/day_1.rs b/2020/src/bin/day_1.rs
new file mode 100644
index 0000000..68a570c
--- /dev/null
+++ b/2020/src/bin/day_1.rs
@@ -0,0 +1,83 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("mark")
+ .add_system_to_stage("mark", mark_sum_pair.system())
+ .add_system_to_stage("mark", mark_sum_triple.system())
+ .add_stage("report")
+ .add_system_to_stage("report", print_product_pair.system())
+ .add_system_to_stage("report", print_product_triple.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Expense(i32);
+struct FlaggedPair;
+struct FlaggedTriple;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_1.txt").unwrap(); // TODO: Error handling on systems?
+ for line in BufReader::new(f).lines() {
+ let expense = line.unwrap().trim().parse().unwrap();
+ commands.spawn((Expense(expense),));
+ }
+}
+
+fn mark_sum_pair(mut commands: Commands, expenses: Query<(Entity, &Expense)>) {
+ for (entity_1, expense_1) in expenses.iter() {
+ for (entity_2, expense_2) in expenses.iter() {
+ if expense_1.0 + expense_2.0 == 2020 {
+ commands.insert_one(entity_1, FlaggedPair);
+ commands.insert_one(entity_2, FlaggedPair);
+ }
+ }
+ }
+}
+
+fn mark_sum_triple(mut commands: Commands, expenses: Query<(Entity, &Expense)>) {
+ for (entity_1, expense_1) in expenses.iter() {
+ for (entity_2, expense_2) in expenses.iter() {
+ for (entity_3, expense_3) in expenses.iter() {
+ if expense_1.0 + expense_2.0 + expense_3.0 == 2020 {
+ commands.insert_one(entity_1, FlaggedTriple);
+ commands.insert_one(entity_2, FlaggedTriple);
+ commands.insert_one(entity_3, FlaggedTriple);
+ }
+ }
+ }
+ }
+}
+
+fn print_product_pair(flagged_expenses: Query<With<FlaggedPair, &Expense>>) {
+ let mut product = 1;
+ for expense in flagged_expenses.iter() {
+ product *= expense.0;
+ }
+ // TODO: Put it on the screen!
+ println!("Product Pair: {}", product);
+}
+
+fn print_product_triple(flagged_expenses: Query<With<FlaggedTriple, &Expense>>) {
+ let mut product = 1;
+ for expense in flagged_expenses.iter() {
+ product *= expense.0;
+ }
+ // TODO: Put it on the screen!
+ println!("Product Triple: {}", product);
+}
diff --git a/2020/src/bin/day_10.rs b/2020/src/bin/day_10.rs
new file mode 100644
index 0000000..7ef4fa2
--- /dev/null
+++ b/2020/src/bin/day_10.rs
@@ -0,0 +1,124 @@
+use bevy::{app::AppExit, prelude::*};
+use std::io::{BufRead, BufReader};
+use std::{collections::BTreeMap, fs::File};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_startup_stage("differences")
+ .add_startup_system_to_stage("differences", add_min_differences.system())
+ .add_startup_system_to_stage("differences", add_all_differences.system())
+ .add_startup_stage("report")
+ .add_startup_system_to_stage("report", print_difference_stats.system())
+ .add_system(add_next_paths_to_end_sum.system())
+ .add_system(report_full_paths_to_end.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, PartialOrd, Ord)]
+struct MinJoltDiff(i64);
+#[derive(Clone)]
+struct NextJolts(Vec<Entity>);
+struct Jolts(i64);
+struct PathsToEnd(u64);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_10.txt").unwrap();
+
+ commands.spawn((Jolts(0),));
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ let num = line.parse().unwrap();
+
+ commands.spawn((Jolts(num),));
+ }
+}
+
+fn add_min_differences(
+ mut commands: Commands,
+ jolts_query: Query<(Entity, &Jolts, Option<&MinJoltDiff>)>,
+) {
+ for (entity, jolts, jolt_diff) in jolts_query.iter() {
+ if jolt_diff.is_none() {
+ let min_increase = jolts_query
+ .iter()
+ .map(|(_, other_jolts, _)| other_jolts)
+ .filter(|other_jolts| other_jolts.0 > jolts.0)
+ .map(|other_jolts| MinJoltDiff(other_jolts.0 - jolts.0))
+ .min()
+ .unwrap_or(MinJoltDiff(3));
+ commands.insert_one(entity, min_increase);
+ }
+ }
+}
+
+fn add_all_differences(mut commands: Commands, jolts_query: Query<(Entity, &Jolts)>) {
+ for (entity, jolts) in jolts_query.iter() {
+ let next_entities = jolts_query
+ .iter()
+ .filter(|(_, other_jolts)| other_jolts.0 > jolts.0 && other_jolts.0 - jolts.0 <= 3)
+ .map(|(other_entity, _)| other_entity)
+ .collect();
+ commands.insert_one(entity, NextJolts(next_entities));
+ }
+}
+
+fn print_difference_stats(diffs: Query<&MinJoltDiff>) {
+ let mut buckets: BTreeMap<i64, usize> = BTreeMap::new();
+ for diff in diffs.iter() {
+ *buckets.entry(diff.0).or_insert(0) += 1;
+ }
+ println!("Buckets: {:?}", buckets);
+
+ println!(
+ "Bucket 1 * Bucket 3: {}",
+ buckets.get(&1).unwrap_or(&0) * buckets.get(&3).unwrap_or(&0)
+ );
+}
+
+fn add_next_paths_to_end_sum(
+ mut commands: Commands,
+ potential_to_add: Query<Without<PathsToEnd, (Entity, &NextJolts)>>,
+ already_added: Query<&PathsToEnd>,
+) {
+ for (entity, next) in potential_to_add.iter() {
+ if next.0.is_empty() {
+ commands.insert_one(entity, PathsToEnd(1));
+ } else {
+ let next_paths: Result<Vec<&PathsToEnd>, _> = next
+ .0
+ .iter()
+ .map(|next_entity| already_added.get(*next_entity))
+ .collect();
+ if let Ok(next_paths) = next_paths {
+ let sum = next_paths.iter().map(|paths| paths.0).sum();
+ commands.insert_one(entity, PathsToEnd(sum));
+ }
+ }
+ }
+}
+
+fn report_full_paths_to_end(
+ mut exit_events: ResMut<Events<AppExit>>,
+ jolts: &Jolts,
+ paths: &PathsToEnd,
+) {
+ if jolts.0 == 0 {
+ println!("Paths from the start to the end: {}", paths.0);
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_11.rs b/2020/src/bin/day_11.rs
new file mode 100644
index 0000000..82bb282
--- /dev/null
+++ b/2020/src/bin/day_11.rs
@@ -0,0 +1,209 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_event::<AdjacentStableEvent>()
+ .add_event::<LineOfSightStableEvent>()
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(iterate_adjacent_seats.system())
+ .add_system(iterate_line_of_sight_seats.system())
+ .add_system(report_adjacent_done.system())
+ .add_system(report_line_of_sight_done.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, Clone, Copy)]
+struct Position {
+ x: i32,
+ y: i32,
+}
+impl Position {
+ fn distance(&self, other: &Position) -> i32 {
+ (self.x - other.x).abs().max((self.y - other.y).abs())
+ }
+}
+impl std::ops::Add<&Position> for Position {
+ type Output = Position;
+ fn add(self, other: &Position) -> Self::Output {
+ Position {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ }
+ }
+}
+
+struct AdjacentSeat {
+ occupied: bool,
+}
+struct LineOfSightSeat {
+ occupied: bool,
+}
+
+struct AdjacentStableEvent;
+struct LineOfSightStableEvent;
+
+#[derive(Default)]
+struct Bounds {
+ min_x: i32,
+ max_x: i32,
+ min_y: i32,
+ max_y: i32,
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_11.txt").unwrap();
+ let mut bounds = Bounds::default();
+
+ for (y, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.unwrap();
+ let line = line.trim();
+ for (x, c) in line.chars().enumerate() {
+ if c == 'L' {
+ commands.spawn((
+ Position {
+ x: x as i32,
+ y: y as i32,
+ },
+ AdjacentSeat { occupied: false },
+ LineOfSightSeat { occupied: false },
+ ));
+ }
+ bounds.max_x = x as i32;
+ }
+
+ bounds.max_y = y as i32;
+ }
+ commands.insert_resource(bounds);
+}
+
+fn iterate_adjacent_seats(
+ mut commands: Commands,
+ mut stable_events: ResMut<Events<AdjacentStableEvent>>,
+ seats: Query<(Entity, &Position, &AdjacentSeat)>,
+) {
+ let mut changes: Vec<(Entity, AdjacentSeat)> = Vec::new();
+ for (entity, position, seat) in seats.iter() {
+ let surrounding_count = seats
+ .iter()
+ .filter(|(_, other_position, other_seat)| {
+ other_seat.occupied && position.distance(other_position) == 1
+ })
+ .count();
+ let change = if !seat.occupied && surrounding_count == 0 {
+ Some(true)
+ } else if seat.occupied && surrounding_count >= 4 {
+ Some(false)
+ } else {
+ None
+ };
+ if let Some(occupied) = change {
+ changes.push((entity, AdjacentSeat { occupied }));
+ }
+ }
+ if changes.is_empty() {
+ stable_events.send(AdjacentStableEvent);
+ }
+
+ for (entity, seat) in changes {
+ commands.insert_one(entity, seat);
+ }
+}
+
+fn iterate_line_of_sight_seats(
+ mut commands: Commands,
+ mut stable_events: ResMut<Events<LineOfSightStableEvent>>,
+ bounds: Res<Bounds>,
+ seats: Query<(Entity, &Position, &LineOfSightSeat)>,
+) {
+ let dir_vectors = [
+ Position { x: -1, y: 0 },
+ Position { x: -1, y: -1 },
+ Position { x: 0, y: -1 },
+ Position { x: 1, y: -1 },
+ Position { x: 1, y: 0 },
+ Position { x: 1, y: 1 },
+ Position { x: 0, y: 1 },
+ Position { x: -1, y: 1 },
+ ];
+
+ let mut changes: Vec<(Entity, LineOfSightSeat)> = Vec::new();
+ for (entity, position, seat) in seats.iter() {
+ let mut surrounding_count = 0;
+ for vec in dir_vectors.iter() {
+ let mut check = position.clone();
+ while check.x >= bounds.min_x
+ && check.x <= bounds.max_x
+ && check.y >= bounds.min_y
+ && check.y <= bounds.max_y
+ {
+ check = check + vec;
+ if let Some((_, _, other_seat)) =
+ seats.iter().find(|(_, other_pos, _)| other_pos == &&check)
+ {
+ if other_seat.occupied {
+ surrounding_count += 1;
+ }
+ break;
+ }
+ }
+ }
+
+ let change = if !seat.occupied && surrounding_count == 0 {
+ Some(true)
+ } else if seat.occupied && surrounding_count >= 5 {
+ Some(false)
+ } else {
+ None
+ };
+ if let Some(occupied) = change {
+ changes.push((entity, LineOfSightSeat { occupied }));
+ }
+ }
+ if changes.is_empty() {
+ stable_events.send(LineOfSightStableEvent);
+ }
+
+ for (entity, seat) in changes {
+ commands.insert_one(entity, seat);
+ }
+}
+
+fn report_adjacent_done(
+ stable_events: Res<Events<AdjacentStableEvent>>,
+ mut stable_event_reader: Local<EventReader<AdjacentStableEvent>>,
+ seats: Query<&AdjacentSeat>,
+) {
+ for _ in stable_event_reader.iter(&stable_events) {
+ let occupied = seats.iter().filter(|s| s.occupied).count();
+ println!("{} seats end up occupied in the adjacent model", occupied);
+ }
+}
+
+fn report_line_of_sight_done(
+ stable_events: Res<Events<LineOfSightStableEvent>>,
+ mut stable_event_reader: Local<EventReader<LineOfSightStableEvent>>,
+ seats: Query<&LineOfSightSeat>,
+) {
+ for _ in stable_event_reader.iter(&stable_events) {
+ let occupied = seats.iter().filter(|s| s.occupied).count();
+ println!(
+ "{} seats end up occupied in the line of sight model",
+ occupied
+ );
+ }
+}
diff --git a/2020/src/bin/day_12.rs b/2020/src/bin/day_12.rs
new file mode 100644
index 0000000..489cdca
--- /dev/null
+++ b/2020/src/bin/day_12.rs
@@ -0,0 +1,233 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::ops::Deref;
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(move_normal_ship.system())
+ .add_system(move_waypoint_ship.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(PartialEq, Eq, Clone, Copy)]
+struct Position {
+ x: i64,
+ y: i64,
+}
+impl Position {
+ fn manhattan_distance(&self, other: &Position) -> i64 {
+ (self.x - other.x).abs() + (self.y - other.y).abs()
+ }
+}
+impl std::ops::Add<&Position> for &Position {
+ type Output = Position;
+ fn add(self, other: &Position) -> Self::Output {
+ Position {
+ x: self.x + other.x,
+ y: self.y + other.y,
+ }
+ }
+}
+impl std::ops::Mul<i64> for Position {
+ type Output = Position;
+ fn mul(self, other: i64) -> Self::Output {
+ Position {
+ x: self.x * other,
+ y: self.y * other,
+ }
+ }
+}
+
+enum Facing {
+ North,
+ South,
+ East,
+ West,
+}
+impl Facing {
+ fn right(&mut self) {
+ use Facing::*;
+ *self = match self {
+ North => East,
+ East => South,
+ South => West,
+ West => North,
+ }
+ }
+
+ fn reverse(&mut self) {
+ self.right();
+ self.right();
+ }
+
+ fn left(&mut self) {
+ self.reverse();
+ self.right();
+ }
+}
+
+struct Instructions(Vec<Instruction>);
+#[derive(Clone)]
+enum Instruction {
+ North(i64),
+ South(i64),
+ East(i64),
+ West(i64),
+ Left(i64),
+ Right(i64),
+ Forward(i64),
+}
+
+struct InstructionPointer(usize);
+
+struct Waypoint(Position);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_12.txt").unwrap();
+
+ let instructions: Vec<Instruction> = BufReader::new(f)
+ .lines()
+ .map(|line| {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let val: i64 = line[1..].parse().unwrap();
+ let instruction = match line.chars().next().unwrap() {
+ 'N' => Instruction::North(val),
+ 'S' => Instruction::South(val),
+ 'E' => Instruction::East(val),
+ 'W' => Instruction::West(val),
+ 'L' => Instruction::Left(val),
+ 'R' => Instruction::Right(val),
+ 'F' => Instruction::Forward(val),
+ other => panic!("Unknown instruction: {}", other),
+ };
+ instruction
+ })
+ .collect();
+
+ commands.spawn((
+ Instructions(instructions.clone()),
+ InstructionPointer(0),
+ Facing::East,
+ Position { x: 0, y: 0 },
+ ));
+
+ commands.spawn((
+ Waypoint(Position { x: 10, y: 1 }),
+ Instructions(instructions),
+ InstructionPointer(0),
+ Position { x: 0, y: 0 },
+ ));
+}
+
+fn move_normal_ship(
+ mut q: Query<
+ Without<
+ Waypoint,
+ (
+ &Instructions,
+ &mut InstructionPointer,
+ &mut Facing,
+ &mut Position,
+ ),
+ >,
+ >,
+) {
+ for (instructions, mut instruction_pointer, mut facing, mut position) in q.iter_mut() {
+ if let Some(instruction) = instructions.0.get(instruction_pointer.0) {
+ use Instruction::*;
+ match instruction {
+ North(val) => position.y += val,
+ South(val) => position.y -= val,
+ East(val) => position.x += val,
+ West(val) => position.x -= val,
+ Left(90) | Right(270) => facing.left(),
+ Left(180) | Right(180) => facing.reverse(),
+ Left(270) | Right(90) => facing.right(),
+ Left(val) | Right(val) => panic!("Unknown left/right val: {}", val),
+ Forward(val) => match facing.deref() {
+ Facing::North => position.y += val,
+ Facing::South => position.y -= val,
+ Facing::East => position.x += val,
+ Facing::West => position.x -= val,
+ },
+ };
+
+ instruction_pointer.0 += 1;
+ } else {
+ println!(
+ "Normal Ship at destination: {} x {}, Manhattan distance: {}",
+ position.x,
+ position.y,
+ position.manhattan_distance(&Position { x: 0, y: 0 })
+ );
+ }
+ }
+}
+
+fn move_waypoint_ship(
+ instructions: &Instructions,
+ mut waypoint: Mut<Waypoint>,
+ mut instruction_pointer: Mut<InstructionPointer>,
+ mut position: Mut<Position>,
+) {
+ if let Some(instruction) = instructions.0.get(instruction_pointer.0) {
+ use Instruction::*;
+ match instruction {
+ North(val) => waypoint.0.y += val,
+ South(val) => waypoint.0.y -= val,
+ East(val) => waypoint.0.x += val,
+ West(val) => waypoint.0.x -= val,
+ Left(90) | Right(270) => {
+ waypoint.0 = Position {
+ x: -waypoint.0.y,
+ y: waypoint.0.x,
+ }
+ }
+ Left(180) | Right(180) => {
+ waypoint.0 = Position {
+ x: -waypoint.0.x,
+ y: -waypoint.0.y,
+ }
+ }
+ Left(270) | Right(90) => {
+ waypoint.0 = Position {
+ x: waypoint.0.y,
+ y: -waypoint.0.x,
+ }
+ }
+ Left(val) | Right(val) => panic!("Unknown left/right val: {}", val),
+ Forward(val) => *position = position.deref() + &(waypoint.0 * *val),
+ };
+
+ // println!(
+ // "Position: {} x {}. Waypoint: {} x {}",
+ // position.x, position.y, waypoint.0.x, waypoint.0.y
+ // );
+
+ instruction_pointer.0 += 1;
+ } else {
+ println!(
+ "Waypoint Ship at destination: {} x {}, Manhattan distance: {}",
+ position.x,
+ position.y,
+ position.manhattan_distance(&Position { x: 0, y: 0 })
+ );
+ }
+}
diff --git a/2020/src/bin/day_2.rs b/2020/src/bin/day_2.rs
new file mode 100644
index 0000000..6c26647
--- /dev/null
+++ b/2020/src/bin/day_2.rs
@@ -0,0 +1,104 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("mark")
+ .add_system_to_stage("mark", validate_sled_passwords.system())
+ .add_system_to_stage("mark", validate_toboggan_passwords.system())
+ .add_stage("report")
+ .add_system_to_stage("report", count_valid_sled_passwords.system())
+ .add_system_to_stage("report", count_valid_toboggan_passwords.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct PasswordRule {
+ num_1: usize,
+ num_2: usize,
+ c: char,
+}
+struct Password(String);
+struct SledPasswordValidation(bool);
+struct TobogganPasswordValidation(bool);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_2.txt").expect("Failed to read file"); // TODO: Use the asset loading system to load this rather?
+ for line in BufReader::new(f).lines() {
+ let line = line.expect("Error reading file");
+ let line = line.trim();
+ let mut parts = line.split_whitespace();
+ let range = parts.next().expect("File was missing a range");
+ let chars = parts.next().expect("File was missing chars");
+ let password = parts.next().expect("File was missing a password");
+
+ let mut range_parts = range.split('-');
+
+ let rule = PasswordRule {
+ num_1: range_parts
+ .next()
+ .expect("Range did not have a minimum")
+ .parse()
+ .expect("Minimum was not a number"),
+ num_2: range_parts
+ .next()
+ .expect("Range did not have a maximum")
+ .parse()
+ .expect("Maximum was not a number"),
+ c: chars.chars().next().expect("File was missing chars"),
+ };
+ let password = Password(password.to_owned());
+
+ commands.spawn((rule, password));
+ }
+}
+
+fn validate_sled_passwords(
+ mut commands: Commands,
+ passwords: Query<Without<SledPasswordValidation, (Entity, &PasswordRule, &Password)>>,
+) {
+ for (entity, rule, password) in passwords.iter() {
+ let actual = password.0.chars().filter(|c| c == &rule.c).count();
+ let valid = actual >= rule.num_1 && actual <= rule.num_2;
+ commands.insert_one(entity, SledPasswordValidation(valid));
+ }
+}
+
+fn validate_toboggan_passwords(
+ mut commands: Commands,
+ passwords: Query<Without<TobogganPasswordValidation, (Entity, &PasswordRule, &Password)>>,
+) {
+ for (entity, rule, password) in passwords.iter() {
+ let actual_1 = password.0.chars().nth(rule.num_1 - 1);
+ let actual_2 = password.0.chars().nth(rule.num_2 - 1);
+ let actual_1_match = actual_1.map_or(false, |c| c == rule.c);
+ let actual_2_match = actual_2.map_or(false, |c| c == rule.c);
+
+ let valid = actual_1_match != actual_2_match;
+ commands.insert_one(entity, TobogganPasswordValidation(valid));
+ }
+}
+
+fn count_valid_sled_passwords(validation: Query<&SledPasswordValidation>) {
+ let count = validation.iter().filter(|v| v.0).count();
+ println!("Valid Sled Passwords: {}", count);
+}
+
+fn count_valid_toboggan_passwords(validation: Query<&TobogganPasswordValidation>) {
+ let count = validation.iter().filter(|v| v.0).count();
+ println!("Valid Toboggan Passwords: {}", count);
+}
diff --git a/2020/src/bin/day_3.rs b/2020/src/bin/day_3.rs
new file mode 100644
index 0000000..5e6f0bd
--- /dev/null
+++ b/2020/src/bin/day_3.rs
@@ -0,0 +1,205 @@
+use bevy::app::AppExit;
+use bevy::prelude::*;
+use bevy::render::camera::Camera;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_stage("game_entities")
+ .add_startup_system_to_stage("game_entities", read_input_file.system())
+ .add_system(move_tobogganist.system())
+ .add_system(collide_with_trees.system())
+ .add_system(clear_finished_tobogganists.system())
+ .add_system(end_of_slope.system())
+ .add_system(translate_positions.system())
+ .add_system(tobogganist_cam.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands, mut materials: ResMut<Assets<ColorMaterial>>) {
+ commands.spawn(Camera2dComponents::default());
+
+ commands.insert_resource(Materials {
+ tobogganist_material: materials.add(Color::rgb(0., 0., 255.).into()),
+ tree_material: materials.add(Color::rgb(0., 255., 0.).into()),
+ });
+}
+
+struct Materials {
+ tobogganist_material: Handle<ColorMaterial>,
+ tree_material: Handle<ColorMaterial>,
+}
+
+struct Tobogganist;
+
+struct Tree;
+#[derive(PartialEq, Eq)]
+struct Position {
+ x: usize,
+ y: usize,
+}
+struct Velocity {
+ x: usize,
+ y: usize,
+}
+struct MapSize {
+ width: usize,
+ height: usize,
+}
+struct TreeHitCount(usize);
+struct Score(usize);
+
+fn read_input_file(mut commands: Commands, materials: Res<Materials>) {
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 1, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 3, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 5, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 7, y: 1 })
+ .with(TreeHitCount(0));
+
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tobogganist_material.clone(),
+ ..Default::default()
+ })
+ .with(Tobogganist)
+ .with(Position { x: 0, y: 0 })
+ .with(Velocity { x: 1, y: 2 })
+ .with(TreeHitCount(0));
+
+ let f = File::open("./inputs/day_3.txt").expect("Failed to read file"); // TODO: Use the asset loading system to load this rather?
+ let mut width = 0;
+ let mut height = 0;
+ for (y, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.expect("Error reading file");
+ let line = line.trim();
+ width = width.max(line.len());
+ for (x, c) in line.chars().enumerate() {
+ if c == '#' {
+ commands
+ .spawn(SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: materials.tree_material.clone(),
+ ..Default::default()
+ })
+ .with(Tree)
+ .with(Position { x, y })
+ .with(TreeHitCount(0));
+ }
+ }
+ height = y + 1;
+ }
+ commands.insert_resource(MapSize { width, height });
+ commands.insert_resource(Score(1));
+}
+
+fn translate_positions(mut transform: Mut<Transform>, position: &Position) {
+ transform.translation = Vec3::new(position.x as f32 * 10., position.y as f32 * -10., 0.);
+}
+
+fn tobogganist_cam(
+ tobogganist: Query<With<Tobogganist, &Transform>>,
+ mut camera: Query<With<Camera, &mut Transform>>,
+) {
+ for mut camera_transform in camera.iter_mut() {
+ if let Some(tobogganist_transform) = tobogganist.iter().next() {
+ camera_transform.translation = Vec3::new(0., tobogganist_transform.translation.y(), 0.);
+ }
+ }
+}
+
+fn move_tobogganist(map_size: Res<MapSize>, mut position: Mut<Position>, velocity: &Velocity) {
+ position.x += velocity.x;
+ position.x %= map_size.width;
+ position.y += velocity.y;
+}
+
+fn collide_with_trees(
+ mut tobogganists: Query<With<Tobogganist, (&Position, &mut TreeHitCount)>>,
+ trees: Query<With<Tree, &Position>>,
+) {
+ for (tobogganist_position, mut tree_hit_count) in tobogganists.iter_mut() {
+ for tree_position in trees.iter() {
+ if *tree_position == *tobogganist_position {
+ tree_hit_count.0 += 1;
+ }
+ }
+ }
+}
+
+fn clear_finished_tobogganists(
+ mut commands: Commands,
+ map_size: Res<MapSize>,
+ mut score: ResMut<Score>,
+ tobogganists: Query<With<Tobogganist, (Entity, &Position, &Velocity, &TreeHitCount)>>,
+) {
+ for (entity, position, velocity, tree_hit_count) in tobogganists.iter() {
+ if position.y >= map_size.height {
+ println!(
+ "A tobogganist finished heading at incline {} x {}, after hitting {} trees",
+ velocity.x, velocity.y, tree_hit_count.0
+ );
+ score.0 *= tree_hit_count.0;
+ commands.despawn(entity);
+ }
+ }
+}
+
+fn end_of_slope(
+ score: Res<Score>,
+ mut exit_events: ResMut<Events<AppExit>>,
+ tobogganists: Query<&Tobogganist>,
+) {
+ if tobogganists.iter().count() == 0 {
+ println!("All tobogganists finished. Total score: {}", score.0);
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_4.rs b/2020/src/bin/day_4.rs
new file mode 100644
index 0000000..50b8eb5
--- /dev/null
+++ b/2020/src/bin/day_4.rs
@@ -0,0 +1,222 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+use std::str::FromStr;
+use thiserror::Error;
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(count_valid.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(Error, Debug)]
+enum ValidationError {
+ #[error("{0}")]
+ FromIntError(#[from] std::num::ParseIntError),
+ #[error("value is out of range")]
+ OutOfRange,
+ #[error("value has an invalid unit")]
+ InvalidUnit,
+ #[error("value has an invalid characters")]
+ InvalidChars,
+}
+
+struct BirthYear(u32);
+impl FromStr for BirthYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 1920 && num <= 2002 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct IssueYear(u32);
+impl FromStr for IssueYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 2010 && num <= 2020 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct ExpirationYear(u32);
+impl FromStr for ExpirationYear {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let num: u32 = s.parse()?;
+ if num >= 2020 && num <= 2030 {
+ Ok(Self(num))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct Height(u32);
+impl FromStr for Height {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let inches = s.ends_with("in");
+ let centimeters = s.ends_with("cm");
+ if !inches && !centimeters {
+ return Err(ValidationError::InvalidUnit);
+ }
+
+ let num: u32 = s[0..s.len() - 2].parse()?;
+ let num_cm = if inches {
+ ((num as f32) * 2.54).round() as u32
+ } else {
+ num
+ };
+
+ if num_cm >= 150 && num_cm <= 193 {
+ Ok(Self(num_cm))
+ } else {
+ Err(ValidationError::OutOfRange)
+ }
+ }
+}
+
+struct HairColor(String);
+impl FromStr for HairColor {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if !s.starts_with("#") {
+ return Err(ValidationError::InvalidChars);
+ }
+ if s.len() != 7 {
+ return Err(ValidationError::InvalidChars);
+ }
+ if !s
+ .chars()
+ .skip(1)
+ .all(|c| (c >= 'a' && c <= 'f') || c >= '0' && c <= '9')
+ {
+ return Err(ValidationError::InvalidChars);
+ }
+
+ Ok(Self(s.to_string()))
+ }
+}
+
+struct EyeColor(String);
+impl FromStr for EyeColor {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let valid_vals = ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"];
+ if valid_vals.contains(&s) {
+ Ok(Self(s.to_string()))
+ } else {
+ Err(ValidationError::InvalidChars)
+ }
+ }
+}
+
+struct PassportId(String);
+impl FromStr for PassportId {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if s.len() != 9 {
+ return Err(ValidationError::InvalidChars);
+ }
+ if !s.chars().all(|c| c.is_ascii_digit()) {
+ return Err(ValidationError::InvalidChars);
+ }
+
+ Ok(Self(s.to_string()))
+ }
+}
+
+struct CountryId(String);
+impl FromStr for CountryId {
+ type Err = ValidationError;
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(Self(s.to_string()))
+ }
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_4.txt").expect("Failed to read file");
+
+ commands.spawn(());
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ if line.is_empty() {
+ commands.spawn(());
+ } else {
+ for section in line.split_whitespace() {
+ let mut section_parts = section.split(':');
+ let name = section_parts.next().unwrap();
+ let value = section_parts.next().unwrap();
+ match name {
+ "byr" => {
+ BirthYear::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "iyr" => {
+ IssueYear::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "eyr" => {
+ ExpirationYear::from_str(value)
+ .ok()
+ .map(|c| commands.with(c));
+ }
+ "hgt" => {
+ Height::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "hcl" => {
+ HairColor::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "ecl" => {
+ EyeColor::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "pid" => {
+ PassportId::from_str(value).ok().map(|c| commands.with(c));
+ }
+ "cid" => {
+ CountryId::from_str(value).ok().map(|c| commands.with(c));
+ }
+ _ => {}
+ }
+ }
+ }
+ }
+}
+
+fn count_valid(
+ passports: Query<(
+ &BirthYear,
+ &IssueYear,
+ &ExpirationYear,
+ &Height,
+ &HairColor,
+ &EyeColor,
+ &PassportId,
+ )>,
+) {
+ let count = passports.iter().count();
+ println!("There are {} valid passports", count);
+}
diff --git a/2020/src/bin/day_5.rs b/2020/src/bin/day_5.rs
new file mode 100644
index 0000000..15c8a70
--- /dev/null
+++ b/2020/src/bin/day_5.rs
@@ -0,0 +1,157 @@
+use bevy::prelude::*;
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_startup_stage("search")
+ .add_startup_system_to_stage("search", find_unoccupied_seat.system())
+ .add_startup_stage("metadata")
+ .add_startup_system_to_stage("metadata", add_seat_ids.system())
+ .add_startup_system_to_stage("metadata", add_seat_sprites.system())
+ .add_startup_stage("report")
+ .add_startup_system_to_stage("report", print_highest_seat_id.system())
+ .add_startup_system_to_stage("report", print_my_seat_id.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands, mut materials: ResMut<Assets<ColorMaterial>>) {
+ commands.spawn(Camera2dComponents {
+ transform: Transform::from_translation(Vec3::new(80. / 2., 1280. / 2., 0.)),
+ ..Default::default()
+ });
+
+ commands.insert_resource(Materials {
+ my_seat_material: materials.add(Color::rgb(0., 0., 255.).into()),
+ seat_material: materials.add(Color::rgb(0., 255., 0.).into()),
+ });
+}
+
+struct Materials {
+ my_seat_material: Handle<ColorMaterial>,
+ seat_material: Handle<ColorMaterial>,
+}
+
+#[derive(PartialEq, Eq)]
+struct Position {
+ x: u32,
+ y: u32,
+}
+struct SeatId(u32);
+struct MySeat;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_5.txt").unwrap();
+ for line in BufReader::new(f).lines() {
+ let mut max_y = 128;
+ let mut min_y = 0;
+ let mut max_x = 8;
+ let mut min_x = 0;
+ for c in line.unwrap().trim().chars() {
+ let mid_x = (min_x + max_x) / 2;
+ let mid_y = (min_y + max_y) / 2;
+ match c {
+ 'F' => {
+ max_y = mid_y;
+ }
+ 'B' => {
+ min_y = mid_y;
+ }
+ 'L' => {
+ max_x = mid_x;
+ }
+ 'R' => {
+ min_x = mid_x;
+ }
+ _ => panic!("Unexpected character {}", c),
+ }
+ }
+
+ assert_eq!(max_y - min_y, 1);
+ assert_eq!(max_x - min_x, 1);
+
+ commands.spawn((Position { x: min_x, y: min_y },));
+ }
+}
+
+fn find_unoccupied_seat(mut commands: Commands, seats: Query<&Position>) {
+ for y in 1..127 {
+ for x in 0..8 {
+ let potential_position = Position { x, y };
+ let required_left = if x == 0 {
+ Position { x: 7, y: y - 1 }
+ } else {
+ Position { x: x - 1, y }
+ };
+ let required_right = if x == 7 {
+ Position { x: 0, y: y + 1 }
+ } else {
+ Position { x: x + 1, y }
+ };
+
+ let required_surrounds = [required_left, required_right];
+ if !seats.iter().any(|p| p == &potential_position) {
+ if required_surrounds
+ .iter()
+ .all(|required| seats.iter().any(|p| p == required))
+ {
+ commands.spawn((MySeat, potential_position));
+ }
+ }
+ }
+ }
+}
+
+fn add_seat_ids(mut commands: Commands, seats: Query<(Entity, &Position)>) {
+ for (entity, position) in seats.iter() {
+ let seat_id = position.y * 8 + position.x;
+ commands.insert_one(entity, SeatId(seat_id));
+ }
+}
+
+fn add_seat_sprites(
+ mut commands: Commands,
+ materials: Res<Materials>,
+ seats: Query<(Entity, &Position, Option<&MySeat>)>,
+) {
+ for (entity, position, my_seat) in seats.iter() {
+ commands.insert(
+ entity,
+ SpriteComponents {
+ sprite: Sprite::new(Vec2::new(10., 10.)),
+ material: if my_seat.is_some() {
+ materials.my_seat_material.clone()
+ } else {
+ materials.seat_material.clone()
+ },
+ transform: Transform::from_translation(Vec3::new(
+ position.x as f32 * 10.,
+ position.y as f32 * 10.,
+ 0.,
+ )),
+ ..Default::default()
+ },
+ );
+ }
+}
+
+fn print_highest_seat_id(seats: Query<&SeatId>) {
+ let max = seats.iter().map(|s| s.0).max();
+ println!("Max seat id: {:?}", max);
+}
+
+fn print_my_seat_id(seats: Query<With<MySeat, &SeatId>>) {
+ for seat_id in seats.iter() {
+ println!("My seat id: {}", seat_id.0);
+ }
+}
diff --git a/2020/src/bin/day_6.rs b/2020/src/bin/day_6.rs
new file mode 100644
index 0000000..68efbce
--- /dev/null
+++ b/2020/src/bin/day_6.rs
@@ -0,0 +1,102 @@
+use bevy::prelude::*;
+use std::collections::{BTreeMap, BTreeSet};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("calculate")
+ .add_system_to_stage("calculate", calculate_anyone_groups.system())
+ .add_system_to_stage("calculate", calculate_everyone_groups.system())
+ .add_stage("report")
+ .add_system_to_stage("report", count_anyone_group_sizes.system())
+ .add_system_to_stage("report", count_everyone_group_sizes.system())
+ //.add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Individual;
+struct Anyone;
+struct Everyone;
+
+struct Group(usize);
+struct Answers(BTreeSet<char>);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_6.txt").unwrap();
+
+ let mut current_group = 0;
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+ if line.is_empty() {
+ current_group += 1;
+ } else {
+ let answers = line.chars().collect();
+ commands.spawn((Individual, Group(current_group), Answers(answers)));
+ }
+ }
+}
+
+fn calculate_anyone_groups(
+ mut commands: Commands,
+ individuals: Query<With<Individual, (&Group, &Answers)>>,
+) {
+ let mut anyone_groups = BTreeMap::new();
+ for (group_id, answer) in individuals.iter() {
+ let updated = anyone_groups
+ .entry(group_id.0)
+ .or_insert(BTreeSet::new())
+ .union(&answer.0)
+ .cloned()
+ .collect();
+ anyone_groups.insert(group_id.0, updated);
+ }
+
+ for (group_id, anyone) in anyone_groups.into_iter() {
+ commands.spawn((Anyone, Group(group_id), Answers(anyone)));
+ }
+}
+
+fn calculate_everyone_groups(
+ mut commands: Commands,
+ individuals: Query<With<Individual, (&Group, &Answers)>>,
+) {
+ let mut anyone_groups = BTreeMap::new();
+ for (group_id, answer) in individuals.iter() {
+ let updated = anyone_groups
+ .entry(group_id.0)
+ .or_insert(answer.0.clone())
+ .intersection(&answer.0)
+ .cloned()
+ .collect();
+ anyone_groups.insert(group_id.0, updated);
+ }
+
+ for (group_id, anyone) in anyone_groups.into_iter() {
+ commands.spawn((Everyone, Group(group_id), Answers(anyone)));
+ }
+}
+
+fn count_anyone_group_sizes(groups: Query<With<Anyone, &Answers>>) {
+ let sum: usize = groups.iter().map(|g| g.0.len()).sum();
+ println!("Anyone: {}", sum);
+}
+
+fn count_everyone_group_sizes(groups: Query<With<Everyone, &Answers>>) {
+ let sum: usize = groups.iter().map(|g| g.0.len()).sum();
+ println!("Everyone: {}", sum);
+}
diff --git a/2020/src/bin/day_7.rs b/2020/src/bin/day_7.rs
new file mode 100644
index 0000000..45cb9ee
--- /dev/null
+++ b/2020/src/bin/day_7.rs
@@ -0,0 +1,137 @@
+use bevy::prelude::*;
+use std::collections::{BTreeMap, BTreeSet};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_system(trim_empty_bags.system())
+ .add_system(add_known_sizes.system())
+ .add_system(report_gold_bag_known_size.system())
+ //.add_system(debug_print_bags.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+const TARGET_COLOUR: &str = "shiny gold";
+
+struct Bag {
+ colour: String,
+ required: BTreeMap<String, usize>,
+}
+struct CantContainShinyGold;
+#[derive(Clone)]
+struct KnownSize(usize);
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_7.txt").unwrap();
+
+ for line in BufReader::new(f).lines() {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let (src_colour, contents) = split_2(line, "bags contain");
+ let contents_parts = contents
+ .trim_end_matches('.')
+ .split(',')
+ .filter(|part| part != &"no other bags")
+ .map(|part| {
+ let (quantity, colour) = split_2(
+ part.trim().trim_end_matches("bags").trim_end_matches("bag"),
+ " ",
+ );
+ (colour, quantity.parse().unwrap())
+ })
+ .collect();
+ commands.spawn((Bag {
+ colour: src_colour,
+ required: contents_parts,
+ },));
+ }
+}
+
+fn split_2(line: &str, split: &str) -> (String, String) {
+ let parts = line.splitn(2, split).collect::<Vec<_>>();
+ assert_eq!(parts.len(), 2);
+ (parts[0].trim().to_string(), parts[1].trim().to_string())
+}
+
+fn debug_print_bags(bags: Query<&Bag>) {
+ for bag in bags.iter() {
+ println!("{} requires {:?}", bag.colour, bag.required);
+ }
+}
+
+fn trim_empty_bags(
+ mut commands: Commands,
+ bags: Query<Without<CantContainShinyGold, (Entity, &Bag)>>,
+) {
+ let mut colours_cleared = BTreeSet::new();
+ for (entity, bag) in bags.iter() {
+ let required_not_relevant = bag.required.keys().all(|required| {
+ !bags
+ .iter()
+ .any(|can_contain_shiny_gold| &can_contain_shiny_gold.1.colour == required)
+ });
+ if required_not_relevant && bag.colour != TARGET_COLOUR {
+ colours_cleared.insert(bag.colour.clone());
+ commands.insert_one(entity, CantContainShinyGold);
+ }
+ }
+
+ if colours_cleared.is_empty() {
+ println!(
+ "{} bags can hold the shiny gold one",
+ bags.iter().count() - 1
+ );
+ }
+}
+
+fn add_known_sizes(mut commands: Commands, bags: Query<(Entity, &Bag, Option<&KnownSize>)>) {
+ for (entity, bag, size) in bags.iter() {
+ if size.is_some() {
+ continue;
+ }
+
+ let mut new_size = Some(0);
+ for (required_colour, required_quantity) in bag.required.iter() {
+ if new_size.is_none() {
+ break;
+ }
+
+ let inner_bag_size = bags
+ .iter()
+ .find(|(_, bag, _)| &bag.colour == required_colour)
+ .and_then(|(_, _, size)| size.clone());
+ new_size = new_size
+ .zip(inner_bag_size)
+ .map(|(a, b)| a + required_quantity * b.0)
+ }
+
+ if let Some(new_size) = new_size {
+ commands.insert_one(entity, KnownSize(new_size + 1));
+ }
+ }
+}
+
+fn report_gold_bag_known_size(bags: Query<(&Bag, &KnownSize)>) {
+ println!("{} have a known size", bags.iter().count());
+ for (bag, size) in bags.iter() {
+ if bag.colour == TARGET_COLOUR {
+ println!("The shiny gold bag must contain {} other bags!", size.0 - 1)
+ }
+ }
+}
diff --git a/2020/src/bin/day_8.rs b/2020/src/bin/day_8.rs
new file mode 100644
index 0000000..2c0c227
--- /dev/null
+++ b/2020/src/bin/day_8.rs
@@ -0,0 +1,154 @@
+use bevy::{app::AppExit, prelude::*};
+use std::convert::TryFrom;
+use std::io::{BufRead, BufReader};
+use std::{collections::BTreeSet, fs::File};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("check_line")
+ .add_system_to_stage("check_line", track_program_line_execution.system())
+ .add_system_to_stage("check_line", track_program_termination.system())
+ .add_stage("exec")
+ .add_system_to_stage("exec", tick_computer.system())
+ .add_system_to_stage("exec", exit.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+struct Program {
+ ops: Vec<Op>,
+}
+#[derive(Clone)]
+enum Op {
+ Acc(i32),
+ Jmp(i32),
+ Nop(i32),
+}
+struct UnalteredProgram;
+#[derive(Default)]
+struct Computer {
+ program_counter: i32,
+ accumulator: i32,
+ termiated: bool,
+}
+#[derive(Default)]
+struct LineTracker(BTreeSet<i32>);
+
+impl Computer {
+ fn exec(&mut self, program: &Program) {
+ if self.termiated {
+ return;
+ }
+
+ let x = usize::try_from(self.program_counter).ok();
+ match x.and_then(|x| program.ops.get(x)) {
+ None => {}
+ Some(Op::Acc(val)) => {
+ self.accumulator += val;
+ self.program_counter += 1;
+ }
+ Some(Op::Jmp(val)) => {
+ self.program_counter += val;
+ }
+ Some(Op::Nop(_)) => {
+ self.program_counter += 1;
+ }
+ }
+ if self.program_counter >= program.ops.len() as i32 {
+ self.termiated = true;
+ }
+ }
+}
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_8.txt").unwrap();
+
+ let ops: Vec<Op> = BufReader::new(f)
+ .lines()
+ .map(|line| {
+ let line = line.unwrap();
+ let line = line.trim();
+
+ let mut line_parts = line.split_whitespace();
+ let opcode = line_parts.next().unwrap();
+ let val: i32 = line_parts.next().unwrap().parse().unwrap();
+ let op = match opcode {
+ "acc" => Op::Acc(val),
+ "jmp" => Op::Jmp(val),
+ "nop" => Op::Nop(val),
+ _ => panic!("Invalid opcode"),
+ };
+ op
+ })
+ .collect();
+ commands.spawn((
+ UnalteredProgram,
+ Program { ops: ops.clone() },
+ Computer::default(),
+ LineTracker::default(),
+ ));
+
+ for i in 0..ops.len() {
+ let mut ops = ops.clone();
+ ops[i] = match ops[i] {
+ Op::Nop(v) => Op::Jmp(v),
+ Op::Jmp(v) => Op::Nop(v),
+ Op::Acc(v) => Op::Acc(v),
+ };
+ commands.spawn((
+ Program { ops: ops.clone() },
+ Computer::default(),
+ LineTracker::default(),
+ ));
+ }
+}
+
+fn track_program_line_execution(
+ mut commands: Commands,
+ entity: Entity,
+ mut line_tracker: Mut<LineTracker>,
+ computer: &Computer,
+ unaltered: Option<&UnalteredProgram>,
+) {
+ if line_tracker.0.contains(&computer.program_counter) {
+ if unaltered.is_some() {
+ println!(
+ "About to execute a line for the second time! Line {}. Accumulator: {}",
+ computer.program_counter, computer.accumulator
+ );
+ }
+ commands.despawn(entity);
+ } else {
+ line_tracker.0.insert(computer.program_counter);
+ }
+}
+
+fn track_program_termination(mut commands: Commands, entity: Entity, computer: &Computer) {
+ if computer.termiated {
+ println!("Program terminated! Accumulator: {}", computer.accumulator);
+ commands.despawn(entity);
+ }
+}
+
+fn tick_computer(mut computer: Mut<Computer>, program: &Program) {
+ computer.exec(program);
+}
+
+fn exit(mut exit_events: ResMut<Events<AppExit>>, computers: Query<&Computer>) {
+ if computers.iter().len() == 0 {
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/bin/day_9.rs b/2020/src/bin/day_9.rs
new file mode 100644
index 0000000..b5a02e6
--- /dev/null
+++ b/2020/src/bin/day_9.rs
@@ -0,0 +1,120 @@
+use bevy::{app::AppExit, prelude::*};
+use std::fs::File;
+use std::io::{BufRead, BufReader};
+
+fn main() {
+ App::build()
+ .add_resource(WindowDescriptor {
+ title: "Advent of Code".to_string(),
+ width: 1920,
+ height: 1080,
+ ..Default::default()
+ })
+ .add_resource(ClearColor(Color::rgb(0., 0., 0.)))
+ .add_startup_system(setup_camera.system())
+ .add_startup_system(read_input_file.system())
+ .add_stage("add")
+ .add_system_to_stage("add", check_next_num.system())
+ .add_stage("remove")
+ .add_system_to_stage("remove", remove_oldest_line.system())
+ .add_stage("find_range")
+ .add_system_to_stage("find_range", find_contiguous_range.system())
+ .add_plugins(DefaultPlugins)
+ .run();
+}
+
+fn setup_camera(mut commands: Commands) {
+ commands.spawn(Camera2dComponents::default());
+}
+
+#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
+struct LineNum(usize);
+#[derive(Clone)]
+struct Num(i64);
+struct Active;
+struct Invalid;
+struct Done;
+
+fn read_input_file(mut commands: Commands) {
+ let f = File::open("./inputs/day_9.txt").unwrap();
+
+ for (line_num, line) in BufReader::new(f).lines().enumerate() {
+ let line = line.unwrap();
+ let line = line.trim();
+ let num = line.parse().unwrap();
+ commands.spawn((LineNum(line_num), Num(num)));
+ if line_num < 25 {
+ commands.with(Active);
+ }
+ }
+}
+
+fn check_next_num(
+ mut commands: Commands,
+ active: Query<With<Active, &Num>>,
+ next: Query<Without<Done, Without<Active, (Entity, &LineNum, &Num)>>>,
+) {
+ if let Some((min_entity, line, num)) = next.iter().min_by_key(|(_, line, _)| line.0) {
+ let mut is_sum = false;
+ for active_1 in active.iter() {
+ for active_2 in active.iter() {
+ is_sum = is_sum || (num.0 == active_1.0 + active_2.0)
+ }
+ }
+ commands.insert_one(min_entity, Active);
+
+ if !is_sum {
+ commands.insert_one(min_entity, Invalid);
+ println!(
+ "{} on line {} was not a sum of the previous lot!",
+ num.0, line.0
+ );
+ }
+ }
+}
+
+fn remove_oldest_line(
+ mut commands: Commands,
+ line_nums: Query<Without<Done, With<Active, (Entity, &LineNum)>>>,
+) {
+ if let Some((min_entity, _)) = line_nums.iter().min_by_key(|(_, line)| line.0) {
+ commands.remove_one::<Active>(min_entity);
+ commands.insert_one(min_entity, Done);
+ } else {
+ println!("All numbers cleared");
+ }
+}
+
+fn find_contiguous_range(
+ mut exit_events: ResMut<Events<AppExit>>,
+ line_nums: Query<(&LineNum, &Num)>,
+ invalid: Query<With<Invalid, &Num>>,
+) {
+ for invalid in invalid.iter() {
+ let mut nums: Vec<(LineNum, Num)> = line_nums
+ .iter()
+ .map(|(line, num)| (line.clone(), num.clone()))
+ .collect();
+
+ nums.sort_by_key(|(line, _num)| line.clone());
+ let nums: Vec<i64> = nums.into_iter().map(|(_line, num)| num.0).collect();
+
+ for min in 0..nums.len() {
+ for max in min + 2..nums.len() + 1 {
+ let sum: i64 = nums[min..max].iter().sum();
+ if sum == invalid.0 {
+ let min_in_range = nums[min..max].iter().min().unwrap();
+ let max_in_range = nums[min..max].iter().max().unwrap();
+ println!(
+ "Range found! {} + {} = {}",
+ min_in_range,
+ max_in_range,
+ min_in_range + max_in_range
+ );
+ }
+ }
+ }
+
+ exit_events.send(AppExit);
+ }
+}
diff --git a/2020/src/lib.rs b/2020/src/lib.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/2020/src/lib.rs
@@ -0,0 +1 @@
+
diff --git a/2020/src/main.rs b/2020/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/2020/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}