diff --git a/README.md b/README.md
index fedbbae..818b392 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
My (attempted) solutions to [Advent of Code 2020](https://adventofcode.com/2020) in Elixir.
-
+
## Strategy
diff --git a/day4/README b/day4/README
new file mode 100644
index 0000000..59e49c8
--- /dev/null
+++ b/day4/README
@@ -0,0 +1,47 @@
+Day 4 Notes
+
++--------+
+| Part 1 |
++--------+
+
+$ elixir day4part1.exs
+210
+
+Thoughts:
+
+Parse each passport into a list of key-value pairs, and extract the keys.
+Not sure if there will be extra keys, so store required keys in a Mapset, which means I can use
+MapSet.subset to make sure all the required keys are present.
+Embedded enums are kind of ugly.
+Nice usage of Enum.into, IMO 🍠.
+
++--------+
+| Part 2 |
++--------+
+
+$ elixir day4part2.exs
+131
+
+Thoughts:
+
+Need the values too now, so refactor a bit to preserve them, storing each passport at a map.
+Can still use part 1 logic to filter out passports that have missing keys.
+ - just pull out the keys and convert to a MapSet as before.
+Delete the cid key if present, since needs to be ignored.
+
+Validation code:
+Mostly just implementing the spec.
+Use regex for fiddly requirements.
+hgt was a bit annoying, really wanted to fail-fast if the regex failed to match the units,
+maybe will come back to that and think of a nicer way later.
+For valid?: Is there a nicer way to call a bunch of functions with the same argument and
+aggregate their results? 🤔
+
+
++------------------+
+| Overall Thoughts |
++------------------+
+
+Starting to take me longer now, about an hour for this one.
+Ended up not using Enum.reduce here, but every time I do use it I forget the order of the
+acc/item pair in the reducer function... 😩
diff --git a/day4/day4part1.exs b/day4/day4part1.exs
new file mode 100644
index 0000000..7cb4762
--- /dev/null
+++ b/day4/day4part1.exs
@@ -0,0 +1,19 @@
+defmodule Day4Part1 do
+ @required MapSet.new(["byr", "ecl", "eyr", "hcl", "hgt", "iyr", "pid"])
+
+ def run do
+ File.read!("input")
+ |> String.trim()
+ |> String.split("\n\n")
+ |> Enum.map(fn passport ->
+ passport
+ |> String.split([" ", "\n"])
+ |> Enum.map(&String.split(&1, ":"))
+ |> Enum.into(MapSet.new(), fn [k, _] -> k end)
+ end)
+ |> Enum.count(&MapSet.subset?(@required, &1))
+ |> IO.puts()
+ end
+end
+
+Day4Part1.run()
diff --git a/day4/day4part2.exs b/day4/day4part2.exs
new file mode 100644
index 0000000..0b0b780
--- /dev/null
+++ b/day4/day4part2.exs
@@ -0,0 +1,67 @@
+defmodule Day4Part2 do
+ @required MapSet.new(["byr", "ecl", "eyr", "hcl", "hgt", "iyr", "pid"])
+
+ def run do
+ File.read!("input")
+ |> String.trim()
+ |> String.split("\n\n")
+ |> Enum.map(fn passport ->
+ passport
+ |> String.split([" ", "\n"])
+ |> Enum.map(&String.split(&1, ":"))
+ |> Map.new(fn [k, v] -> {k, v} end)
+ end)
+ |> Enum.map(&Map.delete(&1, "cid"))
+ |> Enum.filter(&MapSet.subset?(@required, &1 |> Map.keys() |> MapSet.new()))
+ |> Enum.count(&valid?/1)
+ |> IO.puts()
+ end
+
+ def valid?(passport) do
+ byr?(passport) && iyr?(passport) && eyr?(passport) && hgt?(passport) && hcl?(passport) &&
+ ecl?(passport) && pid?(passport)
+ end
+
+ def byr?(%{"byr" => byr}) do
+ date = String.to_integer(byr)
+ 1920 <= date && date <= 2002
+ end
+
+ def iyr?(%{"iyr" => iyr}) do
+ date = String.to_integer(iyr)
+ 2010 <= date && date <= 2020
+ end
+
+ def eyr?(%{"eyr" => eyr}) do
+ date = String.to_integer(eyr)
+ 2020 <= date && date <= 2030
+ end
+
+ def hgt?(%{"hgt" => hgt}) do
+ {hgt, unit} =
+ case Regex.run(~r/\A(\d+)([^\d]+)\z/, hgt, capture: :all_but_first) do
+ [hgt, unit] -> {String.to_integer(hgt), unit}
+ nil -> {0, nil}
+ end
+
+ case unit do
+ "cm" -> 150 <= hgt && hgt <= 193
+ "in" -> 59 <= hgt && hgt <= 76
+ nil -> false
+ end
+ end
+
+ def hcl?(%{"hcl" => hcl}) do
+ Regex.match?(~r/\A#[0-9a-f]{6}\z/, hcl)
+ end
+
+ def ecl?(%{"ecl" => ecl}) do
+ ecl in ["amb", "blu", "brn", "gry", "grn", "hzl", "oth"]
+ end
+
+ def pid?(%{"pid" => pid}) do
+ Regex.match?(~r/\A\d{9}\z/, pid)
+ end
+end
+
+Day4Part2.run()
diff --git a/day4/input b/day4/input
new file mode 100644
index 0000000..242437a
--- /dev/null
+++ b/day4/input
@@ -0,0 +1,1029 @@
+iyr:2015
+hgt:59cm byr:2029 cid:219 pid:9381688753 eyr:1992 hcl:#b6652a
+ecl:#7a0fa6
+
+ecl:blu iyr:2018 pid:943614755 cid:335
+byr:1968
+eyr:2026
+
+pid:067285985 hcl:#ceb3a1 cid:281
+ecl:#07219a eyr:1944
+iyr:2025
+byr:2029 hgt:64cm
+
+hgt:185cm
+ecl:gry cid:222
+iyr:2016
+hcl:#866857 byr:1970 pid:269105457 eyr:2026
+
+pid:260043570 hcl:#b6652a cid:275 byr:1990 ecl:brn
+hgt:163cm iyr:2012
+
+hgt:181cm pid:604983466
+iyr:1930 eyr:2039 byr:1950 ecl:#906548 hcl:#b6652a
+
+iyr:2025 eyr:1956 hcl:z pid:#1c42cc byr:2006
+cid:327 hgt:141 ecl:#f2affc
+
+hgt:178cm byr:1939 pid:595705064 ecl:oth
+iyr:2020 eyr:2026
+hcl:#888785
+
+hgt:159cm iyr:2016
+hcl:#efcc98 pid:139063139 byr:1980 ecl:brn
+eyr:2020
+
+pid:646870519 hgt:179cm eyr:2022 iyr:2011 hcl:#602927
+ecl:brn
+byr:1997
+
+hgt:170cm hcl:#ceb3a1 iyr:2014 eyr:2023 ecl:oth pid:243067344 byr:1962
+
+hcl:#866857
+ecl:oth pid:704529614
+byr:1941 cid:94
+eyr:2026 hgt:180cm
+iyr:2010
+
+iyr:1924
+pid:36196401
+hgt:74cm eyr:1921
+ecl:#3acf57 hcl:a4e4c0 byr:2024
+cid:153
+
+pid:770262094 hcl:#866857
+eyr:2020 hgt:151cm
+ecl:blu
+iyr:2012
+byr:2002
+cid:242
+
+pid:984364862 ecl:dne
+iyr:2020
+hgt:151 eyr:2023 cid:314 hcl:z byr:2012
+
+hgt:178cm iyr:2020 hcl:#6b5442 ecl:grn cid:323 eyr:2030 byr:1925 pid:285882039
+
+iyr:2019 pid:986123633
+eyr:2024 byr:1990 hcl:#7d3b0c ecl:hzl hgt:192cm
+
+hgt:90
+byr:2025 iyr:1933
+ecl:dne eyr:2040 pid:8194347544
+
+hgt:163cm byr:1934 eyr:2026 ecl:amb hcl:#eec6fb cid:303 pid:721792159 iyr:2013
+
+iyr:2019
+byr:1920 hcl:#a97842
+cid:186 eyr:2020
+ecl:oth
+hgt:167cm pid:217112082
+
+pid:#55ce6b hcl:d30f6b eyr:2040 hgt:60cm ecl:dne iyr:1920
+cid:107 byr:2029
+
+ecl:amb eyr:2024 pid:644304174 hcl:#6b5442 iyr:2018
+byr:1935
+hgt:182cm
+
+ecl:hzl pid:559383552
+hcl:#ceb3a1 eyr:2024 hgt:161cm byr:1968 iyr:2010
+
+iyr:2018
+hcl:43fafb
+hgt:65cm eyr:2027
+byr:1937 pid:#4bff3e ecl:grt
+
+eyr:2024
+iyr:2014 cid:163 byr:1924 hcl:#18171d
+hgt:166cm
+
+eyr:2026 pid:955203781
+iyr:2016 cid:52 hgt:167cm
+ecl:grn byr:1963
+
+pid:479898570 hgt:165cm eyr:2024 byr:1932
+iyr:2010 ecl:grn
+cid:88
+hcl:#c0a76e
+
+cid:241 hgt:178cm ecl:blu pid:069760797 hcl:#623a2f byr:1925 eyr:2029 iyr:2019
+
+hgt:172cm eyr:2036
+iyr:2016 pid:#98caec
+ecl:dne hcl:z
+
+ecl:#510672 iyr:1938 byr:2018 hgt:172in hcl:z cid:339 eyr:2039
+pid:#6c1216
+
+hcl:#efcc98
+byr:1972 ecl:brn iyr:2011 pid:190911803 eyr:2025 hgt:171cm
+
+pid:0636917222 byr:2009 hgt:96
+hcl:z
+iyr:1997 ecl:hzl eyr:2026
+
+byr:1989 iyr:2011 pid:071588682 cid:155 ecl:grn
+hcl:#ceb3a1 eyr:1955 hgt:170cm
+
+cid:266 hcl:#a97842 byr:1964 hgt:175cm
+iyr:2017 ecl:brn
+
+pid:930133867 ecl:grn hcl:#733820 hgt:63in byr:1995
+eyr:2021 iyr:2014
+
+eyr:2025 pid:284329794
+ecl:blu hcl:#ceb3a1 iyr:2012
+hgt:65in byr:1961
+
+iyr:2010 byr:1998
+hgt:160cm
+eyr:2029 hcl:#cfa07d
+pid:253052921
+ecl:amb cid:324
+
+pid:026835791 byr:1999 eyr:2022 hgt:162cm
+hcl:#7d3b0c ecl:brn iyr:2014
+
+pid:672752198 eyr:2030 byr:1952 hgt:65in iyr:2016 ecl:amb
+hcl:#cfa07d
+
+hgt:193in
+byr:2019 hcl:z pid:#cbc08c iyr:1951 ecl:#3e9f2f eyr:2002
+
+ecl:utc pid:571477176
+byr:2012 eyr:1929 cid:240
+hgt:175in hcl:f4ef32
+
+cid:93 hcl:#a5db2a
+pid:274721479 byr:1940 eyr:2022 ecl:gry
+hgt:157cm iyr:2012
+
+pid:540858450 iyr:2014 cid:95 byr:1964
+hgt:156cm hcl:#866857 ecl:brn eyr:2026
+
+pid:532626994 byr:1939 iyr:2017
+ecl:blu eyr:2026
+hcl:#fffffd hgt:184cm
+
+hgt:70 pid:404622083
+iyr:2026
+byr:2022 hcl:c1ba7f eyr:1979 ecl:lzr
+
+pid:931910908
+cid:177 hcl:#6b5442
+ecl:gry hgt:184cm
+byr:1963 eyr:2020
+iyr:2014
+
+iyr:2019 eyr:2022 hcl:#ceb3a1 hgt:191cm ecl:gry pid:954124659 cid:123 byr:1939
+
+pid:411032659 byr:1950
+hgt:153cm eyr:2020 iyr:2014 ecl:hzl
+
+hgt:156cm eyr:2023 pid:29836124 byr:2017 hcl:56de83 ecl:zzz cid:179
+iyr:2018
+
+hcl:#866857 iyr:2014 hgt:190cm byr:1998 pid:565524574 eyr:2020
+
+byr:1973 hcl:#888785 iyr:2016 eyr:2028 hgt:173cm ecl:blu
+
+byr:1987
+pid:028825120 hcl:#7d3b0c
+eyr:2023 hgt:190cm ecl:oth iyr:2014
+
+eyr:2036 pid:172661617
+ecl:#ae607d byr:2017 hcl:z
+hgt:82 cid:153
+
+pid:202888577 eyr:2028 iyr:2013
+byr:1933
+hgt:68in cid:151 hcl:#b6652a ecl:brn
+
+iyr:2020
+ecl:amb eyr:2025 hcl:#a355be hgt:63in pid:146650894
+
+iyr:2016 hgt:192cm pid:531372965 hcl:#fffffd
+ecl:blu eyr:2025
+
+eyr:2025 ecl:blu byr:1961 cid:224 iyr:2016 hcl:#6b5442 pid:368694418
+hgt:169cm
+
+pid:43707504 iyr:1945
+ecl:grt byr:2010
+eyr:2026 cid:273
+hgt:165in hcl:z
+
+hgt:159cm ecl:gry
+hcl:#6b5442
+eyr:2030 pid:915819272 iyr:2015
+
+pid:808392314 ecl:gry cid:285 hcl:#efcc98 byr:1923 hgt:161cm iyr:1941 eyr:2020
+
+iyr:2017
+hgt:161cm
+eyr:2025 hcl:#602927 ecl:oth pid:081917611 byr:1983
+
+eyr:2028 pid:831032131 ecl:brn iyr:2013 hcl:#341e13 cid:198 byr:1991 hgt:67in
+
+hgt:181cm cid:320 pid:032769757 ecl:grn hcl:#733820
+eyr:2022 byr:1992
+
+iyr:2010 cid:128 hgt:171cm byr:1932 pid:923377839 ecl:brn
+hcl:#18171d eyr:2020
+
+ecl:hzl iyr:2021 byr:2008 pid:569583509 hcl:f74823
+hgt:188in
+
+iyr:2016 hcl:z eyr:2021 ecl:#24ceee pid:349492243 hgt:67cm
+cid:144 byr:2010
+
+ecl:gry
+byr:2029 hcl:3a0c30 hgt:163in eyr:1962
+
+byr:1927 hgt:180
+cid:87
+ecl:#7ea777
+hcl:#623a2f iyr:2024 pid:597098940 eyr:2027
+
+cid:89 hgt:193cm hcl:#623a2f
+iyr:2010 eyr:2026
+pid:374988952 ecl:hzl byr:1973
+
+eyr:2023 iyr:2013 byr:1977
+cid:329 pid:711256829 ecl:grn hgt:154cm
+hcl:#866857
+
+pid:212535692 ecl:brn
+hcl:#b6652a hgt:169cm eyr:2025 byr:1920 iyr:2019
+
+ecl:blu
+byr:1962
+hgt:157cm iyr:2020 eyr:2027 pid:451039029
+hcl:#6b5442
+
+hgt:187cm pid:187808959 eyr:2026 iyr:2020
+ecl:oth
+byr:1956 hcl:#733820
+
+byr:1959 hgt:160cm ecl:blu hcl:#6b5442
+cid:193 eyr:2026
+iyr:2014
+pid:812555315
+
+hgt:153cm iyr:2011
+ecl:grn hcl:#ceb3a1
+eyr:2026 byr:1966 pid:503356330
+
+ecl:#95d8a9
+eyr:2024 pid:382174744
+iyr:2025
+hgt:152 hcl:#888785 byr:2012
+
+eyr:2028
+iyr:2017 byr:1938
+cid:279 hcl:#733820 ecl:amb pid:497365268 hgt:191cm
+
+cid:335 byr:1982 hgt:171cm iyr:2013
+ecl:hzl eyr:2030
+hcl:#efcc98 pid:018900639
+
+eyr:2029 hgt:175cm pid:530128340
+hcl:#888785
+ecl:gry
+byr:1947 iyr:2019
+
+hgt:183cm
+hcl:#6b5442 eyr:2023 ecl:grn
+byr:1934
+
+hcl:f8ed45 cid:54 iyr:1997
+hgt:69cm eyr:2037 ecl:gry
+pid:184cm byr:2012
+
+ecl:grn hcl:#733820 byr:1928 pid:002528194
+iyr:2014 eyr:2021 hgt:157cm
+
+hgt:163in
+hcl:#c0946f byr:2018 eyr:2021
+iyr:1955 ecl:#216920 pid:87155266
+cid:298
+
+eyr:2026 byr:1945 cid:161 iyr:2017 hgt:170cm hcl:#fffffd ecl:hzl pid:649441221
+
+byr:1930
+iyr:2014 pid:151910079 hcl:#18171d ecl:oth eyr:2029
+hgt:169cm
+
+ecl:blu byr:1950 iyr:2010 cid:260 hcl:#cfa07d
+hgt:167cm
+pid:910685738 eyr:2021
+
+hgt:182cm byr:1993
+eyr:2030 pid:073035999 hcl:#341e13
+cid:117
+
+byr:1981
+hcl:#866857
+eyr:2028 iyr:2012 ecl:blu pid:620133246 hgt:157cm
+
+hgt:191cm
+iyr:2010 pid:089995590 eyr:2023 ecl:amb byr:1986 hcl:#733820
+
+iyr:2019 ecl:gry
+hgt:165cm pid:910093364 hcl:#efcc98 byr:1997
+eyr:2028
+cid:153
+
+hgt:83 hcl:174774 eyr:2032
+ecl:xry iyr:2017 byr:1940
+
+byr:1943
+pid:980352645
+iyr:2015 hgt:66 eyr:2023 hcl:#b6652a ecl:oth
+
+ecl:amb byr:1980 hgt:164cm pid:775303596 hcl:#671bed iyr:2013 eyr:2030
+
+hgt:173cm byr:1947 eyr:1947 iyr:1940 ecl:gmt hcl:7e515c
+
+hcl:#b6652a
+iyr:2012
+eyr:2030 hgt:185cm ecl:grn
+
+ecl:amb byr:1940 hcl:#2943a5 iyr:2015
+hgt:185cm pid:931660417
+eyr:2021
+
+eyr:1957 hcl:#623a2f
+ecl:grt hgt:62cm pid:#af106a iyr:2012
+cid:59 byr:1985
+
+ecl:amb eyr:2025
+pid:351412754 iyr:2014 byr:1941 hcl:#6b5442 hgt:174cm
+
+pid:5621200134 hcl:6ef9ba ecl:#ef68f5 eyr:1924
+hgt:63cm cid:188 byr:2004
+
+hcl:#a97842 byr:1976 eyr:2020 hgt:171cm pid:041926354 iyr:2019
+
+cid:234
+byr:2025 hcl:98619a pid:181cm eyr:1941
+iyr:2021
+hgt:167in ecl:#f5e651
+
+hgt:73cm eyr:2028 byr:1985 iyr:1949 hcl:z ecl:utc cid:207 pid:#ee9f95
+
+pid:179cm eyr:2030 hcl:b8e142
+hgt:69cm
+iyr:1933
+byr:1934
+ecl:grn
+
+iyr:2028 eyr:1954 hgt:111 cid:180 pid:183391861
+byr:2030 hcl:1fb30f ecl:#0d0160
+
+ecl:#0b3b2d hgt:191cm byr:2023 pid:727024676 eyr:2025 hcl:#b6652a
+
+hgt:66in
+byr:1923 eyr:2023 ecl:gry
+pid:454789451 iyr:2013 hcl:#cfa07d
+
+eyr:2020
+pid:339972685
+ecl:amb
+iyr:2017 byr:1926 hgt:154cm
+hcl:#18171d
+
+ecl:oth cid:302
+byr:1946
+hcl:#ceb3a1
+pid:622779476 eyr:2024 iyr:2012 hgt:158cm
+
+byr:2012
+pid:748786877 hgt:135 iyr:2016 hcl:b6e962 ecl:gry eyr:2011
+
+byr:1997
+hcl:#a97842
+eyr:2022 pid:325672898 ecl:amb hgt:190cm iyr:2010
+
+cid:210 hcl:#c0946f byr:1957 eyr:2022
+iyr:2020 pid:374646087 ecl:blu hgt:184cm
+
+eyr:2029 ecl:#353e0f
+pid:#66ec82
+byr:2023 hcl:10d9d8 cid:271
+
+pid:816485054
+eyr:2019 ecl:grn
+hcl:#efcc98 hgt:185cm iyr:2013
+byr:2014
+
+hcl:#866857 iyr:2014 byr:1953 eyr:2022 ecl:blu hgt:166cm
+
+pid:162cm hgt:59cm iyr:1981
+eyr:2025 byr:2009
+ecl:gmt hcl:116742
+
+eyr:2028 hgt:67cm hcl:3d1f34 byr:1963 pid:62859332
+ecl:dne
+iyr:2023
+
+iyr:2013
+pid:271450754 eyr:2016 hcl:e20882 cid:186 hgt:157in ecl:utc byr:2023
+
+pid:702200026 eyr:1968 ecl:gmt hcl:#888785 iyr:2018 hgt:193in byr:1943
+
+eyr:2025 byr:1989 ecl:amb hcl:#866857 cid:119
+hgt:191cm
+pid:556011434
+
+hgt:178cm iyr:2013
+pid:928476807
+ecl:amb hcl:#623a2f byr:1996 eyr:2026
+
+cid:222
+pid:325218825 eyr:2021 byr:1983 hgt:155cm ecl:brn iyr:2011
+hcl:#fffffd
+
+pid:949344785 ecl:grn eyr:2025 cid:182 byr:1974 hcl:#ceb3a1
+iyr:2011
+
+cid:269 pid:669599426 hgt:176cm ecl:blu byr:1957
+iyr:2015 hcl:#623a2f eyr:2025
+
+eyr:2023 hcl:#888785
+pid:178525132 iyr:2018 hgt:186cm
+
+ecl:hzl
+byr:1940 iyr:2013
+hgt:185cm eyr:2028
+hcl:#7c73a3
+
+hcl:z
+byr:2001 cid:292 ecl:#d56bbd pid:93473192
+iyr:2003 hgt:150
+eyr:1922
+
+eyr:2021 pid:786485899
+hgt:170cm hcl:#efcc98 byr:1955
+iyr:2010 ecl:brn
+
+hcl:#733820 ecl:hzl hgt:157cm byr:1944 eyr:2027 pid:906803629 iyr:2015
+
+hgt:151cm ecl:blu iyr:2016
+hcl:#02ffd7 byr:1995
+pid:369315941 eyr:2026
+
+cid:330 ecl:#18e883 eyr:2038
+hcl:z iyr:1929
+hgt:193 pid:33765426
+
+pid:743094345 eyr:2027
+iyr:1949 byr:1955
+ecl:gry
+hgt:160cm hcl:8dae67
+
+cid:167 hcl:#18171d
+iyr:2016 pid:214065645 byr:1942 eyr:2030 hgt:183cm ecl:hzl
+
+ecl:brn hcl:#623a2f cid:171 byr:1971
+iyr:2011 eyr:2028
+pid:607344613
+hgt:153cm
+
+byr:1921 pid:677007802 hcl:#341e13 ecl:brn iyr:2012 hgt:188cm eyr:2028
+
+hgt:162cm cid:319 hcl:z iyr:2025
+byr:1989 eyr:1939 pid:67311222
+ecl:utc
+
+iyr:2014 eyr:2025 hgt:171cm
+cid:302 byr:1997
+hcl:z
+ecl:amb pid:101363367
+
+ecl:oth iyr:2010
+cid:96 hgt:164cm hcl:4bc20a byr:1947
+pid:166115442 eyr:2030
+
+byr:1964
+hcl:#6b5442 hgt:156cm eyr:2022 pid:426807062 ecl:brn cid:321 iyr:2012
+
+byr:2012 hcl:#888785 cid:298 eyr:1920 ecl:zzz hgt:169cm pid:0660316558 iyr:2019
+
+hcl:579266 byr:1931 pid:#aa5fd0 ecl:gry eyr:2017 hgt:60 iyr:1965
+
+iyr:2011
+pid:610896691 hcl:#733820
+byr:1936
+ecl:gry eyr:2021 hgt:161cm
+
+pid:443246791 iyr:2015 hgt:158cm hcl:#18171d
+byr:1928 ecl:brn cid:207
+
+byr:1950 pid:644579904 hcl:#b6652a
+eyr:2027 iyr:2017
+ecl:brn hgt:171cm
+
+iyr:2011 byr:1960
+eyr:2023
+hgt:171cm ecl:hzl
+pid:331465564 cid:205 hcl:#18171d
+
+hgt:61cm eyr:1987 ecl:#9f458c byr:2023 pid:162cm hcl:z iyr:1997
+
+hcl:59e376 pid:065607649
+iyr:2020
+byr:2010 ecl:blu
+
+pid:167cm byr:2022 hgt:150cm ecl:#06650a hcl:caa145 eyr:2032
+iyr:2015
+
+byr:1932
+hcl:#419d73
+cid:203 iyr:2017
+pid:105921085
+ecl:gry
+
+pid:501585534 hcl:#418895
+iyr:2018
+hgt:157cm byr:1940 ecl:hzl eyr:2027
+
+cid:220 hgt:171cm hcl:#623a2f
+ecl:gry
+iyr:2017
+pid:085309709 eyr:2024 byr:1932
+
+hcl:#733820 eyr:2028 cid:93
+iyr:2017
+byr:1974 hgt:163cm ecl:grn pid:630322998
+
+hcl:#602927 cid:97 hgt:166cm eyr:2025
+ecl:hzl iyr:2016 byr:1964 pid:355325363
+
+iyr:2016 pid:402228657 hgt:174cm byr:1993
+eyr:2020 hcl:#733820 ecl:grn
+
+iyr:2020 hgt:171cm ecl:amb
+hcl:#c0946f
+byr:1939
+cid:316 pid:782384470 eyr:2030
+
+byr:1983 pid:839608616
+eyr:2026
+hcl:#ceb3a1 cid:242
+hgt:192cm ecl:hzl
+
+pid:701022732 byr:1931 ecl:amb
+hgt:70in hcl:#341e13 eyr:2030 iyr:2013
+
+eyr:2027
+pid:740692321 byr:1940
+hgt:179cm ecl:blu cid:153 iyr:2010
+
+iyr:2024 hcl:z ecl:zzz hgt:181in pid:#c38620 eyr:1976 cid:97
+byr:2029
+
+byr:1999 ecl:lzr hcl:6f29a6 eyr:2023
+iyr:2018 cid:209 pid:401606571 hgt:163cm
+
+ecl:amb
+byr:1996 hgt:181cm iyr:2018 hcl:#6b5442 pid:022285219 eyr:2021
+
+cid:93 pid:807990476
+hgt:61in eyr:2027 hcl:#cfa07d ecl:oth iyr:2017
+
+hcl:#7d3b0c pid:225151503 iyr:2013 cid:68
+eyr:2029
+ecl:brn hgt:64in byr:1959
+
+eyr:2028 hgt:172in
+iyr:2014 byr:1950 pid:187cm hcl:z ecl:brn
+
+byr:1982
+pid:978263388 eyr:2021 hgt:175cm iyr:2014 ecl:brn hcl:#a97842
+
+hgt:162cm
+eyr:2025
+pid:6533951177 byr:1993 iyr:2011 hcl:#c0946f ecl:hzl
+
+pid:182cm
+iyr:2025 eyr:2035 hgt:59in
+ecl:#799f29 hcl:z
+byr:1920 cid:202
+
+hcl:#733820
+eyr:2022 hgt:185cm byr:1989 pid:195276207
+ecl:blu iyr:2017
+
+hcl:#7d3b0c
+cid:257 ecl:gry
+pid:123065639 byr:1951 iyr:2013
+
+eyr:2039 ecl:#a82e90 byr:1927 pid:719738468 hgt:73cm
+
+hcl:605223
+hgt:162cm pid:50424035
+ecl:oth cid:343 byr:2025 iyr:2023 eyr:2024
+
+hcl:699116 iyr:2001
+eyr:2022
+byr:2013
+hgt:171cm pid:8900968325
+
+hcl:#efcc98 eyr:2029 ecl:grn pid:568953221
+byr:1986
+hgt:178cm
+iyr:2020
+
+pid:452235579 byr:1932
+ecl:grn
+iyr:2010 hgt:189cm eyr:2028
+hcl:#602927 cid:258
+
+ecl:xry iyr:2009 cid:334 pid:189cm
+eyr:2032 byr:2005 hgt:172in hcl:z
+
+hgt:159cm hcl:z pid:166cm
+ecl:oth eyr:2026 iyr:2020
+
+eyr:2023 ecl:blu byr:1935 iyr:2015
+hcl:#866857 pid:542611829
+hgt:168cm
+
+pid:#ec3d53
+hcl:#ceb3a1
+byr:1999 eyr:2024
+hgt:188cm ecl:oth iyr:2018
+
+byr:2003 hgt:167
+hcl:486800
+ecl:#29bdd6 eyr:2037 cid:169 iyr:2010
+
+byr:1983
+eyr:2026 ecl:gry
+pid:203934984
+hgt:181cm iyr:2020 hcl:#a97842 cid:184
+
+hgt:180cm
+iyr:1934 eyr:2038 hcl:#a97842 ecl:brn byr:1942 pid:427001597
+
+hcl:#18171d byr:1988
+cid:267 hgt:188cm
+ecl:amb
+eyr:2028 pid:696617232
+
+eyr:2024 hcl:#cfa07d
+iyr:2013 pid:176cm hgt:189cm byr:1990
+ecl:gry
+
+eyr:2025 iyr:2015 hgt:153cm hcl:#ceb3a1 ecl:grn pid:686467422 byr:1961 cid:282
+
+byr:1931 hgt:185cm ecl:oth
+eyr:2022
+pid:561083684 hcl:#efcc98
+iyr:2012
+
+byr:1948 cid:327 hgt:151cm
+iyr:2016 hcl:#733820 ecl:oth pid:341978822
+
+hcl:#ceb3a1
+byr:1978 iyr:2020 hgt:172cm
+eyr:2022 ecl:oth pid:093317990
+
+eyr:2029
+pid:096891409 iyr:2018
+hcl:#d82822 hgt:174cm ecl:hzl
+byr:1988
+
+hgt:170cm iyr:2018 pid:588142771 eyr:2022 hcl:#733820
+cid:273 byr:1940 ecl:#a608fe
+
+iyr:2029 eyr:1980 hcl:#341e13 byr:2027 ecl:grt
+pid:443809337 hgt:180cm
+cid:205
+
+ecl:#f89df0 hgt:144 hcl:2f26ab iyr:1982 pid:#3b43c1 eyr:2032 byr:2012
+
+ecl:hzl byr:1971
+pid:030850749
+hgt:170in
+hcl:#ceb3a1 eyr:2023 iyr:2018
+
+byr:1940 iyr:2020
+eyr:2026 pid:437820254
+hgt:179cm ecl:gry
+
+byr:2028
+eyr:1986 hcl:z
+hgt:185in pid:773739744 ecl:dne iyr:2020
+
+hcl:#a97842
+hgt:186cm cid:64 iyr:2016
+byr:1947 eyr:2021
+
+byr:1988 hgt:160cm eyr:2023 hcl:#866857 pid:788805179 iyr:2022 ecl:amb
+
+hgt:164cm byr:1996 cid:338 hcl:#efcc98
+eyr:2029 pid:208596014 ecl:blu
+
+pid:357680064 byr:1960 eyr:2029 ecl:gry hgt:192cm hcl:#c0946f
+
+ecl:#d32320
+hgt:167in pid:19531341
+hcl:z
+cid:346 iyr:2024 byr:2006 eyr:2035
+
+pid:843729120 byr:1987 hgt:185cm eyr:2022
+ecl:amb
+iyr:2012 hcl:#c0946f
+
+eyr:2020 byr:1961 iyr:2011
+hgt:162cm cid:54 pid:891397982 ecl:brn
+
+ecl:zzz byr:2019 iyr:2015 eyr:2028 hcl:43d56d
+hgt:152cm
+pid:182cm
+
+hcl:#18171d byr:1979 hgt:174cm
+iyr:2013 cid:228 eyr:2022 ecl:amb pid:82422450
+
+cid:156 iyr:2017
+byr:1924
+hcl:#b6652a ecl:gry hgt:184cm eyr:2027 pid:451347151
+
+pid:850192502 hgt:65in
+iyr:2011 hcl:#7d3b0c
+eyr:2023 ecl:gry
+
+ecl:amb hgt:181cm iyr:2017 pid:233345009 byr:1934
+hcl:#341e13
+eyr:2024 cid:199
+
+eyr:2026 pid:#4cb480
+iyr:1958 hgt:176cm ecl:dne hcl:z
+
+ecl:grn eyr:2027 hgt:178cm byr:1994 hcl:#341e13
+iyr:2016 pid:790075315
+
+pid:140922484
+byr:1958
+eyr:2025
+iyr:2019 ecl:brn hgt:157cm hcl:#623a2f
+
+pid:466785488 hgt:160cm hcl:#cfa07d
+byr:1947
+iyr:2010
+cid:198 eyr:2020 ecl:hzl
+
+ecl:oth
+eyr:2022 byr:1963
+hcl:#fffffd iyr:2017
+hgt:171cm pid:463249115
+
+hgt:73cm byr:1968
+pid:470317690 ecl:blu
+iyr:2015 hcl:#c0946f cid:54 eyr:2029
+
+hgt:162cm iyr:2014
+byr:1951 hcl:#b6652a eyr:2029 ecl:blu
+
+ecl:oth
+hgt:176cm hcl:#888785 byr:1963
+iyr:2017 pid:453133253 eyr:2025
+
+hcl:#efcc98
+eyr:2024 iyr:2020 cid:330 byr:1950 pid:937122408 ecl:gry hgt:162cm
+
+hgt:168cm
+pid:745867335
+cid:165 hcl:#c0946f iyr:2018 ecl:grt eyr:2030
+byr:1932
+
+byr:1949 pid:116003343
+hcl:#c0946f hgt:178cm eyr:2028 iyr:2020 cid:220
+ecl:hzl
+
+iyr:2013
+cid:314 pid:186cm hgt:74cm eyr:1973 ecl:hzl byr:2007
+hcl:180e0c
+
+pid:486330019
+byr:1999 ecl:oth hgt:154cm iyr:2019 eyr:2026
+hcl:#efcc98
+
+eyr:2030 iyr:2018 hcl:#18171d byr:1950
+pid:648616604 hgt:160cm ecl:gry
+
+hgt:173cm
+ecl:oth byr:1993 eyr:2029 hcl:#fffffd iyr:2010 pid:317451887
+
+ecl:brn hgt:157cm
+byr:1963 eyr:2023 pid:005387570 hcl:#866857 iyr:2012
+
+pid:419695212 eyr:2020 byr:1957 cid:198 iyr:2015 hcl:#888785 hgt:168cm ecl:amb
+
+ecl:amb
+iyr:2017 eyr:2024 pid:039995171 hcl:#a97842
+hgt:153cm byr:1983
+
+byr:1979 eyr:2021 iyr:2011 hgt:157cm ecl:blu pid:110855542 hcl:#c0946f
+
+ecl:blu pid:948753945 eyr:2029 iyr:2012 hcl:#ceb3a1
+hgt:164cm byr:1988
+
+iyr:2010
+eyr:2032 hcl:#fffffd pid:#175129 hgt:184cm
+ecl:hzl byr:1985
+
+hgt:189cm ecl:blu byr:1936 eyr:2027 hcl:#733820
+pid:728752361 iyr:2011
+
+hcl:#733820 ecl:blu eyr:2023 hgt:172cm iyr:2017
+pid:013415387 byr:1947
+
+byr:2012 iyr:2017 pid:#424ae4
+cid:172 hgt:166cm eyr:2022
+hcl:b1319b ecl:#6635d8
+
+eyr:2030
+iyr:1928 hgt:185cm ecl:brn pid:#ac5a90 byr:1984 hcl:ac8f43
+
+eyr:2027
+ecl:amb iyr:2014 hcl:#fffffd
+pid:838758900
+hgt:177cm byr:1942
+
+cid:166 iyr:2020 ecl:lzr hgt:70cm eyr:2040 byr:2004 hcl:#733820
+
+eyr:2028 ecl:grn byr:2016 cid:61 iyr:2010
+hcl:#cfa07d
+hgt:155in
+pid:9594283803
+
+ecl:gmt pid:984675198
+byr:1997 hgt:128 eyr:2037 hcl:#b6652a cid:299
+
+iyr:2015 pid:733864914 eyr:2021 ecl:amb
+byr:1971 cid:280
+hgt:181cm hcl:#054593
+
+ecl:hzl hcl:#cfa07d eyr:2022 pid:832736421
+byr:1958
+iyr:2010
+cid:274 hgt:152cm
+
+eyr:2020 hcl:#6b5442 cid:223 hgt:155cm byr:1989 ecl:oth
+iyr:2011 pid:549182194
+
+iyr:2020 hcl:#cfa07d
+eyr:2027 pid:093361240 byr:1941 cid:271 hgt:178cm ecl:brn
+
+ecl:blu cid:290 eyr:2027
+hgt:192cm byr:1945 hcl:#7d3b0c iyr:2020 pid:910713369
+
+byr:1991 hcl:#ceb3a1 ecl:xry hgt:159cm pid:9496171384
+eyr:2030 iyr:2016
+
+eyr:2020 pid:812617809 hcl:#7d3b0c
+byr:1970 ecl:gmt
+iyr:1971 hgt:157in
+
+pid:596027311 hcl:#866857 hgt:169cm byr:1945 eyr:2030 ecl:oth
+iyr:2010
+
+hgt:176cm
+pid:213213359 byr:2012 hcl:be7b13 eyr:1971 ecl:gmt iyr:2011
+cid:64
+
+pid:27107946 ecl:utc hgt:66cm byr:1928 eyr:2040
+cid:87
+
+byr:1959 ecl:blu hcl:4e023b pid:9017609497 eyr:2023 hgt:68 iyr:2029
+
+hgt:164cm eyr:2023 byr:2008 ecl:grn pid:420168481 hcl:#b6652a iyr:2012
+
+eyr:1977 byr:1934
+ecl:brn cid:163
+iyr:2018 pid:2863284754
+hgt:150in hcl:#623a2f
+
+ecl:hzl eyr:2031 cid:145 hgt:186cm hcl:#cfa07d
+byr:1941 iyr:2010 pid:722056139
+
+ecl:blu eyr:2027
+hcl:#888785 iyr:2018 byr:1977 cid:278 hgt:156cm
+
+eyr:2039 hgt:82 byr:2007
+hcl:z iyr:2021 ecl:dne cid:191
+pid:#1cf69f
+
+pid:183cm cid:111
+hgt:66cm
+iyr:1950
+eyr:1947 ecl:#016f6a
+
+ecl:hzl byr:1957 iyr:2015 hgt:186cm eyr:2029 hcl:#701e04 cid:149 pid:827898914
+
+cid:214 pid:785688542 hgt:189cm byr:1974 ecl:brn
+hcl:#18171d
+eyr:2030
+
+hcl:#866857
+cid:241 ecl:grn pid:389488422 byr:1959 iyr:2015 hgt:67in
+eyr:2027
+
+hcl:#6b5442 iyr:2011 hgt:193cm
+eyr:2026 byr:1952
+pid:033382338
+ecl:grn
+
+iyr:2020 hgt:166cm byr:1927
+eyr:2029 ecl:hzl
+pid:927006613 hcl:#623a2f
+
+ecl:gry pid:640783974
+hgt:71in byr:1945 iyr:2019 cid:268 hcl:#b6652a
+eyr:2025
+
+hcl:#733820 hgt:163cm
+pid:1285584293 byr:1967 ecl:oth
+cid:309 iyr:2020 eyr:2031
+
+pid:910349085 iyr:2011 hcl:#623a2f byr:1956
+eyr:2025 ecl:gry
+hgt:182cm
+
+pid:018283044 hcl:#602927 hgt:153cm ecl:gry iyr:2020
+eyr:2024
+byr:1990
+
+hgt:184cm hcl:#866857 ecl:oth
+eyr:2023 pid:405733635 cid:205
+byr:1987 iyr:2012
+
+hgt:167cm
+iyr:2015 ecl:brn
+eyr:2025
+hcl:#18171d cid:313 byr:1960
+
+hgt:165cm byr:1933
+iyr:2014
+cid:203
+hcl:#1cdbb3
+ecl:hzl eyr:2027 pid:747009469
+
+hgt:169cm ecl:gry iyr:2014
+byr:1966 pid:621876532 hcl:#efcc98
+
+cid:342 eyr:2029 hcl:#a97842 byr:1970
+ecl:oth
+pid:137287449 hgt:180cm
+iyr:2011
+
+hcl:#cfa07d byr:1985 hgt:183cm ecl:grn
+iyr:2013 eyr:2022
+
+iyr:2023
+pid:164cm hcl:z byr:1966
+eyr:2021 ecl:utc
+
+hcl:#fffffd cid:60
+byr:1973
+pid:324648387
+hgt:177cm eyr:2022 iyr:2010
+ecl:oth
+
+pid:632056596 hcl:#efcc98
+hgt:73in ecl:brn byr:1928 iyr:2017
+eyr:2023
+
+cid:144 ecl:amb eyr:2035 byr:1943 hgt:180cm
+iyr:2012
+pid:155cm
+
+hcl:#6b5442
+pid:927492391
+eyr:2023 hgt:172cm byr:1958 cid:92 ecl:gry iyr:2019
+
+iyr:2020 cid:82
+hgt:193in hcl:#b6652a
+ecl:grn eyr:2034 byr:2026
+
+iyr:1922 hcl:245cb3 byr:2015
+pid:151cm
+eyr:2040
+ecl:lzr cid:136 hgt:101
+
+byr:2025
+eyr:2029
+hgt:193in
+cid:308
+ecl:gry iyr:2028 pid:9335153289
+hcl:z
+
+eyr:2030 hgt:163cm iyr:2014
+pid:147768826 ecl:blu byr:1922 hcl:#ceb3a1 cid:169
+
+ecl:blu byr:2002 eyr:2028 pid:998185490 cid:165 iyr:2020
+hgt:188cm hcl:#c0946f