summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2022-04-19 20:31:44 +0200
committerJustin Wernick <justin@worthe-it.co.za>2022-04-19 20:31:44 +0200
commitcb3d2db9b82f131ebb36a9b3bea6830bf1a80c0f (patch)
treef516c9f1084b8ed57efe60482a51860e7436550c
parent34c0aa87fada4bf3bc75ff0493e0876e65289697 (diff)
parentcfd9b4f2ad1a09bedf7f764f84448a61faab54a3 (diff)
Merge branch '2018-main'
-rw-r--r--2018/Cargo.toml11
-rw-r--r--2018/inputs/1.txt968
-rw-r--r--2018/inputs/10.txt369
-rw-r--r--2018/inputs/12.txt34
-rw-r--r--2018/inputs/13.txt150
-rw-r--r--2018/inputs/15.txt32
-rw-r--r--2018/inputs/16_1.txt3143
-rw-r--r--2018/inputs/16_2.txt1014
-rw-r--r--2018/inputs/17.txt1713
-rw-r--r--2018/inputs/18.txt50
-rw-r--r--2018/inputs/19.txt37
-rw-r--r--2018/inputs/2.txt250
-rw-r--r--2018/inputs/20.txt1
-rw-r--r--2018/inputs/21.txt32
-rw-r--r--2018/inputs/22.txt2
-rw-r--r--2018/inputs/23.txt1000
-rw-r--r--2018/inputs/24.txt23
-rw-r--r--2018/inputs/25.txt1248
-rw-r--r--2018/inputs/3.txt1385
-rw-r--r--2018/inputs/4.txt1088
-rw-r--r--2018/inputs/5.txt1
-rw-r--r--2018/inputs/6.txt50
-rw-r--r--2018/inputs/7.txt101
-rw-r--r--2018/inputs/8.txt1
-rw-r--r--2018/inputs/9.txt1
-rw-r--r--2018/license.org21
-rw-r--r--2018/readme.org38
-rw-r--r--2018/src/bin/day_1.rs32
-rw-r--r--2018/src/bin/day_10.rs82
-rw-r--r--2018/src/bin/day_11.rs66
-rw-r--r--2018/src/bin/day_12.rs102
-rw-r--r--2018/src/bin/day_13.rs249
-rw-r--r--2018/src/bin/day_14.rs111
-rw-r--r--2018/src/bin/day_15.rs272
-rw-r--r--2018/src/bin/day_16.rs205
-rw-r--r--2018/src/bin/day_17.rs175
-rw-r--r--2018/src/bin/day_18.rs123
-rw-r--r--2018/src/bin/day_19.rs139
-rw-r--r--2018/src/bin/day_2.rs53
-rw-r--r--2018/src/bin/day_20.rs137
-rw-r--r--2018/src/bin/day_21.rs137
-rw-r--r--2018/src/bin/day_22.rs165
-rw-r--r--2018/src/bin/day_23.rs114
-rw-r--r--2018/src/bin/day_24.rs217
-rw-r--r--2018/src/bin/day_25.rs47
-rw-r--r--2018/src/bin/day_3.rs76
-rw-r--r--2018/src/bin/day_4.rs116
-rw-r--r--2018/src/bin/day_5.rs53
-rw-r--r--2018/src/bin/day_6.rs103
-rw-r--r--2018/src/bin/day_7.rs135
-rw-r--r--2018/src/bin/day_8.rs66
-rw-r--r--2018/src/bin/day_9.rs91
-rw-r--r--2018/src/lib.rs31
53 files changed, 15860 insertions, 0 deletions
diff --git a/2018/Cargo.toml b/2018/Cargo.toml
new file mode 100644
index 0000000..b1342d1
--- /dev/null
+++ b/2018/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "advent_of_code_2018"
+version = "0.1.0"
+authors = ["Justin Worthe <justin@worthe-it.co.za>"]
+
+[dependencies]
+im-rc = "12.2.0"
+arrayvec = "0.4.9"
+
+[profile.release]
+debug = true
diff --git a/2018/inputs/1.txt b/2018/inputs/1.txt
new file mode 100644
index 0000000..079567f
--- /dev/null
+++ b/2018/inputs/1.txt
@@ -0,0 +1,968 @@
++11
++9
++15
+-17
++8
++16
++5
++13
++8
+-6
++12
+-17
+-16
++13
++16
+-15
+-5
++11
++19
++5
+-8
++20
++18
++15
+-4
+-12
++8
++2
++15
++12
+-13
+-4
+-1
+-14
+-15
+-6
+-9
+-13
++18
++13
++6
+-8
+-3
+-19
++8
++17
++8
++5
+-11
++15
+-7
++9
+-18
+-9
++17
+-14
+-19
++4
+-6
++4
++1
+-12
++4
+-1
+-9
++4
++19
++20
++11
++8
++19
+-13
++17
++6
++8
+-11
++5
++9
+-15
++17
+-12
++6
+-19
+-2
++17
+-18
++7
+-5
++19
++15
++5
+-6
++2
++5
++18
++11
++2
++5
+-14
++17
++17
++1
++17
+-9
+-1
++5
+-11
++5
+-17
++2
++14
++16
+-3
++17
++18
++1
+-16
++19
+-11
+-10
++3
++8
++17
++19
+-18
++6
+-1
+-2
++14
+-2
++12
++11
++1
+-19
+-1
++18
++13
+-6
+-10
+-13
++12
+-11
++19
++14
++17
+-2
+-18
+-4
++11
+-12
+-2
+-21
++7
+-1
+-5
+-13
+-18
+-18
+-7
++9
++12
++6
+-12
++20
+-19
++6
+-19
++3
+-16
++20
+-17
+-8
++4
++8
+-21
++18
+-6
+-13
++2
++5
+-14
+-16
+-19
+-17
++4
+-15
+-11
+-3
++6
++13
++18
+-16
+-16
+-15
+-15
+-2
++1
+-3
++13
++25
++1
++14
+-8
+-8
+-19
++7
++11
++20
++5
+-9
++8
++19
+-9
++3
++1
++1
+-12
++18
++15
+-5
++11
+-1
++18
+-2
+-18
+-14
+-1
+-16
++12
++12
+-20
++10
++25
+-13
+-17
+-20
+-13
++11
+-40
+-19
++5
+-21
+-9
+-15
+-6
++3
++13
+-5
+-2
++33
++3
+-7
++42
++32
+-13
++2
++37
+-1
+-20
++30
++3
++8
++10
++11
+-5
+-26
++35
++16
+-12
++9
++16
++18
+-13
+-15
++19
++6
++18
++16
++11
++16
+-2
+-10
++1
+-2
++17
++7
+-1
++17
++6
++15
++7
+-5
+-6
++9
+-4
+-17
+-14
+-1
+-21
+-2
++15
++3
++8
+-18
+-17
+-14
++6
+-17
++20
++13
++14
+-1
+-1
++3
+-11
++19
++19
++7
+-18
+-9
++11
+-12
++11
++4
++2
++8
+-2
++6
+-20
++5
++6
+-13
+-8
++6
++11
++8
++2
++7
++11
+-7
++18
++11
++15
+-16
+-18
++6
++10
++6
++15
++13
++4
++4
++14
++14
+-47
++17
+-7
+-20
+-1
++19
++16
+-23
+-13
+-17
++13
+-8
++6
+-20
++4
++15
++4
++19
++19
+-7
+-24
+-17
+-19
+-2
++19
+-13
++8
+-4
+-19
+-9
++29
++21
+-29
++2
++15
++22
++1
++21
+-13
+-14
++12
+-57
+-5
+-49
+-10
+-19
+-19
+-6
++7
++21
+-12
+-13
+-13
++4
+-15
++9
++21
+-7
++19
++32
++31
+-27
+-21
++25
+-101
++69
+-75
++26
+-22
+-45
+-30
++5
+-40
+-15
+-880
+-60727
++14
+-13
+-18
++7
++2
+-5
++6
++14
++5
++5
+-18
+-15
+-9
++7
+-10
++19
++4
++7
++6
++3
++21
++2
++5
+-19
++15
+-11
+-19
+-7
+-1
+-16
++4
+-12
+-15
++3
++5
+-6
+-14
++11
+-16
+-7
+-15
++8
++12
+-2
+-9
+-12
+-17
++19
+-5
+-19
++16
+-10
+-13
+-14
+-1
+-10
+-18
+-6
+-11
++8
+-11
++4
++14
++9
++8
+-18
+-9
++8
+-19
+-5
+-14
++13
++19
++13
++16
++19
+-4
+-4
++3
++19
+-4
+-7
+-15
++6
+-9
+-15
++12
+-14
++6
+-17
++9
++13
+-4
+-20
++17
+-9
+-12
++16
++6
+-9
++19
++10
++11
++17
+-19
+-1
++12
++12
++1
+-6
+-1
++4
+-12
++11
+-14
++19
+-3
+-9
+-6
+-23
+-2
+-13
++18
+-2
++10
++2
++8
+-9
+-20
+-17
+-21
+-14
++11
+-5
+-15
++2
+-9
++4
+-7
+-12
++9
+-1
+-11
++1
+-10
++11
+-17
+-10
+-17
+-3
+-10
++11
++15
+-19
+-14
++1
++2
++18
++17
++3
++17
+-18
+-15
++2
+-3
+-14
++9
++9
++6
+-18
++13
+-21
+-18
++12
++7
++13
+-11
++20
++12
++1
++15
+-14
++4
++11
++18
+-2
+-7
+-12
+-11
++5
++10
++6
++8
++18
++6
+-13
++19
+-5
+-3
++14
+-3
+-20
+-3
+-3
++16
+-15
+-12
++8
+-24
+-16
+-13
+-3
++13
++6
+-12
+-31
++7
+-18
++17
+-13
++1
+-15
++16
++4
+-1
+-17
+-1
++16
+-4
++13
++8
++3
++33
++8
+-6
++20
+-4
++2
++13
+-29
+-17
+-22
+-24
+-5
++2
+-12
+-1
++2
+-15
++2
+-11
++6
++1
+-2
++5
++4
+-22
++5
++19
+-13
+-7
++16
++6
++2
+-22
++19
++9
++8
+-9
+-12
+-18
+-13
++1
++5
+-9
++10
+-11
+-10
++16
+-15
+-2
+-16
++1
+-15
+-17
+-3
++6
++11
++4
++11
+-16
+-3
++6
+-1
++13
++18
++6
+-2
+-6
+-4
+-5
++20
++19
+-8
++1
+-13
++16
++1
++10
+-25
+-19
+-4
++9
+-8
++17
++6
+-19
+-2
++5
++12
++7
+-21
+-12
++3
+-7
+-11
+-3
+-18
++2
++12
++20
+-23
+-19
+-17
++9
+-19
++1
+-14
+-5
+-4
+-9
++17
++4
++3
++15
+-13
++1
+-12
+-17
++8
++8
+-20
+-17
++15
+-16
++10
++7
++2
+-10
+-2
++8
++19
+-6
+-17
+-8
++9
++17
++25
+-5
+-18
++4
++18
++9
++18
+-14
+-2
++11
++14
+-17
+-15
++38
++12
+-2
++14
++4
++21
++16
++12
++15
++23
+-1
++6
++9
+-24
+-6
+-13
+-3
++33
+-13
++62
++81
++11
+-5
+-27
++9
+-7
++20
+-19
+-4
++27
++28
+-29
++82
++11
+-10
++8
+-22
++42
++34
+-24
+-15
++19
+-66
+-70
+-34
+-18
+-548
++408
+-1249
+-60542
++6
+-17
+-4
++6
+-7
++3
++14
++2
++15
+-6
+-5
++19
+-17
+-10
++6
+-11
++2
+-4
++10
+-5
+-11
+-13
+-12
+-14
+-10
+-9
++17
++9
++15
++1
+-10
+-10
++14
++16
+-17
+-15
++7
+-6
+-16
+-10
++15
+-2
+-7
+-3
+-5
+-14
+-8
+-9
++16
++7
++17
+-22
++12
+-16
++18
++5
++15
++10
++20
++11
+-5
++12
+-16
++8
+-16
++13
++14
+-5
+-12
+-9
+-16
+-5
++16
+-18
++21
+-9
+-13
+-8
+-10
++14
++18
+-17
+-16
++8
+-15
++2
+-4
++3
+-21
++17
+-16
++18
++18
+-3
+-21
++1
+-19
+-3
+-2
+-4
+-5
+-20
+-19
++6
+-19
++3
+-12
++124236
diff --git a/2018/inputs/10.txt b/2018/inputs/10.txt
new file mode 100644
index 0000000..3c77538
--- /dev/null
+++ b/2018/inputs/10.txt
@@ -0,0 +1,369 @@
+position=<-30052, -9918> velocity=< 3, 1>
+position=< 20349, -50260> velocity=<-2, 5>
+position=< 40505, -40169> velocity=<-4, 4>
+position=< 30444, 50599> velocity=<-3, -5>
+position=< 40549, -50259> velocity=<-4, 5>
+position=< 30454, -30087> velocity=<-3, 3>
+position=< 50623, 20347> velocity=<-5, -2>
+position=< 30439, -50262> velocity=<-3, 5>
+position=< 50623, 40516> velocity=<-5, -4>
+position=<-40143, -30090> velocity=< 4, 3>
+position=< 50594, 50602> velocity=<-5, -5>
+position=< -9884, -30087> velocity=< 1, 3>
+position=<-19958, -40168> velocity=< 2, 4>
+position=< 20357, 40513> velocity=<-2, -4>
+position=<-50240, 30431> velocity=< 5, -3>
+position=< 20351, 40516> velocity=<-2, -4>
+position=<-50257, -20005> velocity=< 5, 2>
+position=<-30073, 10253> velocity=< 3, -1>
+position=<-50265, 50597> velocity=< 5, -5>
+position=<-40154, 50601> velocity=< 4, -5>
+position=<-19987, -40168> velocity=< 2, 4>
+position=<-19987, -30087> velocity=< 2, 3>
+position=<-50257, 30425> velocity=< 5, -3>
+position=< 40558, 30425> velocity=<-4, -3>
+position=<-19990, 10256> velocity=< 2, -1>
+position=<-19979, 30425> velocity=< 2, -3>
+position=<-19976, -50254> velocity=< 2, 5>
+position=< 30446, -40172> velocity=<-3, 4>
+position=<-40157, 40515> velocity=< 4, -4>
+position=<-40143, 20342> velocity=< 4, -2>
+position=< 30467, -50255> velocity=<-3, 5>
+position=<-30040, 50606> velocity=< 3, -5>
+position=<-30037, 50605> velocity=< 3, -5>
+position=< 20382, -30086> velocity=<-2, 3>
+position=< 50594, 10262> velocity=<-5, -1>
+position=< 20342, 40515> velocity=<-2, -4>
+position=<-19963, -50258> velocity=< 2, 5>
+position=<-40135, 50599> velocity=< 4, -5>
+position=< 40558, 10262> velocity=<-4, -1>
+position=< 20366, -40177> velocity=<-2, 4>
+position=< -9888, -9919> velocity=< 1, 1>
+position=<-19998, 40511> velocity=< 2, -4>
+position=< 50608, 40516> velocity=<-5, -4>
+position=< 10263, 40520> velocity=<-1, -4>
+position=< 40521, -40171> velocity=<-4, 4>
+position=< 30427, -20005> velocity=<-3, 2>
+position=< 20333, -9916> velocity=<-2, 1>
+position=< -9909, -9913> velocity=< 1, 1>
+position=< 50628, 40511> velocity=<-5, -4>
+position=< 50610, 30430> velocity=<-5, -3>
+position=<-50248, 30433> velocity=< 5, -3>
+position=< 50612, 50599> velocity=<-5, -5>
+position=<-50253, -40170> velocity=< 5, 4>
+position=< -9880, 40513> velocity=< 1, -4>
+position=< 20362, 10256> velocity=<-2, -1>
+position=< -9877, -30087> velocity=< 1, 3>
+position=<-40182, -30082> velocity=< 4, 3>
+position=<-50240, -20003> velocity=< 5, 2>
+position=<-40138, 10255> velocity=< 4, -1>
+position=<-50221, 20348> velocity=< 5, -2>
+position=< -9896, -9917> velocity=< 1, 1>
+position=<-50209, 40516> velocity=< 5, -4>
+position=< 20352, 50602> velocity=<-2, -5>
+position=< 50607, -19998> velocity=<-5, 2>
+position=<-19995, -30087> velocity=< 2, 3>
+position=<-20003, 40517> velocity=< 2, -4>
+position=<-50219, 30431> velocity=< 5, -3>
+position=< 40521, -20001> velocity=<-4, 2>
+position=<-30036, 20339> velocity=< 3, -2>
+position=< 50624, 10257> velocity=<-5, -1>
+position=<-50224, 40517> velocity=< 5, -4>
+position=< -9907, 20344> velocity=< 1, -2>
+position=< 40534, -40169> velocity=<-4, 4>
+position=<-30065, -20003> velocity=< 3, 2>
+position=< -9922, 20339> velocity=< 1, -2>
+position=<-30052, 50602> velocity=< 3, -5>
+position=< 10276, -50263> velocity=<-1, 5>
+position=< 50594, 10258> velocity=<-5, -1>
+position=< -9876, 10258> velocity=< 1, -1>
+position=<-20001, -30091> velocity=< 2, 3>
+position=<-50253, 50602> velocity=< 5, -5>
+position=<-40159, -20002> velocity=< 4, 2>
+position=<-50224, -30091> velocity=< 5, 3>
+position=<-20001, 40511> velocity=< 2, -4>
+position=< 20357, -40173> velocity=<-2, 4>
+position=< 50615, 10255> velocity=<-5, -1>
+position=< -9877, -50254> velocity=< 1, 5>
+position=< 30440, 40516> velocity=<-3, -4>
+position=< 30427, 50605> velocity=<-3, -5>
+position=< 30419, -30090> velocity=<-3, 3>
+position=< 20376, -20001> velocity=<-2, 2>
+position=< 10255, 20344> velocity=<-1, -2>
+position=< 30419, 20344> velocity=<-3, -2>
+position=< 50595, -40169> velocity=<-5, 4>
+position=<-30081, 40513> velocity=< 3, -4>
+position=<-40143, -30090> velocity=< 4, 3>
+position=< 40553, 20344> velocity=<-4, -2>
+position=< 40529, -40170> velocity=<-4, 4>
+position=< 30427, -50262> velocity=<-3, 5>
+position=<-50240, -19996> velocity=< 5, 2>
+position=<-50245, -30090> velocity=< 5, 3>
+position=< 30448, -30087> velocity=<-3, 3>
+position=< -9875, -40171> velocity=< 1, 4>
+position=< -9900, 50599> velocity=< 1, -5>
+position=<-19954, -40168> velocity=< 2, 4>
+position=< 40526, 40518> velocity=<-4, -4>
+position=<-20011, 30428> velocity=< 2, -3>
+position=< 10283, 10257> velocity=<-1, -1>
+position=<-40175, 40520> velocity=< 4, -4>
+position=< 50636, -9915> velocity=<-5, 1>
+position=< -9904, 10255> velocity=< 1, -1>
+position=< 30435, 40520> velocity=<-3, -4>
+position=< 30424, -50254> velocity=<-3, 5>
+position=< 20393, 50602> velocity=<-2, -5>
+position=<-50261, -30083> velocity=< 5, 3>
+position=<-30065, 10254> velocity=< 3, -1>
+position=<-30052, -40177> velocity=< 3, 4>
+position=< 50625, -50263> velocity=<-5, 5>
+position=<-40142, -20001> velocity=< 4, 2>
+position=< 20338, -19996> velocity=<-2, 2>
+position=< 50599, 50604> velocity=<-5, -5>
+position=< 40534, -40176> velocity=<-4, 4>
+position=<-50235, 20339> velocity=< 5, -2>
+position=<-30068, -9918> velocity=< 3, 1>
+position=<-40173, 20339> velocity=< 4, -2>
+position=<-30054, -9915> velocity=< 3, 1>
+position=< 10255, 20348> velocity=<-1, -2>
+position=<-40162, 40520> velocity=< 4, -4>
+position=<-40158, -9918> velocity=< 4, 1>
+position=< 40508, 20348> velocity=<-4, -2>
+position=< 10307, -40177> velocity=<-1, 4>
+position=< 40545, -50261> velocity=<-4, 5>
+position=<-30073, -40172> velocity=< 3, 4>
+position=<-50209, -9918> velocity=< 5, 1>
+position=< -9913, 40515> velocity=< 1, -4>
+position=< -9873, -50262> velocity=< 1, 5>
+position=< -9877, 10261> velocity=< 1, -1>
+position=<-50245, -30084> velocity=< 5, 3>
+position=< 30440, 50606> velocity=<-3, -5>
+position=<-40167, 40514> velocity=< 4, -4>
+position=<-30076, -50255> velocity=< 3, 5>
+position=< -9891, -19996> velocity=< 1, 2>
+position=< -9877, 20340> velocity=< 1, -2>
+position=< 20365, -9911> velocity=<-2, 1>
+position=<-50256, 10253> velocity=< 5, -1>
+position=< -9909, -19996> velocity=< 1, 2>
+position=< 30479, -9919> velocity=<-3, 1>
+position=<-30065, 10257> velocity=< 3, -1>
+position=< 50652, -9919> velocity=<-5, 1>
+position=< 20338, -9914> velocity=<-2, 1>
+position=<-30062, 20339> velocity=< 3, -2>
+position=< 20360, 10259> velocity=<-2, -1>
+position=< 40537, 50604> velocity=<-4, -5>
+position=<-50221, 50603> velocity=< 5, -5>
+position=< 40505, -30090> velocity=<-4, 3>
+position=< -9890, 20339> velocity=< 1, -2>
+position=<-30097, -50261> velocity=< 3, 5>
+position=<-19995, -30086> velocity=< 2, 3>
+position=< 20341, 10255> velocity=<-2, -1>
+position=<-19977, -20005> velocity=< 2, 2>
+position=<-30053, -50259> velocity=< 3, 5>
+position=<-30065, -40173> velocity=< 3, 4>
+position=< 50617, 50601> velocity=<-5, -5>
+position=< 50631, -40171> velocity=<-5, 4>
+position=< -9925, -9915> velocity=< 1, 1>
+position=<-40150, 10262> velocity=< 4, -1>
+position=< 40526, 40516> velocity=<-4, -4>
+position=<-30055, -9915> velocity=< 3, 1>
+position=<-50264, 30432> velocity=< 5, -3>
+position=< 10287, -20003> velocity=<-1, 2>
+position=< 40534, 20348> velocity=<-4, -2>
+position=<-19960, -19998> velocity=< 2, 2>
+position=< 30464, -40173> velocity=<-3, 4>
+position=<-50220, -50259> velocity=< 5, 5>
+position=< 40537, -9919> velocity=<-4, 1>
+position=< 20357, 20346> velocity=<-2, -2>
+position=< 40510, 50598> velocity=<-4, -5>
+position=< 50607, -40172> velocity=<-5, 4>
+position=< 40537, -19996> velocity=<-4, 2>
+position=< 50636, 10261> velocity=<-5, -1>
+position=< -9896, 30425> velocity=< 1, -3>
+position=< -9917, 10255> velocity=< 1, -1>
+position=<-50248, 50606> velocity=< 5, -5>
+position=<-50237, -9919> velocity=< 5, 1>
+position=<-30073, -20005> velocity=< 3, 2>
+position=< 40529, 50606> velocity=<-4, -5>
+position=< 50650, -30082> velocity=<-5, 3>
+position=<-30093, 10258> velocity=< 3, -1>
+position=< 30456, -40177> velocity=<-3, 4>
+position=< 40521, -40170> velocity=<-4, 4>
+position=< 30468, 10257> velocity=<-3, -1>
+position=< 10276, -50261> velocity=<-1, 5>
+position=< 30421, -9919> velocity=<-3, 1>
+position=< -9877, 20346> velocity=< 1, -2>
+position=< 10258, -40177> velocity=<-1, 4>
+position=<-50264, 40516> velocity=< 5, -4>
+position=< -9883, -40173> velocity=< 1, 4>
+position=<-40127, -50256> velocity=< 4, 5>
+position=< -9885, 20343> velocity=< 1, -2>
+position=< 20382, -9914> velocity=<-2, 1>
+position=<-30076, -19998> velocity=< 3, 2>
+position=<-30073, 50601> velocity=< 3, -5>
+position=< -9893, 20345> velocity=< 1, -2>
+position=< -9904, 10258> velocity=< 1, -1>
+position=< 20393, -40171> velocity=<-2, 4>
+position=<-19984, 50603> velocity=< 2, -5>
+position=< -9889, 20343> velocity=< 1, -2>
+position=<-19982, 40512> velocity=< 2, -4>
+position=<-20009, -40168> velocity=< 2, 4>
+position=<-30069, -19997> velocity=< 3, 2>
+position=<-19987, -30085> velocity=< 2, 3>
+position=< 10252, 10259> velocity=<-1, -1>
+position=< -9917, 30428> velocity=< 1, -3>
+position=< 10287, 20342> velocity=<-1, -2>
+position=<-50245, -20000> velocity=< 5, 2>
+position=<-40165, -40177> velocity=< 4, 4>
+position=<-40135, -50262> velocity=< 4, 5>
+position=<-19984, -30085> velocity=< 2, 3>
+position=< 30428, -30091> velocity=<-3, 3>
+position=<-30089, 30431> velocity=< 3, -3>
+position=< 30467, 20344> velocity=<-3, -2>
+position=<-19987, 40520> velocity=< 2, -4>
+position=<-30037, 40512> velocity=< 3, -4>
+position=< 40557, -50255> velocity=<-4, 5>
+position=< 40550, 10254> velocity=<-4, -1>
+position=<-40159, 10258> velocity=< 4, -1>
+position=< 40539, 20343> velocity=<-4, -2>
+position=< 30440, 50605> velocity=<-3, -5>
+position=< 30453, 30434> velocity=<-3, -3>
+position=< 40550, -30088> velocity=<-4, 3>
+position=<-40151, 10256> velocity=< 4, -1>
+position=< 10276, 40514> velocity=<-1, -4>
+position=< 10280, 20348> velocity=<-1, -2>
+position=<-20009, -30091> velocity=< 2, 3>
+position=< 30467, 50601> velocity=<-3, -5>
+position=< 30439, -20000> velocity=<-3, 2>
+position=< 10276, -20005> velocity=<-1, 2>
+position=< 40562, -30082> velocity=<-4, 3>
+position=<-19986, -20004> velocity=< 2, 2>
+position=< 20333, 10259> velocity=<-2, -1>
+position=<-50224, -9911> velocity=< 5, 1>
+position=< -9872, -9919> velocity=< 1, 1>
+position=< 10295, -30085> velocity=<-1, 3>
+position=<-19990, 30429> velocity=< 2, -3>
+position=< 10295, -30084> velocity=<-1, 3>
+position=< 30429, 40515> velocity=<-3, -4>
+position=< 20365, -30086> velocity=<-2, 3>
+position=< 50618, 10258> velocity=<-5, -1>
+position=<-20010, -9910> velocity=< 2, 1>
+position=< 20373, -40169> velocity=<-2, 4>
+position=< 10307, -50261> velocity=<-1, 5>
+position=< 20381, 10256> velocity=<-2, -1>
+position=< 40513, 40517> velocity=<-4, -4>
+position=< -9865, 20345> velocity=< 1, -2>
+position=< -9909, 20347> velocity=< 1, -2>
+position=< 10284, 20348> velocity=<-1, -2>
+position=<-30073, 20342> velocity=< 3, -2>
+position=<-30078, 30425> velocity=< 3, -3>
+position=< -9899, 20342> velocity=< 1, -2>
+position=< 20333, 30429> velocity=<-2, -3>
+position=< 10306, 10253> velocity=<-1, -1>
+position=<-50261, 10260> velocity=< 5, -1>
+position=< 30459, -9912> velocity=<-3, 1>
+position=< 10292, -40176> velocity=<-1, 4>
+position=< 20389, -30083> velocity=<-2, 3>
+position=<-40166, 20340> velocity=< 4, -2>
+position=< -9901, 20345> velocity=< 1, -2>
+position=< 40557, -20004> velocity=<-4, 2>
+position=<-40158, -30090> velocity=< 4, 3>
+position=<-50209, 10255> velocity=< 5, -1>
+position=<-50265, -40172> velocity=< 5, 4>
+position=<-50245, 50605> velocity=< 5, -5>
+position=< 30443, -40177> velocity=<-3, 4>
+position=< -9916, 20339> velocity=< 1, -2>
+position=< 50640, 50601> velocity=<-5, -5>
+position=<-19971, -20005> velocity=< 2, 2>
+position=< 40522, -9914> velocity=<-4, 1>
+position=< 50607, -19999> velocity=<-5, 2>
+position=<-50243, 40515> velocity=< 5, -4>
+position=<-50240, 10260> velocity=< 5, -1>
+position=< 40561, -19998> velocity=<-4, 2>
+position=<-50211, -50254> velocity=< 5, 5>
+position=<-40143, 30431> velocity=< 4, -3>
+position=< 30430, -50259> velocity=<-3, 5>
+position=< 30479, -20002> velocity=<-3, 2>
+position=<-30092, 20344> velocity=< 3, -2>
+position=<-30092, -40168> velocity=< 3, 4>
+position=< 50601, 10257> velocity=<-5, -1>
+position=< 20373, 40515> velocity=<-2, -4>
+position=< 30479, -19997> velocity=<-3, 2>
+position=<-40175, 50605> velocity=< 4, -5>
+position=< -9880, -40173> velocity=< 1, 4>
+position=< 20349, -50255> velocity=<-2, 5>
+position=< 20362, -9914> velocity=<-2, 1>
+position=<-30089, 50601> velocity=< 3, -5>
+position=< 30467, 10253> velocity=<-3, -1>
+position=< 40565, 30429> velocity=<-4, -3>
+position=<-40142, 10257> velocity=< 4, -1>
+position=< 50609, -50263> velocity=<-5, 5>
+position=< -9881, -40173> velocity=< 1, 4>
+position=< 50639, 40515> velocity=<-5, -4>
+position=<-50269, -40170> velocity=< 5, 4>
+position=< 40553, -9910> velocity=<-4, 1>
+position=< 30455, 30434> velocity=<-3, -3>
+position=< 20362, 10258> velocity=<-2, -1>
+position=< 40505, 50603> velocity=<-4, -5>
+position=<-19990, 10260> velocity=< 2, -1>
+position=< 30447, -19998> velocity=<-3, 2>
+position=<-40150, -30087> velocity=< 4, 3>
+position=< -9907, -40172> velocity=< 1, 4>
+position=<-30044, 20348> velocity=< 3, -2>
+position=<-40178, -9913> velocity=< 4, 1>
+position=<-50261, 30428> velocity=< 5, -3>
+position=<-40151, 20348> velocity=< 4, -2>
+position=<-50224, 30432> velocity=< 5, -3>
+position=< 50652, -50263> velocity=<-5, 5>
+position=<-19952, 50606> velocity=< 2, -5>
+position=< 30431, 40511> velocity=<-3, -4>
+position=< 30459, -30088> velocity=<-3, 3>
+position=< 50651, 20347> velocity=<-5, -2>
+position=< 10292, -30082> velocity=<-1, 3>
+position=< 20366, 10257> velocity=<-2, -1>
+position=<-19987, -9913> velocity=< 2, 1>
+position=< -9865, -40170> velocity=< 1, 4>
+position=< -9889, 50597> velocity=< 1, -5>
+position=<-30065, -50262> velocity=< 3, 5>
+position=< -9921, 20347> velocity=< 1, -2>
+position=<-30084, 10253> velocity=< 3, -1>
+position=< 10248, -20005> velocity=<-1, 2>
+position=< 20345, -9915> velocity=<-2, 1>
+position=< -9882, -9915> velocity=< 1, 1>
+position=<-30065, 50602> velocity=< 3, -5>
+position=< 40565, 50599> velocity=<-4, -5>
+position=< 20349, -50261> velocity=<-2, 5>
+position=<-19960, -19998> velocity=< 2, 2>
+position=< 10255, -50258> velocity=<-1, 5>
+position=< -9901, -50255> velocity=< 1, 5>
+position=<-50219, -9916> velocity=< 5, 1>
+position=< 40524, -30086> velocity=<-4, 3>
+position=< 40550, 50600> velocity=<-4, -5>
+position=<-50233, -30091> velocity=< 5, 3>
+position=< 30440, -50257> velocity=<-3, 5>
+position=< -9920, 50605> velocity=< 1, -5>
+position=< 40507, 20339> velocity=<-4, -2>
+position=< 10264, 30426> velocity=<-1, -3>
+position=< 40556, 20341> velocity=<-4, -2>
+position=< -9875, -9913> velocity=< 1, 1>
+position=<-30068, -50254> velocity=< 3, 5>
+position=< -9889, 30425> velocity=< 1, -3>
+position=<-20011, -40172> velocity=< 2, 4>
+position=<-50269, 10259> velocity=< 5, -1>
+position=<-40132, 30432> velocity=< 4, -3>
+position=< 40553, -9913> velocity=<-4, 1>
+position=<-30073, 10256> velocity=< 3, -1>
+position=<-30092, 20340> velocity=< 3, -2>
+position=< 40542, 50606> velocity=<-4, -5>
+position=<-50224, 20347> velocity=< 5, -2>
+position=<-40143, 50606> velocity=< 4, -5>
+position=<-19971, -20000> velocity=< 2, 2>
+position=< 40553, 20340> velocity=<-4, -2>
+position=<-30081, -20001> velocity=< 3, 2>
+position=<-30037, -40172> velocity=< 3, 4>
+position=< -9865, 30428> velocity=< 1, -3>
+position=< 30479, 20340> velocity=<-3, -2>
+position=< 30429, 20343> velocity=<-3, -2>
+position=<-19971, -40172> velocity=< 2, 4>
+position=< 30431, 50601> velocity=<-3, -5>
+position=<-19982, 10256> velocity=< 2, -1>
+position=< 20344, 20343> velocity=<-2, -2>
diff --git a/2018/inputs/12.txt b/2018/inputs/12.txt
new file mode 100644
index 0000000..6d801ae
--- /dev/null
+++ b/2018/inputs/12.txt
@@ -0,0 +1,34 @@
+initial state: ###..#...####.#..###.....####.######.....##.#####.##.##..###....#....##...##...##.#..###..#.#...#..#
+
+.###. => .
+..#.. => .
+.#### => .
+.##.. => #
+#.#.# => .
+..#.# => #
+#.##. => #
+#...# => #
+..... => .
+##..# => #
+.#.#. => .
+..##. => #
+##.#. => .
+###.. => .
+.#... => #
+..### => .
+#..## => .
+...#. => .
+###.# => #
+.##.# => .
+.#.## => .
+....# => .
+##### => .
+#.#.. => #
+...## => #
+#.... => .
+#.### => #
+##... => #
+.#..# => .
+####. => .
+#..#. => #
+##.## => #
diff --git a/2018/inputs/13.txt b/2018/inputs/13.txt
new file mode 100644
index 0000000..a2195f8
--- /dev/null
+++ b/2018/inputs/13.txt
@@ -0,0 +1,150 @@
+ /----------------------------------------------------\ /----------------------------\
+ /-------->-------\ | /----+----------+----------------------------+----------\
+ | /+-----+-----------------------------------------------+----+----------+-\ /---+-------\ |
+ | /-------++-----+-----------------------------------------------+----+----------+-+---\ | | | |
+ /--+-------+-------++-----+-----------------------------------------------+---\| | | | | | | |
+ /----------+--+-----\ | || | /----------------------------------+---++----------+-+---+----\ | | | |
+ | | | /---+-+-------++-----+------------+--------------->------------------+---++----------+-+\ | | | | | |
+ | /-----+--+-+---+-+-------++-----+------------+----------------------------------+---++---\ | || | | | | | |
+ | | | | | | | || | | /-------------------+---++---+--\ | || | | | | | |
+ /+----+-----+--+-+---+-+-------++-----+------------+\ | | || | | | || | | | | | |
+ || | /---+--+-+---+-+-------++-----+------------++-------------+-------------------+---++---+--+-\ | || | | | | | |
+ || | | | | | | | || /-+---------\ || | | || | | | | || | | | | | |
+ || | | | | | | | || | | | || | | || | | | | || | | | | | |
+ || | | | | | | ^ || | | | || | /-----+---++---+--+-+-+-++--+----+-------------+---+--\ | |
+ || | | | | | | | ||/--+-+---------+--++-------------+------->-----+-----+\ || | | | | || | | | | | | |
+ || | | | | | | | ||| | | | || /-------+-------------+-----++--++---+--+-+-+-++--+----+-------------+---+\ | | |
+ || | | | | | | | ||| |/+---------+--++-----+-------+-------------+-----++--++---+--+-+-+-++--+----+-------------+---++\| | |
+ || \-+---+--+-+---+-+-------+++--+++---------+--++-----+-------+-------------+-----++--++---/ | | | || |/---+-------------+---++++----+--+\
+ || | | | | | | ||| ||| | || | | | || || | | | || || | \---++++----/ ||
+ || | | \-+---+-+-------+/| ||| | || | | | |v || | | | || || | |||| ||
+ || | | | | | | |/-+++-----\ | || | | | || || | | | || || | |||| ||
+ || | | | | | | || ||| | | || | | | || || /----+-+-+-++--++---+-----------------++++-------++--\
+ || | /+----+---+-+-------+-++-+++-----+---+--++-\ | | | || || | | | | || || | |||| || |
+ || /--+--++----+---+-+--\ | || ||| | | || | | | /------+-----++--++-+----+-+-+-++--++---+-----------------++++--\ || |
+ || | | || | | | | | || ||| | | || | | | | /-+-----++-\|| | | | | || || | |||| | || |
+ || | | ||/---+---+-+--+----+-++-+++-----+---+--++-+---+--->---+-\ | | | || |||/+----+-+-+-++--++---+-----------------++++--+----++--+\
+ || | | ||| | | | | | || ||| | | || | | | | | | \-----++-+++++----+-+-+-++--++---+-----------------+++/ | || ||
+ || | | ||| | | | | | || ||| | | || | /+-------+-+----+----+-------++\||||| | | | || || | ||| | || ||
+ || | | ||| | | | | /+-++-+++-----+---+--++-+--++-------+-+\ /+----+-------++++++++----+-+-+-++--++---+-----------------+++-\ | || ||
+ || | | ||| /-+---+-+--+---++-++-+++-----+---+--++-+--++-------+-++--++----+------\|||||||| | | | || || | ||| | | || ||
+ || | | ||| | | | | | || || ||| | | || | || | || || | ||||||||| |/+-+-++--++---+-----------------+++-+-+\ || ||
+ || | | ||| | | | | | || || ||| | | || | || \-++--++----+------+++++++++----/|| | || /++---+------------\ ||| | || || ||
+ || | | ||| | | | | | || || ||| | | || | || /++--++----+---\ ||||||||| || | || ||| | | ||| | || || ||
+ || | | ||| | | | | | || || ||| | | || | || ||| || | | ||||||||| || | || ||\---+------------+----+++-+-++---+/ ||
+ || | | ||| | | | | | || || ||| |/--+--++-+--++-------\||| || | | ||||||||| || | || || | | ||| | || | ||
+ || | | /+++-+-+---+-+--+---++-++-+++-----++--+--++-+--++-------++++--++----+---+--+++++++++----\|| | || || | | ||| | || | ||
+ || | | |||| | | | | | || || ||\-----++--+--++-+--++-------++++--++----+---+--++++++/|| ||| | || || | | ||| | || | ||
+ || | | |||| | |/--+-+--+---++-++-++------++--+--++\| || /----++++--++----+---+--++++++-++----+++-+-++-++----+------\ | ||| | || | ||
+ || | | |||| | || | | | || || || || | |||| || | |||| || | | |||||| || ||| | || || | | | ||| | || | ||
+ || | | |||| | || | | | || || || /++--+--++++--++--+----++++--++----+---+--++++++-++----+++-+-++-++----+------+-----+----+++-+-++---+---++\
+ || | | |||| | || | | | || || || /---+++--+--++++--++--+----++++--++----+---+--++++++-++----+++-+-++-++\ | | /+----+++-+-++---+--\|||
+ || | | |||| | || | | | || || || | ||| | \+++--++--+----++++--++----+---+--++++++-++----+++-+-++-+++---/ | || ||| | || | ||||
+ || | | |||| | || | | | || || \+-+---+++--/ ||| || | |||| || | | |||||| || ||| | || ||| | || ||| | || | ||||
+ || | | |||| | || | | | || || |/+---+++------+++--++--+----++++--++\ | | |||||| || ||| | || ||| | || ||| | || | ||||
+ || | | |||| | || | | | || || ||| ||| ||| || | ||||/-+++---+---+--++++++-++----+++-+-++-+++----------+----++----+++-+\|| | ||||
+ || | | |||| \-++--+-+--+---++-++--+++---+++------+++--++--+----+++++-+++---+---+--/||||| || ||| | || ||| | || ||| |||| | ||||
+ || | | |||| || | | | || || ||| ||| ||| || | ||||| ||| | | ||||| || ||| | || ||| | || ||| |||| | ||||
+ || | | |||| || | | | || || ||| ||| /----+++--++--+----+++++-+++---+---+---+++++-++----+++-+-++-+++----------+----++---\||| |||| | ||||
+ || | /+-++++---++--+-+--+---++-++--+++---+++-+----+++--++--+----+++++-+++\ | | ||||| || ||| | || ||| | ||/--++++-++++\ | ||||
+ || |/++-++++---++--+-+--+--\|| || ||| ||\-+----+++--++--+----/\+++-++++--+---/ ||||| || ||| | || ||| | ||| |||| ||||| | ||||
+ || |||| |||| || | | | ||| || ||| || | ||| || | ||| |||| | ||||| || /-+++-+-++-+++---\ | ||| |||| ||||| | ||||
+ |\---++++-++++---++--/ | | ||| || ||| || | ||| || \------+++-++++--+-------+++++-++--+-+++-+-++-+++---+------/ ||| |||| ||||| | ||||
+ | |||| |||| || | | ||| || ||| || | ||| || ||| |||| | ||||| || | ||| | || ||| | ||| |||| ||||| | ||||
+ | |||| |||| || \--+--+++-++--+++---++--+----+++--++---------+++-++++--+-------+++++-++--+-+++-+-++-+/| | ||| |||| ||||| | ||||
+ | ||||/++++---++-------+--+++-++--+++---++--+----+++--++---------+++\|||| | ||||| || | |||/+-++-+-+---+-----------+++--++++-+++++--+\ ||||
+ | ||||||||\<--++-------+--+++-++--+++---++--+----+++--++---------/||||||| \-------+++/| || | ||||| || \-+---+-----------+/| |||| ||||| || ||||
+ | |||||||| /++------\| ||| || /+++---++--+----+++--++----------+++++++----------+++-+-++--+-+++++-++---+---+---------\ | | |||| ||||| || ||||
+ | |||||||| ||| ||/-+++-++-++++---++--+-\ ||| || ||||||| ||| | || | ||||| || | | | | | |||| ||||| || ||||
+ | |||||||| ||| ||| ||| || |||| || | | ||| || ||||||| /+++-+-++--+-+++++-++\ | | | | \--++++-++++/ || ||||
+ | |||||||| ||| ||| ||| || |||| || | | ||| || ||||||| |\++-+-++--+-+++++-+++--+---+---------+-+----++++-++++---/| ||||
+ | /--++++++++---+++------+++-+++-++-++++---++--+-+--+++\ || ||||||| | || | || | ||||| ||| | | | \----++++-++++----+-/|||
+ | | |||||||| ||| ||| ||| || |||| || | | |||| || ||||||| | || | || | ||||| ||| | |/--------+----\ |||| |||| | |||
+ | | |||||||| ||| /+++-+++-++-++++---++--+-+--++++-++----------+++++++---\ | || | || | ||||| ||| | || /------+---\| |||| |||| | |||
+ | | |||||||| ||| |||| ||| || |||| || | | |||| || /-----+++++++---+---\ | || | || | ||||| ||| |/--++-+------+---++-++++-++++----+-\|||
+ \-+--++++++++---+++-----++++-+++-++-++++---++--+-+--/||| || | ||||||| | | | || | || | ||||| ||| || || | | || |||| |||| | ||||
+ | |||||||| /-+++-----++++-+++-++-++++---++--+\| ||| || | ||||||| | | | || | || | ||||| ||| || || | | || |||| |||| | ||||
+ | |||||||| | ||| |||| ||| ||/++++---++--+++---+++-++----+-----+++++++---+---+-+-++-+-++--+-+++++-+++--++--++-+------+\ || |||| |||| | ||||
+/--+--++++++++-+-+++-----++++-+++-+++++++---++--+++---+++-++----+-----+++++++---+---+-+-++-+-++--+-+++++-+++\ || || | || || |||| |||| | ||||
+| | |||||||| | ||| ||||/+++-+++++++---++--+++---+++-++----+-----+++++++---+\ | | || | |\--+-+++++-++++-++--++-+------++--++-++++-++++----+-+/||
+| | |||||||| | ||| |||||||| ||||||| || ||| ||| || | ||||||| || | | || | | | ||||| |||| || || | || || |||| |||| | | ||
+| | |||||||| | |||/----++++++++-+++++++---++--+++---+++-++----+-----+++++++---++--+-+-++-+-+---+-+++++-++++-++\ || | || || |||| |||| | | ||
+| | |||||||| | |||| |||||||| ||||||| /-++--+++---+++-++----+-----+++++++---++--+\| || | | | ||||| |||| ||| || | || || |||| |||| | | ||
+| | |||||||| | |||| |||||||| ||||||| | || ||| ||| || | ||||||| || ||| || | | | ||||| |||| ||| || | || || |||| |||| | | ||
+| | |||\++++-+-++++----++++++++-+++++++-+-++--+++---+++-++----+-----+++++++---++--+++-++-+-+---+-++/|| |||| ||| || | || || |||| |||| | | ||
+| | ||| |||| | |||| ||||||||/+++++++-+-++\ ||| ||| || \-----+++++++---++--/|| || | | | || || |||| ||| || | || || |||| |||| | | ||
+| | ||| |||| | |||| |||||||\++++++++-+-+++-+++---+++-++----------+++++++---++---++-++-+-+---+-++-++-/||| ||| || | || || |||| |||| | | ||
+| | ||| |\++-+-++++----+++++++-++++++++-+-+++-+++---+++-++----------+++++++---++---++-++-+-+---+-/\-++--+++-+++-++-+------++--++-++++-+++/ | | ||
+| | ||| | || | |||| ||||||| |||||||| | ||| ||| ||| ^| ||||\++---++---++-++-+-+---+----++--+++-+++-++-+------++--++-++++-++/ | | ||
+| | ||| | || | |||| ||||||| ||||||\+-+-+++-+++---+++-++----------++++-/|/--++---++-++-+-+---+----++--+++-+++-++-+-\ || || |||| || | | ||
+| | ||| | || \-++++----+++++++-++++++-+-+-+++-+/| /-+++-++-------\ |||| || || || |v | v | \+--+++-+++-++-+-+----++--++-++++-++------/ | ||
+| | ||| | || |\++----+++++++-++++++-+-+-+++-+-+-+-+++-++-------+--++++--++--++---++-++-+-+---+-----+--/|| ||| || | | || || |||| || | ||
+| /+--+++-+-++---+-++----+++++++-++++++-+-+-+++-+-+-+-+++-++-------+--++++--++-\|| || || | | /+-----+---++-+++-++-+-+----++--++-++++-++-----\ | ||
+| || ||| | \+---+-++----+++++++-++++++-+-+-+++-+-+-+-+/| || | |||| || ||| || || | | || | || |\+-++-+-+----++--++-++++-++-----+--/ ||
+| || ||| | | |/++----+++++++-++++++-+-+-+++-+-+-+-+-+-++-------+--++++--++-+++---++-++-+-+--++-----+---++-+\| || | | || || |||| || | ||
+| || ||| | | |||| ||||||\-++++++-+-+-+++-+-+-+-+-+-++-------+--/||| || ||| || || | | || /---+---++-+++-++-+-+----++--++-++++-++---\ | ||
+| || ||| | /+---++++----++++++--++++++-+-+-+++-+-+-+-+-+-++-------+---+++--++-+++---++-++-+-+--++-+--\| || ||| || | | || || |||| || | | ||
+| || ||| | || /-++++----++++++\ |||||| | \-+++-+-+-+-+-+-++-------+---+++--++-+++---/| ||/+-+--++-+--++---++-+++-++-+\| || || |||| || | | ||
+| || ||\-+-++-+-++++----+++++++-++++++-+---+++-+-+-+-+-+-++-------+---+++--/| ||| | |||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | |\-+-++++----+++++++-++++++-+---+++-+-+-+-+-+-++-------+---+++---+-+++----+-+++/ | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | \+++----+/||||| \+++++-+---++/ | | | | | || | ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | |\+----+-+++++--+++++-+---++--+-+-+-/ | || | ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || | | | | | | ||||| ||||| | || | | | /+-++-------+\ ||| | ||| | ||| | || | || || ||| || ||| || || |||| || | | ||
+| || || \-+--+--+-+----+-+++++--+++++-+---++--+-+-+--++-++-------++--+/| | ||| \-+++--+--++-+--++---/| ||| || ||| || || |||| || | | ||
+| || || | | | | | ||||| ||||| | || | | | || || /----++--+-+---+-+++------+++--+--++-+--++----+-+++-++-+++----++-\|| |||| || | | ||
+| || ||/---+--+-\| |/---+-+++++--+++++-+---++--+-+-+--++-++--+----++--+-+---+-+++----\ ||| | ||/+--++----+-+++-++-+++----++-+++-++++-++---+\| ||
+| || ||| | | || || | ||||| ||||| | || | | | || || | || | | | ||| | ||| \--++++--++----+-+++-++-+++----++-+++-++++-++---+++----/|
+| || ||| | | || || | ||||| ||||| | || | | | /++-++--+----++--+-+---+-+++----+-+++-----++++--++----+-+++-++-+++----++-+++\|||| || ||| |
+| || ||| ^ | || || | ||||| ||||| | || | | | ||| || | || | | | ||| | ||| |||\--++----+-+++-++-+++----++-++++++++-++---/|| |
+| || ||| | | || || | ||||| ||||| | || \-+-+-+++-++--+----++--+-+---+-+++----+-+++-----+++---++----+-+++-++-+++----++-++++/||| || || |
+| || ||| | | || || | ||||| ||||| | || | | ||| || | /-++--+-+---+-+++----+-+++-----+++---++----+-+++-++-+++--\ || |||| ||| || || |
+|/++--+++---+--+-++-++---+-+++++--+++++-+--\|| |/+-+++-++--+--+\|| | | | ||| | ||| ||| |\----+-+++-++-+++--+-++-++++-/|| || || |
+|||| ||| | | || || | ||||| ||||| | ||| /+++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+++-++-+++--+-++-++++\ || || || |
+|||| ||| | | || || | ||||| |\+++-+--++/ |||| ||| || | |||| | | | ||| | ||| ||| | | ||| || ||| | || ||||| || || || |
+|||| ||| | | || || | ||||| |/+++-+--++---\|||| ||| || | |||| | | | ||| | ||| ||| | | ||| || ||| | || ||||| || || || |
+|||| |\+---+--+-++-++---+-+++/| ||||| | |\---+++++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+++-++-+++--+-++-+++++-++-++----++-----/
+|||| | | | | |\-++---+-+++-+--+++++-+--+----+++++-+++-++--+--++++--+-+---+-+++----+-+++-----+++---+-----+-+/| || ||| | || ||||| || || ||
+|||| | | | | | /++---+-+++\| ||||| | | ||||| ||| || | |||| | | | ||| | ||| ||| | | | | || ||| | || ||||| || || ||
+|||| | | | /+-+-+++--\| ||||| ||||| | | ||||| ||| || | |||| | | | ||| | ||| ||| | | | | || ||| | || ||||| || || ||
+|||| | | | || | ||| || ||||| ||||| | | ||||| ||| || | |||| | | | ||| /-+-+++-----+++---+----\| | | || ||| | || ||||| || || ||
+|||| | | | || | ||| /++-+++++--+++++-+--+----+++++-+++-++--+--++++-\| | | ||| | | ||| ||\---+----++-+-+-++-+++--+-++-+++++-++-++----/|
+|||| | | | || | ||| ||| ||||| ||||| \--+----+++++-+++-++--+--++++-++-+---+-+++--+-+-+++-----++----+----++-/ | || ||| | || ||||| || || |
+|||| \-+--<+-++-+-+++-+++-/|||| ||||| | |\+++-+++-++--+--++++-++-+---+-+++--+-+-+++-----++----+----++---+-++-+++--+-++-++++/ || || |
+|||| | | || | ||| ||| |||| ||||| | | ||| ||| || | |||| |\-+---+-+++--+-+-+++-----++----+----++---+-++-+++--+-++-++++--++-+/ |
+|\++----+---+-++-+-+++-+++--++++--+++++----/ | ||| ||| \+--+--++++-+--+---+-+++--+-+-+/| |\----+----++---+-/| ||| | || |||| || | |
+| || | | || | ||| ||| |||| \++++---------+-+++-+++--+--+--++++-+--+---+-+++--+-+-/ | | | || | | ||| | || |||| || | |
+| || | | || | ||| ||| |||| |||\---------+-+++-+++--+--+--++++-+--+---+-+++--+-+---+-----+-----+----++---+--+-+++--+-++-++++--+/ | |
+| || | | || | ||| ||| |||| ||| /----+-+++-+++--+--+--++++-+--+---+-+++--+-+---+-----+--\ | || | | |||/-+-++-++++--+--+------+-\
+| |\----+---+-++-+-+++-+++--++++---+++-----+----+-+++-++/ | | |||| | \---+-+++--+-+---+-----+--+--+----++---+--+-++++-+-++-++++--+--/ | |
+| | | | || | ||| ||| |||| ||| | | ||| || | | |||| | | ||| | | | | | | || | | \+++-+-++-+/|| | | |
+| \-----+---+-++-+-+++-+++--++++---+++-----+----+-+++-++---+--+--++++-+------+-/|| | | \-----+--+--+----++---+--+--/|| | || | || | | |
+| | \-++-+-+++-+++--++++---+++-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+--/ || | | || |/++-+-++--+---------+-+---\
+| | |\-+-+++-+++--+++/ /+++-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+-------++---+--+>--++-++++-+-++--+-------\ | | |
+| | | | ||| ||| ||| ||\+-----+----+-+++-++---+--+--++++-+------+--++--+-+---------+--+-------++---+--+---++-+++/ | || | | | | |
+| | | | ||| ||| ||| || | | | ||| || \--+--++++-+------+--++--+-+---------+--+-------++---+--+---++-+++--+-++--/ | | | |
+| | | | ||| ||| \++---++-+-----+----+-/|| || | |||| | | || | | | | || | | || ||| | || | | | |
+| | | | \++-+++---+/ || | \----+--++-++------+--++++-+------+--++--+-+---------+--/ || | | || ||| | || | | | |
+| | | | || ||| \----++-+----------+--++-++------+--++++-+---->-+--+/ | | | || | | || ||| | || | | | |
+| | | | || \++--------++-+----------+--++-++------+--++++-/ | | | | \----------++---+--+---++-+++--+-++----------+-/ | |
+| | | | || || || | | || || | |||| | | | | /--------------++---+--+---++-+++--+-++-----\ | | |
+| | | | || || || | | || || | \+++--------+--+---+-+-----+--------------++---+--+---++-/|| | || | | | |
+| | | | || || || | | || || | ||| | | \-+-----+--------------/| | | || || | || | | | |
+| | | | || || /++-+----------+\ || \+------+---+++--------+--+-----+-----+---------------+---+--+---++--++--+-+/ | | | |
+| | | | || || |\+-+----------++-++--+------+---+++--------+--+-----+-----+---------------+---+--+---++--++--+-+------+----/ | |
+| | | | /++--++-------+-+-+----------++-++--+------+---+++-\ \--+-----+-----+---------------+---+--+---/| || | | | | |
+| | | | ||| || | | | || \+--+------+---/|| | | | | | | | | || | | | | |
+| | | | ||| || | | | |v | | | || | | | | | | | | \+--+-+------+--------+---/
+| /-+-----+--+-+++--++-------+-+-+----------++--+--+------+----++-+---------+-----+-----+---------------+\ | | | | | | | |
+| | | | | ||| |\-------+-+-+----------++--+--+------+----++-+---------/ | | || | | | | | | | |
+| | | | | ||| | | | \----------++--+--+------+----++-+---------------+-----+---------------++--+--+----+---/ | | | |
+| | | | | ||| | | | || | \------+----+/ | | | || | | | | | | |
+| | | \--+-+++--/ ^ | || | | | | | | || | | | | | | |
+| | | | ||\-----------+-+------------++--+---------+----+--+---------------/ | || | | \------+-+------+--------/
+| | | | || | | || \---------+----/ | | || | | | | |
+\-----+-+--------+-++------------+-+------------++------------+-------+---------------------+---------------/| | | | | |
+ | | | |\------------+-+------------++------------+-------+-<-------------------+----------------+--/ \-----------+-/ |
+ | | | | \-+------------+/ \-------+---------------------+----------------+-----------------/ |
+ | | | \---------------+------------+---------------------/ | | |
+ | | | \------------/ \----------------+--------------------------/
+ \-+--------+-------------------------------------------------------------------------------------------/
+ \--------/
diff --git a/2018/inputs/15.txt b/2018/inputs/15.txt
new file mode 100644
index 0000000..0bd71e0
--- /dev/null
+++ b/2018/inputs/15.txt
@@ -0,0 +1,32 @@
+################################
+#######################.########
+#######################.########
+########..#############.########
+#######.....#########....#..####
+#######.....##########......####
+######....#..########.......#..#
+#######.G...########...........#
+####..GG....G######..........###
+########....G..###..E.......#.E#
+########...G..#....G..G.....E..#
+########...G...G.G...........E.#
+####....G.....#####..E......#E.#
+####.####.#..#######....G.....##
+####.G#####.#########..........#
+####G#####..#########..........#
+####.####..E#########..........#
+####...#..#.#########.G........#
+####.....G..#########.........##
+####..G....E.#######........####
+####G.........#####...##....####
+#####G................###..E####
+#####..####...............######
+####..#####.............########
+#####.#######...........########
+#####.########.........#########
+#####.########.....E..##########
+#.....#########...#.############
+#..#############....############
+################....############
+##################.#############
+################################
diff --git a/2018/inputs/16_1.txt b/2018/inputs/16_1.txt
new file mode 100644
index 0000000..755acda
--- /dev/null
+++ b/2018/inputs/16_1.txt
@@ -0,0 +1,3143 @@
+Before: [2, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 1, 2, 3]
+6 0 2 0
+After: [0, 1, 2, 3]
+
+Before: [1, 0, 2, 2]
+6 0 2 0
+After: [0, 0, 2, 2]
+
+Before: [1, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [3, 0, 0, 2]
+0 3 3 2
+After: [3, 0, 0, 2]
+
+Before: [1, 1, 2, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [3, 2, 1, 1]
+5 2 1 1
+After: [3, 2, 1, 1]
+
+Before: [1, 1, 0, 3]
+7 1 3 0
+After: [0, 1, 0, 3]
+
+Before: [1, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [0, 2, 2, 0]
+8 0 0 0
+After: [0, 2, 2, 0]
+
+Before: [2, 0, 0, 1]
+3 0 3 0
+After: [1, 0, 0, 1]
+
+Before: [3, 1, 2, 2]
+4 1 3 1
+After: [3, 0, 2, 2]
+
+Before: [2, 2, 1, 1]
+5 2 1 1
+After: [2, 2, 1, 1]
+
+Before: [1, 1, 2, 2]
+6 0 2 2
+After: [1, 1, 0, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [2, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 2, 1]
+13 1 3 1
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 1
+After: [2, 0, 0, 2]
+
+Before: [2, 1, 0, 1]
+2 0 1 3
+After: [2, 1, 0, 1]
+
+Before: [3, 1, 2, 1]
+12 1 2 2
+After: [3, 1, 0, 1]
+
+Before: [1, 1, 3, 2]
+4 1 3 3
+After: [1, 1, 3, 0]
+
+Before: [2, 2, 1, 3]
+7 1 3 0
+After: [0, 2, 1, 3]
+
+Before: [1, 3, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 1
+After: [2, 1, 2, 1]
+
+Before: [2, 1, 3, 0]
+14 2 0 3
+After: [2, 1, 3, 1]
+
+Before: [1, 1, 2, 3]
+6 0 2 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 1, 3]
+11 2 1 2
+After: [1, 1, 2, 3]
+
+Before: [2, 2, 3, 2]
+0 3 3 0
+After: [0, 2, 3, 2]
+
+Before: [1, 2, 0, 2]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [2, 1, 0, 0]
+2 0 1 3
+After: [2, 1, 0, 1]
+
+Before: [0, 2, 1, 1]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [0, 3, 2, 1]
+10 3 2 3
+After: [0, 3, 2, 1]
+
+Before: [3, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [0, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [0, 3, 2, 1]
+8 0 0 0
+After: [0, 3, 2, 1]
+
+Before: [1, 1, 1, 3]
+11 2 1 1
+After: [1, 2, 1, 3]
+
+Before: [0, 1, 1, 2]
+11 2 1 2
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 1, 1]
+13 1 3 1
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [2, 2, 3, 1]
+14 2 0 1
+After: [2, 1, 3, 1]
+
+Before: [0, 3, 0, 3]
+8 0 0 3
+After: [0, 3, 0, 0]
+
+Before: [0, 0, 1, 1]
+8 0 0 2
+After: [0, 0, 0, 1]
+
+Before: [0, 3, 2, 1]
+8 0 0 2
+After: [0, 3, 0, 1]
+
+Before: [2, 1, 2, 3]
+12 1 2 1
+After: [2, 0, 2, 3]
+
+Before: [3, 2, 2, 3]
+14 2 1 2
+After: [3, 2, 1, 3]
+
+Before: [2, 2, 3, 0]
+15 2 2 2
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 3, 2]
+15 2 2 0
+After: [1, 3, 3, 2]
+
+Before: [1, 1, 0, 0]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [3, 2, 2, 2]
+0 3 3 3
+After: [3, 2, 2, 0]
+
+Before: [1, 3, 2, 2]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [2, 1, 0, 1]
+3 0 3 1
+After: [2, 1, 0, 1]
+
+Before: [3, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [0, 2, 1, 0]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [0, 3, 1, 2]
+8 0 0 1
+After: [0, 0, 1, 2]
+
+Before: [2, 1, 3, 3]
+7 1 3 0
+After: [0, 1, 3, 3]
+
+Before: [3, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 0, 1]
+3 0 3 3
+After: [2, 1, 0, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 0, 3]
+7 1 3 1
+After: [2, 0, 0, 3]
+
+Before: [2, 2, 0, 1]
+3 0 3 0
+After: [1, 2, 0, 1]
+
+Before: [2, 2, 3, 1]
+3 0 3 3
+After: [2, 2, 3, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [2, 2, 2, 2]
+14 3 2 1
+After: [2, 0, 2, 2]
+
+Before: [3, 1, 1, 2]
+4 1 3 1
+After: [3, 0, 1, 2]
+
+Before: [2, 1, 1, 1]
+2 0 1 3
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [1, 1, 1, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [3, 1, 2, 2]
+12 1 2 2
+After: [3, 1, 0, 2]
+
+Before: [0, 1, 2, 1]
+12 1 2 2
+After: [0, 1, 0, 1]
+
+Before: [3, 2, 0, 3]
+7 1 3 3
+After: [3, 2, 0, 0]
+
+Before: [2, 1, 2, 3]
+7 2 3 2
+After: [2, 1, 0, 3]
+
+Before: [3, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [2, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 3
+After: [0, 1, 1, 2]
+
+Before: [2, 1, 3, 3]
+7 1 3 2
+After: [2, 1, 0, 3]
+
+Before: [2, 3, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [1, 1, 2, 2]
+4 1 3 1
+After: [1, 0, 2, 2]
+
+Before: [1, 3, 0, 1]
+1 0 2 0
+After: [0, 3, 0, 1]
+
+Before: [1, 3, 0, 3]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [2, 3, 3, 1]
+3 0 3 1
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [2, 1, 1, 1]
+2 0 1 1
+After: [2, 1, 1, 1]
+
+Before: [3, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [2, 0, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [1, 3, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [1, 1, 0, 2]
+9 1 0 0
+After: [1, 1, 0, 2]
+
+Before: [2, 3, 2, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 2, 2, 1]
+0 3 3 3
+After: [1, 2, 2, 0]
+
+Before: [3, 1, 2, 2]
+12 1 2 1
+After: [3, 0, 2, 2]
+
+Before: [0, 2, 3, 1]
+8 0 0 1
+After: [0, 0, 3, 1]
+
+Before: [0, 0, 2, 1]
+10 3 2 2
+After: [0, 0, 1, 1]
+
+Before: [3, 2, 1, 3]
+15 0 0 3
+After: [3, 2, 1, 1]
+
+Before: [1, 3, 2, 2]
+6 0 2 2
+After: [1, 3, 0, 2]
+
+Before: [1, 2, 2, 3]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [1, 1, 3, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [1, 2, 2, 1]
+10 3 2 3
+After: [1, 2, 2, 1]
+
+Before: [1, 2, 2, 1]
+6 0 2 2
+After: [1, 2, 0, 1]
+
+Before: [1, 2, 1, 3]
+7 2 3 1
+After: [1, 0, 1, 3]
+
+Before: [1, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 3, 3, 1]
+3 0 3 3
+After: [2, 3, 3, 1]
+
+Before: [2, 3, 2, 3]
+14 2 0 2
+After: [2, 3, 1, 3]
+
+Before: [2, 1, 3, 1]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [0, 3, 3, 0]
+8 0 0 1
+After: [0, 0, 3, 0]
+
+Before: [2, 1, 1, 3]
+7 2 3 2
+After: [2, 1, 0, 3]
+
+Before: [0, 2, 2, 1]
+10 3 2 3
+After: [0, 2, 2, 1]
+
+Before: [3, 2, 1, 3]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [3, 1, 1, 2]
+0 3 3 2
+After: [3, 1, 0, 2]
+
+Before: [0, 3, 1, 3]
+7 2 3 3
+After: [0, 3, 1, 0]
+
+Before: [2, 0, 2, 1]
+10 3 2 3
+After: [2, 0, 2, 1]
+
+Before: [2, 2, 1, 0]
+5 2 1 2
+After: [2, 2, 2, 0]
+
+Before: [2, 1, 2, 2]
+4 1 3 3
+After: [2, 1, 2, 0]
+
+Before: [1, 3, 1, 1]
+0 2 3 2
+After: [1, 3, 0, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [1, 0, 0, 3]
+1 0 2 2
+After: [1, 0, 0, 3]
+
+Before: [2, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [2, 0, 0, 1]
+3 0 3 3
+After: [2, 0, 0, 1]
+
+Before: [3, 3, 0, 1]
+14 0 2 2
+After: [3, 3, 1, 1]
+
+Before: [0, 1, 2, 0]
+8 0 0 1
+After: [0, 0, 2, 0]
+
+Before: [2, 0, 1, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 3, 2, 0]
+6 0 2 1
+After: [1, 0, 2, 0]
+
+Before: [3, 3, 2, 0]
+2 0 2 3
+After: [3, 3, 2, 1]
+
+Before: [2, 1, 0, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 2, 0]
+6 0 2 2
+After: [1, 3, 0, 0]
+
+Before: [3, 1, 3, 2]
+4 1 3 1
+After: [3, 0, 3, 2]
+
+Before: [2, 3, 2, 2]
+15 0 0 3
+After: [2, 3, 2, 1]
+
+Before: [2, 3, 2, 1]
+3 0 3 3
+After: [2, 3, 2, 1]
+
+Before: [2, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [3, 1, 1, 0]
+11 2 1 2
+After: [3, 1, 2, 0]
+
+Before: [3, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [3, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 3, 1, 3]
+15 0 0 3
+After: [3, 3, 1, 1]
+
+Before: [1, 2, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 1, 0]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [1, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [3, 2, 2, 2]
+14 2 1 2
+After: [3, 2, 1, 2]
+
+Before: [0, 0, 3, 3]
+15 2 2 3
+After: [0, 0, 3, 1]
+
+Before: [0, 3, 2, 2]
+0 3 3 0
+After: [0, 3, 2, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 2]
+14 3 2 1
+After: [2, 0, 2, 2]
+
+Before: [1, 0, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [3, 2, 1, 3]
+7 2 3 1
+After: [3, 0, 1, 3]
+
+Before: [3, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [1, 3, 2, 1]
+6 0 2 0
+After: [0, 3, 2, 1]
+
+Before: [2, 0, 3, 1]
+3 0 3 0
+After: [1, 0, 3, 1]
+
+Before: [3, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [3, 1, 2, 0]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [2, 1, 2, 0]
+2 0 1 3
+After: [2, 1, 2, 1]
+
+Before: [1, 1, 3, 1]
+14 2 3 2
+After: [1, 1, 0, 1]
+
+Before: [1, 3, 2, 3]
+6 0 2 0
+After: [0, 3, 2, 3]
+
+Before: [1, 1, 2, 3]
+12 1 2 0
+After: [0, 1, 2, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 1
+After: [3, 1, 2, 1]
+
+Before: [1, 0, 2, 0]
+6 0 2 1
+After: [1, 0, 2, 0]
+
+Before: [2, 3, 1, 3]
+7 2 3 2
+After: [2, 3, 0, 3]
+
+Before: [1, 1, 1, 1]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [2, 1, 2, 2]
+2 0 1 0
+After: [1, 1, 2, 2]
+
+Before: [1, 2, 1, 3]
+7 2 3 3
+After: [1, 2, 1, 0]
+
+Before: [1, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [2, 0, 2, 1]
+10 3 2 2
+After: [2, 0, 1, 1]
+
+Before: [0, 1, 2, 3]
+12 1 2 2
+After: [0, 1, 0, 3]
+
+Before: [2, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [2, 1, 3, 1]
+13 1 3 3
+After: [2, 1, 3, 1]
+
+Before: [0, 2, 1, 1]
+8 0 0 1
+After: [0, 0, 1, 1]
+
+Before: [1, 0, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [2, 1, 3, 3]
+2 0 1 1
+After: [2, 1, 3, 3]
+
+Before: [0, 1, 2, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [1, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 1
+After: [1, 1, 3, 0]
+
+Before: [1, 1, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [2, 2, 3, 1]
+3 0 3 1
+After: [2, 1, 3, 1]
+
+Before: [3, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 0]
+12 1 2 1
+After: [1, 0, 2, 0]
+
+Before: [3, 0, 2, 3]
+2 0 2 3
+After: [3, 0, 2, 1]
+
+Before: [2, 1, 3, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [3, 1, 3, 1]
+15 0 0 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 3, 2]
+4 1 3 1
+After: [0, 0, 3, 2]
+
+Before: [3, 2, 3, 3]
+15 2 0 0
+After: [1, 2, 3, 3]
+
+Before: [1, 3, 3, 1]
+0 3 3 0
+After: [0, 3, 3, 1]
+
+Before: [0, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [0, 2, 1, 3]
+7 2 3 2
+After: [0, 2, 0, 3]
+
+Before: [3, 0, 2, 1]
+2 0 2 0
+After: [1, 0, 2, 1]
+
+Before: [2, 2, 2, 1]
+10 3 2 2
+After: [2, 2, 1, 1]
+
+Before: [1, 2, 0, 1]
+1 0 2 0
+After: [0, 2, 0, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 2
+After: [1, 2, 0, 0]
+
+Before: [3, 1, 2, 1]
+2 0 2 1
+After: [3, 1, 2, 1]
+
+Before: [0, 0, 3, 1]
+8 0 0 1
+After: [0, 0, 3, 1]
+
+Before: [0, 1, 1, 2]
+11 2 1 3
+After: [0, 1, 1, 2]
+
+Before: [0, 1, 3, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 1, 2]
+11 2 1 2
+After: [1, 1, 2, 2]
+
+Before: [2, 0, 3, 1]
+3 0 3 3
+After: [2, 0, 3, 1]
+
+Before: [0, 2, 1, 2]
+8 0 0 0
+After: [0, 2, 1, 2]
+
+Before: [1, 0, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [1, 1, 0, 2]
+4 1 3 3
+After: [1, 1, 0, 0]
+
+Before: [2, 2, 1, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 2
+After: [1, 2, 2, 2]
+
+Before: [2, 0, 2, 1]
+3 0 3 3
+After: [2, 0, 2, 1]
+
+Before: [2, 1, 0, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 1, 2]
+5 2 1 1
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 2]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [2, 2, 1, 3]
+15 0 0 3
+After: [2, 2, 1, 1]
+
+Before: [3, 1, 0, 1]
+13 1 3 3
+After: [3, 1, 0, 1]
+
+Before: [3, 3, 2, 1]
+10 3 2 2
+After: [3, 3, 1, 1]
+
+Before: [0, 1, 3, 2]
+4 1 3 3
+After: [0, 1, 3, 0]
+
+Before: [0, 1, 1, 0]
+11 2 1 2
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 3, 1]
+14 3 1 0
+After: [0, 1, 3, 1]
+
+Before: [0, 1, 3, 3]
+8 0 0 3
+After: [0, 1, 3, 0]
+
+Before: [0, 1, 2, 1]
+10 3 2 0
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [0, 2, 1, 3]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [1, 0, 0, 3]
+1 0 2 0
+After: [0, 0, 0, 3]
+
+Before: [2, 3, 0, 1]
+3 0 3 0
+After: [1, 3, 0, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 1
+After: [2, 0, 2, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 0
+After: [0, 1, 3, 2]
+
+Before: [1, 2, 1, 0]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 1, 3, 1]
+13 1 3 1
+After: [3, 1, 3, 1]
+
+Before: [1, 2, 1, 0]
+5 2 1 1
+After: [1, 2, 1, 0]
+
+Before: [3, 1, 2, 1]
+10 3 2 1
+After: [3, 1, 2, 1]
+
+Before: [1, 1, 1, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [1, 2, 1, 3]
+7 1 3 1
+After: [1, 0, 1, 3]
+
+Before: [0, 0, 2, 2]
+14 3 2 3
+After: [0, 0, 2, 0]
+
+Before: [2, 2, 1, 3]
+15 0 0 1
+After: [2, 1, 1, 3]
+
+Before: [2, 1, 3, 2]
+4 1 3 1
+After: [2, 0, 3, 2]
+
+Before: [1, 2, 1, 3]
+5 2 1 2
+After: [1, 2, 2, 3]
+
+Before: [2, 2, 1, 0]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [2, 0, 2, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 0, 0, 1]
+1 0 2 0
+After: [0, 0, 0, 1]
+
+Before: [2, 1, 1, 0]
+15 0 0 0
+After: [1, 1, 1, 0]
+
+Before: [0, 0, 3, 3]
+8 0 0 0
+After: [0, 0, 3, 3]
+
+Before: [1, 1, 1, 2]
+4 1 3 3
+After: [1, 1, 1, 0]
+
+Before: [1, 2, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 0, 2]
+9 1 0 1
+After: [1, 1, 0, 2]
+
+Before: [3, 1, 1, 1]
+11 2 1 3
+After: [3, 1, 1, 2]
+
+Before: [1, 1, 0, 3]
+7 1 3 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 1, 3]
+7 1 3 2
+After: [1, 1, 0, 3]
+
+Before: [1, 1, 2, 3]
+6 0 2 1
+After: [1, 0, 2, 3]
+
+Before: [2, 1, 1, 2]
+4 1 3 3
+After: [2, 1, 1, 0]
+
+Before: [2, 2, 2, 3]
+7 1 3 2
+After: [2, 2, 0, 3]
+
+Before: [1, 3, 2, 1]
+0 3 3 3
+After: [1, 3, 2, 0]
+
+Before: [0, 0, 3, 3]
+8 0 0 3
+After: [0, 0, 3, 0]
+
+Before: [3, 1, 3, 1]
+15 0 0 1
+After: [3, 1, 3, 1]
+
+Before: [1, 0, 0, 2]
+1 0 2 2
+After: [1, 0, 0, 2]
+
+Before: [0, 0, 0, 1]
+0 3 3 1
+After: [0, 0, 0, 1]
+
+Before: [1, 1, 1, 2]
+9 1 0 0
+After: [1, 1, 1, 2]
+
+Before: [1, 3, 0, 1]
+1 0 2 2
+After: [1, 3, 0, 1]
+
+Before: [1, 1, 3, 3]
+9 1 0 0
+After: [1, 1, 3, 3]
+
+Before: [2, 1, 3, 1]
+13 1 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 3
+After: [2, 1, 3, 0]
+
+Before: [2, 1, 2, 1]
+13 1 3 3
+After: [2, 1, 2, 1]
+
+Before: [1, 0, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 2
+After: [1, 1, 1, 1]
+
+Before: [3, 2, 1, 3]
+5 2 1 2
+After: [3, 2, 2, 3]
+
+Before: [0, 1, 2, 0]
+12 1 2 2
+After: [0, 1, 0, 0]
+
+Before: [2, 1, 1, 3]
+2 0 1 0
+After: [1, 1, 1, 3]
+
+Before: [1, 2, 2, 3]
+14 2 1 2
+After: [1, 2, 1, 3]
+
+Before: [1, 2, 0, 3]
+1 0 2 0
+After: [0, 2, 0, 3]
+
+Before: [0, 1, 2, 2]
+8 0 0 2
+After: [0, 1, 0, 2]
+
+Before: [0, 2, 1, 0]
+5 2 1 1
+After: [0, 2, 1, 0]
+
+Before: [2, 0, 0, 1]
+15 0 0 2
+After: [2, 0, 1, 1]
+
+Before: [2, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [3, 2, 2, 1]
+10 3 2 2
+After: [3, 2, 1, 1]
+
+Before: [0, 3, 2, 2]
+14 3 2 2
+After: [0, 3, 0, 2]
+
+Before: [1, 2, 0, 1]
+1 0 2 2
+After: [1, 2, 0, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [1, 2, 2, 3]
+14 2 1 3
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 3, 1]
+3 0 3 3
+After: [2, 1, 3, 1]
+
+Before: [0, 1, 2, 3]
+7 1 3 3
+After: [0, 1, 2, 0]
+
+Before: [2, 1, 2, 2]
+2 0 1 1
+After: [2, 1, 2, 2]
+
+Before: [2, 2, 1, 0]
+5 2 1 1
+After: [2, 2, 1, 0]
+
+Before: [3, 2, 1, 3]
+5 2 1 0
+After: [2, 2, 1, 3]
+
+Before: [1, 1, 2, 1]
+0 3 3 1
+After: [1, 0, 2, 1]
+
+Before: [1, 0, 2, 1]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 0
+After: [0, 3, 0, 2]
+
+Before: [0, 1, 1, 3]
+11 2 1 2
+After: [0, 1, 2, 3]
+
+Before: [1, 1, 3, 3]
+9 1 0 1
+After: [1, 1, 3, 3]
+
+Before: [3, 1, 2, 3]
+12 1 2 1
+After: [3, 0, 2, 3]
+
+Before: [0, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 1
+After: [1, 1, 2, 3]
+
+Before: [0, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 0, 1, 3]
+7 2 3 1
+After: [1, 0, 1, 3]
+
+Before: [1, 1, 0, 3]
+1 0 2 0
+After: [0, 1, 0, 3]
+
+Before: [2, 1, 2, 2]
+12 1 2 2
+After: [2, 1, 0, 2]
+
+Before: [3, 0, 1, 3]
+14 3 0 0
+After: [1, 0, 1, 3]
+
+Before: [3, 1, 3, 3]
+7 1 3 3
+After: [3, 1, 3, 0]
+
+Before: [1, 1, 0, 0]
+1 0 2 0
+After: [0, 1, 0, 0]
+
+Before: [1, 1, 1, 1]
+0 2 3 2
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 1]
+2 0 1 2
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+14 3 1 1
+After: [1, 0, 2, 1]
+
+Before: [0, 0, 2, 3]
+7 2 3 3
+After: [0, 0, 2, 0]
+
+Before: [3, 2, 0, 0]
+14 0 2 1
+After: [3, 1, 0, 0]
+
+Before: [0, 0, 2, 3]
+8 0 0 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 1, 0]
+11 2 1 1
+After: [3, 2, 1, 0]
+
+Before: [1, 2, 1, 1]
+5 2 1 2
+After: [1, 2, 2, 1]
+
+Before: [0, 2, 1, 3]
+7 2 3 3
+After: [0, 2, 1, 0]
+
+Before: [3, 1, 2, 2]
+15 0 0 3
+After: [3, 1, 2, 1]
+
+Before: [0, 0, 0, 2]
+8 0 0 2
+After: [0, 0, 0, 2]
+
+Before: [3, 1, 3, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [1, 2, 0, 2]
+1 0 2 2
+After: [1, 2, 0, 2]
+
+Before: [2, 1, 2, 3]
+2 0 1 3
+After: [2, 1, 2, 1]
+
+Before: [1, 2, 0, 3]
+1 0 2 2
+After: [1, 2, 0, 3]
+
+Before: [1, 0, 2, 0]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 0, 3, 1]
+0 3 3 2
+After: [1, 0, 0, 1]
+
+Before: [1, 3, 2, 1]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [1, 1, 1, 1]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [0, 3, 2, 1]
+0 3 3 1
+After: [0, 0, 2, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 3
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 0, 3]
+7 1 3 0
+After: [0, 2, 0, 3]
+
+Before: [0, 3, 2, 1]
+0 3 3 0
+After: [0, 3, 2, 1]
+
+Before: [1, 0, 0, 1]
+1 0 2 2
+After: [1, 0, 0, 1]
+
+Before: [2, 1, 2, 1]
+2 0 1 2
+After: [2, 1, 1, 1]
+
+Before: [1, 2, 2, 2]
+6 0 2 2
+After: [1, 2, 0, 2]
+
+Before: [0, 1, 1, 1]
+13 1 3 3
+After: [0, 1, 1, 1]
+
+Before: [2, 1, 1, 0]
+11 2 1 2
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 3, 1]
+13 1 3 1
+After: [0, 1, 3, 1]
+
+Before: [3, 2, 0, 2]
+0 3 3 1
+After: [3, 0, 0, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 3
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 0, 1]
+13 1 3 1
+After: [2, 1, 0, 1]
+
+Before: [2, 1, 2, 2]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 2, 0]
+12 1 2 1
+After: [0, 0, 2, 0]
+
+Before: [3, 1, 2, 2]
+4 1 3 2
+After: [3, 1, 0, 2]
+
+Before: [1, 1, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [0, 2, 1, 1]
+0 2 3 2
+After: [0, 2, 0, 1]
+
+Before: [1, 1, 2, 0]
+6 0 2 0
+After: [0, 1, 2, 0]
+
+Before: [0, 3, 1, 2]
+8 0 0 3
+After: [0, 3, 1, 0]
+
+Before: [1, 3, 0, 0]
+1 0 2 2
+After: [1, 3, 0, 0]
+
+Before: [1, 1, 2, 0]
+12 1 2 2
+After: [1, 1, 0, 0]
+
+Before: [2, 1, 0, 2]
+0 3 3 1
+After: [2, 0, 0, 2]
+
+Before: [0, 3, 3, 3]
+8 0 0 1
+After: [0, 0, 3, 3]
+
+Before: [3, 3, 0, 1]
+0 3 3 0
+After: [0, 3, 0, 1]
+
+Before: [3, 1, 1, 2]
+4 1 3 3
+After: [3, 1, 1, 0]
+
+Before: [2, 1, 2, 3]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [3, 1, 2, 1]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [1, 0, 2, 2]
+6 0 2 3
+After: [1, 0, 2, 0]
+
+Before: [1, 1, 0, 1]
+0 3 3 1
+After: [1, 0, 0, 1]
+
+Before: [1, 1, 0, 3]
+9 1 0 2
+After: [1, 1, 1, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 3
+After: [3, 0, 2, 1]
+
+Before: [2, 2, 3, 3]
+14 3 2 3
+After: [2, 2, 3, 1]
+
+Before: [3, 1, 2, 2]
+12 1 2 3
+After: [3, 1, 2, 0]
+
+Before: [0, 1, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 3, 0]
+8 0 0 2
+After: [0, 1, 0, 0]
+
+Before: [3, 1, 2, 0]
+12 1 2 1
+After: [3, 0, 2, 0]
+
+Before: [1, 3, 2, 0]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [2, 0, 1, 3]
+7 2 3 3
+After: [2, 0, 1, 0]
+
+Before: [3, 2, 2, 1]
+10 3 2 3
+After: [3, 2, 2, 1]
+
+Before: [1, 2, 0, 0]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [2, 1, 1, 1]
+0 2 3 0
+After: [0, 1, 1, 1]
+
+Before: [3, 2, 1, 1]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [3, 1, 3, 1]
+14 2 3 0
+After: [0, 1, 3, 1]
+
+Before: [2, 1, 1, 3]
+14 2 1 1
+After: [2, 0, 1, 3]
+
+Before: [0, 1, 1, 2]
+8 0 0 0
+After: [0, 1, 1, 2]
+
+Before: [2, 3, 3, 2]
+15 2 2 2
+After: [2, 3, 1, 2]
+
+Before: [0, 1, 2, 3]
+7 2 3 1
+After: [0, 0, 2, 3]
+
+Before: [1, 1, 0, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [0, 2, 3, 0]
+8 0 0 2
+After: [0, 2, 0, 0]
+
+Before: [0, 1, 1, 1]
+11 2 1 1
+After: [0, 2, 1, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [2, 3, 1, 3]
+7 2 3 0
+After: [0, 3, 1, 3]
+
+Before: [2, 1, 2, 3]
+12 1 2 2
+After: [2, 1, 0, 3]
+
+Before: [2, 2, 1, 3]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [3, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [0, 0, 1, 3]
+7 2 3 1
+After: [0, 0, 1, 3]
+
+Before: [1, 3, 2, 1]
+10 3 2 2
+After: [1, 3, 1, 1]
+
+Before: [3, 2, 1, 2]
+15 0 0 2
+After: [3, 2, 1, 2]
+
+Before: [1, 2, 1, 1]
+0 2 3 1
+After: [1, 0, 1, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 0, 3]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [0, 1, 1, 1]
+11 2 1 2
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 2, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 2, 2]
+4 1 3 2
+After: [1, 1, 0, 2]
+
+Before: [3, 1, 1, 2]
+11 2 1 3
+After: [3, 1, 1, 2]
+
+Before: [2, 2, 3, 2]
+0 3 3 3
+After: [2, 2, 3, 0]
+
+Before: [0, 0, 1, 1]
+0 2 3 1
+After: [0, 0, 1, 1]
+
+Before: [0, 1, 2, 2]
+12 1 2 1
+After: [0, 0, 2, 2]
+
+Before: [2, 0, 3, 1]
+3 0 3 2
+After: [2, 0, 1, 1]
+
+Before: [1, 0, 2, 0]
+6 0 2 0
+After: [0, 0, 2, 0]
+
+Before: [0, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [1, 3, 3, 0]
+15 2 2 0
+After: [1, 3, 3, 0]
+
+Before: [0, 3, 2, 0]
+8 0 0 2
+After: [0, 3, 0, 0]
+
+Before: [2, 2, 2, 1]
+0 3 3 1
+After: [2, 0, 2, 1]
+
+Before: [3, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 2, 3, 3]
+15 0 0 0
+After: [1, 2, 3, 3]
+
+Before: [2, 1, 0, 0]
+2 0 1 1
+After: [2, 1, 0, 0]
+
+Before: [1, 2, 2, 3]
+6 0 2 2
+After: [1, 2, 0, 3]
+
+Before: [1, 0, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 1
+After: [2, 1, 0, 1]
+
+Before: [3, 2, 1, 2]
+5 2 1 1
+After: [3, 2, 1, 2]
+
+Before: [2, 1, 3, 2]
+14 2 0 1
+After: [2, 1, 3, 2]
+
+Before: [1, 1, 0, 0]
+9 1 0 2
+After: [1, 1, 1, 0]
+
+Before: [2, 2, 3, 3]
+15 2 2 2
+After: [2, 2, 1, 3]
+
+Before: [0, 2, 1, 0]
+8 0 0 2
+After: [0, 2, 0, 0]
+
+Before: [1, 1, 0, 1]
+9 1 0 0
+After: [1, 1, 0, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 0, 0]
+9 1 0 0
+After: [1, 1, 0, 0]
+
+Before: [2, 3, 2, 1]
+3 0 3 1
+After: [2, 1, 2, 1]
+
+Before: [1, 2, 1, 3]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [2, 1, 1, 3]
+11 2 1 2
+After: [2, 1, 2, 3]
+
+Before: [1, 1, 3, 0]
+9 1 0 2
+After: [1, 1, 1, 0]
+
+Before: [2, 1, 1, 3]
+11 2 1 1
+After: [2, 2, 1, 3]
+
+Before: [2, 1, 3, 2]
+2 0 1 2
+After: [2, 1, 1, 2]
+
+Before: [0, 2, 1, 3]
+5 2 1 2
+After: [0, 2, 2, 3]
+
+Before: [1, 0, 0, 2]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [1, 1, 1, 2]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [1, 0, 2, 2]
+6 0 2 2
+After: [1, 0, 0, 2]
+
+Before: [3, 1, 1, 3]
+11 2 1 1
+After: [3, 2, 1, 3]
+
+Before: [3, 1, 2, 3]
+2 0 2 0
+After: [1, 1, 2, 3]
+
+Before: [1, 2, 0, 2]
+1 0 2 0
+After: [0, 2, 0, 2]
+
+Before: [3, 1, 2, 1]
+10 3 2 2
+After: [3, 1, 1, 1]
+
+Before: [1, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 2, 3]
+12 1 2 0
+After: [0, 1, 2, 3]
+
+Before: [2, 1, 1, 3]
+7 2 3 1
+After: [2, 0, 1, 3]
+
+Before: [0, 2, 1, 2]
+5 2 1 3
+After: [0, 2, 1, 2]
+
+Before: [3, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [1, 1, 3, 1]
+9 1 0 0
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 2, 2]
+9 1 0 1
+After: [1, 1, 2, 2]
+
+Before: [2, 1, 1, 3]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [1, 1, 1, 2]
+4 1 3 1
+After: [1, 0, 1, 2]
+
+Before: [3, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 2, 2, 3]
+6 0 2 0
+After: [0, 2, 2, 3]
+
+Before: [1, 3, 0, 3]
+1 0 2 0
+After: [0, 3, 0, 3]
+
+Before: [2, 1, 1, 0]
+2 0 1 2
+After: [2, 1, 1, 0]
+
+Before: [0, 1, 2, 1]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [2, 3, 1, 1]
+3 0 3 3
+After: [2, 3, 1, 1]
+
+Before: [2, 1, 3, 3]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [1, 3, 2, 1]
+10 3 2 3
+After: [1, 3, 2, 1]
+
+Before: [1, 1, 3, 3]
+9 1 0 3
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 3, 2]
+9 1 0 1
+After: [1, 1, 3, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 2
+After: [1, 1, 1, 1]
+
+Before: [3, 0, 2, 0]
+2 0 2 1
+After: [3, 1, 2, 0]
+
+Before: [2, 0, 0, 0]
+14 0 1 2
+After: [2, 0, 1, 0]
+
+Before: [0, 1, 2, 1]
+13 1 3 3
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 3, 0]
+14 2 0 1
+After: [2, 1, 3, 0]
+
+Before: [2, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 1]
+2 0 1 1
+After: [2, 1, 0, 1]
+
+Before: [0, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [0, 1, 3, 1]
+0 3 3 2
+After: [0, 1, 0, 1]
+
+Before: [0, 2, 1, 1]
+5 2 1 1
+After: [0, 2, 1, 1]
+
+Before: [2, 1, 1, 2]
+15 0 0 3
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 0]
+6 0 2 2
+After: [1, 1, 0, 0]
+
+Before: [1, 1, 2, 1]
+6 0 2 0
+After: [0, 1, 2, 1]
+
+Before: [0, 2, 1, 3]
+7 1 3 1
+After: [0, 0, 1, 3]
+
+Before: [1, 0, 0, 0]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [2, 1, 2, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [0, 2, 0, 2]
+0 3 3 1
+After: [0, 0, 0, 2]
+
+Before: [0, 2, 3, 0]
+15 2 2 2
+After: [0, 2, 1, 0]
+
+Before: [1, 2, 2, 2]
+14 2 1 3
+After: [1, 2, 2, 1]
+
+Before: [0, 1, 3, 1]
+8 0 0 2
+After: [0, 1, 0, 1]
+
+Before: [3, 3, 3, 2]
+15 0 0 3
+After: [3, 3, 3, 1]
+
+Before: [3, 3, 0, 2]
+14 0 2 1
+After: [3, 1, 0, 2]
+
+Before: [0, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [1, 1, 0, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [0, 1, 2, 1]
+10 3 2 3
+After: [0, 1, 2, 1]
+
+Before: [2, 2, 2, 1]
+10 3 2 1
+After: [2, 1, 2, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 3
+After: [0, 1, 2, 0]
+
+Before: [1, 2, 2, 1]
+10 3 2 2
+After: [1, 2, 1, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 1
+After: [2, 2, 1, 2]
+
+Before: [1, 1, 2, 1]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [3, 3, 1, 1]
+0 2 3 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 2, 2]
+4 1 3 1
+After: [0, 0, 2, 2]
+
+Before: [0, 3, 2, 2]
+8 0 0 3
+After: [0, 3, 2, 0]
+
+Before: [2, 1, 2, 1]
+2 0 1 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [3, 3, 3, 2]
+15 0 0 0
+After: [1, 3, 3, 2]
+
+Before: [0, 1, 1, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [1, 3, 0, 3]
+1 0 2 1
+After: [1, 0, 0, 3]
+
+Before: [1, 1, 0, 1]
+1 0 2 2
+After: [1, 1, 0, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 2, 2, 2]
+2 0 2 2
+After: [3, 2, 1, 2]
+
+Before: [0, 2, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 0, 2]
+4 1 3 2
+After: [0, 1, 0, 2]
+
+Before: [0, 1, 0, 2]
+4 1 3 3
+After: [0, 1, 0, 0]
+
+Before: [1, 1, 2, 1]
+10 3 2 1
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 3, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [0, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [0, 1, 1, 3]
+11 2 1 1
+After: [0, 2, 1, 3]
+
+Before: [3, 2, 1, 0]
+5 2 1 3
+After: [3, 2, 1, 2]
+
+Before: [2, 1, 2, 3]
+7 2 3 3
+After: [2, 1, 2, 0]
+
+Before: [1, 1, 1, 1]
+11 2 1 2
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [0, 1, 1, 3]
+8 0 0 1
+After: [0, 0, 1, 3]
+
+Before: [3, 2, 3, 3]
+7 1 3 3
+After: [3, 2, 3, 0]
+
+Before: [0, 3, 0, 0]
+8 0 0 2
+After: [0, 3, 0, 0]
+
+Before: [1, 1, 2, 1]
+6 0 2 1
+After: [1, 0, 2, 1]
+
+Before: [0, 1, 1, 2]
+4 1 3 0
+After: [0, 1, 1, 2]
+
+Before: [1, 1, 2, 1]
+9 1 0 1
+After: [1, 1, 2, 1]
+
+Before: [3, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [1, 3, 0, 3]
+1 0 2 2
+After: [1, 3, 0, 3]
+
+Before: [1, 1, 0, 3]
+9 1 0 1
+After: [1, 1, 0, 3]
+
+Before: [0, 2, 2, 2]
+8 0 0 1
+After: [0, 0, 2, 2]
+
+Before: [0, 1, 1, 1]
+13 1 3 1
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [0, 1, 2, 1]
+8 0 0 0
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 2
+After: [2, 1, 0, 1]
+
+Before: [1, 0, 2, 3]
+6 0 2 1
+After: [1, 0, 2, 3]
+
+Before: [3, 0, 3, 1]
+15 2 0 2
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 1, 1]
+0 2 3 0
+After: [0, 1, 1, 1]
+
+Before: [3, 0, 0, 3]
+14 0 2 1
+After: [3, 1, 0, 3]
+
+Before: [3, 1, 1, 1]
+0 2 3 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 2, 3]
+7 2 3 3
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 0, 1]
+13 1 3 1
+After: [3, 1, 0, 1]
+
+Before: [0, 0, 3, 0]
+8 0 0 1
+After: [0, 0, 3, 0]
+
+Before: [1, 1, 0, 2]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [2, 1, 1, 2]
+4 1 3 1
+After: [2, 0, 1, 2]
+
+Before: [3, 2, 3, 0]
+15 2 2 3
+After: [3, 2, 3, 1]
+
+Before: [0, 2, 0, 3]
+7 1 3 0
+After: [0, 2, 0, 3]
+
+Before: [1, 1, 3, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [0, 3, 1, 3]
+8 0 0 1
+After: [0, 0, 1, 3]
+
+Before: [3, 1, 2, 1]
+2 0 2 0
+After: [1, 1, 2, 1]
+
+Before: [1, 1, 3, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 0]
+2 0 1 3
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 1, 0]
+11 2 1 1
+After: [2, 2, 1, 0]
+
+Before: [3, 1, 1, 1]
+13 1 3 0
+After: [1, 1, 1, 1]
+
+Before: [2, 2, 1, 3]
+5 2 1 1
+After: [2, 2, 1, 3]
+
+Before: [0, 0, 2, 1]
+10 3 2 3
+After: [0, 0, 2, 1]
+
+Before: [3, 3, 0, 2]
+0 3 3 1
+After: [3, 0, 0, 2]
+
+Before: [0, 2, 1, 0]
+8 0 0 0
+After: [0, 2, 1, 0]
+
+Before: [3, 3, 0, 2]
+15 0 0 3
+After: [3, 3, 0, 1]
+
+Before: [1, 0, 2, 3]
+6 0 2 0
+After: [0, 0, 2, 3]
+
+Before: [0, 0, 1, 1]
+8 0 0 1
+After: [0, 0, 1, 1]
+
+Before: [1, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 1
+After: [1, 2, 1, 2]
+
+Before: [2, 1, 3, 1]
+14 2 0 1
+After: [2, 1, 3, 1]
+
+Before: [2, 1, 2, 0]
+2 0 1 0
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 2]
+6 0 2 3
+After: [1, 1, 2, 0]
+
+Before: [2, 1, 1, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [2, 3, 3, 2]
+14 2 0 2
+After: [2, 3, 1, 2]
+
+Before: [1, 0, 0, 2]
+1 0 2 0
+After: [0, 0, 0, 2]
+
+Before: [3, 3, 2, 2]
+15 0 0 0
+After: [1, 3, 2, 2]
+
+Before: [0, 1, 1, 2]
+4 1 3 3
+After: [0, 1, 1, 0]
+
+Before: [2, 2, 1, 2]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [2, 1, 2, 0]
+12 1 2 0
+After: [0, 1, 2, 0]
+
+Before: [3, 1, 0, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [1, 2, 1, 1]
+5 2 1 1
+After: [1, 2, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [0, 1, 0, 2]
+4 1 3 0
+After: [0, 1, 0, 2]
+
+Before: [3, 1, 0, 2]
+4 1 3 2
+After: [3, 1, 0, 2]
+
+Before: [1, 1, 3, 2]
+4 1 3 1
+After: [1, 0, 3, 2]
+
+Before: [3, 1, 1, 1]
+13 1 3 2
+After: [3, 1, 1, 1]
+
+Before: [0, 0, 2, 0]
+8 0 0 3
+After: [0, 0, 2, 0]
+
+Before: [1, 1, 3, 2]
+9 1 0 0
+After: [1, 1, 3, 2]
+
+Before: [3, 2, 1, 0]
+5 2 1 1
+After: [3, 2, 1, 0]
+
+Before: [1, 1, 0, 2]
+1 0 2 0
+After: [0, 1, 0, 2]
+
+Before: [2, 1, 0, 1]
+13 1 3 3
+After: [2, 1, 0, 1]
+
+Before: [3, 1, 2, 0]
+12 1 2 2
+After: [3, 1, 0, 0]
+
+Before: [3, 2, 2, 3]
+2 0 2 0
+After: [1, 2, 2, 3]
+
+Before: [1, 1, 1, 0]
+11 2 1 1
+After: [1, 2, 1, 0]
+
+Before: [0, 0, 1, 2]
+8 0 0 3
+After: [0, 0, 1, 0]
+
+Before: [1, 1, 0, 0]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 3
+After: [1, 1, 3, 1]
+
+Before: [1, 1, 1, 1]
+11 2 1 1
+After: [1, 2, 1, 1]
+
+Before: [3, 0, 0, 0]
+14 0 2 3
+After: [3, 0, 0, 1]
+
+Before: [2, 1, 1, 3]
+7 1 3 3
+After: [2, 1, 1, 0]
+
+Before: [0, 3, 3, 2]
+8 0 0 2
+After: [0, 3, 0, 2]
+
+Before: [3, 1, 2, 1]
+12 1 2 1
+After: [3, 0, 2, 1]
+
+Before: [3, 0, 2, 3]
+7 2 3 0
+After: [0, 0, 2, 3]
+
+Before: [3, 1, 1, 1]
+14 3 1 1
+After: [3, 0, 1, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 0
+After: [1, 1, 1, 3]
+
+Before: [0, 0, 3, 3]
+8 0 0 2
+After: [0, 0, 0, 3]
+
+Before: [3, 1, 3, 3]
+7 1 3 1
+After: [3, 0, 3, 3]
+
+Before: [1, 1, 2, 2]
+12 1 2 1
+After: [1, 0, 2, 2]
+
+Before: [1, 1, 0, 1]
+1 0 2 3
+After: [1, 1, 0, 0]
+
+Before: [2, 2, 2, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [2, 0, 3, 0]
+14 0 1 1
+After: [2, 1, 3, 0]
+
+Before: [1, 1, 2, 2]
+4 1 3 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 3]
+12 1 2 2
+After: [1, 1, 0, 3]
+
+Before: [1, 2, 1, 3]
+7 2 3 2
+After: [1, 2, 0, 3]
+
+Before: [3, 0, 0, 1]
+14 0 2 2
+After: [3, 0, 1, 1]
+
+Before: [3, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 2, 1]
+3 0 3 0
+After: [1, 3, 2, 1]
+
+Before: [0, 1, 3, 2]
+8 0 0 3
+After: [0, 1, 3, 0]
+
+Before: [2, 2, 1, 1]
+3 0 3 3
+After: [2, 2, 1, 1]
+
+Before: [3, 2, 3, 1]
+0 3 3 3
+After: [3, 2, 3, 0]
+
+Before: [2, 1, 1, 0]
+14 2 1 3
+After: [2, 1, 1, 0]
+
+Before: [2, 2, 1, 3]
+7 2 3 1
+After: [2, 0, 1, 3]
+
+Before: [2, 3, 3, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 1, 2, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [0, 3, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 3
+After: [0, 1, 0, 1]
+
+Before: [1, 1, 1, 3]
+11 2 1 3
+After: [1, 1, 1, 2]
+
+Before: [3, 1, 1, 2]
+11 2 1 2
+After: [3, 1, 2, 2]
+
+Before: [1, 3, 2, 3]
+6 0 2 3
+After: [1, 3, 2, 0]
+
+Before: [0, 1, 2, 3]
+8 0 0 2
+After: [0, 1, 0, 3]
+
+Before: [3, 0, 1, 3]
+14 3 0 2
+After: [3, 0, 1, 3]
+
+Before: [2, 1, 2, 0]
+12 1 2 3
+After: [2, 1, 2, 0]
+
+Before: [0, 1, 1, 1]
+11 2 1 0
+After: [2, 1, 1, 1]
+
+Before: [2, 3, 2, 1]
+0 3 3 2
+After: [2, 3, 0, 1]
+
+Before: [1, 1, 0, 2]
+0 3 3 3
+After: [1, 1, 0, 0]
+
+Before: [1, 0, 0, 1]
+1 0 2 3
+After: [1, 0, 0, 0]
+
+Before: [3, 2, 1, 3]
+7 2 3 3
+After: [3, 2, 1, 0]
+
+Before: [3, 1, 1, 3]
+11 2 1 2
+After: [3, 1, 2, 3]
+
+Before: [0, 1, 2, 2]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [3, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [1, 1, 3, 1]
+13 1 3 1
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 1, 1]
+9 1 0 2
+After: [1, 1, 1, 1]
+
+Before: [1, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [2, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [1, 1, 0, 3]
+1 0 2 2
+After: [1, 1, 0, 3]
+
+Before: [1, 2, 0, 1]
+1 0 2 3
+After: [1, 2, 0, 0]
+
+Before: [1, 3, 0, 0]
+1 0 2 0
+After: [0, 3, 0, 0]
+
+Before: [2, 1, 1, 3]
+14 2 1 0
+After: [0, 1, 1, 3]
+
+Before: [1, 1, 1, 2]
+9 1 0 1
+After: [1, 1, 1, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 1
+After: [1, 1, 0, 1]
+
+Before: [2, 0, 0, 2]
+15 0 0 0
+After: [1, 0, 0, 2]
+
+Before: [2, 3, 1, 1]
+3 0 3 0
+After: [1, 3, 1, 1]
+
+Before: [0, 1, 2, 0]
+12 1 2 3
+After: [0, 1, 2, 0]
+
+Before: [1, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [2, 0, 2, 2]
+14 3 2 2
+After: [2, 0, 0, 2]
+
+Before: [0, 2, 2, 1]
+10 3 2 0
+After: [1, 2, 2, 1]
+
+Before: [2, 1, 0, 2]
+4 1 3 3
+After: [2, 1, 0, 0]
+
+Before: [1, 3, 0, 2]
+1 0 2 2
+After: [1, 3, 0, 2]
+
+Before: [0, 0, 2, 3]
+8 0 0 1
+After: [0, 0, 2, 3]
+
+Before: [2, 1, 1, 3]
+7 1 3 0
+After: [0, 1, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 0, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [1, 1, 2, 1]
+13 1 3 1
+After: [1, 1, 2, 1]
+
+Before: [0, 1, 2, 1]
+12 1 2 1
+After: [0, 0, 2, 1]
+
+Before: [2, 2, 3, 3]
+14 3 2 2
+After: [2, 2, 1, 3]
+
+Before: [3, 1, 1, 1]
+13 1 3 3
+After: [3, 1, 1, 1]
+
+Before: [3, 3, 3, 2]
+15 2 0 1
+After: [3, 1, 3, 2]
+
+Before: [2, 1, 2, 1]
+3 0 3 1
+After: [2, 1, 2, 1]
+
+Before: [3, 1, 2, 0]
+2 0 2 3
+After: [3, 1, 2, 1]
+
+Before: [1, 2, 1, 2]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [0, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 0
+After: [1, 1, 1, 1]
+
+Before: [3, 1, 1, 2]
+11 2 1 1
+After: [3, 2, 1, 2]
+
+Before: [1, 1, 1, 3]
+11 2 1 0
+After: [2, 1, 1, 3]
+
+Before: [1, 1, 2, 0]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [0, 2, 2, 3]
+8 0 0 3
+After: [0, 2, 2, 0]
+
+Before: [0, 0, 2, 1]
+10 3 2 1
+After: [0, 1, 2, 1]
+
+Before: [0, 2, 3, 3]
+14 3 2 0
+After: [1, 2, 3, 3]
+
+Before: [2, 1, 0, 3]
+2 0 1 2
+After: [2, 1, 1, 3]
+
+Before: [3, 1, 2, 0]
+2 0 2 0
+After: [1, 1, 2, 0]
+
+Before: [3, 1, 0, 2]
+14 0 2 0
+After: [1, 1, 0, 2]
+
+Before: [2, 1, 3, 0]
+2 0 1 1
+After: [2, 1, 3, 0]
+
+Before: [1, 1, 1, 0]
+9 1 0 3
+After: [1, 1, 1, 1]
+
+Before: [1, 0, 0, 0]
+1 0 2 1
+After: [1, 0, 0, 0]
+
+Before: [0, 3, 2, 2]
+8 0 0 2
+After: [0, 3, 0, 2]
+
+Before: [3, 3, 2, 2]
+2 0 2 0
+After: [1, 3, 2, 2]
+
+Before: [0, 2, 1, 2]
+5 2 1 1
+After: [0, 2, 1, 2]
+
+Before: [3, 3, 2, 2]
+2 0 2 3
+After: [3, 3, 2, 1]
+
+Before: [0, 2, 1, 2]
+5 2 1 0
+After: [2, 2, 1, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 2
+After: [1, 0, 1, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 2
+After: [0, 1, 1, 1]
+
+Before: [3, 1, 1, 1]
+14 2 1 1
+After: [3, 0, 1, 1]
+
+Before: [0, 1, 0, 1]
+13 1 3 1
+After: [0, 1, 0, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 2
+After: [2, 2, 1, 1]
+
+Before: [3, 2, 1, 3]
+14 3 0 0
+After: [1, 2, 1, 3]
+
+Before: [1, 1, 2, 2]
+4 1 3 0
+After: [0, 1, 2, 2]
+
+Before: [3, 1, 2, 3]
+7 1 3 1
+After: [3, 0, 2, 3]
+
+Before: [3, 0, 3, 0]
+15 2 2 1
+After: [3, 1, 3, 0]
+
+Before: [0, 2, 2, 2]
+14 2 1 3
+After: [0, 2, 2, 1]
+
+Before: [1, 1, 2, 3]
+12 1 2 1
+After: [1, 0, 2, 3]
+
+Before: [3, 1, 1, 1]
+13 1 3 1
+After: [3, 1, 1, 1]
+
+Before: [2, 1, 1, 1]
+13 1 3 3
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 2, 3]
+7 2 3 3
+After: [2, 2, 2, 0]
+
+Before: [2, 3, 3, 3]
+15 0 0 2
+After: [2, 3, 1, 3]
+
+Before: [3, 1, 2, 1]
+13 1 3 3
+After: [3, 1, 2, 1]
+
+Before: [3, 3, 3, 2]
+15 0 2 0
+After: [1, 3, 3, 2]
+
+Before: [3, 1, 0, 2]
+0 3 3 0
+After: [0, 1, 0, 2]
+
+Before: [2, 0, 3, 2]
+14 0 1 1
+After: [2, 1, 3, 2]
+
+Before: [1, 0, 2, 1]
+10 3 2 3
+After: [1, 0, 2, 1]
+
+Before: [1, 3, 3, 1]
+0 3 3 2
+After: [1, 3, 0, 1]
+
+Before: [0, 2, 2, 1]
+10 3 2 2
+After: [0, 2, 1, 1]
+
+Before: [2, 2, 1, 0]
+5 2 1 0
+After: [2, 2, 1, 0]
+
+Before: [2, 3, 0, 1]
+3 0 3 2
+After: [2, 3, 1, 1]
+
+Before: [1, 2, 2, 2]
+6 0 2 1
+After: [1, 0, 2, 2]
+
+Before: [0, 1, 2, 2]
+12 1 2 0
+After: [0, 1, 2, 2]
+
+Before: [1, 1, 0, 2]
+9 1 0 2
+After: [1, 1, 1, 2]
+
+Before: [0, 1, 2, 2]
+12 1 2 2
+After: [0, 1, 0, 2]
+
+Before: [2, 1, 2, 0]
+12 1 2 2
+After: [2, 1, 0, 0]
+
+Before: [2, 3, 3, 0]
+15 0 0 3
+After: [2, 3, 3, 1]
+
+Before: [2, 2, 0, 1]
+15 0 0 0
+After: [1, 2, 0, 1]
+
+Before: [2, 0, 3, 2]
+0 3 3 2
+After: [2, 0, 0, 2]
+
+Before: [3, 0, 3, 2]
+15 2 2 3
+After: [3, 0, 3, 1]
+
+Before: [2, 3, 2, 1]
+10 3 2 3
+After: [2, 3, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 3
+After: [2, 1, 2, 1]
+
+Before: [1, 3, 0, 0]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [3, 1, 2, 3]
+2 0 2 3
+After: [3, 1, 2, 1]
+
+Before: [2, 1, 1, 2]
+11 2 1 2
+After: [2, 1, 2, 2]
+
+Before: [1, 3, 2, 3]
+7 2 3 1
+After: [1, 0, 2, 3]
+
+Before: [0, 0, 0, 0]
+8 0 0 3
+After: [0, 0, 0, 0]
+
+Before: [1, 0, 3, 1]
+14 2 3 2
+After: [1, 0, 0, 1]
+
+Before: [3, 2, 0, 3]
+14 0 2 3
+After: [3, 2, 0, 1]
+
+Before: [3, 2, 2, 1]
+2 0 2 1
+After: [3, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+3 0 3 0
+After: [1, 1, 2, 1]
+
+Before: [2, 2, 0, 1]
+3 0 3 3
+After: [2, 2, 0, 1]
+
+Before: [0, 3, 3, 2]
+8 0 0 0
+After: [0, 3, 3, 2]
+
+Before: [3, 2, 0, 1]
+14 0 2 1
+After: [3, 1, 0, 1]
+
+Before: [1, 1, 1, 3]
+9 1 0 1
+After: [1, 1, 1, 3]
+
+Before: [0, 1, 0, 1]
+13 1 3 0
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 1, 0]
+9 1 0 1
+After: [1, 1, 1, 0]
+
+Before: [1, 3, 2, 2]
+6 0 2 0
+After: [0, 3, 2, 2]
+
+Before: [2, 1, 1, 1]
+14 3 1 0
+After: [0, 1, 1, 1]
+
+Before: [1, 1, 3, 0]
+9 1 0 0
+After: [1, 1, 3, 0]
+
+Before: [2, 1, 3, 1]
+3 0 3 2
+After: [2, 1, 1, 1]
+
+Before: [2, 1, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [3, 2, 1, 3]
+7 1 3 3
+After: [3, 2, 1, 0]
+
+Before: [2, 0, 3, 3]
+15 0 0 2
+After: [2, 0, 1, 3]
+
+Before: [3, 0, 2, 1]
+10 3 2 2
+After: [3, 0, 1, 1]
+
+Before: [1, 1, 2, 3]
+9 1 0 0
+After: [1, 1, 2, 3]
+
+Before: [1, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [0, 1, 2, 3]
+12 1 2 1
+After: [0, 0, 2, 3]
+
+Before: [1, 3, 0, 1]
+1 0 2 3
+After: [1, 3, 0, 0]
+
+Before: [2, 1, 0, 1]
+2 0 1 0
+After: [1, 1, 0, 1]
+
+Before: [3, 2, 2, 3]
+2 0 2 1
+After: [3, 1, 2, 3]
+
+Before: [1, 2, 0, 1]
+1 0 2 1
+After: [1, 0, 0, 1]
+
+Before: [1, 2, 2, 0]
+6 0 2 0
+After: [0, 2, 2, 0]
+
+Before: [2, 1, 1, 2]
+11 2 1 0
+After: [2, 1, 1, 2]
+
+Before: [3, 1, 1, 3]
+7 1 3 2
+After: [3, 1, 0, 3]
+
+Before: [2, 2, 1, 3]
+5 2 1 2
+After: [2, 2, 2, 3]
+
+Before: [3, 1, 1, 1]
+11 2 1 1
+After: [3, 2, 1, 1]
+
+Before: [2, 1, 2, 2]
+4 1 3 1
+After: [2, 0, 2, 2]
+
+Before: [1, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [1, 1, 0, 2]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [3, 3, 2, 3]
+2 0 2 0
+After: [1, 3, 2, 3]
+
+Before: [1, 1, 2, 3]
+9 1 0 3
+After: [1, 1, 2, 1]
+
+Before: [2, 1, 2, 1]
+12 1 2 0
+After: [0, 1, 2, 1]
+
+Before: [1, 1, 0, 2]
+4 1 3 1
+After: [1, 0, 0, 2]
+
+Before: [1, 2, 2, 0]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [2, 1, 1, 0]
+11 2 1 3
+After: [2, 1, 1, 2]
+
+Before: [1, 1, 0, 1]
+13 1 3 3
+After: [1, 1, 0, 1]
+
+Before: [3, 1, 2, 3]
+7 1 3 3
+After: [3, 1, 2, 0]
+
+Before: [0, 2, 1, 3]
+8 0 0 0
+After: [0, 2, 1, 3]
+
+Before: [3, 2, 1, 3]
+7 1 3 0
+After: [0, 2, 1, 3]
+
+Before: [1, 2, 2, 2]
+6 0 2 3
+After: [1, 2, 2, 0]
+
+Before: [1, 1, 1, 1]
+13 1 3 3
+After: [1, 1, 1, 1]
+
+Before: [2, 1, 3, 2]
+15 2 2 1
+After: [2, 1, 3, 2]
+
+Before: [2, 1, 0, 3]
+2 0 1 0
+After: [1, 1, 0, 3]
+
+Before: [1, 1, 2, 1]
+12 1 2 2
+After: [1, 1, 0, 1]
+
+Before: [1, 1, 3, 2]
+4 1 3 0
+After: [0, 1, 3, 2]
+
+Before: [2, 3, 2, 3]
+7 2 3 2
+After: [2, 3, 0, 3]
+
+Before: [2, 2, 1, 1]
+5 2 1 3
+After: [2, 2, 1, 2]
+
+Before: [0, 0, 2, 1]
+10 3 2 0
+After: [1, 0, 2, 1]
+
+Before: [3, 1, 0, 3]
+7 1 3 2
+After: [3, 1, 0, 3]
+
+Before: [2, 1, 3, 2]
+2 0 1 1
+After: [2, 1, 3, 2]
+
+Before: [2, 3, 1, 1]
+3 0 3 1
+After: [2, 1, 1, 1]
+
+Before: [2, 2, 1, 3]
+7 1 3 3
+After: [2, 2, 1, 0]
+
+Before: [3, 3, 3, 1]
+15 0 2 1
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 1, 0]
+11 2 1 1
+After: [0, 2, 1, 0]
+
+Before: [1, 1, 1, 0]
+11 2 1 0
+After: [2, 1, 1, 0]
+
+Before: [3, 1, 3, 1]
+13 1 3 3
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 3, 2]
+8 0 0 1
+After: [0, 0, 3, 2]
+
+Before: [2, 2, 0, 3]
+7 1 3 3
+After: [2, 2, 0, 0]
+
+Before: [1, 0, 2, 1]
+6 0 2 2
+After: [1, 0, 0, 1]
+
+Before: [1, 3, 0, 2]
+0 3 3 3
+After: [1, 3, 0, 0]
+
+Before: [1, 1, 0, 1]
+9 1 0 3
+After: [1, 1, 0, 1]
+
+Before: [1, 2, 2, 3]
+7 1 3 1
+After: [1, 0, 2, 3]
+
+Before: [1, 1, 2, 2]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 2, 0]
+12 1 2 3
+After: [1, 1, 2, 0]
+
+Before: [0, 1, 0, 2]
+4 1 3 1
+After: [0, 0, 0, 2]
+
+Before: [1, 1, 1, 0]
+9 1 0 0
+After: [1, 1, 1, 0]
+
+Before: [1, 1, 2, 0]
+9 1 0 0
+After: [1, 1, 2, 0]
+
+Before: [1, 2, 1, 1]
+5 2 1 3
+After: [1, 2, 1, 2]
+
+Before: [3, 0, 3, 2]
+15 2 2 0
+After: [1, 0, 3, 2]
+
+Before: [2, 2, 1, 3]
+7 2 3 3
+After: [2, 2, 1, 0]
+
+Before: [3, 1, 2, 2]
+4 1 3 3
+After: [3, 1, 2, 0]
+
+Before: [3, 1, 2, 1]
+15 0 0 1
+After: [3, 1, 2, 1]
+
+Before: [2, 3, 2, 1]
+10 3 2 0
+After: [1, 3, 2, 1]
+
+Before: [2, 1, 2, 2]
+0 3 3 1
+After: [2, 0, 2, 2]
+
+Before: [1, 2, 0, 2]
+1 0 2 1
+After: [1, 0, 0, 2]
+
+Before: [3, 3, 2, 0]
+2 0 2 0
+After: [1, 3, 2, 0]
+
+Before: [0, 1, 1, 2]
+11 2 1 1
+After: [0, 2, 1, 2]
+
+Before: [3, 1, 2, 1]
+13 1 3 1
+After: [3, 1, 2, 1]
+
+Before: [3, 1, 3, 3]
+15 2 0 3
+After: [3, 1, 3, 1]
+
+Before: [0, 1, 0, 1]
+8 0 0 3
+After: [0, 1, 0, 0]
+
+Before: [2, 3, 2, 1]
+0 3 3 3
+After: [2, 3, 2, 0]
+
+Before: [2, 1, 1, 2]
+4 1 3 2
+After: [2, 1, 0, 2]
+
+Before: [0, 1, 3, 1]
+13 1 3 0
+After: [1, 1, 3, 1]
+
+Before: [2, 2, 1, 1]
+5 2 1 0
+After: [2, 2, 1, 1]
+
+Before: [3, 1, 2, 0]
+15 0 0 0
+After: [1, 1, 2, 0]
+
+Before: [1, 1, 1, 1]
+9 1 0 0
+After: [1, 1, 1, 1]
+
+Before: [1, 1, 2, 2]
+12 1 2 2
+After: [1, 1, 0, 2]
+
+Before: [1, 1, 2, 1]
+10 3 2 0
+After: [1, 1, 2, 1]
+
+Before: [2, 0, 1, 1]
+3 0 3 3
+After: [2, 0, 1, 1]
diff --git a/2018/inputs/16_2.txt b/2018/inputs/16_2.txt
new file mode 100644
index 0000000..6f6f812
--- /dev/null
+++ b/2018/inputs/16_2.txt
@@ -0,0 +1,1014 @@
+8 0 0 2
+5 2 2 2
+6 3 1 1
+8 0 0 3
+5 3 0 3
+9 2 3 1
+8 1 3 1
+8 1 2 1
+11 0 1 0
+10 0 0 1
+8 0 0 2
+5 2 3 2
+6 3 0 3
+8 2 0 0
+5 0 1 0
+12 3 2 0
+8 0 3 0
+11 1 0 1
+10 1 1 3
+6 1 2 0
+8 1 0 1
+5 1 0 1
+6 0 0 2
+5 0 1 1
+8 1 3 1
+11 3 1 3
+10 3 3 2
+6 3 0 3
+6 2 1 1
+4 3 1 0
+8 0 3 0
+11 0 2 2
+10 2 0 1
+8 1 0 0
+5 0 1 0
+8 3 0 2
+5 2 0 2
+6 2 1 3
+8 0 2 3
+8 3 3 3
+8 3 3 3
+11 3 1 1
+10 1 1 3
+6 3 3 2
+6 0 0 1
+8 0 2 0
+8 0 1 0
+8 0 1 0
+11 3 0 3
+10 3 0 0
+6 2 2 1
+6 1 0 3
+13 1 2 1
+8 1 2 1
+11 1 0 0
+10 0 3 2
+6 2 0 0
+6 3 1 1
+6 2 0 3
+9 0 3 1
+8 1 1 1
+8 1 3 1
+11 1 2 2
+10 2 0 0
+6 3 1 1
+6 2 1 2
+6 0 2 3
+7 3 2 1
+8 1 2 1
+8 1 2 1
+11 1 0 0
+10 0 3 3
+6 3 1 2
+6 1 2 0
+6 0 1 1
+6 2 1 1
+8 1 1 1
+11 3 1 3
+10 3 3 1
+6 2 0 3
+8 0 0 2
+5 2 0 2
+6 2 2 0
+15 0 3 0
+8 0 1 0
+8 0 2 0
+11 0 1 1
+10 1 0 0
+6 3 1 1
+6 0 0 3
+6 2 1 2
+7 3 2 2
+8 2 2 2
+11 2 0 0
+10 0 1 1
+6 1 0 3
+8 0 0 0
+5 0 2 0
+8 0 0 2
+5 2 0 2
+3 0 3 2
+8 2 3 2
+8 2 2 2
+11 1 2 1
+10 1 1 3
+8 2 0 2
+5 2 3 2
+6 3 2 0
+6 1 3 1
+8 1 2 2
+8 2 1 2
+11 2 3 3
+6 1 1 0
+8 1 0 2
+5 2 0 2
+6 2 0 0
+8 0 3 0
+11 3 0 3
+10 3 3 2
+6 2 1 0
+6 2 2 3
+6 0 1 1
+9 0 3 0
+8 0 1 0
+8 0 1 0
+11 0 2 2
+10 2 3 3
+6 3 1 1
+8 3 0 2
+5 2 1 2
+6 1 3 0
+5 0 1 0
+8 0 2 0
+11 0 3 3
+10 3 0 0
+6 1 3 3
+8 0 0 2
+5 2 0 2
+6 0 1 1
+5 3 1 2
+8 2 2 2
+11 0 2 0
+10 0 2 3
+6 2 1 1
+6 2 0 2
+6 3 3 0
+13 1 0 1
+8 1 2 1
+11 1 3 3
+10 3 2 2
+6 1 1 3
+6 0 2 1
+6 0 2 0
+5 3 1 3
+8 3 2 3
+11 2 3 2
+10 2 3 3
+6 1 3 0
+6 0 0 2
+6 3 1 1
+8 0 2 1
+8 1 3 1
+11 3 1 3
+10 3 0 1
+6 2 2 0
+6 2 1 3
+6 3 3 2
+9 0 3 2
+8 2 2 2
+8 2 3 2
+11 2 1 1
+10 1 3 3
+6 0 3 2
+8 2 0 1
+5 1 3 1
+2 0 1 1
+8 1 1 1
+11 1 3 3
+10 3 3 2
+6 3 0 1
+6 1 1 3
+3 0 3 1
+8 1 3 1
+11 2 1 2
+10 2 1 0
+6 2 1 1
+6 1 3 2
+6 2 0 3
+9 1 3 3
+8 3 3 3
+11 3 0 0
+10 0 3 2
+6 2 3 0
+6 1 0 3
+3 0 3 3
+8 3 2 3
+11 2 3 2
+10 2 2 1
+6 1 2 3
+6 2 3 2
+3 0 3 2
+8 2 1 2
+8 2 2 2
+11 2 1 1
+10 1 0 2
+6 3 2 1
+6 3 3 0
+11 3 3 1
+8 1 2 1
+8 1 2 1
+11 2 1 2
+6 2 1 1
+13 1 0 0
+8 0 3 0
+8 0 1 0
+11 0 2 2
+10 2 1 3
+8 1 0 0
+5 0 1 0
+6 0 0 2
+8 0 2 0
+8 0 3 0
+8 0 2 0
+11 3 0 3
+10 3 3 1
+6 3 3 2
+6 2 1 0
+6 2 2 3
+15 0 3 3
+8 3 2 3
+11 3 1 1
+10 1 3 2
+6 3 1 1
+8 2 0 3
+5 3 0 3
+4 1 0 1
+8 1 2 1
+11 2 1 2
+10 2 0 1
+6 3 1 2
+6 1 1 3
+6 1 0 0
+8 3 2 3
+8 3 2 3
+11 1 3 1
+10 1 2 3
+6 2 1 1
+6 2 1 2
+10 0 2 2
+8 2 1 2
+11 3 2 3
+6 0 0 1
+6 2 1 2
+10 0 2 0
+8 0 3 0
+11 3 0 3
+10 3 1 2
+8 2 0 3
+5 3 0 3
+6 1 1 0
+11 0 0 3
+8 3 2 3
+11 3 2 2
+10 2 3 3
+6 2 1 1
+6 3 2 2
+6 2 2 0
+0 0 2 0
+8 0 1 0
+11 0 3 3
+10 3 3 2
+6 2 1 3
+6 2 0 0
+6 3 0 1
+15 0 3 3
+8 3 1 3
+8 3 3 3
+11 3 2 2
+10 2 3 1
+8 1 0 0
+5 0 1 0
+6 3 3 2
+8 0 0 3
+5 3 1 3
+8 0 2 3
+8 3 1 3
+11 3 1 1
+10 1 1 3
+6 0 0 1
+6 2 1 2
+10 0 2 1
+8 1 2 1
+11 1 3 3
+10 3 2 0
+8 0 0 2
+5 2 0 2
+6 3 2 3
+6 3 3 1
+12 3 2 1
+8 1 1 1
+11 1 0 0
+10 0 0 3
+6 3 2 1
+6 2 2 0
+6 3 3 2
+0 0 2 0
+8 0 3 0
+8 0 1 0
+11 0 3 3
+10 3 3 2
+6 1 3 1
+8 1 0 3
+5 3 2 3
+8 0 0 0
+5 0 2 0
+1 1 3 0
+8 0 1 0
+11 2 0 2
+6 3 1 1
+6 2 0 0
+4 1 0 1
+8 1 2 1
+11 2 1 2
+10 2 1 1
+6 3 0 2
+6 1 2 3
+3 0 3 0
+8 0 1 0
+11 0 1 1
+8 3 0 2
+5 2 2 2
+6 2 0 3
+8 2 0 0
+5 0 3 0
+2 2 0 2
+8 2 1 2
+11 1 2 1
+10 1 2 0
+6 3 0 1
+8 0 0 2
+5 2 0 2
+14 2 3 1
+8 1 2 1
+11 1 0 0
+10 0 2 3
+6 3 3 2
+6 1 3 0
+8 3 0 1
+5 1 1 1
+11 1 0 2
+8 2 3 2
+8 2 3 2
+11 3 2 3
+10 3 3 1
+6 2 2 2
+6 0 2 3
+7 3 2 0
+8 0 2 0
+8 0 2 0
+11 1 0 1
+10 1 2 3
+6 3 2 0
+8 2 0 2
+5 2 0 2
+8 1 0 1
+5 1 3 1
+0 2 0 0
+8 0 3 0
+11 0 3 3
+10 3 2 1
+6 1 1 0
+8 3 0 3
+5 3 0 3
+6 1 1 2
+6 3 0 2
+8 2 2 2
+11 2 1 1
+10 1 3 2
+8 3 0 1
+5 1 1 1
+6 3 1 3
+11 0 0 1
+8 1 1 1
+11 1 2 2
+10 2 1 1
+6 1 2 2
+6 3 2 0
+6 2 1 3
+12 0 2 0
+8 0 3 0
+11 1 0 1
+10 1 1 2
+6 2 3 0
+8 2 0 3
+5 3 1 3
+6 3 1 1
+5 3 1 3
+8 3 2 3
+11 2 3 2
+6 0 3 3
+6 3 0 0
+8 2 0 1
+5 1 2 1
+13 1 0 0
+8 0 1 0
+11 0 2 2
+10 2 3 1
+6 2 1 2
+6 1 2 3
+6 3 0 0
+2 2 0 3
+8 3 3 3
+11 1 3 1
+10 1 2 3
+6 1 3 0
+6 3 0 1
+5 0 1 1
+8 1 2 1
+11 1 3 3
+10 3 3 2
+6 1 3 3
+8 0 0 1
+5 1 0 1
+8 1 0 0
+5 0 2 0
+3 0 3 1
+8 1 2 1
+11 2 1 2
+6 1 1 0
+6 0 2 1
+8 3 0 3
+5 3 2 3
+5 0 1 0
+8 0 3 0
+8 0 2 0
+11 0 2 2
+6 1 0 1
+6 2 1 0
+15 0 3 3
+8 3 3 3
+11 3 2 2
+6 0 2 1
+6 2 3 3
+6 3 3 0
+4 0 3 1
+8 1 2 1
+11 2 1 2
+6 0 1 3
+8 0 0 0
+5 0 2 0
+8 3 0 1
+5 1 2 1
+6 3 0 0
+8 0 2 0
+8 0 3 0
+11 0 2 2
+10 2 1 3
+8 2 0 2
+5 2 3 2
+6 1 1 1
+6 2 3 0
+1 1 0 2
+8 2 3 2
+11 3 2 3
+10 3 0 0
+6 0 3 3
+8 3 0 1
+5 1 0 1
+6 2 0 2
+7 3 2 2
+8 2 2 2
+11 0 2 0
+10 0 0 3
+6 2 3 1
+8 3 0 2
+5 2 0 2
+6 3 3 0
+13 1 0 2
+8 2 3 2
+8 2 3 2
+11 3 2 3
+8 3 0 2
+5 2 2 2
+2 2 0 1
+8 1 3 1
+11 3 1 3
+10 3 2 2
+6 1 3 3
+6 3 3 1
+6 2 0 0
+3 0 3 3
+8 3 3 3
+11 3 2 2
+10 2 2 0
+6 1 1 1
+6 2 1 3
+8 2 0 2
+5 2 0 2
+14 2 3 2
+8 2 2 2
+8 2 3 2
+11 2 0 0
+10 0 1 3
+6 3 0 1
+6 3 2 2
+6 2 0 0
+6 2 1 0
+8 0 2 0
+11 3 0 3
+10 3 0 1
+6 0 1 3
+6 2 3 2
+8 3 0 0
+5 0 0 0
+7 3 2 3
+8 3 3 3
+8 3 2 3
+11 1 3 1
+10 1 1 2
+6 2 0 0
+8 0 0 3
+5 3 1 3
+6 1 1 1
+1 3 0 1
+8 1 2 1
+11 1 2 2
+10 2 2 3
+6 0 2 1
+6 3 1 0
+6 2 2 2
+2 2 0 1
+8 1 3 1
+8 1 1 1
+11 1 3 3
+10 3 1 2
+6 1 0 1
+6 2 2 3
+1 1 3 0
+8 0 2 0
+8 0 3 0
+11 2 0 2
+10 2 3 1
+6 2 0 0
+6 2 0 2
+15 0 3 3
+8 3 1 3
+11 3 1 1
+10 1 0 3
+6 3 0 2
+6 1 3 1
+0 0 2 2
+8 2 3 2
+11 3 2 3
+10 3 3 0
+6 1 2 3
+6 3 1 1
+6 0 0 2
+12 1 2 3
+8 3 3 3
+8 3 3 3
+11 3 0 0
+10 0 3 1
+8 1 0 0
+5 0 2 0
+8 1 0 2
+5 2 2 2
+6 0 2 3
+7 3 2 2
+8 2 2 2
+11 2 1 1
+10 1 2 3
+6 2 3 1
+6 3 1 2
+13 1 2 0
+8 0 3 0
+11 0 3 3
+10 3 1 1
+6 1 2 3
+6 3 1 0
+8 3 2 0
+8 0 1 0
+11 1 0 1
+6 1 3 0
+6 2 2 2
+6 3 0 3
+10 0 2 0
+8 0 1 0
+11 0 1 1
+6 3 0 0
+2 2 0 3
+8 3 1 3
+11 3 1 1
+10 1 2 3
+6 1 2 2
+8 1 0 1
+5 1 1 1
+6 2 2 0
+1 1 0 0
+8 0 3 0
+11 3 0 3
+10 3 1 0
+6 2 0 3
+6 2 0 2
+1 1 3 3
+8 3 1 3
+11 3 0 0
+10 0 0 3
+6 3 2 1
+8 3 0 0
+5 0 2 0
+6 3 2 2
+0 0 2 2
+8 2 1 2
+11 3 2 3
+10 3 3 0
+8 0 0 3
+5 3 0 3
+6 1 3 1
+6 2 2 2
+7 3 2 3
+8 3 1 3
+8 3 3 3
+11 0 3 0
+10 0 0 3
+6 3 2 2
+6 2 1 0
+0 0 2 1
+8 1 3 1
+8 1 2 1
+11 1 3 3
+8 1 0 2
+5 2 2 2
+6 3 1 0
+6 3 3 1
+2 2 1 1
+8 1 1 1
+11 3 1 3
+10 3 1 1
+6 3 2 3
+6 2 0 0
+6 3 0 2
+13 0 2 3
+8 3 3 3
+8 3 1 3
+11 3 1 1
+10 1 2 3
+8 2 0 0
+5 0 1 0
+8 3 0 2
+5 2 2 2
+8 0 0 1
+5 1 0 1
+11 0 0 1
+8 1 2 1
+11 3 1 3
+10 3 3 0
+6 0 1 3
+6 3 3 1
+6 3 1 2
+14 3 2 3
+8 3 3 3
+11 0 3 0
+10 0 2 3
+6 1 0 1
+6 1 0 0
+6 2 3 2
+10 0 2 1
+8 1 1 1
+8 1 2 1
+11 1 3 3
+6 1 1 2
+6 0 3 1
+5 0 1 2
+8 2 3 2
+11 3 2 3
+10 3 2 1
+8 3 0 3
+5 3 2 3
+8 1 0 0
+5 0 2 0
+6 3 3 2
+0 0 2 3
+8 3 2 3
+8 3 1 3
+11 3 1 1
+10 1 2 0
+6 1 3 3
+8 3 0 2
+5 2 1 2
+6 0 1 1
+5 3 1 3
+8 3 1 3
+11 0 3 0
+10 0 3 1
+6 1 3 0
+6 0 3 3
+8 1 0 2
+5 2 2 2
+7 3 2 3
+8 3 2 3
+11 3 1 1
+6 0 0 2
+6 2 3 3
+6 0 3 0
+14 2 3 0
+8 0 1 0
+8 0 1 0
+11 0 1 1
+10 1 0 3
+6 3 0 2
+6 2 2 0
+6 2 0 1
+13 0 2 1
+8 1 3 1
+8 1 1 1
+11 3 1 3
+10 3 2 1
+6 3 1 3
+6 1 2 0
+8 0 2 2
+8 2 3 2
+11 1 2 1
+6 1 0 3
+6 3 3 2
+11 0 0 2
+8 2 2 2
+11 1 2 1
+10 1 2 3
+6 0 3 0
+8 1 0 2
+5 2 2 2
+6 3 2 1
+2 2 1 2
+8 2 1 2
+11 3 2 3
+6 0 0 2
+6 1 3 1
+8 1 2 0
+8 0 3 0
+8 0 2 0
+11 0 3 3
+10 3 2 2
+6 2 2 0
+6 1 2 3
+3 0 3 0
+8 0 2 0
+11 2 0 2
+10 2 3 3
+6 0 0 1
+6 2 0 0
+6 3 3 2
+0 0 2 2
+8 2 1 2
+8 2 1 2
+11 2 3 3
+10 3 1 0
+6 2 3 1
+6 2 3 3
+8 3 0 2
+5 2 0 2
+14 2 3 2
+8 2 3 2
+11 2 0 0
+10 0 0 1
+8 2 0 2
+5 2 0 2
+6 1 0 0
+1 0 3 3
+8 3 2 3
+8 3 2 3
+11 1 3 1
+6 2 2 0
+6 2 0 3
+6 1 3 2
+15 0 3 0
+8 0 2 0
+11 1 0 1
+10 1 2 0
+6 3 0 1
+6 0 3 2
+6 1 1 3
+12 1 2 1
+8 1 1 1
+11 1 0 0
+10 0 1 2
+6 3 1 1
+6 3 1 0
+5 3 1 3
+8 3 3 3
+11 2 3 2
+10 2 1 0
+6 0 2 3
+6 2 3 2
+8 1 0 1
+5 1 0 1
+7 3 2 3
+8 3 1 3
+8 3 1 3
+11 3 0 0
+6 2 1 1
+6 3 0 2
+6 0 1 3
+14 3 2 2
+8 2 2 2
+11 2 0 0
+8 2 0 2
+5 2 0 2
+6 1 1 3
+6 2 3 1
+8 1 3 1
+11 0 1 0
+10 0 0 1
+6 2 1 0
+6 3 1 2
+1 3 0 0
+8 0 2 0
+11 0 1 1
+10 1 3 0
+6 0 3 3
+6 1 1 1
+14 3 2 1
+8 1 2 1
+11 0 1 0
+10 0 3 2
+6 2 3 1
+6 2 0 0
+6 1 1 3
+1 3 0 0
+8 0 1 0
+11 0 2 2
+10 2 0 1
+6 0 2 2
+6 2 0 3
+6 2 1 0
+15 0 3 3
+8 3 2 3
+8 3 3 3
+11 1 3 1
+6 3 0 0
+8 0 0 3
+5 3 1 3
+11 3 3 3
+8 3 1 3
+8 3 1 3
+11 3 1 1
+10 1 3 3
+6 2 0 0
+6 3 0 2
+8 0 0 1
+5 1 2 1
+0 0 2 1
+8 1 1 1
+8 1 1 1
+11 1 3 3
+10 3 1 2
+6 2 0 1
+6 2 3 3
+15 0 3 1
+8 1 1 1
+8 1 1 1
+11 1 2 2
+10 2 1 0
+6 0 2 3
+6 3 3 1
+6 2 1 2
+7 3 2 3
+8 3 3 3
+11 3 0 0
+10 0 0 2
+6 2 3 0
+6 0 0 3
+2 0 1 3
+8 3 3 3
+11 2 3 2
+10 2 2 3
+6 1 0 2
+6 1 0 1
+1 1 0 1
+8 1 1 1
+11 3 1 3
+8 1 0 1
+5 1 3 1
+2 0 1 1
+8 1 3 1
+11 3 1 3
+10 3 0 2
+6 2 2 3
+8 2 0 1
+5 1 3 1
+15 0 3 1
+8 1 1 1
+8 1 1 1
+11 2 1 2
+10 2 3 0
+6 3 0 1
+6 1 0 3
+6 2 1 2
+2 2 1 2
+8 2 2 2
+8 2 3 2
+11 0 2 0
+10 0 0 1
+6 1 0 0
+6 2 2 2
+10 0 2 2
+8 2 1 2
+11 1 2 1
+10 1 2 0
+6 3 1 1
+6 2 0 3
+6 2 0 2
+9 2 3 2
+8 2 1 2
+11 0 2 0
+10 0 2 2
+6 1 1 3
+6 0 2 1
+8 0 0 0
+5 0 1 0
+5 3 1 3
+8 3 2 3
+11 3 2 2
+10 2 0 1
+6 1 2 2
+6 2 1 3
+1 0 3 2
+8 2 2 2
+11 2 1 1
+6 3 3 2
+6 2 3 0
+15 0 3 2
+8 2 2 2
+11 2 1 1
+10 1 2 0
+6 2 1 1
+6 3 3 2
+9 1 3 3
+8 3 3 3
+11 0 3 0
+10 0 2 1
+6 0 0 2
+6 2 0 0
+6 1 1 3
+1 3 0 2
+8 2 1 2
+8 2 1 2
+11 2 1 1
+10 1 0 0
+6 2 2 1
+6 0 0 3
+6 3 2 2
+13 1 2 2
+8 2 3 2
+11 0 2 0
+10 0 0 2
+6 2 2 3
+8 2 0 0
+5 0 0 0
+6 3 1 1
+6 3 0 0
+8 0 3 0
+11 0 2 2
+10 2 0 1
+6 0 1 2
+6 3 2 0
+6 0 1 3
+12 0 2 3
+8 3 1 3
+8 3 2 3
+11 3 1 1
+10 1 3 2
+6 2 2 1
+6 2 3 0
+6 3 2 3
+4 3 1 1
+8 1 2 1
+11 2 1 2
+10 2 0 0
+8 3 0 3
+5 3 1 3
+6 1 1 1
+6 3 3 2
+8 3 2 3
+8 3 2 3
+11 0 3 0
+6 2 3 2
+6 2 0 1
+6 2 0 3
+9 1 3 3
+8 3 1 3
+11 0 3 0
+10 0 1 2
+6 1 3 3
+6 2 2 0
+11 3 3 3
+8 3 2 3
+11 2 3 2
+6 2 0 3
+6 3 1 1
+15 0 3 0
+8 0 2 0
+8 0 2 0
+11 2 0 2
+10 2 2 3
+8 2 0 0
+5 0 1 0
+8 3 0 1
+5 1 1 1
+6 0 0 2
+8 1 2 2
+8 2 2 2
+8 2 1 2
+11 3 2 3
+10 3 2 0
diff --git a/2018/inputs/17.txt b/2018/inputs/17.txt
new file mode 100644
index 0000000..1e2ccdd
--- /dev/null
+++ b/2018/inputs/17.txt
@@ -0,0 +1,1713 @@
+y=1181, x=576..579
+y=434, x=498..503
+x=647, y=653..675
+y=1204, x=593..595
+y=268, x=475..498
+x=599, y=619..638
+y=1130, x=452..478
+x=439, y=1365..1377
+y=652, x=589..595
+y=1552, x=560..577
+x=439, y=852..867
+x=605, y=292..298
+x=489, y=709..718
+x=567, y=1087..1097
+y=1774, x=631..634
+x=649, y=592..612
+x=610, y=533..555
+x=564, y=996..1008
+x=651, y=416..441
+y=1106, x=502..519
+y=1015, x=479..487
+x=572, y=25..35
+x=630, y=849..865
+x=573, y=884..897
+x=614, y=667..688
+x=464, y=1542..1567
+x=645, y=258..270
+y=1029, x=656..662
+y=1502, x=483..511
+x=589, y=1553..1555
+x=535, y=1792..1795
+x=469, y=166..193
+x=484, y=1117..1142
+x=655, y=1277..1295
+x=598, y=162..170
+y=620, x=430..455
+x=665, y=1205..1212
+x=501, y=1347..1364
+x=661, y=664..684
+x=583, y=131..142
+x=542, y=722..727
+x=475, y=748..761
+x=602, y=1386..1393
+x=578, y=1651..1662
+y=1711, x=598..603
+y=164, x=642..660
+x=488, y=1176..1183
+x=644, y=207..221
+x=654, y=1678..1691
+y=1673, x=448..454
+x=630, y=1299..1312
+y=695, x=472..474
+x=465, y=1022..1045
+x=645, y=1216..1243
+x=623, y=423..437
+x=625, y=200..219
+x=565, y=1153..1166
+x=490, y=1510..1519
+x=553, y=941..947
+x=634, y=1101..1126
+x=515, y=111..113
+y=1146, x=427..438
+y=1096, x=451..460
+x=464, y=1339..1346
+x=612, y=1383..1396
+y=500, x=516..532
+x=555, y=941..947
+x=528, y=1243..1270
+x=646, y=1136..1146
+y=887, x=470..484
+x=617, y=316..343
+x=575, y=1060..1069
+y=1047, x=443..455
+y=1120, x=527..580
+x=514, y=126..135
+y=292, x=484..500
+x=556, y=75..91
+y=646, x=494..518
+x=644, y=552..568
+x=509, y=8..17
+y=735, x=591..614
+x=586, y=1215..1228
+y=1335, x=443..465
+y=495, x=522..526
+x=610, y=864..867
+y=221, x=639..644
+y=1346, x=464..469
+x=489, y=967..983
+x=602, y=1277..1289
+x=620, y=1348..1375
+x=575, y=1736..1744
+x=629, y=462..466
+y=270, x=645..652
+x=518, y=1244..1270
+x=576, y=1151..1162
+x=483, y=970..973
+y=1349, x=606..610
+y=1335, x=634..655
+y=1671, x=650..657
+x=619, y=243..265
+x=585, y=558..563
+x=536, y=1876..1887
+x=652, y=551..559
+x=593, y=1256..1268
+x=440, y=1480..1496
+y=1401, x=520..541
+x=624, y=1297..1306
+x=501, y=1510..1528
+x=587, y=567..575
+y=1470, x=560..580
+y=776, x=519..523
+x=601, y=981..983
+x=516, y=655..666
+y=1803, x=573..578
+x=504, y=1654..1677
+y=1931, x=537..667
+x=540, y=145..163
+x=616, y=204..210
+x=473, y=1856..1859
+x=547, y=241..259
+x=664, y=932..939
+x=475, y=306..316
+y=1572, x=622..628
+x=641, y=985..1001
+x=527, y=1572..1575
+x=447, y=1116..1124
+x=595, y=650..652
+y=1326, x=616..619
+x=626, y=822..835
+x=583, y=1063..1075
+x=576, y=1212..1222
+y=1206, x=486..495
+x=602, y=1885..1910
+x=460, y=1781..1805
+y=996, x=521..527
+x=591, y=1083..1103
+x=569, y=1563..1574
+y=785, x=560..579
+y=857, x=522..524
+x=599, y=804..805
+x=651, y=1724..1736
+y=637, x=449..467
+x=455, y=815..842
+x=476, y=1327..1345
+y=1533, x=615..624
+y=1268, x=633..655
+x=653, y=295..299
+x=522, y=388..415
+y=1365, x=462..487
+y=1430, x=428..438
+x=487, y=488..499
+y=1150, x=599..608
+x=559, y=1922..1927
+x=664, y=170..193
+y=1531, x=441..444
+y=1315, x=600..604
+x=603, y=1541..1543
+x=664, y=1401..1420
+x=580, y=322..345
+x=449, y=627..637
+y=1749, x=497..511
+x=577, y=1060..1069
+y=289, x=492..494
+x=443, y=1330..1335
+x=487, y=405..416
+x=603, y=18..33
+y=1312, x=612..630
+x=605, y=625..633
+x=546, y=1230..1232
+x=553, y=1126..1142
+x=441, y=936..943
+y=1715, x=544..641
+y=1693, x=594..596
+x=649, y=1151..1170
+x=490, y=405..416
+x=602, y=1602..1623
+y=142, x=580..583
+x=574, y=646..660
+y=789, x=479..485
+y=1093, x=640..655
+y=1200, x=501..508
+y=225, x=557..572
+x=591, y=727..735
+x=515, y=1653..1665
+x=467, y=489..499
+y=193, x=459..469
+x=593, y=1143..1162
+x=461, y=489..493
+x=547, y=198..217
+x=522, y=61..73
+x=626, y=1767..1779
+y=446, x=437..448
+y=840, x=443..451
+x=496, y=597..601
+x=650, y=1004..1013
+x=429, y=936..943
+x=557, y=812..822
+x=542, y=1633..1635
+x=469, y=1607..1615
+y=1654, x=624..626
+x=504, y=787..798
+x=569, y=1868..1875
+y=902, x=641..644
+y=1170, x=649..651
+x=606, y=532..555
+x=493, y=1509..1528
+x=452, y=1410..1425
+x=535, y=468..480
+x=599, y=1150..1158
+y=1486, x=429..437
+y=415, x=518..522
+x=511, y=1490..1502
+x=634, y=1765..1774
+x=539, y=869..879
+x=470, y=1413..1418
+x=516, y=1641..1648
+y=598, x=432..434
+x=494, y=807..818
+x=477, y=1875..1898
+x=577, y=77..98
+x=477, y=324..337
+x=451, y=1510..1535
+x=590, y=838..849
+x=565, y=1872..1898
+x=516, y=825..831
+x=541, y=869..879
+y=695, x=427..444
+x=437, y=1166..1194
+x=593, y=1279..1292
+x=518, y=469..480
+x=532, y=1851..1861
+y=1861, x=532..536
+y=1485, x=636..652
+y=1887, x=493..496
+x=436, y=749..766
+y=1268, x=593..610
+y=1145, x=512..520
+y=334, x=482..485
+y=1351, x=553..565
+x=491, y=1547..1556
+y=1908, x=530..549
+y=521, x=607..634
+x=602, y=1687..1698
+x=631, y=1725..1736
+y=1792, x=432..456
+x=530, y=1572..1575
+x=584, y=1154..1166
+x=620, y=1286..1292
+x=537, y=1918..1931
+x=608, y=1474..1489
+x=461, y=989..1006
+x=477, y=1672..1678
+y=1287, x=492..495
+y=1318, x=532..554
+x=463, y=12..30
+x=628, y=595..608
+x=560, y=778..785
+y=1624, x=472..480
+y=673, x=486..489
+x=475, y=1241..1254
+y=1479, x=472..485
+x=458, y=468..477
+y=1298, x=494..497
+x=641, y=1437..1447
+y=973, x=464..483
+y=1695, x=594..596
+x=460, y=1084..1096
+x=613, y=293..298
+x=503, y=1548..1556
+x=574, y=915..931
+y=25, x=482..501
+x=637, y=529..549
+x=441, y=1440..1453
+y=91, x=556..567
+x=432, y=1695..1711
+y=1375, x=620..644
+y=1912, x=553..556
+y=413, x=595..598
+x=584, y=1257..1281
+y=131, x=551..556
+x=493, y=573..576
+x=551, y=860..864
+x=469, y=79..91
+x=462, y=1144..1150
+x=513, y=812..814
+y=1789, x=582..607
+y=1246, x=590..592
+x=544, y=1703..1715
+y=677, x=480..496
+x=432, y=588..598
+x=566, y=556..559
+y=1926, x=511..515
+y=592, x=455..478
+x=610, y=1647..1659
+x=651, y=213..238
+y=1622, x=543..565
+x=451, y=90..104
+x=576, y=1174..1181
+y=1243, x=645..651
+x=553, y=1343..1351
+x=572, y=201..225
+x=648, y=947..970
+x=581, y=444..462
+x=459, y=36..59
+x=642, y=147..164
+x=561, y=1634..1635
+x=593, y=697..707
+x=557, y=200..225
+y=1077, x=457..461
+y=1429, x=600..626
+x=631, y=781..785
+x=565, y=1343..1351
+x=651, y=891..905
+x=445, y=1827..1843
+y=1711, x=432..460
+x=491, y=1819..1821
+x=558, y=725..730
+x=434, y=991..1012
+x=634, y=434..442
+x=452, y=527..540
+x=618, y=1479..1484
+x=644, y=621..626
+x=533, y=1526..1544
+y=831, x=490..516
+y=466, x=629..649
+y=1228, x=568..586
+x=567, y=1062..1075
+x=640, y=1747..1758
+x=579, y=777..785
+x=549, y=812..822
+y=1732, x=638..640
+y=490, x=576..594
+x=516, y=1495..1518
+x=620, y=1297..1306
+y=254, x=460..468
+x=475, y=254..268
+x=482, y=12..25
+y=1183, x=468..488
+x=587, y=666..675
+y=68, x=479..500
+x=524, y=1789..1801
+x=613, y=1046..1058
+x=580, y=567..575
+y=879, x=539..541
+x=448, y=533..537
+x=658, y=1363..1375
+y=410, x=427..438
+y=176, x=501..504
+x=491, y=783..794
+x=570, y=351..373
+y=259, x=521..547
+y=480, x=518..535
+y=633, x=605..607
+x=523, y=767..776
+y=898, x=552..556
+x=606, y=1340..1349
+x=494, y=631..646
+x=496, y=1688..1695
+y=821, x=634..642
+y=1393, x=602..605
+x=443, y=1175..1177
+x=531, y=851..861
+y=582, x=442..546
+y=864, x=551..570
+x=562, y=996..1008
+y=575, x=580..587
+x=529, y=1763..1775
+y=40, x=502..506
+y=73, x=522..529
+y=798, x=504..526
+y=628, x=513..529
+x=520, y=1657..1662
+y=1648, x=516..536
+y=1142, x=484..495
+x=492, y=302..315
+x=586, y=1176..1187
+y=512, x=516..518
+y=218, x=502..504
+y=515, x=516..518
+x=516, y=512..515
+x=444, y=690..695
+y=626, x=624..644
+x=637, y=1276..1295
+y=1370, x=592..595
+y=1860, x=609..620
+x=620, y=900..915
+x=614, y=727..735
+x=437, y=1464..1486
+y=1254, x=457..475
+y=910, x=583..585
+y=294, x=429..436
+y=398, x=481..501
+x=642, y=1768..1779
+y=1845, x=500..524
+y=1898, x=561..565
+y=712, x=571..573
+y=735, x=489..491
+y=887, x=586..589
+y=1518, x=516..521
+x=466, y=551..560
+x=472, y=1613..1624
+x=561, y=701..715
+y=33, x=599..603
+x=538, y=896..908
+x=568, y=1456..1464
+y=559, x=566..568
+x=515, y=328..356
+x=662, y=1020..1029
+x=624, y=355..377
+x=480, y=1612..1624
+y=1139, x=570..574
+y=1795, x=530..535
+x=516, y=490..500
+x=462, y=1830..1837
+x=437, y=202..223
+x=661, y=1504..1509
+x=451, y=470..481
+x=515, y=1836..1840
+x=633, y=189..191
+x=467, y=708..718
+x=528, y=900..902
+x=497, y=232..241
+x=588, y=1686..1698
+y=1306, x=620..624
+x=480, y=667..677
+x=493, y=9..21
+y=1416, x=490..515
+x=624, y=1507..1533
+x=436, y=290..294
+y=708, x=571..573
+x=462, y=601..615
+y=595, x=628..638
+y=1205, x=621..626
+x=582, y=1130..1142
+x=487, y=1000..1015
+x=651, y=1695..1703
+x=544, y=891..902
+x=459, y=165..193
+x=549, y=1897..1908
+y=1484, x=616..618
+x=556, y=1887..1912
+y=1868, x=462..480
+x=621, y=1177..1205
+x=561, y=1873..1898
+x=624, y=1475..1489
+y=1377, x=439..451
+y=943, x=429..441
+y=1553, x=610..615
+x=509, y=1048..1074
+x=483, y=915..928
+x=480, y=606..608
+x=580, y=1027..1043
+x=630, y=978..996
+x=516, y=1875..1887
+x=501, y=1190..1200
+y=377, x=624..632
+y=481, x=451..470
+y=555, x=606..610
+x=445, y=1542..1567
+x=514, y=1231..1233
+x=572, y=62..72
+y=1097, x=548..567
+x=593, y=1784..1786
+x=556, y=29..31
+x=514, y=34..44
+x=651, y=29..31
+x=601, y=1342..1352
+x=439, y=177..182
+x=522, y=853..857
+x=638, y=110..114
+y=1166, x=565..584
+x=549, y=447..457
+x=508, y=1896..1898
+x=525, y=1763..1775
+x=572, y=350..373
+x=583, y=273..301
+x=496, y=148..158
+x=427, y=690..695
+x=506, y=449..461
+x=622, y=592..612
+x=492, y=497..521
+x=554, y=962..972
+x=543, y=827..840
+y=91, x=469..487
+x=446, y=614..616
+x=477, y=453..456
+x=501, y=366..376
+y=487, x=564..568
+x=495, y=1188..1206
+x=530, y=1896..1908
+x=436, y=123..147
+x=471, y=1856..1859
+x=486, y=664..673
+y=770, x=573..583
+x=565, y=1403..1411
+x=599, y=18..33
+y=1599, x=556..577
+y=1411, x=565..567
+x=541, y=986..1012
+x=601, y=1083..1103
+y=1825, x=486..502
+y=1695, x=480..496
+x=440, y=122..147
+x=476, y=364..376
+y=409, x=449..463
+x=446, y=1143..1150
+x=536, y=1614..1619
+y=290, x=510..514
+y=600, x=454..459
+y=1837, x=562..579
+x=462, y=1851..1868
+x=544, y=278..297
+y=902, x=544..563
+x=580, y=1438..1447
+x=546, y=570..582
+x=644, y=1874..1875
+x=447, y=306..316
+x=556, y=277..297
+x=626, y=424..437
+y=806, x=549..557
+x=596, y=1693..1695
+y=936, x=444..451
+y=1156, x=486..510
+y=1567, x=445..464
+y=779, x=514..530
+x=536, y=1851..1861
+y=992, x=504..509
+x=535, y=329..356
+y=814, x=513..519
+y=210, x=604..616
+x=491, y=731..735
+x=558, y=1084..1093
+y=352, x=642..648
+x=425, y=591..601
+x=634, y=1586..1603
+x=554, y=599..608
+x=605, y=397..419
+x=514, y=267..290
+y=263, x=554..568
+x=473, y=911..937
+y=897, x=573..579
+x=595, y=1401..1409
+x=613, y=367..370
+y=1535, x=433..451
+x=573, y=767..770
+x=665, y=41..45
+y=1093, x=558..561
+x=454, y=1666..1673
+x=495, y=1662..1672
+x=566, y=220..222
+x=492, y=1268..1287
+x=534, y=808..818
+x=480, y=1852..1868
+y=282, x=590..616
+x=502, y=218..221
+y=1187, x=566..586
+x=598, y=317..343
+x=562, y=1833..1837
+x=499, y=470..481
+y=113, x=456..478
+y=1703, x=649..651
+x=454, y=598..600
+x=474, y=1058..1074
+x=498, y=434..436
+y=1680, x=481..483
+x=662, y=851..868
+y=987, x=563..565
+y=299, x=653..660
+y=1590, x=617..625
+y=608, x=476..480
+x=538, y=527..540
+y=246, x=488..504
+x=455, y=611..620
+x=490, y=345..356
+x=566, y=602..604
+y=1603, x=634..650
+x=608, y=1150..1158
+x=454, y=363..376
+y=1679, x=596..623
+x=483, y=1569..1571
+x=554, y=1309..1318
+x=660, y=146..164
+x=442, y=752..755
+x=514, y=850..861
+y=1142, x=531..553
+y=1509, x=653..661
+x=509, y=1836..1840
+x=604, y=1301..1315
+x=488, y=426..440
+x=475, y=1733..1758
+x=543, y=41..67
+x=527, y=1107..1120
+y=660, x=574..577
+x=502, y=1081..1106
+x=469, y=1428..1434
+y=564, x=488..492
+x=430, y=1435..1455
+x=547, y=919..929
+x=641, y=1560..1563
+x=480, y=646..657
+y=715, x=478..480
+x=622, y=193..215
+x=445, y=271..274
+x=612, y=1280..1292
+y=938, x=608..621
+x=526, y=1897..1898
+x=610, y=441..443
+x=610, y=666..688
+y=1887, x=516..536
+x=625, y=1287..1292
+x=512, y=1204..1207
+x=505, y=1292..1303
+y=1045, x=465..485
+x=485, y=327..334
+x=574, y=570..587
+x=463, y=394..409
+x=485, y=1460..1479
+y=457, x=549..552
+y=456, x=477..479
+x=453, y=758..770
+x=660, y=360..381
+y=1895, x=616..620
+x=530, y=93..101
+x=589, y=861..887
+x=657, y=41..45
+y=31, x=556..564
+y=1823, x=512..656
+x=542, y=381..398
+y=1897, x=616..620
+x=610, y=1922..1927
+y=675, x=635..647
+x=535, y=938..950
+x=525, y=180..188
+x=635, y=654..675
+y=356, x=515..535
+x=520, y=1525..1544
+x=469, y=1799..1801
+x=478, y=1780..1805
+x=604, y=204..210
+x=456, y=490..493
+x=504, y=1875..1898
+x=527, y=1013..1027
+x=521, y=974..996
+x=583, y=737..760
+x=598, y=410..413
+x=476, y=493..496
+x=478, y=588..592
+x=438, y=1134..1146
+x=639, y=172..182
+x=471, y=1826..1843
+x=489, y=731..735
+x=427, y=888..914
+x=490, y=215..224
+y=1287, x=644..649
+x=655, y=729..747
+x=493, y=1788..1792
+x=596, y=763..765
+y=1236, x=446..456
+x=442, y=590..601
+x=600, y=1277..1289
+y=1224, x=590..608
+x=452, y=1102..1130
+x=504, y=165..176
+x=494, y=1296..1298
+x=615, y=511..516
+x=512, y=1465..1469
+x=649, y=1280..1287
+x=656, y=1811..1823
+x=567, y=76..91
+y=111, x=502..510
+y=867, x=439..444
+x=638, y=595..608
+y=87, x=531..549
+x=484, y=278..292
+y=1364, x=501..511
+x=454, y=1848..1872
+x=607, y=821..835
+x=504, y=218..221
+y=1402, x=626..640
+x=468, y=244..254
+x=554, y=1735..1744
+y=540, x=452..538
+x=472, y=493..496
+x=434, y=1757..1760
+x=502, y=97..111
+x=630, y=1250..1254
+y=1479, x=616..618
+x=549, y=788..806
+x=522, y=198..217
+x=577, y=1539..1552
+x=639, y=206..221
+x=591, y=697..707
+x=514, y=1554..1581
+x=647, y=1325..1330
+x=597, y=192..215
+x=461, y=1058..1077
+y=1528, x=493..501
+x=503, y=191..203
+y=1348, x=431..435
+y=1898, x=477..504
+x=487, y=79..91
+y=1074, x=509..519
+x=601, y=1361..1373
+x=579, y=499..504
+x=640, y=243..265
+y=1922, x=435..438
+y=1267, x=429..448
+x=650, y=156..158
+x=449, y=1439..1453
+x=545, y=417..419
+y=521, x=492..504
+x=517, y=895..908
+y=315, x=492..510
+x=644, y=1280..1287
+y=666, x=512..516
+y=395, x=490..494
+x=433, y=1434..1455
+x=510, y=1595..1617
+x=588, y=763..765
+x=631, y=1550..1552
+x=612, y=1102..1126
+y=1635, x=542..561
+x=526, y=787..798
+x=580, y=1497..1511
+x=603, y=1709..1711
+x=471, y=947..963
+y=730, x=558..564
+x=496, y=168..180
+x=435, y=1331..1348
+y=983, x=489..501
+y=257, x=597..613
+x=617, y=1343..1352
+x=598, y=498..504
+x=580, y=78..98
+y=104, x=441..451
+x=500, y=279..292
+x=626, y=1419..1429
+x=613, y=254..257
+x=610, y=1552..1553
+y=1418, x=470..472
+x=470, y=1038..1041
+y=1375, x=652..658
+y=230, x=457..467
+x=547, y=1370..1395
+x=597, y=1324..1349
+x=504, y=235..246
+x=499, y=728..739
+y=1910, x=602..627
+y=1830, x=456..462
+x=487, y=445..459
+x=525, y=590..610
+y=238, x=651..654
+x=587, y=367..370
+y=1336, x=554..575
+y=462, x=566..581
+x=452, y=1167..1194
+y=798, x=626..643
+x=507, y=507..518
+x=554, y=1523..1525
+x=536, y=1766..1778
+x=539, y=1465..1469
+x=465, y=1329..1335
+x=516, y=1697..1722
+y=970, x=644..648
+y=739, x=483..499
+x=625, y=1584..1590
+x=631, y=1765..1774
+x=598, y=1709..1711
+y=1330, x=645..647
+y=914, x=427..455
+y=1177, x=443..445
+x=618, y=1142..1162
+x=434, y=588..598
+y=560, x=450..466
+x=621, y=921..938
+y=481, x=478..499
+x=620, y=1857..1860
+x=577, y=843..845
+x=486, y=1647..1649
+x=589, y=534..537
+x=576, y=216..223
+y=606, x=476..480
+x=500, y=1831..1845
+x=450, y=644..650
+x=490, y=1401..1416
+x=581, y=63..72
+x=547, y=543..563
+x=605, y=1386..1393
+y=1249, x=575..599
+x=518, y=632..646
+y=563, x=581..585
+y=1805, x=460..478
+x=551, y=125..131
+x=483, y=366..376
+y=1013, x=645..650
+y=1560, x=641..649
+x=664, y=1267..1295
+y=462, x=543..560
+y=221, x=502..504
+x=604, y=101..107
+y=1263, x=602..604
+x=624, y=621..626
+y=996, x=630..632
+y=1659, x=567..571
+y=851, x=606..608
+y=928, x=483..486
+y=840, x=523..543
+y=1649, x=463..486
+x=592, y=1358..1370
+y=1615, x=457..469
+y=1295, x=546..550
+x=581, y=855..868
+y=698, x=462..480
+x=594, y=864..867
+x=593, y=216..223
+x=552, y=723..727
+y=707, x=591..593
+y=1142, x=565..582
+x=496, y=127..135
+x=637, y=1197..1223
+x=608, y=839..851
+x=641, y=1703..1715
+y=745, x=506..518
+x=536, y=1205..1207
+y=1233, x=502..514
+x=447, y=1732..1758
+x=627, y=529..549
+y=1008, x=562..564
+y=1784, x=593..598
+x=496, y=407..421
+x=583, y=163..170
+x=595, y=1193..1204
+x=519, y=1049..1074
+x=509, y=971..992
+y=785, x=631..634
+x=495, y=1117..1142
+y=1563, x=641..649
+x=540, y=591..603
+x=572, y=838..849
+y=1898, x=508..526
+y=568, x=642..644
+y=1571, x=576..585
+y=1001, x=453..455
+x=448, y=1702..1704
+x=553, y=141..164
+y=559, x=647..652
+y=297, x=544..556
+x=451, y=925..936
+x=626, y=1400..1402
+x=467, y=1058..1074
+x=502, y=1230..1233
+y=376, x=454..476
+x=487, y=1354..1365
+x=537, y=1554..1581
+x=495, y=1269..1287
+y=1212, x=656..665
+x=519, y=1082..1106
+x=628, y=728..747
+x=552, y=1652..1662
+x=510, y=98..111
+x=640, y=1730..1732
+y=1035, x=539..558
+x=616, y=1479..1484
+x=472, y=1460..1479
+x=626, y=771..798
+x=520, y=1395..1401
+y=163, x=533..540
+y=931, x=574..578
+y=1455, x=430..433
+x=552, y=674..689
+x=579, y=1832..1837
+x=467, y=208..230
+x=650, y=1587..1603
+x=464, y=969..973
+x=565, y=1129..1142
+x=660, y=294..299
+y=180, x=496..513
+x=622, y=1566..1572
+y=1556, x=491..503
+y=516, x=612..615
+y=1006, x=445..461
+x=574, y=404..411
+x=485, y=787..789
+x=548, y=1086..1097
+x=538, y=7..25
+x=504, y=971..992
+x=517, y=9..17
+x=615, y=803..805
+x=570, y=998..1012
+x=519, y=767..776
+x=571, y=708..712
+y=1295, x=637..655
+y=215, x=597..622
+x=569, y=737..760
+y=1779, x=626..642
+x=549, y=81..87
+y=135, x=496..514
+x=644, y=848..865
+x=543, y=417..419
+x=551, y=591..603
+y=939, x=585..591
+x=498, y=947..963
+x=568, y=1214..1228
+x=588, y=1477..1489
+x=586, y=1196..1207
+x=514, y=749..761
+x=455, y=548..557
+y=1162, x=576..578
+x=481, y=1326..1345
+y=1069, x=575..577
+x=573, y=1777..1803
+x=483, y=1490..1502
+x=595, y=410..413
+x=636, y=1463..1485
+y=1001, x=641..655
+x=486, y=1189..1206
+x=488, y=190..203
+x=493, y=1883..1887
+x=560, y=1539..1552
+x=455, y=992..1001
+x=564, y=482..487
+y=1292, x=593..612
+y=587, x=559..574
+x=436, y=37..59
+x=549, y=872..885
+x=456, y=177..182
+y=991, x=552..572
+y=812, x=513..519
+x=469, y=1338..1346
+x=500, y=1570..1571
+x=518, y=721..745
+y=1821, x=491..493
+x=429, y=1239..1267
+x=430, y=749..766
+x=470, y=471..481
+x=532, y=491..500
+x=612, y=1796..1805
+x=478, y=1103..1130
+x=478, y=471..481
+x=647, y=931..939
+y=983, x=601..622
+x=628, y=1565..1572
+x=631, y=1197..1223
+y=1489, x=570..588
+x=460, y=926..934
+x=542, y=112..113
+x=444, y=482..503
+x=557, y=789..806
+x=446, y=12..30
+x=635, y=1557..1567
+x=660, y=1197..1200
+x=565, y=977..987
+y=549, x=627..637
+x=654, y=213..238
+y=504, x=579..598
+x=565, y=1627..1640
+y=885, x=531..549
+x=474, y=683..695
+x=531, y=380..398
+x=445, y=1175..1177
+y=1455, x=548..550
+y=1235, x=536..556
+x=627, y=1249..1254
+x=595, y=1358..1370
+x=459, y=598..600
+x=496, y=910..937
+x=580, y=1108..1120
+y=1840, x=509..515
+x=499, y=324..337
+x=575, y=1893..1914
+x=593, y=1892..1914
+x=599, y=1239..1249
+x=520, y=1137..1145
+y=343, x=598..617
+x=575, y=1238..1249
+y=947, x=553..555
+x=568, y=482..487
+x=556, y=1224..1235
+y=241, x=495..497
+x=454, y=124..138
+x=550, y=1438..1455
+x=645, y=1004..1013
+y=1722, x=514..516
+x=486, y=915..928
+y=768, x=547..561
+x=499, y=1789..1792
+x=531, y=871..885
+y=1805, x=606..612
+x=437, y=1757..1760
+y=1158, x=599..608
+x=480, y=713..715
+x=541, y=1396..1401
+x=441, y=89..104
+y=493, x=456..461
+x=648, y=359..381
+x=552, y=1043..1053
+x=634, y=1318..1335
+y=1345, x=476..481
+x=620, y=1895..1897
+y=223, x=437..442
+x=432, y=271..274
+x=429, y=1463..1486
+x=579, y=884..897
+x=577, y=1585..1599
+y=141, x=610..633
+y=1075, x=567..583
+y=1270, x=518..528
+x=572, y=980..991
+y=35, x=551..572
+x=656, y=1205..1212
+y=1914, x=575..593
+x=441, y=1516..1531
+y=1801, x=524..550
+x=439, y=614..616
+y=604, x=566..572
+y=222, x=563..566
+x=531, y=674..689
+y=1281, x=559..584
+x=590, y=1222..1224
+x=633, y=120..141
+x=451, y=1365..1377
+x=595, y=534..537
+y=219, x=625..635
+y=1413, x=588..608
+x=470, y=445..459
+y=615, x=462..486
+y=1659, x=610..632
+x=585, y=950..974
+x=603, y=1583..1596
+y=747, x=628..655
+y=1519, x=472..490
+x=643, y=771..798
+x=578, y=914..931
+y=1678, x=461..477
+x=498, y=1531..1542
+y=101, x=627..641
+x=667, y=1918..1931
+x=455, y=587..592
+x=632, y=979..996
+y=1331, x=603..625
+x=519, y=792..794
+y=1223, x=631..637
+x=560, y=1458..1470
+y=1511, x=556..580
+x=610, y=998..1020
+x=441, y=532..537
+y=608, x=628..638
+y=158, x=650..653
+x=568, y=253..263
+y=608, x=554..578
+x=488, y=552..564
+y=1778, x=520..536
+x=430, y=610..620
+x=493, y=1532..1542
+x=497, y=1743..1749
+y=223, x=576..593
+x=500, y=878..881
+x=512, y=427..440
+y=822, x=549..557
+x=551, y=181..188
+y=1640, x=565..618
+x=432, y=1788..1792
+y=437, x=623..626
+x=608, y=1403..1413
+y=1786, x=593..598
+y=1289, x=600..602
+x=477, y=1590..1599
+x=467, y=628..637
+x=513, y=627..628
+y=164, x=553..565
+x=658, y=1400..1420
+x=438, y=645..650
+x=554, y=1422..1437
+x=514, y=1696..1722
+x=492, y=553..564
+x=632, y=1136..1146
+x=648, y=1679..1691
+x=472, y=1412..1418
+y=421, x=479..496
+x=444, y=1745..1773
+x=454, y=645..657
+x=479, y=1000..1015
+x=493, y=1819..1821
+x=490, y=382..395
+x=472, y=683..695
+x=543, y=1609..1622
+x=616, y=1895..1897
+y=881, x=500..515
+y=557, x=455..459
+x=657, y=1656..1671
+y=356, x=468..490
+x=584, y=1028..1043
+y=537, x=589..595
+x=580, y=702..715
+y=657, x=454..480
+x=642, y=810..821
+x=572, y=602..604
+x=474, y=1038..1041
+x=655, y=985..1001
+x=563, y=890..902
+y=107, x=604..614
+x=571, y=1654..1659
+x=609, y=947..963
+x=526, y=488..495
+x=612, y=511..516
+x=466, y=925..934
+x=575, y=542..563
+x=456, y=1224..1236
+y=1927, x=559..610
+y=1124, x=428..447
+x=641, y=899..902
+x=490, y=824..831
+x=600, y=1302..1315
+x=616, y=172..182
+y=527, x=565..567
+y=1596, x=581..603
+y=21, x=491..493
+x=566, y=443..462
+y=1792, x=493..499
+x=607, y=493..521
+y=381, x=648..660
+x=545, y=1519..1530
+y=67, x=535..543
+x=506, y=37..40
+x=529, y=626..628
+y=1043, x=580..584
+x=464, y=784..794
+x=500, y=54..68
+y=934, x=460..466
+y=477, x=458..464
+x=550, y=1789..1801
+x=460, y=245..254
+y=274, x=432..445
+y=204, x=604..616
+x=591, y=919..939
+x=438, y=1915..1922
+x=592, y=1563..1574
+y=1623, x=592..602
+x=445, y=989..1006
+y=1150, x=446..462
+x=567, y=501..527
+x=474, y=125..138
+x=501, y=11..25
+y=1396, x=590..612
+x=652, y=1463..1485
+x=478, y=102..113
+x=479, y=408..421
+x=578, y=1151..1162
+x=461, y=122..135
+x=640, y=111..114
+x=461, y=1671..1678
+x=489, y=1654..1677
+y=135, x=461..466
+x=536, y=1225..1235
+x=579, y=843..845
+y=170, x=583..598
+x=524, y=1832..1845
+x=501, y=165..176
+x=457, y=1059..1077
+x=466, y=122..135
+x=652, y=1442..1456
+x=565, y=500..527
+y=1792, x=530..535
+y=1295, x=659..664
+x=427, y=386..410
+y=31, x=648..651
+x=509, y=597..601
+x=585, y=1324..1349
+x=623, y=1668..1679
+x=435, y=1849..1872
+x=445, y=147..158
+y=1544, x=520..533
+x=592, y=1243..1246
+x=556, y=1585..1599
+x=624, y=947..963
+y=781, x=631..634
+x=626, y=1654..1656
+x=527, y=973..996
+x=442, y=1340..1350
+y=1662, x=520..530
+x=602, y=1260..1263
+x=606, y=1796..1805
+x=633, y=890..905
+x=494, y=35..44
+x=456, y=1788..1792
+x=498, y=255..268
+y=1656, x=624..626
+y=1162, x=593..618
+x=510, y=1154..1156
+x=633, y=1258..1268
+x=547, y=765..768
+y=217, x=522..547
+x=444, y=926..936
+x=581, y=1582..1596
+x=593, y=1193..1204
+x=471, y=1799..1801
+x=483, y=1589..1599
+y=849, x=572..590
+y=1837, x=456..462
+x=496, y=666..677
+x=458, y=753..755
+x=468, y=345..356
+x=511, y=214..224
+x=444, y=853..867
+y=1469, x=512..539
+x=523, y=589..610
+y=761, x=475..514
+x=439, y=326..335
+x=597, y=255..257
+x=579, y=1212..1222
+x=426, y=954..975
+x=489, y=1293..1303
+x=615, y=1551..1553
+x=582, y=1541..1543
+x=650, y=1656..1671
+x=575, y=1324..1336
+x=568, y=1519..1530
+y=147, x=436..440
+x=638, y=189..191
+x=627, y=77..101
+x=518, y=512..515
+x=515, y=1400..1416
+y=684, x=657..661
+y=1654, x=567..571
+y=1856, x=471..473
+y=1875, x=631..644
+x=494, y=382..395
+x=524, y=853..857
+x=645, y=1478..1480
+x=552, y=447..457
+y=612, x=622..649
+x=645, y=169..193
+x=462, y=1354..1365
+y=1555, x=589..606
+x=428, y=1746..1773
+x=590, y=1383..1396
+x=647, y=552..559
+y=503, x=444..446
+y=25, x=523..538
+y=1672, x=495..498
+y=794, x=511..519
+x=663, y=1557..1567
+y=1012, x=425..434
+x=495, y=232..241
+x=478, y=713..715
+x=484, y=861..887
+y=1464, x=568..571
+x=655, y=1319..1335
+y=1373, x=584..601
+y=576, x=493..532
+x=574, y=1127..1139
+y=1456, x=652..665
+x=455, y=888..914
+y=1859, x=471..473
+x=649, y=461..466
+x=579, y=1174..1181
+y=1425, x=445..452
+y=1194, x=437..452
+x=556, y=124..131
+y=496, x=472..476
+y=718, x=467..489
+x=652, y=1363..1375
+x=627, y=1884..1910
+y=794, x=464..491
+y=1437, x=554..561
+x=550, y=999..1012
+x=578, y=598..608
+x=446, y=481..503
+x=581, y=558..563
+x=481, y=384..398
+x=559, y=1256..1281
+y=937, x=473..496
+x=585, y=1568..1571
+x=465, y=758..770
+y=867, x=594..610
+y=805, x=599..615
+y=1395, x=547..575
+x=511, y=792..794
+y=675, x=568..587
+y=1207, x=512..536
+y=845, x=577..579
+x=470, y=860..887
+x=481, y=1675..1680
+x=642, y=553..568
+y=974, x=585..599
+x=479, y=55..68
+x=583, y=768..770
+x=518, y=387..415
+x=443, y=1020..1047
+x=480, y=686..698
+x=616, y=620..638
+x=592, y=1602..1623
+x=612, y=1300..1312
+x=550, y=1273..1295
+y=461, x=506..525
+y=316, x=447..475
+x=638, y=1730..1732
+x=634, y=781..785
+x=521, y=1496..1518
+x=563, y=977..987
+y=1496, x=440..465
+x=510, y=266..290
+x=519, y=812..814
+x=497, y=1595..1618
+x=438, y=387..410
+x=448, y=436..446
+x=658, y=224..247
+x=455, y=1021..1047
+y=459, x=470..487
+x=479, y=453..456
+x=443, y=833..840
+x=528, y=1614..1619
+x=448, y=1240..1267
+x=542, y=1230..1232
+x=632, y=354..377
+x=511, y=1743..1749
+y=1027, x=513..527
+y=963, x=471..498
+x=464, y=468..477
+y=939, x=647..664
+x=433, y=1510..1535
+x=511, y=1346..1364
+x=553, y=1886..1912
+x=602, y=441..443
+x=551, y=26..35
+y=376, x=483..501
+y=1698, x=588..602
+x=640, y=1400..1402
+x=536, y=414..424
+x=506, y=722..745
+x=502, y=1809..1825
+y=1691, x=648..654
+x=449, y=395..409
+x=643, y=1478..1480
+x=600, y=1418..1429
+x=502, y=37..40
+y=908, x=517..538
+y=1074, x=467..474
+y=1662, x=552..578
+x=514, y=1596..1617
+y=441, x=651..663
+x=445, y=1411..1425
+y=894, x=552..556
+y=1058, x=613..628
+x=645, y=1325..1330
+y=1568, x=576..585
+y=370, x=587..613
+x=515, y=878..881
+x=442, y=203..223
+x=435, y=1914..1922
+y=1420, x=658..664
+x=530, y=1792..1795
+y=443, x=602..610
+x=598, y=1784..1786
+x=607, y=625..633
+x=537, y=1653..1665
+x=524, y=900..902
+x=561, y=1084..1093
+x=468, y=1175..1183
+y=766, x=430..436
+x=645, y=1891..1908
+x=663, y=416..441
+x=425, y=992..1012
+x=457, y=1608..1615
+y=1349, x=585..597
+y=1760, x=434..437
+y=1200, x=656..660
+x=513, y=1013..1027
+y=688, x=610..614
+x=523, y=828..840
+y=59, x=436..459
+y=715, x=561..580
+x=570, y=1127..1139
+x=585, y=998..1020
+x=501, y=385..398
+x=590, y=1243..1246
+x=536, y=1747..1758
+y=835, x=607..626
+y=424, x=536..552
+x=622, y=980..983
+x=604, y=1260..1263
+x=648, y=343..352
+x=645, y=435..442
+x=536, y=1640..1648
+y=770, x=453..465
+x=552, y=894..898
+x=606, y=839..851
+y=1736, x=631..651
+x=564, y=29..31
+y=1434, x=469..490
+x=521, y=242..259
+y=114, x=638..640
+y=765, x=588..596
+x=577, y=647..660
+x=606, y=1552..1555
+x=653, y=1505..1509
+y=1617, x=510..514
+y=499, x=467..487
+y=915, x=607..620
+y=1908, x=637..645
+x=463, y=1646..1649
+x=483, y=1674..1680
+y=1677, x=489..504
+y=373, x=570..572
+x=624, y=1654..1656
+x=453, y=1897..1912
+x=585, y=919..939
+x=626, y=1177..1205
+x=529, y=61..73
+x=531, y=1125..1142
+x=450, y=550..560
+y=1012, x=550..570
+x=583, y=906..910
+x=592, y=1869..1875
+y=865, x=630..644
+x=490, y=1428..1434
+x=582, y=1773..1789
+x=655, y=1258..1268
+x=608, y=1223..1224
+x=558, y=1023..1035
+x=486, y=601..615
+x=635, y=201..219
+x=659, y=1267..1295
+x=576, y=1568..1571
+y=1704, x=448..453
+x=503, y=434..436
+y=72, x=572..581
+x=657, y=663..684
+x=665, y=1443..1456
+x=453, y=1702..1704
+x=580, y=1459..1470
+x=588, y=1404..1413
+x=524, y=1854..1867
+y=905, x=633..651
+x=567, y=1044..1053
+x=499, y=701..713
+y=601, x=425..442
+y=1883, x=493..496
+x=492, y=276..289
+y=193, x=645..664
+y=442, x=634..645
+x=610, y=121..141
+x=570, y=1478..1489
+x=427, y=1133..1146
+x=652, y=257..270
+y=1126, x=612..634
+x=568, y=667..675
+x=559, y=403..411
+y=224, x=490..511
+y=537, x=441..448
+x=642, y=343..352
+y=518, x=507..529
+x=561, y=765..768
+x=586, y=862..887
+x=614, y=102..107
+x=451, y=1083..1096
+x=533, y=144..163
+x=522, y=488..495
+x=557, y=322..345
+y=1775, x=525..529
+x=585, y=906..910
+x=644, y=899..902
+y=610, x=523..525
+x=476, y=606..608
+y=1041, x=470..474
+y=603, x=540..551
+y=1574, x=569..592
+x=594, y=476..490
+y=1254, x=627..630
+x=610, y=1340..1349
+x=510, y=301..315
+x=535, y=40..67
+x=485, y=1023..1045
+x=644, y=948..970
+x=459, y=548..557
+y=1409, x=595..599
+y=1665, x=515..537
+x=653, y=156..158
+y=247, x=658..662
+x=483, y=728..739
+y=861, x=514..531
+y=1801, x=469..471
+y=17, x=509..517
+y=818, x=494..534
+x=610, y=1257..1268
+y=1489, x=608..624
+x=649, y=1560..1563
+y=950, x=535..561
+y=713, x=499..511
+y=301, x=570..583
+x=463, y=816..842
+x=573, y=961..972
+y=335, x=439..453
+x=496, y=1883..1887
+x=556, y=1523..1525
+x=515, y=1904..1926
+x=656, y=1197..1200
+x=456, y=103..113
+x=617, y=1583..1590
+y=1543, x=582..603
+x=570, y=274..301
+x=460, y=1696..1711
+y=1758, x=536..640
+x=437, y=435..446
+x=465, y=1479..1496
+y=1020, x=585..610
+x=641, y=77..101
+y=929, x=527..547
+x=618, y=1627..1640
+y=601, x=496..509
+x=651, y=1217..1243
+x=494, y=276..289
+x=656, y=1021..1029
+x=616, y=266..282
+x=619, y=1324..1326
+y=616, x=439..446
+x=514, y=770..779
+x=616, y=1324..1326
+y=899, x=641..644
+y=1103, x=591..601
+y=1710, x=659..663
+x=542, y=1853..1867
+x=488, y=234..246
+y=1352, x=601..617
+x=523, y=6..25
+x=630, y=1231..1233
+x=444, y=1339..1350
+y=975, x=426..434
+x=438, y=1412..1430
+x=546, y=1272..1295
+y=1530, x=545..568
+x=590, y=266..282
+y=868, x=656..662
+x=603, y=1320..1331
+x=457, y=1241..1254
+x=498, y=1662..1672
+x=573, y=856..868
+x=634, y=494..521
+x=552, y=979..991
+x=532, y=573..576
+x=428, y=1412..1430
+y=158, x=445..496
+x=644, y=1347..1375
+y=182, x=616..639
+x=491, y=9..21
+x=532, y=1309..1318
+x=442, y=1896..1912
+x=520, y=1765..1778
+x=497, y=1296..1298
+y=1233, x=620..630
+y=1296, x=494..497
+y=1447, x=580..641
+x=659, y=1709..1710
+x=615, y=1507..1533
+x=564, y=726..730
+x=462, y=685..698
+x=640, y=1075..1093
+x=632, y=1647..1659
+x=576, y=476..490
+x=482, y=327..334
+x=559, y=569..587
+y=345, x=557..580
+x=656, y=851..868
+x=456, y=1830..1837
+x=607, y=1773..1789
+y=755, x=442..458
+y=101, x=530..550
+x=561, y=939..950
+y=1744, x=554..575
+y=1567, x=635..663
+x=556, y=894..898
+y=1525, x=554..556
+x=655, y=1076..1093
+y=1618, x=490..497
+x=442, y=571..582
+x=649, y=1694..1703
+y=1453, x=441..449
+y=1575, x=527..530
+y=1843, x=445..471
+x=512, y=1811..1823
+y=650, x=438..450
+x=434, y=954..975
+x=662, y=223..247
+x=472, y=1511..1519
+x=568, y=556..559
+x=453, y=992..1001
+y=398, x=531..542
+x=619, y=1550..1552
+x=561, y=1421..1437
+y=337, x=477..499
+y=44, x=494..514
+x=457, y=208..230
+x=511, y=701..713
+x=620, y=1232..1233
+y=1146, x=632..646
+y=1872, x=435..454
+x=451, y=834..840
+x=565, y=142..164
+y=419, x=543..545
+y=1875, x=569..592
+y=1552, x=619..631
+x=490, y=1595..1618
+x=578, y=1777..1803
+x=543, y=434..462
+y=113, x=515..542
+y=1350, x=442..444
+y=963, x=609..624
+x=587, y=398..419
+y=1572, x=527..530
+x=501, y=966..983
+x=563, y=220..222
+x=566, y=1177..1187
+x=429, y=289..294
+y=972, x=554..573
+x=554, y=1323..1336
+x=584, y=1360..1373
+y=419, x=587..605
+x=565, y=1610..1622
+x=486, y=1810..1825
+y=1571, x=483..500
+y=30, x=446..463
+x=512, y=656..666
+y=1599, x=477..483
+x=530, y=1657..1662
+y=138, x=454..474
+y=1773, x=428..444
+y=1619, x=528..536
+x=486, y=1154..1156
+x=550, y=92..101
+y=1581, x=514..537
+y=440, x=488..512
+x=634, y=809..821
+x=599, y=1401..1409
+y=1222, x=576..579
+x=552, y=413..424
+y=265, x=619..640
+x=599, y=951..974
+x=504, y=496..521
+x=532, y=985..1012
+x=508, y=1189..1200
+y=188, x=525..551
+y=727, x=542..552
+x=631, y=1873..1875
+y=638, x=599..616
+x=556, y=1498..1511
+y=1292, x=620..625
+x=513, y=167..180
+y=1912, x=442..453
+x=531, y=82..87
+x=589, y=651..652
+x=637, y=1892..1908
+x=560, y=435..462
+y=411, x=559..574
+y=416, x=487..490
+y=1542, x=493..498
+x=602, y=1195..1207
+x=573, y=708..712
+x=575, y=1370..1395
+y=1480, x=643..645
+x=489, y=664..673
+x=428, y=1116..1124
+x=651, y=1152..1170
+x=625, y=1319..1331
+y=45, x=657..665
+x=453, y=325..335
+y=760, x=569..583
+x=628, y=1047..1058
+x=530, y=769..779
+y=842, x=455..463
+x=596, y=1669..1679
+x=571, y=1456..1464
+x=448, y=1667..1673
+x=648, y=29..31
+y=868, x=573..581
+y=1207, x=586..602
+y=1758, x=447..475
+x=444, y=1516..1531
+y=1303, x=489..505
+x=567, y=1404..1411
+y=689, x=531..552
+y=182, x=439..456
+x=570, y=861..864
+y=1012, x=532..541
+x=608, y=920..938
+y=563, x=547..575
+x=525, y=450..461
+y=1232, x=542..546
+x=539, y=1023..1035
+x=480, y=1689..1695
+y=191, x=633..638
+x=548, y=1437..1455
+y=1243, x=590..592
+x=431, y=1330..1348
+y=1053, x=552..567
+x=594, y=1693..1695
+x=479, y=787..789
+x=567, y=1654..1659
+y=902, x=524..528
+y=98, x=577..580
+x=554, y=253..263
+x=609, y=1856..1860
+y=203, x=488..503
+x=527, y=918..929
+x=607, y=901..915
+x=511, y=1905..1926
+y=436, x=498..503
+x=446, y=1224..1236
+x=580, y=131..142
+x=663, y=1708..1710
+x=512, y=1138..1145
+x=529, y=508..518
+y=298, x=605..613
+y=1867, x=524..542
diff --git a/2018/inputs/18.txt b/2018/inputs/18.txt
new file mode 100644
index 0000000..9e354bc
--- /dev/null
+++ b/2018/inputs/18.txt
@@ -0,0 +1,50 @@
+#.#.|..#|.||.#...|...#.|.......##|##..#..||.||....
+#.......#.....|##..#|..#.##..##|.|.#..|.#...|....#
+.|..........#.|..|.....|..|#.#...##|#|.|#|##|...#|
+#|....#|##..#|.|||.#.|.#...#.##.......#||..#......
+.#|....|.|..#..||...#||...|......###.#.#...##..#..
+..||#...|.#.|||||.....|.......##...#.#....|..#....
+###|..##...|.#|..|.#|#...|.#.|....||.|...#|.|#...#
+|.#.|#.#.|###.|..#..|....#....#|.#..||.||.....#..#
+.#..|.#..#|##..|.....|.#.|.#.#|.......#..|...#..|.
+...|||##...|..#.#|#|..#.#..#|.|.|#..##........##.#
+|#.#..||....|...|#..|....|#|...#.#.#.##|.|.#......
+|..|...|.|#.........|..#|...|.#.|##....|..|..|#.||
+|....#..||..|...#|......|||||.|#....||....|.#|.#..
+......#||.#.#.||..|.......|....||#||#.|.#.|.##||#|
+.##.#....##.#.|....|...###..#...|.#....|.#...|..##
+.##..#|#.#.##.||..|.#|..|.|.##|....|...#||||.|..#.
+|.|..|#|....|.#.#..||.....|.....##....||....|.||..
+#|.|.##...||...........|..#.||.|.#..##..|#||......
+||..||.||..#.##.#...|.#|.....|###....#.....#...|..
+|.#.##|.|...||#.#...||....|.|#..|.#....##........#
+..|....|.#.##|....|||#....#.|.|.##....|##|.|#.....
+.|.....#|.#....|###|..#|||........||#.#..||..|..#.
+#..#...|#|.#...|.||##..#.|..|.|.#.|..#.#.|.....#.#
+|#||.##..#..|||.......#|..#...#..##....#||.#|.....
+.|.#.....|..#...#...##...|.#...|.#|.......|..#...|
+.||.......|..##..##.#|.|..|...#.|.#..#.|....#.|#.|
+....#..#|##|....#..|.#..|||..#....#.#|...||.#..|..
+#......#|.##..|..|....|.##.#|...#..#.|..|..|..|##.
+...|||.#|#.#.|..|||.#.#.#...||...||..##..#.....|..
+..#..|.|#.#..|..##|..#....#.|..|.......|||#.|.|.|#
+.##|..#...#..||..|.........|#.|#.....|...##.|..||#
+#.....||....#.....|#.||......|.#|.#|....||.||.#.#.
+#..|#..|......|.#.#.#.##..||.|.#.|......#|#||#.|.#
+..||..||.....|.#..###.#.|#..|.......|....#||.|..#.
+.#...###|#|#|||...|...#.#|.#|..|...#..#.|#|.#...|.
+...|..#||....##|..#...#....#||#.......|....#.|###.
+..#....|#..#|.....|.#|..#..|#....||......|.|.#.|#.
+..|##....#.|..#..#.|.#..||....#...|.....|..#.....|
+.......#||..#||...|.#.|#...#....|.|.||.#.|...#.##|
+.|.|||.....#............#..#..|..|..#.|.#..|......
+|...|.|####..#.....#..#..|#|#..#..|......|...|.#|#
+|.|...#..#..|....|.....#|#||..#.||..|#|..|||.|.|.|
+..#...|#.......||.#.#.#....#.........##|.|..#.##||
+#|#..|..|#|.##.|.|#......||......|.....#||###.|###
+....#..#.|..|...#|#|..|#..|.#|....||#|.||.|#|.....
+|..#.|..#.|#......#...#|.#|#|.....|#...###....##..
+...##..#..|..#..#.#...|.#..#|...|#.##|.#|..##..#.#
+|.|.|...#.|..##.|.|....|..#..|...|..##|...|..|....
+.#|..|..|..|.|..#...|.||#...#......||.#.#.........
+.#.##..|............|.||.....#||..|##.|..|.....#.|
diff --git a/2018/inputs/19.txt b/2018/inputs/19.txt
new file mode 100644
index 0000000..1207b7b
--- /dev/null
+++ b/2018/inputs/19.txt
@@ -0,0 +1,37 @@
+#ip 4
+addi 4 16 4
+seti 1 7 2
+seti 1 1 5
+mulr 2 5 3
+eqrr 3 1 3
+addr 3 4 4
+addi 4 1 4
+addr 2 0 0
+addi 5 1 5
+gtrr 5 1 3
+addr 4 3 4
+seti 2 7 4
+addi 2 1 2
+gtrr 2 1 3
+addr 3 4 4
+seti 1 3 4
+mulr 4 4 4
+addi 1 2 1
+mulr 1 1 1
+mulr 4 1 1
+muli 1 11 1
+addi 3 3 3
+mulr 3 4 3
+addi 3 9 3
+addr 1 3 1
+addr 4 0 4
+seti 0 1 4
+setr 4 9 3
+mulr 3 4 3
+addr 4 3 3
+mulr 4 3 3
+muli 3 14 3
+mulr 3 4 3
+addr 1 3 1
+seti 0 6 0
+seti 0 7 4
diff --git a/2018/inputs/2.txt b/2018/inputs/2.txt
new file mode 100644
index 0000000..1edb865
--- /dev/null
+++ b/2018/inputs/2.txt
@@ -0,0 +1,250 @@
+krdmtuqjmwfoevnadixyclzspv
+yrdmtuqjiwfoevnabfxyclzsph
+kqjvtuqjgwfoevnabixyclzsph
+krdmtuqjgwjoevnaolxyclzsph
+krdmtnqjgwfoevnabiiyxlzsph
+lrymtuqjgwhoevnabixyclzsph
+krdmguqjgwfoevnabixkclzsah
+krdmtuqjgwfoevnibinyclzdph
+krdmtucjgwfoevnabhxyclzspv
+krdmtuqjgwfoevtabixyulzsuh
+krdmtuqqgwfoevnabixdblzsph
+krdmtuqjawfsevnabiyyclzsph
+krdmtuqjgwfoevnabzxccldsph
+krdmtcqegwfhevnabixyclzsph
+krdmtuqjgwforvnaxixycgzsph
+krdmtuqjgwfoqvnaxixyclzskh
+krdmtutjgwfoevyajixyclzsph
+krdmtuqmgwfoevnabixycxzspc
+krdptuqjgwhoevkabixyclzsph
+krdttuqjhwfoevnabixyclzspa
+krdmtuqjgwfoevnabibyhnzsph
+krdmtuqjywfoevntbidyclzsph
+krdmtojdgwfoevnabixyclzsph
+krdmtuqjgpfuevnauixyclzsph
+krdmtoqjgwfrevjabixyclzsph
+krdmtuqjgwfoyvndbixyclzyph
+krdmtxqjgwfomvnayixyclzsph
+crdmtuqjgwfoevnabixyoxzsph
+krdmtpqjgwfdevnabixycqzsph
+krdmtuqjgwfoevuabfxsclzsph
+krdmtuqjgwfoevnybixycdzskh
+krdmtusjgwfoevnabixxclzdph
+krdmtuqjgwfoevnaboxyglzjph
+zrdmtuqjgrfoevnalixyclzsph
+krdmtuqjclfoevnabixyclzsih
+kqdmtlqjgwfoevnabtxyclzsph
+krdmtuqggwpoevnabixyclzlph
+krdmtuqjgwfobwnrbixyclzsph
+krdmtuqjgwfoevwabkxycnzsph
+kldmtuqjgwfogvyabixyclzsph
+krdmtuqvgwfoevnabixtcrzsph
+krdmtuqjgwroevnabixyrlzspw
+krdmtuqjgjfoevnabixyelzrph
+krdmtuqjgffoevnaaixyclzspa
+krdmtuqjgwfoevxabifywlzsph
+krdmtuqjgwfoevlabixycrzsrh
+krdmtuqjgwfpevnabixocqzsph
+krdmtuqjgwfoevdabixycnhsph
+krdmtmqjgwfoevnajixyclvsph
+krdmtuqjjvfoevnabgxyclzsph
+krzmtuqjgwfoevnabioyckzsph
+kodmtwqjgwfoevnabieyclzsph
+ehdmthqjgwfoevnabixyclzsph
+krdmtuqjxwioevnabixyclbsph
+grdmkutjgwfoevnabixyclzsph
+krdutuqjgwfoebnabixaclzsph
+krdmtuqjgwfoebnabixyclcjph
+krdmteqjgwfoevnlbixycizsph
+krdmtegjgwhoevnabixyclzsph
+krdmtuqjgwfdrvnabixbclzsph
+krdmtuqjgyfoevidbixyclzsph
+krdmtubjawfoevnabixyclzuph
+krdmtuqjgwfoavjabixyclzssh
+krdmtuqjgwfoeonabixyclzsvo
+vrdmtuqjgwffevnabixpclzsph
+krdmtuqonwfoevnabixycfzsph
+krdmtumjgwfpevnubixyclzsph
+krdmtutjgwfoevnaciyyclzsph
+krdrtuqjgwfoevnwbixyglzsph
+krdmtuqjgwfoevbabixyclesdh
+krdmtuqcgwfoevnabixyqdzsph
+krdmtuqjgwfogvnabrxycezsph
+krdmujqkgwfoevnabixyclzsph
+krdmtuqjgtooevnabixyclzzph
+jrdntuqjgwfoevnabixyclrsph
+krdmtuqjgzfoevkebixyclzsph
+krdmtuqjgwfosvnaeixyclztph
+krdmtuqjgwfoevzabixydlzaph
+krdmtuqzgwfoavnabiqyclzsph
+krdmtuqvgwfoevnabixycwzspv
+krdmvuqjgwteevnabixyclzsph
+krdmtujjgwfoevgybixyclzsph
+kydmtuqjgwfoeunacixyclzsph
+krdmtuqjgifoqvnabicyclzsph
+krnltiqjgwfoevnabixyclzsph
+krdmtuqjgwfoevnabhxyclzsgi
+kfdmtuqjnwfowvnabixyclzsph
+kmdmtuljgwfoevnabixycvzsph
+krdmtxqjgwaoevvabixyclzsph
+kramduqjgwfoevnabixyclzwph
+krdutuqjgwfoennabixyclziph
+krdmvuqfgwfoevnacixyclzsph
+krdmtuqogwfoevnabmvyclzsph
+krdmfuqjgwfoyvnabixyclzseh
+krdmtuqjgweoelnabixyclzspd
+krdmtumjgwfoevnabixyclzypo
+krdmtuqjgkfoevhabixyclzsqh
+kjdmtuqjgwfoevgabixyclzsah
+krdmtuqjgwfoevnlbixyclzsbw
+mrdmtxqjgwfoevnabgxyclzsph
+krdmtuqpgwfoevnhbixycltsph
+krdmtuqjgwfmqvnabixyclzslh
+krqmtuqogwfoevnaqixyclzsph
+krdmtusjggfoevnabicyclzsph
+krcmtuljgwfoevlabixyclzsph
+krdmtuojgwfoeknabixyclzsrh
+krdmtuqjtwfoevnabiypclzsph
+krvmtupjgwfoevnabixycldsph
+krdmtuxjgwfoevaabxxyclzsph
+krdmtvqlgwfoehnabixyclzsph
+wrdmtuqjgwfoevnabixyclzdpy
+krdatuqlgwfoevnabixyclzsjh
+krdmtuqjgwfoevpabkxyclzsjh
+krdmtuqjgwqvsvnabixyclzsph
+krdmtwqjgwfoevnobixyclzspm
+krdmtuqjgssoevnabixyclgsph
+krdmtuqjgwfoevnafixyclzbpp
+krdmtuqjowfoevxabiuyclzsph
+krdmtuqrgwfoevntbixyclzspu
+krdmtucjgwfoevnabixcnlzsph
+krddtuojgwfoevnabixyclzzph
+krdmtuqjgwuoevnabiqycldsph
+kpdmpuqjgwfoevnabixyclzslh
+krdmtuqjgwfoewnabixyzxzsph
+krdmtuejswfoevhabixyclzsph
+krdmtuqggwfoevntbikyclzsph
+krdmtuqjgwfoevnabixydlhnph
+krdmtcqjglfoevnaxixyclzsph
+krumyuqjgwfoevnrbixyclzsph
+kgdmmuqjgwooevnabixyclzsph
+krdmteqjgwfqevwabixyclzsph
+krdmfuqjgwfpevnabixyclzspq
+erdmtycjgwfoevnabixyclzsph
+krdmcuqjgwfoevnabixjglzsph
+krdmtuqjgtfoeunabixiclzsph
+krdmtuqjgwfoevmqbixyclzspu
+krlmtuqjvwfoevnabikyclzsph
+krdotuqjgwfoevnagrxyclzsph
+krdmtuqbgwfoefnabixyclasph
+kwdmtuqjgwfosjnabixyclzsph
+kydmtuqjgwfoevcabixycezsph
+crdmtuqjgwloevnabixkclzsph
+krimtuqhgwfoevnbbixyclzsph
+krdmjuqagwfoevnabicyclzsph
+krdmtuqdgzfoevnabixydlzsph
+krdmtuqjgwwoevnaqixyclzspf
+krdmtuqjgwfoevnabdxyzvzsph
+krdmtuqjgwaofvnabixyclzsnh
+krdmturjgwfmevnabixyclzspn
+krdmvuqjgwboevnabixyolzsph
+krdmtuqjgwfomvnabijyclzspx
+bedmtuqjgwfoevnabixyslzsph
+krdmtenjgwfoevnabixyclzsqh
+krdmtuqugwfoevnabixpcdzsph
+krdmtuqjgiloevnabrxyclzsph
+krdmtupjcwfoevnabixyclwsph
+kremtuqjgwfoevnabixyyjzsph
+krdmtuqjgwnoovnabixyclzshh
+qrdmtuqjgwfoevnabixyciasph
+krdituqjgbfoevnagixyclzsph
+krdmnoqjgwfoqvnabixyclzsph
+krdmtuqegwfoevhkbixyclzsph
+krdmkucjgwfoevnabixnclzsph
+krdmtuqbnwpoevnabixyclzsph
+krdmttqjgwfoevnabixyclbspz
+srdmtubjgwfrevnabixyclzsph
+krdmruqjzwfoevnabixyclesph
+ardmtuqfgwwoevnabixyclzsph
+yrumtuqjgwhoevnabixyclzsph
+rrdmtuqjgwfoevnabsxycwzsph
+krpmtuqjgwfoevdabixyclzzph
+krdmuuqjgwfoevnabixyclriph
+krdmtuqjgwfobvnabixyvgzsph
+krdmbuujgwfoevnabixycczsph
+krhmtuwjgwfoeqnabixyclzsph
+krdwtuqjgwfoevnkbixyclzzph
+krdmtuqjgwkoeqnabixyvlzsph
+kadmtuqjgwfoednabcxyclzsph
+krdmtyqqgwfoevnabizyclzsph
+krdmtuqjgnfoevnabiyycmzsph
+krdmtuqjcwfouvnabixyclznph
+krdmtuqjjwfcevnqbixyclzsph
+krdmtuqfgbfoevgabixyclzsph
+kkdmtuqjgwfoevnapixyclzsth
+nrdmtuqjgwtoevnakixyclzsph
+krdmtuqjglfoevlabixdclzsph
+zrdmtuqjgwfoevndbixbclzsph
+krdmeuqjgwfoeenabixyclrsph
+krdmoaqjzwfoevnabixyclzsph
+krsmtuqjgwfoevnwbixyclzsfh
+kadmtuqjgwfoqdnabixyclzsph
+krsmtuqjgofoevnabixkclzsph
+krdmtuqjdwfoevnibixdclzsph
+mrdmtuqjgwfouvnabixyclzfph
+trdmtlqjgwfoevnabixyclzjph
+trdmyuqjgwfozvnabixyclzsph
+krdmtiqjgwroevnabixyclzspk
+erdmtutjgwftevnabixyclzsph
+krdwyuqjgwfoevnaaixyclzsph
+krdmthqbgwfoevnabixyclksph
+krdmttqjgwfoivnabixyclvsph
+krdmtuqjgwfoefnabixyflgsph
+khdmtuqjgwfoevnajixyvlzsph
+krdmtuqvgwfoevnasixyclzspt
+krdmtuqjgkwogvnabixyclzsph
+krdmtuqjgwfoevnaboxpglzjph
+kadmtuqjgwfoxvnabixyclziph
+krdmtuqjfwfoevnabaxycbzsph
+krdjtuqjgwfoevnabiryhlzsph
+krdvtuqjgpfoevnabcxyclzsph
+brdmtuqjgwfoevnafixyqlzsph
+krdmtuqjgwfoevnavixxcllsph
+krdhtuqjkwfoevfabixyclzsph
+krdmtuqjgjfoevnawixyclzsuh
+krddtuqjgwfoeqnabiwyclzsph
+krhmtuqjgwfnevnabinyclzsph
+kedmtuqjgzfmevnabixyclzsph
+qrdmtuqjgwfoevntbixyclzxph
+krdmtuqsgwfoevnabixvclzrph
+scdmtuqjgwfoevnabixtclzsph
+krymtuqjgjfolvnabixyclzsph
+krdmtuqjgwfkevnablxyclzskh
+krymtuqjswfoevnabixyclzvph
+krdmtuqjhwfoevnabixycwzspd
+krdmtuxjgwfoevnabyxyclzzph
+krdmtlqjgwfovvnabilyclzsph
+krdmtuqjgwfoevnaaijcclzsph
+krdatrqjgwfokvnabixyclzsph
+krdmtuqjgwfoevnaxifyclzkph
+krddtuqjgwfoevnabixccozsph
+krdmtuqngwfoevnabiyycxzsph
+krdmtumdgwfoevnqbixyclzsph
+krdmtuqjgwfoevnabixyxlmsch
+krdmtudzgwfoevnabixtclzsph
+krdmtuqjgwfoevnpbixyclhspl
+krdmtqqjgwjoevnabexyclzsph
+kydmtuqzgwfoevnabixyclwsph
+krdmeucjgwqoevnabixyclzsph
+krdmtuqjghfoevjabixyclzspp
+krdmtuqjgjfwevnabixyclzskh
+krdmkuhjgwfoevnabipyclzsph
+krdytuqjgwfoevnabibyclztph
+krdmtuqjgwfpevnabisyzlzsph
+kmdmtgqjgwfsevnabixyclzsph
+krdmtuqjgsfoevnabijyclzszh
+krdmtuqjgwfoevnabivyclzuuh
+krdstuqjgrfoevnabixyclzspu
+jrdmtuqjgwfotvnabixyclzspj
+krdmrumjgwfoevnabixeclzsph
+krpmtusjgwfoevnabioyclzsph
diff --git a/2018/inputs/20.txt b/2018/inputs/20.txt
new file mode 100644
index 0000000..620f018
--- /dev/null
+++ b/2018/inputs/20.txt
@@ -0,0 +1 @@
+^ESEEEESSWNWSWSEESESENENNNW(SSWENN|)NENWWWWWNWNWWS(SWSEESE(SSWSWNWSSSESWWSSSSEEESWWSESSEENN(WSNE|)NENEEEEESSSEENNNNENEEENNWWS(WWNNNENWW(NENNNNNEEENWNNWWWWWWWSWNNNWNNEES(SENNNWNNWNNNWWNWSWNWNNENNEENNNWSWNNNWWNWWWSWWSEEEE(NWES|)SENESSS(EE|WNWSSSSE(NNESNWSS|)SWWNNNNNWN(E|WWWWNNWSWWSWWWWWNNESEENNEEE(SWWSNEEN|)NWWNWNNWWSESWSE(E|S(WWNNNNWNWWNNENNWNWNNNNWSSWWNENWWWNWSSSWSSENESEEEE(NWWWNWNE(WSESEEWWNWNE|)|SSE(SWSWNNNWSSWSSSWNWSWNNWNNN(NWSWWNENWWNWWNWWNNNESSEEES(W|ENNENNESENNWWNNWWNWNNNWWWSEESSWSSENESESE(N|SSWSWNW(S|NWN(EESEWNWW|)WWNNE(NWWNNE(SEEWWN|)NWWSWWWN(WSWSEEEEESSSE(SSSSWSSWNWSSWNWWWNENEE(SWEN|)ENE(S|NN(ESSNNW|)NWSWNWSWWSW(NNNEN(NNN(WSSSNNNE|)E|ES(SWEN|)EEEN(ESNW|)WW)|SE(SWSSSEEESWSSESSSENNNENEN(WWSWENEE|)EEESSWW(NEWS|)WSWSEENESSEEENNNW(SWSEWNEN|)NNE(SESEE(NWNWESES|)SSSWSW(NNNESNWSSS|)WSWSSWWNENWN(EE|WSSSWSWWNWWNWSW(NNNNNESSE(NNNWWNNE(NWES|)S|EEENE(SSSW(S|WN(W(WW|S)|E))|E))|SESWSSSESESEEEESWWWSSWWNENWNW(N|SSSSSSEEENN(WSWNSENE|)EEENWWNEEESSSSSENENNENNNNWWW(SEESSW(N|SS)|NNNWWSS(ENSW|)WNW(NW(S|WNENNESSE(S|NEEENEEEESWSWNWS(WWW|SSSEENN(WSNE|)EEN(W|NEENENEEEEESSWWN(WWSWSEE(SENEESENNENEESSW(N|SEENNNEEEE(SWWSEESWSWSSSSSSESSENNEESESSWSWWWSWNWSWNWSSWNWWWWWSWWNWNWSWWNNE(NWWW(NENNNENEENNNEE(NWWNWSSSSWNW(NEWS|)SS|ESWWSEESSWNWSSESWWNNWSSW(SEESES(W|EENN(NNEESWSSEEN(W|NEENESENENE(NWWWNWSS(EE|WSWNNWNNESE(NN(E(SEEES(ENN(N(E|NN)|WWW)|W)|NN)|WW(WSSSSE|N))|S))|SSWSSEE(NWES|)S(WWWWNWSW(NNEEES|WS(WNWSW(S|W)|EEE))|EEEN(N|E))))|W(S|W)))|N))|SWSESWSWNNWWSWNWWWN(WWSESWSESESSEEEEENESSWSESWSESSENESENNNNWSW(SEWN|)NNENENENN(W(WS(SW(S|NWWN(WSSWWNENWW(SS|N(WSNE|)E)|N))|E)|NNN)|ESEE(NWES|)SSWW(NEWS|)SESSSWNW(N(N(N|W)|E)|SSESSESSSSSWWNENNNWN(WWWWWSWSESWWWNWWWNNW(NEEEEES(WS(WWNE|ES)|ENN(ESNW|)NNWSWS(WNWSWWNNE(S|EENE(S|N(EESWENWW|)WWSWNW(NN(ESNW|)N|S)))|E))|SSSEESE(ESSWNWWW(NEWS|)SSESEESSENESESWWWWWW(SSSSSSSSEESESSEENESEENENENESSWSESSESWSEENESSWSEENEESENNENWNNENEEEEENWWNWNWWNWNNEENNWSWWWSESSSSSE(SWSWSESSWNW(S|NWNENNNE(NWWWW(NEENWNNWNWSSWNNWSSSES(ENENSWSW|)WWWWWNNNENEE(NWN(ENNW(NNNWS(S|WWN(WWNWESEE|)ENNNESES(W|EEEE(NWWWN(W|NESENNE(NWWSWN|S(ENSW|)S))|ESSESENENN(WSWNSENE|)NNNNESENEENWWNNENEEEENEENNNNESSEESSENNNWWNNWN(WWS(E|WSWSWWSWNWSWSW(SSWSESSENNNEN(W|NESENENES(SWEN|)ENNE(N|SS))|NNENEENESENENWN(EESNWW|)WSWWWSE(WNEEENSWWWSE|)))|EN(ESSSENESENEEEEESESENESENEESSENNNESSSESESWWSSENES(ENNNNENENE(NNNNWNN(WWNWWWSESE(SSEE(NNWSNESS|)ESWWWSSW(SE(ENEN(E|W)|S)|NNWWWSWWWWWNWNENNNNWNWW(NEENWWNEEESEESWS(WNSE|)ESSSW(SSES(EENNNW(S(W|S)|NENEE(N(EEE|NNWSWNNEENWN(WSWWNWN(EE(EE|S)|W(NEWS|)SWS(WNWSWNWWSWNW(NE(EEEEEE|N)|SSES(W|ENE(SE(N|S)|N)))|EESEESSS(S|EE)))|E))|SSW(N|SSENE(SENSWN|)N)))|W)|NN)|SESESSWSSWNNN(WSSSWWWN(WS|EENWW)|N|E)))|N)|EES(SSESWENWNN|)W)|SSWSWSEEE(SESEEN(EN(EES(EENWESWW|)S(SSSS|W(N|W))|W)|W)|N(W|N)))|SSWSWWSWSEEEE(N(NESE(E|N)|WW)|SSSWWNENWWSSSWSSESENN(W|NESSSSWWWNWWSESESSESENNWNEEESWSSESWSWWWSESENEENEN(NNWESS|)EEESSEEEENWWNW(S|NNEEEE(NNWWWS(EE|W)|SS(WNW(S|W)|EEN(EEENWNENN(WSNE|)NESENESEENNNEESWSSEEN(W|NEESENENENWNNWWNWNENESEENNENWWWS(ESNW|)WNWNEEENNESSEENWNENNENESSEESEESWSWSWNN(WSW(NN(N|EE)|SSSW(SSW(SS(WNNWWEESSE|)EEENNN(WSSWENNE|)EENESENNN(WSWWSWNN(SSENEEWWSWNN|)|NESSSEENWNENWNWNNNESSENNNWNWSWSSWNNWW(SEWN|)NNNWWNENNWNENESSEENNNW(SS|NNWWNENEEENNEESSW(SESSWSW(SSESSEENNW(S|N(W|NEES(ENENWNENEENWNWSWWW(NNENNWNWNEENNWSWWWSESSS(E(N|E)|WWWWSS(EENWESWW|)WSWSWWNNNWNNENNWSWWNWWWSWSWSWWSESEEN(NESESSENENE(NNWWNWS(SE(S|E)|W)|SSSE(SSWWWSESSSSSSWWWSEESENESSSENNNNESE(NNWNNNE(SSEWNN|)NENWNW(SWS(SSSW(S(S|E)|NNNN)|E)|NEESEESW(ENWWNWESEESW|))|EESWWSW(SSWWWSWS(E|WWSWWSWNNENWNNWNEENE(ESE(N|SE(ENWESW|)SWWS(E|W(S|NN(WSNE|)(N|E))))|NNWNWNEEENWNNENWNWWSWWSEEE(SWWS(EE|SWSESSE(E|SWWWSW(SSEE(N(N|W)|ESWWSESWSSWNNWSW(SSSEN(N|ESEESENENN(WSW(NNENNSSWSS|)W|ESSEE(SSESSENESSWWWNWN(NWSWS(E|WSS(WNNNEN(ENEEWWSW|)WWSWNW(SWS|NEE)|S))|E)|NENWW(NEWS|)S)))|N))|WNWSWNNEEE(EN(ESNW|)WWNNNEE(SWSEWNEN|)N(ESNW|)NWNNNWWWWWNWNNNEENNENWWSSWWSWWSESSWWWS(ESEEEN(NNN|ESSSEEENWWNEEEESSS(W(NN|WWWWSEEESSWWN(E|W(SSSSES(ENNWNEEENNN(SSSWWWEEENNN|)|WWW)|WNNNW(NEWS|)S)))|E)|WW)|W(W|NNEE(E|NNNNNEENESS(WWSEWNEE|)ENNNWWNWWSS(ENSW|)WNW(SSEWNN|)NWNNNEENNESESSS(WW(S|N(EN|WS))|ENNEENNWNWNWS(SESEWNWN|)WNNENNWNNESEENWNEESSESEENWNNNW(SS|WWWNNESEEEEEENNNEENNNNWWWN(EEEESSSSSENNENWNEN(EEESESSWWN(E|W(NEWS|)SSSSSSSENESSWWWWWSEEESESWSESENENWNEN(NEEESENNWWWNW(NWNENWW(NEEESESEEENWNNENESESW(W|SEEEEENNNENESSSSENENNESEESESESSENNNESESWSSWSEEENWNEESENNWWNEENNNESESWSSSESENNWNEESE(SWSESWWWSESWSESSSSWNNNWNNNN(WSSWN(N|WSSEESSSSSWSSEEN(N(NNN|ESENESE(NNWNENNW(NNNESS|S)|SSSSSSSWNNWSSSEESSSSSWNWSWWNENWWSWWNNWWNWNENWNWSSSWSWNNW(NNENNNWS(S|WNNEENENESENENESE(SSESSEEE(ENE(NWW(NEE|SWNWS)|S)|SSSSSES(SENNSSWN|)WWNNNWSSSW(NNNNEENWWWNWWWS(EES(SE(SSWNSENN|)N|W)|WNNN(WSSSSS(W|S)|EEE(NWES|)S(E|WW)))|S))|NNENWWNWNWSWSES(WS(WWWS(E|WWS(EE|WWNENEENNENENE(ENNWSWWSWWNWWWSWWWWWWSEEESWWWWSEEESENENEESS(W(N|WSEESWWWSWWWSESSWS(WWNEN(E|WWWWWSS(ENESE(S|N)|WNNWSSWS(SWWWWNENNNWSWNNWNNNESSEENWNNNNNWWSSWNN(NEENNNN(WWWSSENESSW(ENNWSWENESSW|)|NES(ENNN(WSWNSENE|)ESSSENNNNN(SSSSSWENNNNN|)|SSSSEESWSSESEESSWNW(WNSE|)SSS(WW|SES(WSESWENWNE|)ENNN(WSNE|)EES(EENNNENNWSWSWW(SEESNWWN|)NEN(WWNW(NNNWWEESSS|)(S|W)|ENEEESE(SWSESWWSSENESENNENE(SENE|NWWS)|NNWWWNNNESSEEE(N(ENWNENWNN(ENESENESEESWWSWSW(SSENESENN(W|EEENESENNESENNEE(NWNWNWSWSWS(EENEWSWW|)WW(N(WW|NNN|E)|S(SWWEEN|)EE)|SESWW(N|S(EEESEE(NWES|)S(SESENSWNWN|)WW|SWW(NEWS|)(S|WWWWWS)))))|NN(E|W))|WSWWN(WNSE|)E)|WW)|S)))|W))))|WWSWWS(WNNE(NWWSSNNEES|)E|SEESEN(N(WW|N)|E(EENNSSWW|)SSWWSW(SWSS(WNNSSE|)ESENENN(WSWENE|)E(NWES|)SESWSEE(E|SSSESWSWSWNN(WSSSES(EEESES(WSNE|)ENENEN(WWSWNN(E|W(WS(W|E)|NENNEE))|ESE(NN|EEE(N|S(WWS(WNWWEESE|)SSESW(W|SESWS(E|WW))|E))))|WWNWNE)|NNE(NWW(WW|N)|SS)))|NN))))|E)))|SENENNEN(W|ENESENESEE(NWES|)SWWS(WWN(WSWSESE(N|SS(ENSW|)WNWSWN(NEWS|)WWSS(SE(ENWN|SWS)|W))|E)|E))))|ENEENN(WNWS(SEWN|)WWW|E))|SSSW(N|W))))|E)|E(E|N))))|SSS(SWEN|)EEESESESESENN(WNWN(WNWESE|)E|ESE(N|SWSWSSWSSSWSWWNNE(S|NWNW(NENN(WSNE|)E(ESWSSE(NENSWS|)SS|N)|WSWWSESSSWSW(WWWSWNW(S|NNWNEESE(NN|S(W|ENEE(SW|EN))))|SESSSESWS(W|SSSENEESESESESSWSSESSENNN(W|NENNESESEEESWSWWWN(N|WSSEEESSSWWNENWWSSWWN(E|WNWWNWSSSSSWNWNNE(NNWSWSSWWSEESWSEE(N|SSSWSEESENNESEESENNWNEENENNESENN(WWWSWNWNWW(NEWS|)SSE(N|SE(N|E(E|SWWS(S|WNNWSW(N|S(E|S))))))|EEENWNNEN(W|ESE(NNNW(SWEN|)NNWNENE(SSS|NWWSWSSWNNNENNNENESE(NNWWNNWWSSS(ENNSSW|)SWSWWSWSW(SE(ENEE(S(S|W)|N(ENSW|)W)|SS)|WNNW(S|NEEE(SWSNEN|)NWNWWS(WSSWWNENNENENENEEENENNNEESEESESS(SE(SWEN|)NNNNNNNWNENNWWS(SSWWS(EES(E(S|N)|W)|WNNW(SWS(SSWS(E|SWWN(E|WSWS(WN(NENNW(NENSWS|)S|WSSSENE(WSWNNNSSSENE|))|E)))|E)|NEEE(SWEN|)NNEN(WWSSW|EESW)))|E)|WWWNN(ESEWNW|)W(SSSSSSWNW(SSEWNN|)WNEN(WWSWENEE|)E(S|N)|N))|E)))|SWWSEE))|SSSW(NNWESS|)SESSWWN(E|NWWSESSSSWSWNWNN(ESENNWW(EESSWNSENNWW|)|WSSSESEEESWWSWWWWWNWSSSWNNNWN(ENESEESEN(ESEWNW|)NNN|WSWWWSWNWNWSWSESSEN(N|EEESEEE(SEESENESSSENESESEESESESWSSWWSESESEENE(NNWSW(S|W|NNEENNW(S|NENNNNNWSSWNNWNNN(ESSENE(S|NWNWNN(ENE(NNWSW(S|N)|SS(S|W))|W))|WSWWSSEE(NWES|)SESWW(WN(E|WNW(S|NENWWWSE(WNEEESNWWWSE|)))|SEEEESW(W|S)))))|SSSSSWSSWSESE(SSSWNNWWSESWWWS(WNNNENWNNNESSES(SSWENN|)E(E|NNWNNENWNEN(WWSWSS(ENSW|)WNNNWWSSE(SSWSWWWNENWWWSSWSESEESESENESSS(ENNE(SS|NWNWWN(EEE(N(W|N)|S)|W(WWNNSSEE|)S))|WNWWS(E|WNN(NWSWNWN(WSSWSES(WWWWNEENNENWNNWSWWNNE(NNWWWNENENNNWSWWWNEENNWNENNNNEEESSEEESEENNW(NENNWWS(E|WNWN(EENESEESE(N|EESESSSESWWSEESWWSESSWNWWSESESESS(WWN(WSWNNWWNWNWWSSS(W(NNNNEEENNEN(WWSSWWNENN(WWW(NNESNWSS|)SE(SSWNSENN|)E|E)|ESSWSSEE(S(ESEWNW|)W|N(NNNEE(SWSEWNEN|)NNNN(ESSNNW|)NWWSSE(SSWNSENN|)N|W)))|W)|SSEENWNE(NWNSES|)ESSE(ESWWSW(NWW|SEEN)|NN))|E)|E(S(E|S)|NNN(W|NNESSEENE(NWNW(NNW(SSWENN|)NEESES(S|W|EENWN(E|NW(WNWSWNWNN(SSESENSWNWNN|)|S)))|SS)|ES(WSNE|)E)))))|WWNENWNNWWNNENNNNWNENESSEENEE(SSW(N|WWWSEESWS(EEESEN(EESWENWW|)NN(NNES|WWSE)|SW(W|NN)))|NWWW(S|NEENNENE(NNNWSSWNWSS(SWS(WNWNEENNW(WS(E|WSSWNW(NNE(S|E)|SSESWWNW(NENSWS|)SWWSWSSWSESWSSESSSESSSSESSEENWNNNEESENNN(EESWSSE(SWS(WSSSSWNN(NNN(WNSE|)E|WSSSSWWSESWSWWNWNENNNES(EENWNENWWSWNNWSSWSESSWNWNWWNEENWNNNNESSSE(S|NNEE(NWWNEENWNWWWNEEN(ESNW|)NWSWWWWNEENE(S|EENWNWNNWSWSS(E(E|N)|WNNW(SWSSSSE(NN(EE|N)|SESWWSSWNNWWWNWNN(EEENWN(WSWNSENE|)EE(NWES|)SSSWW(SEEEWWWN|)W|WSWSWWWNWSWSEEEEESSSENNE(NWNSES|)SSSSSWNNWSSWNNWSWWSSSWWWWSESWSESEEEENWWNW(NEESEENWNEESSSEESWSEESESESEENWNEEENNNENE(NWNWSWWSSWWNWSS(EEEE(NNEWSS|)SWWW(W|S)|WNNNWNN(W(WWWNE|SSSE)|ESENENNENN(ESSSWSS(ENE(ENESE(ENWNNWSWW(NNE(EENWN(WSNE|)ENE(NWES|)SES(WSSS|ENE)|S)|S)|S)|S)|WS(ESNW|)W)|NWN(WSSS(ENSW|)SS|E))))|SENESSSEN(ESSWWWNWSW(NNEEWWSS|)SWWSESESWSESENENWNN(NEESS(WNSE|)EESSEEEENWWWNNEN(W(WSWNSENE|)N|ESS(ENEESWSESWSEESWWWWN(E|WSWSWWNEN(E|WW(NNESNWSS|)WSSSSEESENN(WWNNSSEE|)ESSENNNESSENEN(ESESENEE(SSW(N|WSS(EEEN(WW|NEENNWSWN(SENESSNNWSWN|))|WWWWNN(ENESESWW(EENWNWESESWW|)|WSSWNWSWNWSWWWWWWWNENENESS(W|EN(ESENSWNW|)NNNWWWWSWNWSWWNENEENEE(NWWNN(ESENSWNW|)WSSSWWWNNESENNWWNE(NWNWWSWWNWWWWSSWWSWWWNNESENEENWNE(EEEEEE(ENWNSESW|)S|NWNNWWSESWSWWS(EEENSWWW|)WSSWSWSSESWSESESWWWSSWWNWWNNWSSSWWNNNE(SS|NWNENENNWWS(E|WS(E|SWWWWSSSESWSSES(ENN(ENWNENN(WSWNSENE|)ESSSSSEEES(WWWWNSEEEE|)EEEN(WWNEWSEE|)EEEES(EENENNW(SW(S|WN(WSNE|)E)|NEESSSS(W|ENESEEENEENWWNWNNEENWNEENNWNNW(NEESSENESSSW(SSWSEEESSEE(SEEN(W|ESE(EN(ENEEWWSW|)W|SSWNWSWWN(E|WSWNN(E|WW(SS(ENSW|)WW|NN(ESNW|)WW(SEWN|)W)))))|NWNN(E(E|S)|WN(WSNE|)ENNW(NNE(N|S)|S)))|N)|SSS(WSSWSWNWS(WWNENEENWWN(EEE(ENWESW|)SS|WSSWS(WNNN(W|NE(SS|NN))|S))|SEESWWSEESEN(SWNWWNSEESEN|))|E))))|WWW)|W)|WWWNENNNWWSS(ENSW|)WWNNWSSWSES(WWWWNENE(S|NWWSWSSWNWSWNNWSWNWNEENWWWWWSESSS(WNWWW(SEEWWN|)NNNENWNEENNNENNWNNWSW(SSSE(SSWNSENN|)N(E|N)|NNENNW(S|NENESSSSENENENNNWSW(S(S|E)|NWNWNW(NNNEESWSEES(W|ES(EEEEESWWWSESEEN(W|ESSSWWWSWW(SSESSENEENNW(W(SEWN|)W|NEESSSEESSSWSEESENEESWSE(S(S|WWWN(WSSWNNN(WWNWNEE(S|NENWWWS(E|WWSESSWS(EE(N|ESSE(SEWN|)NN)|WWNEN(E|WW(SSWSSS(WNSE|)E|NENE(NWN(E|NN(WSNE|)N)|S))))))|E)|E))|EEE(SS|ENWNENNNEEESWS(EENENWNEENNWWWNWNNNNNNWNENESSESENNWNNENNWWS(WWS(W(NNENN(WSWENE|)EES(WSNE|)ENESEESWSSS(SSSSSSESWWNWW(SESEEEENNESSSSENNNNNNNESENEEENENNNNNWWNWWSESWSSWWNNWSSWNW(SSEEES(WWWSSEE(SWW|NW)|ENEEE(SWWEEN|)ENWN(WS|ENW))|NENNNEESS(WNSE|)E(SS|NNENNEEEESWS(WWNEWSEE|)SEESESSSSW(NNN|SSWSSWWSWSWNW(NEENEE|SSESWSS(SSEESESSE(NNNWNNNW(NEN(NESESE(NNE(EENWNENENNNNNENWWNW(NEENWWW(W(NNNNNEENE(SSWWSSSEENN(WSNE|)ESES(W|SEEEE(SWSEESWWSEE(EENNW(N(EESE(SWEN|)N|W)|S)|SSWWWN(EE|NNNW(SSSSW(SE(SWSEWNEN|)EEEE|N)|N(WSWENE|)E)))|NWNW(SWNSEN|)NEENEE(NWES|)S(WSWENE|)EEE(SWEN|)E))|E(NWNNWNWWWWWWNNNESSENNEEE(SSWWNE|NWNNWSSWNNNENENEENNE(ENNWSWWWNNNWSWWNENEENN(WWNWNWSSES(WS(SWSSSEEEN(WWNSEE|)ESSS(ENESNWSW|)SWSWWNENENWWWWNWSWSWNNENEENNNWNW(NEN(W|EE(SWSES|NW))|SSWWWW(NENWESWS|)WSSWWSESSWWSSWSWNWN(WWSSE(N|ESESWSSSWNNNW(NEWS|)SSW(SESESS(ENNESENNWNEENEENWNEESESESEESENNEEE(SWSSW(WSWSWWSSESSEEESWSEE(NNESENNESSES(ENNWNNNN(EESWSEE(ENWN|SWW)|WSWS(WNN(E|N(WSSSS(WWNW(N(EE(S|N(N|W))|W)|S)|E)|NN))|E))|WWW)|SWWWNNWWNWSS(WWNENWW(NW(SWNWESEN|)NNNNEESSW(SEES(E(NNWNENENWN(EES(S|E)|WN(E|WWSS(WNSE|)E(ESNW|)N|N))|E)|W)|N)|S)|ESWSESEN(NN|EEEE)))|NN)|EENNWSWNWWS(E|WWNNNEEENN(WSWWWSWWWN(NENN(WSNE|)NNESE(SWSS(EN|SW)|EN(EENSWW|)W)|WWSES(WWSWS(SWEN|)E|EEEESS(SE|WNW)))|E(SSS(WWWSNEEE|)EE|E))))|WWN(NWWS(WNWSWWNNE(S|NEN(NNWSWNWSSE(E|S)|ESEESWWW(EEENWWEESWWW|)))|SE(SES(SSENSWNN|)W|N))|E))|N))|NESENNNE(SEWN|)NWW(W|NEEEEN)))|E)|EE)|EESE(NN|EE(E|SWSWWN(E|W(N|SSSENEEE(SSENEWSWNN|)N)))))|SSSWWS(ESWSEE(SWSEWNEN|)NEN(W|N)|W)))|EE))|W)|S)|SSESWSSS(ENNSSW|)W(S(SW(N|S(W(S|W)|E))|E)|N))|S)|SWSW(NN|S))|W)|SW(SEWN|)N)|S(WS(WNNW(SS|WN(NESE|WS))|S)|E))|WWWW(SWSSW|NENW))))))|NEENWWN(SEESWWEENWWN|))|W)|WSE(SSWNWSWNW(N|WSWSEE(N|SSWNWSSSESESSSENNNNWN(EENNN(WSSNNE|)ESESE(NNWESS|)SSWNW(N|SWSSEESES(EN(NWNWWEESES|)E(EE|S)|WWW(NEWS|)SESWS(E|SSWNNNWSWWWNENNW(S|NWNEE(NWWNW(SSS|NNESE(NNWNNE(S|N(WWSS(WNNWWWNEENNWSWWWW(SESENSWNWN|)WNENNWSWWNEN(EEESESWSEENNN(ESES(E(NNWNSESS|)SSES(ENSW|)W|W)|W)|NNWW(NEWS|)SESWSS)|S)|E))|S))|SE(N|SS(EE|S)))))))|W)))|E))|EE)|E)|SW(SESWENWN|)NN))))|NEN(EEE|N)))|W))|SS(S|E)))))|EE(NWNNSSES|)EE))|EEENWW))))))|E)|ES(WW|EE))))))|NWW(W|NNESENN(E|WWWNNNE(EN(E|WWWW(NENNE(E|NN)|W))|SS))))|W)))|W))|W)|N))|S)))|NENN(WSNE|)ES(ENEES(W|ENE(SSWS(WNSE|)S|EN(EE|N)))|S))))|S(ESNW|)W))|SSS))|EEE(NWES|)ESEESWW(EENWWNSEESWW|))|N)|WWS(WNW(NENWNNEEESSS(WNNWESSE|)ENNNNWWNNWNEESE(NN(ENNESE|WWWWSSW(N|SS(EENWESWW|)S(SSS|W)))|S(ESSNNW|)W)|SSS)|E))))|NNNEEEES(WSWNWS|EESS(EEEEE(SEWN|)NWNEN(WN(NW(SSSWW(SEEWWN|)NWN(W(S|W)|EE(NWES|)S)|N)|E)|E)|S)))|E)|E)|S)))))|S)|S)|EN(EESWENWW|)N)|E)|E)))|N)|ESE(SWSSWENNEN|)N))|EEEEE)|NNN))|NNWW(SEWN|)W)))))))))|S))|EE))))))))|W)))|W))|N)|NNNNWNN(ESNW|)WWS(ES(SSENSWNN|)W|WWWSWSW(SEENSWWN|)WNWNWSS(E|WNWNN(E(S|EEEES(ENEEEWWWSW|)(S|W))|WS(WNWW(S(SS|E)|WWWSWWSESSWNW(S|NNW(S|WN(WSWSWSW(SESNWN|)NW(S|NN(ESENEWSWNW|)W)|EEEE))))|S))|S))))|SS)|S)|WW))|W)|WWSWNWSSSWWNNN(ESSNNW|)WWSESSWWN(NNWSWWSEESSSEEEN(WW|ESS(WWWWSSESENN(ESSSWWSWNNWSSWNWWNNENENWNNN(ESE(S(W|SSSWSW)|N)|NWNWWSWNN(EEEE(EE|S)|WWWWSWNWSSWSEEEN(W|ENESE(SWWSSEEN(W|EESSSWWSESWWNWSWSWSESENESEENESSENESEN(NWWNW(NNE(NNE(S|NNNW(N|SS|WW))|S)|WW(WW|S))|EEESE(S(E|WWNWSSESWWSWNNENWWWWWWN(EE|WWSWNNWWSWSWNWNNWNEENNENNEENN(WSWNWNWSSWSWWNWNEE(S|ENNNN(WWSSS(ENNSSW|)WNWNWN(EESNWW|)WSWSEESWWWSWSWNNWSWNW(WWNNESEEEEE(ENN(E|WSWWN(WSWNWWWSS(NNEEESNWWWSS|)|E))|S)|SSEESSENESS(EENENEE(ESESES(ENN(W|E(SS|EN(W|N)))|SSWNW(SSSEEN(ESSSE(N|SENEEE(ESSSWSW(SEESW(W|SEEENNNW(NEENNN(EEEESSSSESWWWWSSSE(EEEEE(SEWN|)NNNNW(N(W|ENEE(SWSE|ENNWS))|SSWS(WWN(WSNE|)E|E))|SWW(N(WWSEWNEE|)NNNNENESENNWWNEE(WWSEESNWWNEE|)|SS))|W(WSSENSWNNE|)N)|SS|W))|WNENN(ESNW|)WSWWWW(S(ESENES|W)|N(NNWESS|)E))|N(W|N)))|W)|N(NWSWW(NENEWSWS|)WW|E)))|NWN(ENSW|)WWS(WS(S|E)|E))|WWSWWSSW(S(ESENNENW(ESWSSWENNENW|)|W)|N)))|EEES(ENSW|)S(WNWSNESE|)S))|EESWSSWWSSE(EN(ENEN(E(EENSWW|)S|W)|W)|SSWW(WSEWNE|)N(N|E)))))|N)))|N))))|W)|EESEENNEE(SWSEWNEN|)NNEE(SWEN|)NWWW(N|WWSES(ENSW|)WWWSEES(NWWNEEWWSEES|))))|E)))))))|S))|N))|N)))|N))|NN))|W))|SE(SWSEWNEN|)E)|W)))|NN(E|NW(W|SS)))|N)))|NN)|NN))|E))|W)))))))|W)))))|S)|WWS(E|SWNWN(WWSESESESSWS(WWNEN(WN(E|N)|E)|ES(W|S(EEN(EE(SWSNEN|)E|W)|S)))|E)))|SSW(WSEEWWNE|)N)|SSEE(NWES|)SWWSES)|SS))|EN(WN|ESE))|NN(EESWENWW|)N)|N))|N)))|EEENWNEESS(NNWWSEWNEESS|)))|S)|NNWNWWSS(E(E|N)|WWWWW(N(EENN(N|ESE(NEN|SW))|WWWNWWNNW(SWSES(EE|WSWW(SEWN|)N(ENW|WS))|NNESE(SSEWNN|)N))|S))))|N)|E)))))|S)))))|NWWNW(SWWEEN|)NENNNE)|EEEN(WW|E))))|N)|EE)|S))))|ESSEE(SWEN|)NN(WS|ES))|E|N))|S))))|W)|SWSESSWNWWSWSWS(WW(S|WWWNEEEENWNNEES(S|W|EN(EE|NWNWSW(W(SSSWWEENNN|)W|N))))|EEEEE(SSS|N(WW(W|N)|E))))|E)|E)|E)$
diff --git a/2018/inputs/21.txt b/2018/inputs/21.txt
new file mode 100644
index 0000000..aaebbac
--- /dev/null
+++ b/2018/inputs/21.txt
@@ -0,0 +1,32 @@
+#ip 2
+seti 123 0 4
+bani 4 456 4
+eqri 4 72 4
+addr 4 2 2
+seti 0 0 2
+seti 0 1 4
+bori 4 65536 1
+seti 16031208 7 4
+bani 1 255 3
+addr 4 3 4
+bani 4 16777215 4
+muli 4 65899 4
+bani 4 16777215 4
+gtir 256 1 3
+addr 3 2 2
+addi 2 1 2
+seti 27 3 2
+seti 0 9 3
+addi 3 1 5
+muli 5 256 5
+gtrr 5 1 5
+addr 5 2 2
+addi 2 1 2
+seti 25 7 2
+addi 3 1 3
+seti 17 4 2
+setr 3 1 1
+seti 7 5 2
+eqrr 4 0 3
+addr 3 2 2
+seti 5 1 2
diff --git a/2018/inputs/22.txt b/2018/inputs/22.txt
new file mode 100644
index 0000000..e2e94a0
--- /dev/null
+++ b/2018/inputs/22.txt
@@ -0,0 +1,2 @@
+depth: 7863
+target: 14,760
diff --git a/2018/inputs/23.txt b/2018/inputs/23.txt
new file mode 100644
index 0000000..306c4ad
--- /dev/null
+++ b/2018/inputs/23.txt
@@ -0,0 +1,1000 @@
+pos=<61981295,70302690,50074583>, r=86817788
+pos=<-39574082,11593440,52034024>, r=86226353
+pos=<-22613800,41560771,22762338>, r=83067593
+pos=<-12414843,51978293,68300191>, r=85018769
+pos=<-12727191,34870716,52975971>, r=52899633
+pos=<-32063168,40924402,49558575>, r=74871596
+pos=<18752046,16372097,-9651854>, r=70068867
+pos=<3474631,29804741,98417262>, r=77072884
+pos=<18354169,57026789,74027645>, r=65025959
+pos=<22104105,74882695,61927007>, r=67031041
+pos=<-42133805,38530007,57591711>, r=90581205
+pos=<-47869746,22599340,42855147>, r=77956291
+pos=<-27020782,-4791281,34203354>, r=93149809
+pos=<-18487970,40655084,49627122>, r=61095611
+pos=<10137288,54171533,97007570>, r=93367254
+pos=<21836035,43430190,47217893>, r=78376026
+pos=<8216569,21003453,101684850>, r=78676489
+pos=<-40466865,34952266,70038151>, r=97782720
+pos=<72670731,-8427298,58419388>, r=97862747
+pos=<-26904810,19437248,39548346>, r=63460381
+pos=<-14862223,38537164,6158587>, r=88895667
+pos=<-4093645,28809183,65079634>, r=50307904
+pos=<-13276886,43613687,45971502>, r=55187766
+pos=<49089034,29003918,14560017>, r=57321614
+pos=<-13807521,-29104885,50131321>, r=99255387
+pos=<48476757,37188242,72540714>, r=62665037
+pos=<7140081,51751715,-8561127>, r=94827577
+pos=<-43249072,32737116,53752441>, r=82064216
+pos=<6641528,98591490,47271959>, r=91547386
+pos=<-23305462,10475650,56073326>, r=75115096
+pos=<6053316,21990329,84119652>, r=62287689
+pos=<7023331,60698763,57949984>, r=63950985
+pos=<-36608889,31399128,35446137>, r=74217136
+pos=<6817093,34966536,98116734>, r=78591704
+pos=<4957605,61740316,52702032>, r=61810336
+pos=<-2269508,-8851147,43341014>, r=63321024
+pos=<12839874,52090204,58609561>, r=50185956
+pos=<-24117273,33915884,49793440>, r=60152075
+pos=<74759590,28034712,42456610>, r=54126256
+pos=<-48197949,37668470,48713802>, r=86905688
+pos=<-465248,41562365,60498029>, r=54851108
+pos=<10694430,32208520,48027772>, r=61692668
+pos=<-8548512,14246214,83247198>, r=83761331
+pos=<43950964,33755026,90173201>, r=72338199
+pos=<-14628694,43441676,58236468>, r=68632319
+pos=<106381567,34503222,46141825>, r=91485627
+pos=<-42403687,53189612,46049581>, r=93968393
+pos=<3940021,35797440,82233626>, r=66416478
+pos=<-12215361,4082478,43661351>, r=60012674
+pos=<19860123,68466722,60165468>, r=61097501
+pos=<70777186,32758921,32118468>, r=65206073
+pos=<-38591125,46522298,54596946>, r=92035892
+pos=<22636563,105345403,45688673>, r=80723037
+pos=<-3951303,29434316,22353040>, r=52688125
+pos=<-176419819,31194464,52039201>, r=76587195
+pos=<-3596358,48726226,78390625>, r=83038642
+pos=<7182613,37282188,20126279>, r=51628082
+pos=<-25240363,51483969,55323702>, r=84373768
+pos=<21428319,64401806,57994375>, r=53293330
+pos=<-5939048,7790261,21935573>, r=71754303
+pos=<-14391272,30291007,70042112>, r=67049881
+pos=<-22323827,29920141,55916312>, r=60485891
+pos=<13475129,52193445,63897921>, r=54942071
+pos=<-3994272,15505795,89454649>, r=84155011
+pos=<475865,1537450,69193888>, r=73392255
+pos=<-10815135,44879964,69035166>, r=77056155
+pos=<11306358,28884419,64442081>, r=91273574
+pos=<14678811,33694651,48185622>, r=71901550
+pos=<3756099,71276526,21743645>, r=87431573
+pos=<40262582,59466852,61256380>, r=65445301
+pos=<11616060,70966185,64722364>, r=76397938
+pos=<3872060,39650278,107716165>, r=95819913
+pos=<9586133,45083261,78735554>, r=66558242
+pos=<77865670,42917012,73695024>, r=98936729
+pos=<-1745961,55327607,42088395>, r=56640112
+pos=<26855240,67981174,26878283>, r=61746856
+pos=<-14224458,28877026,31495228>, r=53261041
+pos=<15850501,66941649,70246547>, r=73663230
+pos=<-22483771,25856673,49504583>, r=52343508
+pos=<9442908,53159770,55875115>, r=51917541
+pos=<1959101,903989,50510107>, r=53859027
+pos=<7569188,-24881655,45995388>, r=69519533
+pos=<1336123,50534199,50773018>, r=52296589
+pos=<-6780305,30188574,97998637>, r=87293233
+pos=<-27347231,32710526,48539527>, r=60922750
+pos=<-54109318,45563567,46755290>, r=98753653
+pos=<-23931716,34591305,51177382>, r=62025865
+pos=<1842700,54313361,57870403>, r=62666497
+pos=<9906862,47176518,46588813>, r=49926624
+pos=<-5650338,36212767,99081721>, r=93270578
+pos=<-9210222,73861103,51071528>, r=86469031
+pos=<-48605170,28058111,39410284>, r=78908074
+pos=<6277738,31698726,83207681>, r=60954109
+pos=<5935953,25376812,52194560>, r=66482724
+pos=<-33349449,32090950,46515684>, r=64281651
+pos=<-1144497,68829923,72349587>, r=94649606
+pos=<68150356,106204720,129297951>, r=83514523
+pos=<8426203,98908672,49758875>, r=92566786
+pos=<16538168,48418035,65737293>, r=49942650
+pos=<19573131,82515397,58801909>, r=74069662
+pos=<98906639,46422007,45986912>, r=95774562
+pos=<12340098,62609442,59505078>, r=62099865
+pos=<-28251146,31055125,25461712>, r=75499853
+pos=<19758085,59632651,60443124>, r=52643379
+pos=<-63046046,25663836,40121278>, r=92801960
+pos=<-37359413,31532323,71313730>, r=92530910
+pos=<53387378,31226416,70902974>, r=59975761
+pos=<-111343725,90010574,65438544>, r=96905196
+pos=<39565178,36023094,48981621>, r=96285986
+pos=<-18425354,35959496,54078093>, r=60788536
+pos=<4117058,66844365,17924670>, r=86457430
+pos=<4823188,-14314294,64385895>, r=80088678
+pos=<20323219,61060408,10757887>, r=71634602
+pos=<89860271,38268711,51332073>, r=83920073
+pos=<6829746,30401653,100430131>, r=76327501
+pos=<-18163621,73955629,42658058>, r=91116552
+pos=<-9868198,28983545,82688052>, r=73865474
+pos=<-3955635,32776886,7789254>, r=70598099
+pos=<22115720,88382733,50485824>, r=69078561
+pos=<-25241164,31938266,56917737>, r=66422608
+pos=<14985873,-15753032,55823238>, r=62802267
+pos=<16643466,61628684,29386869>, r=57253552
+pos=<21580242,42328478,123256438>, r=96330398
+pos=<-25199672,13587085,61865724>, r=79689986
+pos=<25598120,-21677261,57401363>, r=63021973
+pos=<20683805,43416073,80207144>, r=55264851
+pos=<-12206963,28525784,76317729>, r=69375956
+pos=<66517337,40023722,63765750>, r=74765959
+pos=<21046583,32632182,66997632>, r=92540759
+pos=<-13138431,65411819,48286547>, r=79162230
+pos=<-33524737,76477821,155964131>, r=73103463
+pos=<-33331228,9961241,69359006>, r=98940886
+pos=<39564979,28572472,53811503>, r=61407169
+pos=<-48869811,21665479,51245298>, r=84661484
+pos=<-8710194,53780076,47547665>, r=62363657
+pos=<-7314943,55087956,46146524>, r=60875047
+pos=<-61837954,25859003,56641091>, r=98831768
+pos=<-5695240,58983811,70577156>, r=87581649
+pos=<-25981379,35101300,31842886>, r=70894580
+pos=<3669996,59130810,1907555>, r=95208068
+pos=<34776272,-4188188,70499131>, r=67808809
+pos=<-35530241,30475154,50076449>, r=68407314
+pos=<-8155622,43149031,72681791>, r=76311918
+pos=<6666752,64359993,46401448>, r=56420132
+pos=<14935236,11018971,47709423>, r=95072999
+pos=<-31457362,28416643,49636691>, r=61836519
+pos=<-16109927,48371152,51014763>, r=67821289
+pos=<42694611,33011663,86560963>, r=66726260
+pos=<10684191,49511278,21069239>, r=59412987
+pos=<-423180,40569321,15553431>, r=67093941
+pos=<-32350990,31916431,66781337>, r=83374335
+pos=<-40417062,33333028,20729982>, r=94675000
+pos=<-5784232,29640751,62496121>, r=50246685
+pos=<-15428974,17471422,52568175>, r=56737766
+pos=<-2932788,33823267,68046768>, r=57128261
+pos=<63579456,43455645,46047101>, r=57541191
+pos=<15403015,31974701,112979009>, r=81876224
+pos=<-24087841,19769551,56050682>, r=66580826
+pos=<-11649390,82772147,39945831>, r=96130620
+pos=<20266288,41030544,49627298>, r=52471876
+pos=<15271488,104802139,55747920>, r=97604129
+pos=<-17294454,29095937,38121063>, r=49924113
+pos=<-28047432,15028531,34900811>, r=73659132
+pos=<63036558,50019938,71871561>, r=89387198
+pos=<-34801957,36642230,53036734>, r=76806612
+pos=<-38144076,30407351,68440798>, r=89317810
+pos=<3512495,54767308,49076598>, r=52656960
+pos=<14274088,34274498,46377106>, r=89548213
+pos=<39329258,25136254,46456590>, r=73770931
+pos=<-43496380,31317940,30852295>, r=85616814
+pos=<14184631,31298574,54769039>, r=52386260
+pos=<80496193,20583845,74488856>, r=92746549
+pos=<-23389071,63823214,32693625>, r=96173548
+pos=<-25690209,44737890,68493032>, r=91246752
+pos=<-27606431,29594954,78055471>, r=87582356
+pos=<72441600,37663099,5449732>, r=98443349
+pos=<64033149,70075201,56633740>, r=95201164
+pos=<-41252112,41584295,58764742>, r=93926622
+pos=<-12824950,60182885,70449830>, r=95783330
+pos=<63858499,1902299,56897189>, r=77198605
+pos=<-35302433,28371559,42263514>, r=63065421
+pos=<-50193553,13029004,178032706>, r=87155339
+pos=<-10241339,30475433,65035094>, r=58077303
+pos=<27176667,88255399,39199151>, r=70021298
+pos=<3789738,63200642,58556644>, r=70293009
+pos=<-29026962,17065408,63626804>, r=81800634
+pos=<-15528112,28599049,55171449>, r=51624044
+pos=<67553889,-12734884,46684710>, r=85318716
+pos=<-22058789,25579659,47800035>, r=50491043
+pos=<65502868,77153034,48367762>, r=95482653
+pos=<52012555,29111973,69892338>, r=55475892
+pos=<7094796,39275693,83735416>, r=68242166
+pos=<1860284,40455320,92877446>, r=83797940
+pos=<11928924,-2446863,70048662>, r=66778312
+pos=<7667696,94196419,41409153>, r=86774357
+pos=<-47571004,37469854,46817463>, r=84183789
+pos=<-4156736,84010739,52365610>, r=92858630
+pos=<6056924,12888978,84519517>, r=71785287
+pos=<-47345906,30387796,45986301>, r=76045882
+pos=<-14305750,38815805,53464135>, r=58911123
+pos=<-5509681,53176769,46879448>, r=57891332
+pos=<-12499446,35923605,56390435>, r=57139055
+pos=<-52764985,37485922,49356853>, r=91933283
+pos=<-995676,157395073,-3073485>, r=52828911
+pos=<20007537,18034710,53163539>, r=53689323
+pos=<14489164,16396768,90904833>, r=66230860
+pos=<-56656961,29846250,59765242>, r=98593988
+pos=<12580077,72518760,77049199>, r=89313340
+pos=<100504676,32770164,49001641>, r=86735485
+pos=<56363428,40982042,51325603>, r=53130348
+pos=<67579027,45292106,26873551>, r=79786057
+pos=<26991023,51464352,68172728>, r=51087111
+pos=<-2477721,38040811,90549029>, r=83393046
+pos=<39812282,49420172,27946843>, r=55074069
+pos=<-7592987,58715561,48320434>, r=66954427
+pos=<7777052,28459937,51985707>, r=53419415
+pos=<-34825568,30793001,25736210>, r=81537269
+pos=<-24303136,54965408,48394944>, r=79988927
+pos=<-23117889,8738217,68644161>, r=89235517
+pos=<-25024083,8306905,47947646>, r=70876621
+pos=<2007442,56985136,59636415>, r=66939562
+pos=<-13687550,71578246,57121637>, r=94712935
+pos=<-16345760,32983233,89061217>, r=90715694
+pos=<86368374,35824210,61445425>, r=88097056
+pos=<-35743614,53334234,57645839>, r=99049305
+pos=<-15191744,62377081,28606960>, r=90616727
+pos=<15180924,74088799,62177344>, r=73410680
+pos=<87747671,31399471,31905651>, r=81030076
+pos=<490300,35168974,87629502>, r=74633619
+pos=<-7639730,47107985,53037366>, r=60110529
+pos=<-15154000,47565888,46724248>, r=61769578
+pos=<-15930553,8949295,49890450>, r=63083820
+pos=<-2085646,59550216,190147611>, r=69262241
+pos=<7225777,50890764,62861738>, r=58852281
+pos=<90275849,20142660,46920592>, r=75399045
+pos=<-26764544,42182428,46746825>, r=68019674
+pos=<76321467,29233298,55996378>, r=66010239
+pos=<-72399950,54572749,137176788>, r=75623903
+pos=<20511710,69381130,54777605>, r=55972482
+pos=<11171812,-1838585,60251989>, r=57130513
+pos=<-15322219,34977106,95397324>, r=98022178
+pos=<45186029,75515109,54316351>, r=79476635
+pos=<-33243023,32685580,54621141>, r=72875433
+pos=<-61584462,35077699,48778369>, r=97765970
+pos=<-2080973,32701858,77315532>, r=64423903
+pos=<-28378799,39591108,22227847>, r=87396852
+pos=<-8099746,62641467,55946146>, r=79012806
+pos=<-24720179,45274695,48132554>, r=70452861
+pos=<20784250,45013508,95099754>, r=71654519
+pos=<-30064753,33988072,46097252>, r=62475758
+pos=<34563348,30488217,55672227>, r=86287854
+pos=<-16742541,7677207,74209817>, r=89487059
+pos=<48717911,60141573,64839376>, r=78157946
+pos=<11980231,77201897,12503508>, r=94373076
+pos=<-35767666,29757894,59267775>, r=77118779
+pos=<-22126819,32362172,682297>, r=95461509
+pos=<-20183006,18654168,80542091>, r=88282618
+pos=<29158741,90530365,43109268>, r=70368234
+pos=<78589607,47357015,57145573>, r=87551217
+pos=<53822697,51713673,83991488>, r=93986944
+pos=<-37287747,28688663,72807970>, r=91110215
+pos=<13542941,37989744,51992083>, r=61754737
+pos=<14525371,30291586,55624740>, r=74352172
+pos=<65594982,25847880,72811378>, r=70903881
+pos=<85028254,32319009,59775298>, r=81581589
+pos=<-47952231,24568531,49936283>, r=79531659
+pos=<-21321958,21913518,49475661>, r=55095834
+pos=<-48453939,34233126,49830769>, r=84843339
+pos=<99391685,35202974,43142729>, r=85240537
+pos=<22710331,34170304,55092906>, r=91207796
+pos=<-12135705,32243191,63938331>, r=60642766
+pos=<-12338157,43480193,54115729>, r=62259632
+pos=<8622864,24881999,3805702>, r=58230495
+pos=<34000374,4364405,71395390>, r=59376643
+pos=<-19712623,50327429,47038637>, r=69404671
+pos=<-8596487,17062414,87164926>, r=84910663
+pos=<-18913938,45008114,51843283>, r=68090880
+pos=<19472967,181579393,106030809>, r=56142937
+pos=<-17173370,-3226764,55066991>, r=81678816
+pos=<63850431,62835473,23871657>, r=96602589
+pos=<-3798894,30299579,101412001>, r=87836232
+pos=<9068586,62089120,57368844>, r=62714847
+pos=<-22474207,29499886,47923819>, r=52223751
+pos=<-45651602,35036414,46323892>, r=79337438
+pos=<-12419250,32111741,56514558>, r=53370983
+pos=<12664542,52854651,103268523>, r=95784065
+pos=<22357114,12328694,108875611>, r=80401468
+pos=<-6746842,50055566,49180574>, r=58308458
+pos=<-27320265,33686937,48286622>, r=61619350
+pos=<-5359976,29458721,92619986>, r=79764181
+pos=<10052919,30248699,46342959>, r=64500134
+pos=<31603672,24458394,109318746>, r=74809324
+pos=<15363324,39635782,101274262>, r=77872183
+pos=<13846270,53578231,29556061>, r=51830690
+pos=<-15354477,46149883,46658194>, r=60488156
+pos=<-569362,85626876,46006904>, r=84528844
+pos=<10749296,42284246,82711135>, r=66571646
+pos=<-14856420,53289609,77345425>, r=97817094
+pos=<-23825436,15929136,64937891>, r=79045870
+pos=<89568342,30383137,46009564>, r=70420359
+pos=<13145554,32649278,85217834>, r=57047183
+pos=<554467,16643477,85598183>, r=74612189
+pos=<36666635,41828463,88364574>, r=71318747
+pos=<12602990,89529451,67821002>, r=97072935
+pos=<-33112360,18329619,59694200>, r=80688742
+pos=<-15561603,38236853,67667639>, r=73791835
+pos=<3519076,58523179,5256274>, r=91402635
+pos=<37058015,73816180,6497217>, r=98165326
+pos=<-485820,34664283,76480969>, r=63956703
+pos=<8046540,50222182,60417372>, r=54918488
+pos=<6698732,2095928,57478145>, r=54895175
+pos=<-110267625,103715108,49404770>, r=83596582
+pos=<14488717,37517183,47868787>, r=90880734
+pos=<11594929,31481958,92334208>, r=64546675
+pos=<13142664,33433973,51871828>, r=78783673
+pos=<14725843,21079396,84588725>, r=54995145
+pos=<17991922,28746415,53178977>, r=62665596
+pos=<21345476,109893878,54658351>, r=95532225
+pos=<99514509,32213492,45962288>, r=82149323
+pos=<37772543,40405568,108402968>, r=91040181
+pos=<16477866,1889108,-9755558>, r=86930037
+pos=<6066766,45074819,93307079>, r=84640752
+pos=<63259627,39790194,63298460>, r=70807277
+pos=<85870661,25697065,48142683>, r=66661876
+pos=<-20063299,13270466,81943036>, r=94947530
+pos=<9219021,14187810,110350611>, r=93155487
+pos=<11396690,79601451,29059476>, r=80800086
+pos=<-5992626,63895408,63403216>, r=85617223
+pos=<13745746,56178190,15154849>, r=68932414
+pos=<-19200598,41415603,54301128>, r=67242872
+pos=<66801369,67709049,33790327>, r=94508881
+pos=<-58054899,31429373,50412427>, r=92222250
+pos=<17725131,19747008,101361033>, r=70100661
+pos=<16315702,21937157,109577476>, r=77536345
+pos=<-21450279,31429149,47689387>, r=52894343
+pos=<16503867,46780903,71008828>, r=53611297
+pos=<-10617311,71781674,53581209>, r=88305651
+pos=<-18369624,34464166,58808640>, r=63968022
+pos=<-44338154,47516775,49329347>, r=93509756
+pos=<7546939,23561808,74615854>, r=49718921
+pos=<-23553075,43233473,30179868>, r=78262286
+pos=<-33728549,33419608,75400040>, r=94873708
+pos=<4130401,-415851,60422323>, r=62919529
+pos=<12199308,42656684,46658363>, r=62914010
+pos=<-10823045,40017720,87358982>, r=90525236
+pos=<54855928,43498518,54679995>, r=57493498
+pos=<12261573,29515175,45893575>, r=97366173
+pos=<15817533,48376146,72425161>, r=57309456
+pos=<22499943,43484899,49303866>, r=84870164
+pos=<15087449,40820405,15442472>, r=51945357
+pos=<2380830,39189079,87564730>, r=76698440
+pos=<10292232,61644825,58639264>, r=62317309
+pos=<-25063352,29824290,49726684>, r=56939825
+pos=<9247300,60592893,82851862>, r=86522910
+pos=<34974237,51631378,71206261>, r=62271044
+pos=<11115341,39008866,88216499>, r=68435471
+pos=<-47347839,33255463,54507917>, r=87436830
+pos=<-12385471,35476634,66586332>, r=66774052
+pos=<40297014,43609070,76102045>, r=64467152
+pos=<-25028316,48459326,70188306>, r=96001387
+pos=<29716238,95743100,36047260>, r=83200834
+pos=<-2195894,57161709,59974579>, r=71657615
+pos=<-34897564,36092514,37195303>, r=75449626
+pos=<-34350080,30930206,62762967>, r=80368703
+pos=<-13299160,-1305686,52546724>, r=73363335
+pos=<74203994,40071747,39943051>, r=68121068
+pos=<-30255218,53252625,55149209>, r=90982504
+pos=<-23708755,36047177,30518158>, r=70892646
+pos=<-42225041,28551593,47086408>, r=70188476
+pos=<45093813,91953991,40089158>, r=90747011
+pos=<20989497,-9578662,65146013>, r=59947021
+pos=<-9469151,9360043,19787978>, r=75862353
+pos=<-10455182,76182076,47046337>, r=86009032
+pos=<1489674,30920418,49075947>, r=50871653
+pos=<-1805815,40895592,59548754>, r=54575822
+pos=<22434664,50411195,76723826>, r=57025799
+pos=<1351173,-35240030,57415985>, r=97516622
+pos=<-32995557,45695405,31582059>, r=88763841
+pos=<96147879,48598772,48672050>, r=97877850
+pos=<71556712,165083816,80525352>, r=61212474
+pos=<-26738516,51821211,51973287>, r=82858872
+pos=<-45126452,24625563,45768892>, r=72481504
+pos=<-1724534,91435747,47738636>, r=93224354
+pos=<-42642617,17009143,50075464>, r=81920769
+pos=<52222152,55156460,54199932>, r=66037534
+pos=<8639285,85433958,47459393>, r=76579513
+pos=<10141717,61817092,48597374>, r=52598556
+pos=<47916267,47143215,50290112>, r=49808644
+pos=<-1999143,50275699,76700962>, r=81301257
+pos=<-41681257,20679616,56340422>, r=83553725
+pos=<35884408,41646080,79776061>, r=61765620
+pos=<4301038,52856724,21630776>, r=68579717
+pos=<-40960612,30439627,37255922>, r=75799466
+pos=<35444048,43762938,84706440>, r=68372926
+pos=<79975658,29137911,50197120>, r=63769730
+pos=<93007,44307904,61961116>, r=58501565
+pos=<-32671755,39076539,66101849>, r=90175907
+pos=<-19991034,51969552,46041742>, r=70328104
+pos=<-35314188,37602800,46861313>, r=72103772
+pos=<37201145,71666894,82972323>, r=96299533
+pos=<-49234235,28079826,57132180>, r=86771712
+pos=<8312877,40022919,72604965>, r=56640475
+pos=<39181205,52790049,92153926>, r=88584204
+pos=<7068698,47606987,62510305>, r=55374127
+pos=<30603349,56814294,106942634>, r=98819430
+pos=<16115552,28332758,35601360>, r=54887656
+pos=<10074393,95989908,47950308>, r=86191298
+pos=<-5591354,49710053,47446079>, r=55073040
+pos=<-16059874,70092354,52417407>, r=90895487
+pos=<-3286599,20110685,83441267>, r=72828890
+pos=<-6936335,22574502,22140566>, r=57762340
+pos=<32992478,36116750,76761537>, r=50329801
+pos=<-89483882,3641127,125934475>, r=84985845
+pos=<45083402,48971622,84039680>, r=82553733
+pos=<16543763,-12232511,59927146>, r=61828172
+pos=<-128930120,71482570,52773218>, r=59057806
+pos=<-3321066,36249470,10553454>, r=70672189
+pos=<11035114,-4452527,60224262>, r=59853336
+pos=<-26291008,49849603,66835908>, r=95302073
+pos=<7937807,81400916,47819246>, r=73607886
+pos=<16576233,48187487,42040402>, r=56973312
+pos=<4344158,75290424,35788694>, r=76812485
+pos=<32189900,-55403075,49857150>, r=95795351
+pos=<17696418,36185949,87820170>, r=58635317
+pos=<777488,12020182,61326632>, r=54740630
+pos=<33863194,35023084,109647702>, r=82992971
+pos=<27201238,50703815,113905343>, r=96269385
+pos=<13342983,51362786,14113529>, r=65561106
+pos=<-3406344,1514525,71500197>, r=79603699
+pos=<-4003952,88211664,52599168>, r=97140440
+pos=<7364870,66805533,30929588>, r=70166122
+pos=<4337235,69741240,49137686>, r=66867686
+pos=<39289283,41543331,80086140>, r=65377837
+pos=<31061019,37187231,96617615>, r=69325024
+pos=<12227872,90873558,49623164>, r=80594302
+pos=<-29205869,34879980,48574906>, r=64986227
+pos=<-23428908,25034353,70988758>, r=75595080
+pos=<31236415,75651801,72043812>, r=83391270
+pos=<-35663336,33550704,50545521>, r=72085007
+pos=<-25373194,33271630,48939058>, r=59909386
+pos=<81186014,21770112,48774152>, r=66535373
+pos=<-36266473,21205391,64408172>, r=85681063
+pos=<46509791,41930052,-8736829>, r=90965014
+pos=<-22028107,15234691,51487555>, r=64492638
+pos=<-20542339,31539802,48757530>, r=53165383
+pos=<13662571,56928981,15523678>, r=69397563
+pos=<-12746344,18867316,85938166>, r=86028894
+pos=<-301007,47558794,60352290>, r=60537813
+pos=<32207624,60299805,78729522>, r=75695968
+pos=<100081770,31328053,46754080>, r=82623316
+pos=<-48070787,30652729,47098499>, r=78147703
+pos=<3499835,47702960,54008261>, r=50536940
+pos=<-30212070,27990135,63986849>, r=74514607
+pos=<-15832151,28224015,56445561>, r=52827166
+pos=<-67978767,28737500,46365512>, r=95407212
+pos=<-30015019,22627881,66498575>, r=80097431
+pos=<-3376964,87518399,46889764>, r=90110663
+pos=<-12133745,41888151,15297059>, r=80379652
+pos=<-3430750,43859378,-4475364>, r=93420295
+pos=<10612582,58698878,71450281>, r=71862044
+pos=<-16853417,30239412,55512427>, r=54930714
+pos=<9856655,-15034177,76105296>, r=87495006
+pos=<19700487,14896792,94233323>, r=65848189
+pos=<90908533,40366432,47407308>, r=83141710
+pos=<53053613,45815347,47231085>, r=50559042
+pos=<91606120,30241005,62870344>, r=89176478
+pos=<6549177,28253488,45947118>, r=89716871
+pos=<-54966251,31984766,51327953>, r=90604410
+pos=<11739879,47302011,70593259>, r=58480946
+pos=<17782015,-43385757,45900297>, r=77715722
+pos=<-22321136,33175591,26785779>, r=70365922
+pos=<7447288,64317364,46803776>, r=55999602
+pos=<7212096,101522192,49782085>, r=96417911
+pos=<9756698,57513943,50726200>, r=50809212
+pos=<53938302,42703477,85380074>, r=86480889
+pos=<6127018,32634301,81765609>, r=60598446
+pos=<16024259,75089269,42148970>, r=58570841
+pos=<-14467950,30833664,53148474>, r=50775521
+pos=<1055620,-8213227,49647151>, r=63016576
+pos=<20109959,34289334,98011242>, r=64516119
+pos=<-51406886,30261849,39781808>, r=83541835
+pos=<21609187,48166640,103039225>, r=81922186
+pos=<-37318020,42076555,46223326>, r=77943551
+pos=<-9802864,50149053,57309602>, r=69587023
+pos=<8892924,30956296,4508427>, r=59209772
+pos=<17951962,38815438,50096954>, r=68485096
+pos=<12306030,97501425,46533603>, r=84054466
+pos=<-37463875,31083117,49553934>, r=70426366
+pos=<92230728,52683980,47015111>, r=96388808
+pos=<9364608,56647782,54993450>, r=54602057
+pos=<8684942,36838535,105538060>, r=86017275
+pos=<-35827611,42789189,57956518>, r=88898907
+pos=<5807845,31720781,7757680>, r=59810369
+pos=<-25365859,48253374,51239130>, r=77183993
+pos=<-13706311,23188045,2328735>, r=83730603
+pos=<-1053434,40958215,58697392>, r=53034540
+pos=<16686564,43884661,76779893>, r=56303739
+pos=<94046858,44171067,48044994>, r=90722205
+pos=<-59177933,25088148,47504944>, r=87806389
+pos=<-18654288,54793837,56331529>, r=82105172
+pos=<113519092,134203172,41554166>, r=95154840
+pos=<9436438,34715386,46078979>, r=73810378
+pos=<49732913,61362619,75247356>, r=90801939
+pos=<-54495041,22320842,50939618>, r=89325794
+pos=<12427539,17900057,11259909>, r=53954136
+pos=<16888421,45562882,95425764>, r=76425888
+pos=<-13394846,17877372,48322242>, r=50051600
+pos=<-20925432,28703245,52084455>, r=54038872
+pos=<8561924,38380609,101695915>, r=83840427
+pos=<76633366,35686884,48280680>, r=65060182
+pos=<15355031,32838431,53406732>, r=83822095
+pos=<-22241568,21612015,21308708>, r=74861862
+pos=<-45540364,39478825,56854957>, r=94199599
+pos=<-130761639,-7225545,18556230>, r=71625415
+pos=<12371981,60358241,50483820>, r=50795545
+pos=<-52881118,38556375,50525246>, r=94288177
+pos=<-5508845,44982595,39309821>, r=52836406
+pos=<-12223578,42705080,48054452>, r=55308618
+pos=<19782229,-391087,65138940>, r=51959480
+pos=<11688897,65712575,56641017>, r=62990663
+pos=<26728983,4877916,77607591>, r=57803924
+pos=<-66749809,31885857,41453884>, r=98836603
+pos=<12947494,40474371,72186292>, r=52038612
+pos=<22710949,73206326,90156950>, r=92977765
+pos=<21418285,58754538,74497516>, r=64159328
+pos=<-14006029,39388620,45791459>, r=51511854
+pos=<32331392,-9548718,53912995>, r=54138363
+pos=<-11103143,48665873,60597818>, r=72692378
+pos=<8404016,40264319,-15387292>, r=88902405
+pos=<-60697351,19761606,51535474>, r=98682907
+pos=<113332017,31654847,49314512>, r=98760760
+pos=<-17968649,23774520,26514627>, r=63220547
+pos=<-7891448,38548696,51246202>, r=50011819
+pos=<-36243928,28580831,31232834>, r=75246710
+pos=<2236746,78152395,33336820>, r=84233689
+pos=<-42646767,27988371,50996303>, r=73957310
+pos=<-12975938,19343337,62716304>, r=62560618
+pos=<-6698310,59281250,50138827>, r=68443906
+pos=<-29169469,6610144,55165008>, r=83936144
+pos=<-859099,48228088,68790664>, r=70203324
+pos=<-53259426,43091307,49454062>, r=98130240
+pos=<40051035,15273208,52961854>, r=55405641
+pos=<8599969,22173989,57555102>, r=96158345
+pos=<11561358,34996323,107452493>, r=83213190
+pos=<12971841,75769901,53455514>, r=68579059
+pos=<-24609077,31137632,12599716>, r=84801836
+pos=<39964941,58818274,67271078>, r=70513393
+pos=<11590874,44091058,16246818>, r=57908243
+pos=<11534010,42492557,73281128>, r=56565109
+pos=<46029692,44356665,33034407>, r=51140346
+pos=<230818789,28332006,48666836>, r=77009932
+pos=<-49307134,28877489,51162598>, r=81672730
+pos=<-24858611,61344602,49583599>, r=88112245
+pos=<-33971422,31026034,46645662>, r=63968617
+pos=<-14920621,60364341,48024490>, r=75635084
+pos=<-18886432,44383739,46645651>, r=62241356
+pos=<63367787,57050728,56716295>, r=81594314
+pos=<-29235501,30020585,46865414>, r=58446946
+pos=<-1116549,51739608,46803263>, r=51985095
+pos=<-12898335,8922965,49532990>, r=59720175
+pos=<11377440,35121435,54012286>, r=63237886
+pos=<-28362629,38084006,47961632>, r=66733755
+pos=<-32732759,53759806,34185847>, r=93961530
+pos=<-2049132,35100887,26872869>, r=51932182
+pos=<10307391,63192491,78308824>, r=83519668
+pos=<-11173886,50879581,47031969>, r=61411041
+pos=<-6714487,69428860,48945046>, r=77413940
+pos=<-35145310,126288277,94537390>, r=86514887
+pos=<15372059,77344628,57152598>, r=71450857
+pos=<-5534049,28501573,47802916>, r=70800310
+pos=<30282369,-27855631,57777471>, r=74260879
+pos=<27578388,34577846,94631718>, r=61246950
+pos=<5377307,28529784,46392652>, r=82994735
+pos=<-9288964,40034367,85892017>, r=87541479
+pos=<32663376,50111633,96347262>, r=83581281
+pos=<64590061,24883190,74402048>, r=72454312
+pos=<6011059,52895297,-9651139>, r=98190405
+pos=<-40075559,29164760,46796031>, r=68361786
+pos=<-27324257,33280398,58797836>, r=71727947
+pos=<65478625,51242475,73962244>, r=95142344
+pos=<-8161052,44514515,51881665>, r=56882708
+pos=<37117480,70516429,65453164>, r=77546136
+pos=<-66556175,24793456,46807708>, r=94782274
+pos=<6745175,-9697218,46249405>, r=55413236
+pos=<-15842202,54067556,49741202>, r=71976478
+pos=<-26234670,32761687,62384539>, r=73706383
+pos=<27047080,45210798,96262259>, r=72979567
+pos=<-54875381,19475504,41999639>, r=88941400
+pos=<15588049,51830394,45712337>, r=63164637
+pos=<78521098,9084198,53510654>, r=81292772
+pos=<-35117158,30884180,40930824>, r=66725315
+pos=<38517388,31310367,53377273>, r=93263507
+pos=<-34824848,35863485,57039123>, r=80052924
+pos=<87999262,21593229,36952685>, r=77127999
+pos=<-14970039,39281480,31602555>, r=64303877
+pos=<30996868,32710257,-7944148>, r=65439616
+pos=<-46544578,32730823,48455778>, r=80056612
+pos=<-25655223,54235827,24268664>, r=97277174
+pos=<-31661104,34739101,46810221>, r=65535871
+pos=<-15725105,33623089,58648908>, r=60322582
+pos=<30366481,48524611,105759957>, r=89110268
+pos=<7896511,67058144,60224279>, r=71711348
+pos=<8886133,36820409,69879921>, r=50139913
+pos=<-35009499,24967338,48346229>, r=64600051
+pos=<12236743,61232811,36406256>, r=54244674
+pos=<32133015,71147471,65672434>, r=73411928
+pos=<-4312430,48491142,58819757>, r=63948774
+pos=<-11255504,48618070,49019953>, r=61218979
+pos=<-36126448,28661597,45905741>, r=63019487
+pos=<6995492,-14641677,39110487>, r=64076982
+pos=<-494882,62507397,74981307>, r=90309172
+pos=<21658971,20515757,32538766>, r=68078733
+pos=<-42721200,2165630,50987236>, r=97754561
+pos=<-46441522,14810192,60365689>, r=98209160
+pos=<48051150,31166319,50307623>, r=70921992
+pos=<28821739,29694631,-1122960>, r=53427671
+pos=<-54273229,34572094,50463893>, r=91634895
+pos=<14673784,34863932,82993530>, r=55509157
+pos=<-32934723,17649588,51138183>, r=72635067
+pos=<-50994378,41060824,52259311>, r=96639953
+pos=<-13412903,29052830,62027839>, r=56819094
+pos=<16028543,72922360,86313287>, r=95532757
+pos=<-29190239,30088199,43593943>, r=57339282
+pos=<-67676350,28809916,49909454>, r=98721154
+pos=<-43374507,39597274,53913745>, r=89211024
+pos=<-27366900,30364601,50115222>, r=60172177
+pos=<16917628,52399768,64291470>, r=52099066
+pos=<41279617,21014635,54307699>, r=93725431
+pos=<1365818,19740622,70504983>, r=55610202
+pos=<-54647289,29012271,49857475>, r=85842468
+pos=<44221414,66917783,53886884>, r=69485079
+pos=<-9940873,70529264,26788845>, r=95336159
+pos=<-2891536,43027095,81243592>, r=79487809
+pos=<16856578,70770998,65638794>, r=71878974
+pos=<48647431,57474901,3221288>, r=96689472
+pos=<18398962,37387340,106423442>, r=77737407
+pos=<6875506,40281303,93455690>, r=79187050
+pos=<2454291,28249463,81600089>, r=59720809
+pos=<-1468549,29220087,631469>, r=71712205
+pos=<1576323,77863026,52114347>, r=80726896
+pos=<11328724,-1103809,57250256>, r=53237238
+pos=<14166873,32412130,88906135>, r=59476952
+pos=<68172516,66679724,50794113>, r=90105431
+pos=<-4882904,63239852,64521058>, r=84969357
+pos=<-39573626,43281992,58908860>, r=94089955
+pos=<47082853,25450033,45728957>, r=77686997
+pos=<30259034,36081601,79825507>, r=50625134
+pos=<13485963,34007713,111156423>, r=84003646
+pos=<-103414983,93539548,30098680>, r=85922019
+pos=<-6802701,-3790574,59234245>, r=76039201
+pos=<82390172,51540341,50478214>, r=88867872
+pos=<5396715,-12159909,37977747>, r=64326869
+pos=<60082922,38998779,61741375>, r=65282109
+pos=<-16364819,10714145,61687053>, r=73549544
+pos=<-58301485,30719708,55794510>, r=97141432
+pos=<16352057,56953747,89166657>, r=82093799
+pos=<-34630538,59464956,51639108>, r=98060041
+pos=<490228,30703545,109025168>, r=91563918
+pos=<-6013632,8426824,52874814>, r=56673453
+pos=<-36209880,25159205,51113229>, r=68375671
+pos=<17796723,1411910,80111570>, r=67114697
+pos=<-31889116,28510083,45862954>, r=58587653
+pos=<19168448,33254095,39684567>, r=98395168
+pos=<-6095859,46062067,73594989>, r=78078378
+pos=<-304797,59105732,57302395>, r=69038374
+pos=<55099745,36449947,86305322>, r=82314003
+pos=<33473188,6098096,-4438050>, r=79487709
+pos=<-31472777,36089404,51315048>, r=71202749
+pos=<15962314,28423814,-7317040>, r=61433573
+pos=<7998189,2801039,69890583>, r=65303215
+pos=<130870385,104831832,11196492>, r=68126888
+pos=<-5327566,58947831,12940865>, r=92989660
+pos=<3824920,57094208,49926985>, r=55521839
+pos=<-1717656,36673098,102114555>, r=92830763
+pos=<-6542148,37528701,53564176>, r=49960544
+pos=<-14811298,29054822,83783336>, r=79975290
+pos=<-37201984,61523961,41570442>, r=98810391
+pos=<20636169,30198837,103026121>, r=64914223
+pos=<10371395,31519349,55590694>, r=62337567
+pos=<31884149,40789942,72870652>, r=50003827
+pos=<-30398435,29198407,42512686>, r=58738952
+pos=<43939568,28346223,78157090>, r=54901870
+pos=<9128846,67552702,83250788>, r=94000232
+pos=<-2588856,30760371,91977867>, r=77653177
+pos=<15962420,82995471,76760935>, r=96119428
+pos=<-33661280,31365698,48813484>, r=66166075
+pos=<-16115499,43852463,46308402>, r=58601848
+pos=<-6987272,33841983,84781289>, r=77936013
+pos=<-485860,34594456,81980122>, r=69386193
+pos=<-15363694,37898885,53146470>, r=58734501
+pos=<-17124380,71830052,45774058>, r=87053925
+pos=<8219084,70226598,55923252>, r=70256199
+pos=<-3903209,29453615,46544603>, r=75288840
+pos=<-9159457,25097083,71581481>, r=61856037
+pos=<-6436575,16618931,70357346>, r=66386656
+pos=<-8806699,29246129,72352585>, r=62730916
+pos=<68862343,36688765,49225208>, r=59235344
+pos=<-79171684,112113447,67348279>, r=92995215
+pos=<2638935,25190324,85791990>, r=64174419
+pos=<14827988,29466545,48474491>, r=98818958
+pos=<-14381380,32037768,62743833>, r=61488450
+pos=<3154619,88011848,41382872>, r=85129150
+pos=<51747013,31306559,79606148>, r=67118845
+pos=<4782291,34063349,70169217>, r=51776099
+pos=<-39091050,45657329,51675336>, r=88749304
+pos=<-26634338,29826468,49344705>, r=58131168
+pos=<28955639,11886714,83389681>, r=58803847
+pos=<-13895377,39956378,49929456>, r=56106810
+pos=<-20174467,38776446,18529455>, r=82076331
+pos=<11908029,50316295,76200518>, r=66934331
+pos=<79036827,16924288,76062556>, r=96520365
+pos=<9584540,67893747,64596741>, r=75231780
+pos=<1999297,28072699,90660851>, r=69059706
+pos=<-4999516,1406744,49697518>, r=59502059
+pos=<-12138046,52832626,53760320>, r=71057036
+pos=<14911107,50532270,74102432>, r=62049081
+pos=<-28076669,-5209886,42939079>, r=85888492
+pos=<-1381979,35962916,89448258>, r=79118686
+pos=<-27555180,38443112,78090455>, r=96414564
+pos=<-45684157,22499678,51249216>, r=80645467
+pos=<-33262343,42412693,21018032>, r=96311801
+pos=<-24933943,30266769,36206604>, r=60648927
+pos=<47087640,55749463,76069992>, r=83366515
+pos=<40948562,39725308,77828570>, r=62961879
+pos=<-21047756,32265813,60780681>, r=66419686
+pos=<37924327,42452651,67877724>, r=52713763
+pos=<-58689938,30781189,50489915>, r=92286565
+pos=<13216582,64885410,61404468>, r=65398749
+pos=<-43382614,29830485,70345833>, r=95884395
+pos=<-20520219,36470699,75190567>, r=84507131
+pos=<14237854,59338973,85949685>, r=83376237
+pos=<-450228,37867875,64907958>, r=55551952
+pos=<17760677,61033651,84995936>, r=80594372
+pos=<22176975,82022403,46533128>, r=58704060
+pos=<22779974,94329178,17857701>, r=95346900
+pos=<-38001053,34049218,49600706>, r=73976424
+pos=<16848379,29946291,48116237>, r=55533891
+pos=<-42631692,35454176,53098888>, r=83510344
+pos=<4649340,48178580,58429391>, r=54284128
+pos=<847183,51607513,81674534>, r=84760407
+pos=<-21437870,4973092,57201053>, r=79877495
+pos=<-31919810,30134447,55487065>, r=69866771
+pos=<-27341158,67125553,48484104>, r=95276520
+pos=<34772295,-8690710,66519732>, r=68327958
+pos=<-31969415,39408252,48343122>, r=72046242
+pos=<102875003,13271850,46851582>, r=94799961
+pos=<-12487583,35034265,55339911>, r=55187220
+pos=<9093156,39769707,84017977>, r=67020115
+pos=<-16380910,41574541,66165228>, r=76446125
+pos=<78145797,37164108,49128463>, r=68897409
+pos=<12696275,29248422,93349910>, r=62227566
+pos=<3806267,80300805,32983373>, r=85166064
+pos=<96882526,36942217,48757938>, r=87041670
+pos=<-171249798,39499790,57712028>, r=97294519
+pos=<-2013420,51530722,55656270>, r=61525906
+pos=<10506453,22608309,43074519>, r=92987198
+pos=<-12980027,57643628,73634339>, r=96583452
+pos=<9759074,34807718,46383535>, r=76510831
+pos=<-46481921,33185083,62928260>, r=94920705
+pos=<-41982125,32478135,69194276>, r=95980083
+pos=<6066850,16557724,-23317282>, r=96233732
+pos=<-27420476,39804614,13027130>, r=95852751
+pos=<-35598484,27994414,43416148>, r=61831662
+pos=<53497255,74968025,34467126>, r=87786515
+pos=<5629165,76030721,52476464>, r=75203884
+pos=<-52112524,15110086,40185629>, r=92357875
+pos=<-23905340,18683396,67786661>, r=79220265
+pos=<1204692,65009004,78621903>, r=94751674
+pos=<-10066560,46695198,48547405>, r=57634798
+pos=<10289802,-10697128,21104545>, r=74844012
+pos=<-40310292,28833507,46959457>, r=68428878
+pos=<-13764816,49841026,61895287>, r=77826610
+pos=<-19679027,58605601,66152788>, r=96763074
+pos=<8809311,33356810,46152100>, r=63432984
+pos=<-29709153,29461995,49058531>, r=60555118
+pos=<-13129092,-9705209,46828679>, r=75874660
+pos=<102118197,31480871,42422516>, r=84965146
+pos=<-32517383,30565130,33503263>, r=71234788
+pos=<9534874,52896280,70697014>, r=66384094
+pos=<16880678,65311318,51702479>, r=52458646
+pos=<-36132788,43209378,55775064>, r=87442665
+pos=<22744530,34380596,134099136>, r=98061118
+pos=<-26547963,41862023,60462772>, r=81198255
+pos=<-545734,40978449,60677738>, r=54527403
+pos=<16538063,68562231,28273188>, r=65405796
+pos=<14494679,58745235,31512009>, r=54393346
+pos=<7791169,67262375,35493930>, r=65632071
+pos=<8485973,48520508,103076567>, r=95436538
+pos=<8214274,28745216,50655896>, r=92680074
+pos=<-6937397,27971689,49092605>, r=65350532
+pos=<-22481435,9380958,40012423>, r=68629066
+pos=<62129884,16597211,12546768>, r=80660497
+pos=<6258688,62081024,87730516>, r=95878363
+pos=<-32278381,28495170,53585234>, r=66684251
+pos=<8040391,72063718,51083757>, r=67432585
+pos=<-5673174,25046673,73686241>, r=60524423
+pos=<-8001243,63756911,61002978>, r=85086692
+pos=<-26577068,41949907,46813510>, r=67665926
+pos=<27314118,87945331,52949180>, r=72667621
+pos=<-20191543,30416348,7242015>, r=85020749
+pos=<-40509210,25805511,61018374>, r=81933846
+pos=<-27572422,16102428,56368833>, r=74050704
+pos=<-11240828,50248391,27895560>, r=75248609
+pos=<34613570,41153477,100115019>, r=80341645
+pos=<15579024,9723842,69284527>, r=50193328
+pos=<-46066212,37488646,47288596>, r=83168980
+pos=<16651399,81480864,60218612>, r=77373965
+pos=<-4490123,12256693,29836426>, r=57938091
+pos=<-9722027,38414943,53203837>, r=53666284
+pos=<-17608773,53047624,65044179>, r=88026024
+pos=<-46201175,24018662,58511638>, r=86905837
+pos=<83707615,22862590,47033198>, r=66223477
+pos=<75278564,31837146,46877582>, r=58452382
+pos=<66228245,28297748,1246309>, r=87068293
+pos=<-41563889,138361221,22834552>, r=92320836
+pos=<-15149458,41692211,57568440>, r=66735557
+pos=<-29959760,29199939,50714596>, r=62199729
+pos=<42142694,49570710,97616140>, r=93788536
+pos=<61202922,61131481,71470186>, r=98263590
+pos=<29827492,38051686,24415070>, r=56692483
+pos=<17592777,73628928,77556835>, r=85918423
+pos=<-20783874,35242533,54629155>, r=62981079
+pos=<64237574,1302210,73405037>, r=94685683
+pos=<-21188594,47968883,69462691>, r=90945802
+pos=<30657831,49880981,-20723938>, r=95051093
+pos=<22864844,93114017,56937539>, r=79512153
+pos=<36531726,66041045,59031978>, r=66063917
+pos=<19846259,-13074428,65015549>, r=64455431
+pos=<-7113733,38738967,15168250>, r=72339348
+pos=<-25341686,54431754,46334838>, r=78433824
+pos=<20656999,57196763,75771625>, r=64636928
+pos=<-22838713,34493030,27829494>, r=71157081
+pos=<-27835555,38366205,61876949>, r=80404149
+pos=<79754868,48144480,60613367>, r=92971746
+pos=<20721233,45043536,93948762>, r=70596524
+pos=<-46680111,37879564,53763782>, r=90648947
+pos=<16009840,86125003,58588086>, r=81028766
+pos=<20025736,5391570,85015946>, r=65810395
+pos=<33720066,104264468,55486952>, r=97930498
+pos=<-63554526,31193768,49947114>, r=97020908
+pos=<-55699886,23371204,32454537>, r=95415201
+pos=<73230725,36900143,48087090>, r=62677110
+pos=<-32963671,28309367,52478944>, r=66077418
+pos=<5939165,55024902,62755578>, r=64166779
+pos=<-24917309,29082130,46444648>, r=52769524
+pos=<7735621,49034186,60918429>, r=54542530
+pos=<4877732,8430499,59198278>, r=52101779
+pos=<83731770,35839732,49766995>, r=73797528
+pos=<-11074931,33743791,62322816>, r=59467077
+pos=<47699715,55835903,55060273>, r=63055430
+pos=<37657191,-9104085,74776203>, r=79882754
+pos=<-46744861,30151111,64292721>, r=93514232
+pos=<-13186319,46003906,17086538>, r=83758581
+pos=<32840031,56015193,64841941>, r=58156157
+pos=<6062205,42632964,47615029>, r=73781872
+pos=<-19799971,51835559,58790016>, r=82751306
+pos=<-30893469,30656893,46300617>, r=60176438
+pos=<-55830501,22240501,57274377>, r=97076042
+pos=<15868849,46019629,96676898>, r=79153313
+pos=<-16265649,52075245,75590161>, r=96256506
+pos=<14624864,56207969,57618910>, r=51527552
+pos=<318934,59504614,60032696>, r=71543938
+pos=<-23487442,41093331,19776590>, r=86459237
+pos=<67237678,41609284,51037661>, r=64343635
+pos=<-19179700,33732993,56360250>, r=61598596
+pos=<-34730837,5580174,61364913>, r=96727618
+pos=<53061020,1668645,85754857>, r=95492537
+pos=<3877306,43959248,85023639>, r=77431037
+pos=<-10413451,33996655,77197477>, r=73933065
+pos=<-15270541,18375898,55749133>, r=58855471
+pos=<37599773,64150517,58789624>, r=64998919
+pos=<6641382,32884368,86779494>, r=65348099
+pos=<-28989825,39572241,63995218>, r=84883334
+pos=<12972158,71582537,87975353>, r=98911274
+pos=<41852603,48069590,65721204>, r=60103061
+pos=<-12895423,34234299,51393776>, r=50848940
+pos=<76683281,42692313,48821155>, r=72655746
+pos=<9795431,-286238,55311954>, r=52014423
+pos=<-12408641,28693619,67844073>, r=61271790
+pos=<18776047,80030396,38475557>, r=64433947
+pos=<75995398,33442514,24888484>, r=78338116
+pos=<-22764877,22172460,58097441>, r=64901579
+pos=<10239772,40250323,68821851>, r=51158213
+pos=<-6984206,11263546,-3408779>, r=94670545
+pos=<-25723496,46861709,48289286>, r=73199930
+pos=<5729735,28403922,117678625>, r=92678286
+pos=<11079147,38654325,86908021>, r=66808654
+pos=<19012903,51490161,13432661>, r=60699507
+pos=<-19708767,24665073,51422478>, r=52677853
+pos=<2549542,80274103,46746108>, r=76796138
+pos=<-48466554,29995042,56395431>, r=87182744
+pos=<86083343,46696534,52688635>, r=89927531
+pos=<19978558,94248897,26059694>, r=89865438
+pos=<21928133,43444423,89266701>, r=63108468
+pos=<-32662150,34466095,53616954>, r=73070642
+pos=<-4767571,24202491,48306992>, r=52750940
+pos=<-6049891,44411137,66256832>, r=69043725
+pos=<14845730,-1633797,-11680131>, r=94009220
+pos=<65363,73430740,49753549>, r=75444608
+pos=<10919543,55374161,60523054>, r=57303105
+pos=<-33344704,36874381,61740346>, r=84284898
+pos=<90823294,32581102,47524970>, r=75388376
+pos=<56762466,39329407,28284461>, r=61595785
+pos=<14326905,38412743,-13806339>, r=79547110
+pos=<-27408929,29564102,49418580>, r=58717093
+pos=<72828690,34540465,56644790>, r=68473289
+pos=<-23879984,-80533415,-13926388>, r=52569551
+pos=<623363,23117915,46129959>, r=71699945
+pos=<-21310687,28343530,48201114>, r=50180986
+pos=<-11268087,54197123,60947343>, r=78738009
+pos=<62637156,43374891,28845119>, r=70955785
+pos=<101486863,29252465,58609523>, r=93807860
+pos=<-7121743,-17618647,50972485>, r=81924604
+pos=<33712412,33093334,104500328>, r=75765083
+pos=<70057598,30520257,59928664>, r=64965508
+pos=<13577885,32272356,41344051>, r=98076208
+pos=<8955771,46905424,22660149>, r=56944295
+pos=<-31671198,35282234,47777117>, r=67056086
+pos=<-28701991,29968381,30147369>, r=70177802
+pos=<46883174,34145057,15459578>, r=59357035
+pos=<-21541824,-3738229,54506228>, r=85997940
+pos=<-7165905,-13698956,55634555>, r=82711088
+pos=<-42136026,37824576,54914702>, r=87201260
+pos=<75444044,34090961,64356096>, r=78350113
+pos=<27070208,76993574,17498441>, r=80354253
+pos=<-24556265,40605071,29335340>, r=77481284
+pos=<7679148,40322729,74549753>, r=59518815
+pos=<64743952,34069862,51081505>, r=54354571
+pos=<7888777,51012156,-6093924>, r=90872090
+pos=<-38312643,6053130,45786004>, r=84257215
+pos=<-10907447,30880694,71717384>, r=65831363
+pos=<-21415341,33770607,55616361>, r=63127773
+pos=<-9268341,12931923,58776983>, r=61325095
+pos=<53680780,36878021,92991425>, r=88009224
+pos=<16325289,32873290,52486621>, r=50056228
+pos=<2379678,52409295,64101601>, r=66456683
+pos=<12407570,48986679,9677595>, r=68556317
+pos=<-23196672,47847216,47491952>, r=70861580
+pos=<17092834,24513176,91350037>, r=55955816
+pos=<8752629,37508985,49239757>, r=72585978
+pos=<52794942,76928483,47757542>, r=81940023
+pos=<12527582,-6613411,50632808>, r=50930382
+pos=<-70810892,45621857,-48305364>, r=62008194
+pos=<-18412210,36869794,57144258>, r=64752285
+pos=<87656632,20763685,66883781>, r=92122439
+pos=<61764769,33809145,-512978>, r=89875236
+pos=<-21591807,57503330,27237264>, r=93512809
+pos=<-8980322,48822102,24813214>, r=74644293
+pos=<-13586166,29673545,54387395>, r=49972553
+pos=<-21336027,12684379,50240160>, r=65103467
+pos=<15312696,61249932,61078049>, r=59340843
+pos=<3820682,55264026,85971673>, r=89740512
+pos=<-8720944,7901096,48785694>, r=55817204
+pos=<46676113,42744663,57067759>, r=50947525
+pos=<63180707,54936070,46238435>, r=68814227
+pos=<-59988823,31676130,52904181>, r=96894648
+pos=<-55767575,34582277,42911408>, r=89093361
+pos=<-24727493,22617024,22771261>, r=74880311
+pos=<30402823,52581940,78464394>, r=65908330
+pos=<-12446120,14245346,47969322>, r=52381926
+pos=<13932111,12087077,52306416>, r=71083363
+pos=<12361114,5008235,62369519>, r=51211858
+pos=<62655763,37235551,16180822>, r=77498932
+pos=<5158458,57101119,21414371>, r=72183092
+pos=<2908218,33006742,52557556>, r=82743046
+pos=<57439166,18173939,101222852>, r=98833513
+pos=<52238468,31780002,45678724>, r=78491149
+pos=<-45793920,10537217,50965371>, r=92433881
+pos=<-13743952,64107054,54632417>, r=84808943
+pos=<-170006460,33686904,57787874>, r=58950081
+pos=<-26862218,29083237,47085032>, r=55356188
+pos=<794530,52505491,57994889>, r=62031400
+pos=<62469765,31544111,56755533>, r=55228669
+pos=<33597386,32945456,56175425>, r=60893404
+pos=<67662625,38142990,51575060>, r=61839764
+pos=<-48808932,29332298,47264670>, r=77731645
+pos=<-13897506,80448804,52473065>, r=99144940
+pos=<-41499426,33500208,34694650>, r=81959864
+pos=<21500730,1820261,108639134>, r=91529831
+pos=<37273144,59821099,54577329>, r=56130643
+pos=<-21429926,6902774,61057229>, r=81796239
+pos=<3340434,50630706,26961101>, r=61983979
+pos=<20112657,-7766263,32920789>, r=50273913
+pos=<66869619,52342243,67598868>, r=91270061
+pos=<6129880,42603189,67116575>, r=55915349
+pos=<6398878,1688559,79467734>, r=77591971
+pos=<14501207,33194081,103787164>, r=74805573
+pos=<-41363813,41379031,51239687>, r=86308022
+pos=<-5072359,37511009,73502277>, r=68411104
+pos=<9979161,47203323,76860857>, r=66410591
+pos=<8272810,70008182,48415971>, r=62477175
+pos=<16131738,39072448,57020881>, r=66650334
+pos=<-18513223,15536711,73318828>, r=82507011
+pos=<-53344764,29150642,46822282>, r=81643567
+pos=<-19488382,39476575,49309757>, r=60600153
+pos=<17795545,86761153,34350936>, r=76269651
+pos=<-39860391,37740470,42830687>, r=76425286
+pos=<75357927,42659157,48122833>, r=70599033
+pos=<67060727,20786860,43203283>, r=50745152
+pos=<11307310,64243278,77782998>, r=83044472
diff --git a/2018/inputs/24.txt b/2018/inputs/24.txt
new file mode 100644
index 0000000..0c90bb1
--- /dev/null
+++ b/2018/inputs/24.txt
@@ -0,0 +1,23 @@
+Immune System:
+2991 units each with 8084 hit points (weak to fire) with an attack that does 19 radiation damage at initiative 11
+4513 units each with 3901 hit points (weak to slashing; immune to bludgeoning, radiation) with an attack that does 7 bludgeoning damage at initiative 12
+5007 units each with 9502 hit points (immune to bludgeoning; weak to fire) with an attack that does 16 fire damage at initiative 2
+2007 units each with 5188 hit points (weak to radiation) with an attack that does 23 cold damage at initiative 9
+1680 units each with 1873 hit points (immune to bludgeoning; weak to radiation) with an attack that does 10 bludgeoning damage at initiative 10
+1344 units each with 9093 hit points (immune to bludgeoning, cold; weak to radiation) with an attack that does 63 cold damage at initiative 16
+498 units each with 2425 hit points (immune to fire, bludgeoning, cold) with an attack that does 44 slashing damage at initiative 3
+1166 units each with 7295 hit points with an attack that does 56 bludgeoning damage at initiative 8
+613 units each with 13254 hit points (immune to radiation, cold, fire) with an attack that does 162 radiation damage at initiative 15
+1431 units each with 2848 hit points (weak to radiation) with an attack that does 19 cold damage at initiative 1
+
+Infection:
+700 units each with 47055 hit points (weak to fire; immune to slashing) with an attack that does 116 fire damage at initiative 14
+2654 units each with 13093 hit points (weak to radiation) with an attack that does 8 radiation damage at initiative 19
+5513 units each with 18026 hit points (immune to radiation; weak to slashing) with an attack that does 6 slashing damage at initiative 20
+89 units each with 48412 hit points (weak to cold) with an attack that does 815 radiation damage at initiative 17
+2995 units each with 51205 hit points (weak to cold) with an attack that does 28 slashing damage at initiative 7
+495 units each with 21912 hit points with an attack that does 82 cold damage at initiative 13
+2911 units each with 13547 hit points with an attack that does 7 slashing damage at initiative 18
+1017 units each with 28427 hit points (immune to fire) with an attack that does 52 fire damage at initiative 4
+2048 units each with 29191 hit points (weak to bludgeoning) with an attack that does 22 bludgeoning damage at initiative 6
+1718 units each with 15725 hit points (immune to cold) with an attack that does 18 slashing damage at initiative 5
diff --git a/2018/inputs/25.txt b/2018/inputs/25.txt
new file mode 100644
index 0000000..d359c48
--- /dev/null
+++ b/2018/inputs/25.txt
@@ -0,0 +1,1248 @@
+-6,2,-8,3
+7,8,-1,-8
+7,-2,-4,-2
+4,-4,2,7
+5,8,-1,6
+-1,6,-4,-5
+-2,-6,-6,-6
+1,4,7,0
+-1,-3,-8,2
+5,-6,-5,-2
+-5,7,4,-2
+-2,6,-1,6
+5,4,0,-7
+1,5,-8,-3
+-3,3,8,2
+4,0,0,6
+4,-8,-3,3
+0,0,-7,-5
+-2,0,5,-3
+2,1,7,-1
+1,6,2,2
+4,4,7,-6
+-1,0,-1,1
+2,4,4,6
+-4,3,-7,2
+-5,-2,8,-7
+6,-8,-1,3
+-8,-6,-7,-3
+4,1,-7,-1
+-7,-5,-4,4
+5,-2,8,-5
+-5,-1,4,-4
+3,-3,8,4
+3,8,-8,-7
+-3,7,7,0
+-7,-5,-3,5
+-4,-5,-3,-2
+6,-8,3,8
+-2,0,8,7
+-4,3,5,7
+-6,3,5,0
+5,2,-3,-3
+0,8,0,5
+-5,-8,-1,-8
+2,6,0,6
+5,-4,0,0
+3,-2,-8,-5
+8,-4,-7,-7
+-3,-7,-8,-2
+6,7,-2,3
+5,0,-6,0
+0,-6,0,2
+8,-4,6,-3
+-5,-4,4,-4
+2,0,3,-1
+3,-5,8,5
+6,-1,5,5
+-6,-5,-4,8
+7,-4,0,5
+5,3,1,6
+-7,2,-3,1
+-4,1,-6,-7
+-4,4,0,8
+-6,4,1,-8
+3,-6,-6,5
+2,-4,-3,2
+-2,2,-2,1
+2,-4,0,0
+3,1,4,8
+-1,3,-7,-5
+-3,-7,2,0
+-2,-2,-8,0
+1,6,0,7
+-6,-3,0,-1
+7,0,-2,-7
+5,-5,-3,0
+7,0,0,5
+-6,5,6,2
+0,8,3,-1
+0,-8,-7,-1
+3,6,7,-7
+-2,4,-8,-3
+3,-3,-6,-4
+-1,-5,0,2
+-7,2,4,0
+-2,7,4,-2
+2,4,-1,5
+-1,-6,-6,4
+4,-6,-7,-2
+-6,6,-4,-2
+5,-5,-2,-6
+4,5,4,0
+3,3,0,-5
+-5,4,3,-2
+-6,1,7,-6
+3,5,-8,5
+-2,8,-2,-2
+-5,6,-2,-7
+-3,-6,7,-4
+-8,-6,7,7
+-5,-7,4,-4
+-8,-8,-6,7
+-7,-1,-2,-1
+3,-1,4,0
+3,6,1,-8
+2,6,-4,0
+-6,4,4,6
+7,7,6,-5
+4,-3,-2,7
+-1,8,2,-2
+3,-1,-4,5
+-2,1,-6,-8
+-3,1,7,-1
+-7,-1,8,6
+4,2,6,-6
+8,-1,8,-8
+4,6,-1,4
+7,-1,6,5
+0,-6,2,3
+-2,-8,-8,-6
+0,6,-4,-8
+4,-8,-7,6
+-3,-3,2,2
+2,1,4,7
+-3,7,-1,-8
+1,1,-2,-5
+3,-6,-4,7
+-3,5,0,8
+3,3,1,0
+1,5,4,6
+7,0,-2,-5
+1,5,-3,7
+-1,-4,3,4
+-4,3,-2,0
+-1,-8,2,0
+-8,-8,3,-3
+-2,-6,5,2
+8,-1,-3,-6
+2,-8,3,-5
+-8,-8,3,4
+-3,-5,-7,0
+0,3,1,3
+-8,5,-6,4
+2,0,4,-2
+-5,1,-7,0
+-5,0,-2,1
+4,-7,0,3
+7,0,4,-1
+0,-3,5,4
+-8,-8,-2,3
+2,5,4,6
+7,0,-8,-7
+-1,8,3,-3
+1,-2,2,-4
+-1,-3,3,-2
+4,6,7,-1
+3,8,2,-3
+-1,-8,8,7
+-8,4,7,-2
+-8,2,-8,-7
+-2,5,0,-5
+-1,-2,-5,-5
+4,6,-2,0
+0,8,0,-4
+2,0,-2,-1
+-8,0,-5,0
+-2,-8,-5,6
+2,0,5,7
+6,0,7,0
+-6,-8,3,-1
+2,2,6,-8
+-8,7,-8,7
+5,0,7,-6
+0,-3,6,-4
+-5,7,-6,-6
+2,5,0,-6
+-6,8,-3,3
+-8,-7,-1,-8
+-1,3,0,0
+1,2,3,-7
+-5,-1,7,2
+4,2,0,2
+-6,-6,-1,-2
+1,0,8,-1
+0,-1,-8,7
+2,2,-6,-4
+-2,3,2,6
+-6,-6,-2,-3
+-2,6,-2,1
+4,0,-8,7
+4,8,1,-1
+4,2,-2,5
+1,-2,-6,1
+1,5,-5,-4
+0,8,7,-6
+8,8,2,-3
+-3,-4,-5,3
+-2,6,-8,-1
+-2,-2,-4,2
+0,6,-3,7
+8,3,-3,7
+6,0,-1,-6
+8,8,3,0
+-7,0,8,7
+-5,7,-2,0
+2,-7,7,3
+8,-5,0,0
+-6,-8,1,-7
+-7,-3,0,5
+5,6,1,-7
+-3,8,-3,6
+-4,0,-4,-5
+7,4,2,1
+-7,-7,-8,6
+7,-7,4,4
+-6,-2,-1,1
+5,7,-6,-5
+1,6,-2,5
+-6,5,-6,3
+-6,-8,0,0
+2,-4,2,8
+0,0,0,-8
+-8,0,-2,2
+0,-4,-8,-8
+1,-5,-8,5
+6,-4,-5,6
+8,4,-5,-1
+8,-7,4,-4
+-7,-6,-8,0
+-2,3,-2,3
+-8,-3,-6,-3
+0,5,5,0
+3,7,-8,6
+0,-7,-5,-1
+1,6,-4,-3
+-4,5,-3,5
+7,-5,-5,8
+-4,4,0,-8
+7,-7,0,2
+6,0,2,-8
+-6,-4,1,0
+-1,0,-2,4
+-4,-8,5,7
+-8,4,-5,-2
+2,8,-8,-8
+-4,7,1,6
+-2,-2,-7,3
+6,4,-1,0
+-1,-7,-4,0
+-4,0,3,0
+0,3,5,2
+-4,-5,-1,0
+8,2,-6,0
+-2,5,-3,8
+7,0,3,-2
+6,0,-5,0
+4,-6,-5,6
+-7,8,0,-1
+8,-2,3,-4
+7,0,-4,7
+-4,-6,-7,-7
+2,8,0,4
+1,-6,5,-6
+4,-7,-2,-2
+4,1,-6,2
+0,7,4,3
+4,1,-1,-5
+1,-4,6,-6
+1,2,-2,-2
+2,-2,6,-5
+-8,6,-6,6
+0,6,8,2
+-3,-2,0,-8
+-6,-5,2,-6
+0,5,-8,-5
+1,-1,7,6
+-6,-3,-7,-3
+-4,-6,-1,0
+8,-3,-6,-2
+-5,-2,6,-1
+-1,0,3,1
+0,2,-6,7
+3,3,5,-2
+8,4,5,-1
+-5,-1,0,-1
+-6,-1,0,6
+2,6,-3,-3
+8,7,-8,4
+-6,-8,-3,0
+-1,-1,0,7
+6,-2,-8,4
+-3,8,3,-1
+6,2,0,4
+0,-3,7,3
+-5,3,-2,-1
+-6,-7,-2,-3
+4,-5,-3,-6
+-7,6,-2,4
+-2,-5,7,0
+1,8,-8,7
+8,3,-3,4
+-3,3,2,-4
+5,-7,4,1
+8,-3,-5,0
+-5,-4,-1,-8
+2,1,-2,-3
+-1,-4,-1,-7
+-7,-8,-7,-2
+3,0,7,4
+6,3,7,7
+0,-2,-4,2
+0,-1,-6,7
+-3,-8,-1,-7
+-8,-6,-6,-4
+-5,-4,-4,0
+0,7,-7,3
+-8,-7,-6,-8
+-5,3,0,-3
+-7,-6,0,7
+-7,6,-6,-2
+-2,8,2,-4
+2,0,0,5
+0,5,-2,0
+8,-7,-7,-1
+-1,3,2,-7
+-3,4,-7,-4
+-6,-3,2,-7
+-7,5,4,3
+5,-1,-6,-2
+3,-7,1,0
+-7,0,-4,-3
+-6,8,-1,0
+3,8,4,-2
+-1,-4,-8,-7
+3,3,8,1
+-5,1,4,5
+8,8,-1,2
+-3,-3,7,-4
+8,-3,2,-4
+6,-8,-6,8
+3,6,3,-2
+-7,-2,6,-4
+-6,-8,-8,5
+6,0,0,7
+-6,7,0,7
+8,0,-6,-3
+0,-3,-7,0
+-2,6,-7,-7
+5,-1,-3,0
+2,3,4,-5
+1,7,-6,0
+3,3,0,-3
+-1,0,-8,-8
+-2,5,-7,4
+7,-1,-8,5
+-2,-1,-1,6
+-2,-6,5,1
+4,-2,5,5
+-7,8,4,7
+-2,-2,6,5
+-6,1,-5,3
+-8,4,0,7
+8,-4,5,5
+-4,8,-4,1
+-8,0,5,4
+8,1,0,0
+-6,-8,-6,-2
+2,-5,0,0
+5,-6,5,-4
+1,2,7,2
+8,-4,6,5
+-6,0,7,6
+6,5,7,-6
+-2,-6,-2,5
+-6,-4,3,1
+6,-8,4,-4
+8,6,1,2
+7,5,7,-2
+7,-2,-6,-1
+4,-2,1,2
+1,1,-3,5
+0,-4,8,4
+5,2,-3,-4
+8,4,1,-3
+-1,1,-8,1
+-1,-1,0,5
+-4,4,6,0
+0,6,-2,6
+-3,4,5,5
+-7,5,4,-4
+2,2,-2,-4
+8,-1,2,-5
+-5,-2,6,-2
+7,2,1,6
+-3,-2,4,-5
+8,8,-7,-8
+0,1,-8,-4
+-3,-6,-3,3
+-4,-4,8,4
+-3,2,-4,-6
+-6,5,-5,-2
+-3,-7,-3,8
+0,6,-1,8
+8,0,7,1
+1,1,-8,-2
+6,-6,-7,3
+4,-5,8,-8
+-3,-6,6,7
+8,-5,2,4
+2,5,-3,-4
+-3,0,-6,7
+-1,-7,7,0
+2,-3,-5,5
+-7,-7,0,-2
+0,-4,7,8
+5,3,7,2
+-2,-7,5,5
+-6,-1,0,-8
+-3,0,8,-5
+-8,-1,1,1
+1,0,-6,8
+-1,-5,8,4
+-5,-4,4,8
+2,-3,0,-4
+-4,-3,0,7
+5,6,5,-5
+-3,-8,-3,-2
+5,8,-8,5
+-7,-2,-2,-2
+7,6,8,6
+0,-6,4,-7
+-1,-4,-7,0
+8,7,-6,6
+6,-5,-1,-3
+5,-2,-2,-3
+6,-3,-5,0
+-8,5,6,-5
+3,-7,7,8
+1,3,-8,0
+-6,8,-5,6
+6,-5,-5,-2
+3,8,1,-8
+-8,5,2,0
+0,5,-3,6
+-5,-7,-8,4
+0,7,0,0
+-5,6,-5,6
+-5,1,6,5
+6,1,-2,-8
+0,-8,3,1
+0,-3,-8,-3
+0,6,0,-2
+-8,0,-7,-5
+-8,2,0,6
+1,6,3,-4
+8,-5,0,-4
+-6,7,0,0
+5,0,1,0
+-8,8,2,8
+-7,4,2,4
+0,3,-2,-4
+-5,5,7,0
+5,0,-1,5
+-7,8,-6,8
+-8,-1,3,-3
+0,-7,-7,-7
+-4,4,8,-2
+1,2,1,-4
+1,-5,-1,8
+-3,8,-2,-2
+8,0,4,-4
+-8,5,-5,3
+-7,-7,-6,-2
+0,-6,-8,-8
+-1,-2,-3,0
+-4,0,1,7
+1,-6,-8,4
+0,8,6,-1
+-8,-5,-7,8
+2,7,-8,4
+-8,4,-3,2
+3,-1,-7,3
+4,-2,-6,-6
+-1,-4,1,-2
+3,-4,2,-6
+2,4,5,-3
+-7,7,1,6
+8,-6,-5,-3
+-7,1,-6,0
+-3,-6,-6,-8
+-8,-5,-6,4
+-5,-1,7,8
+0,7,6,2
+6,-2,-1,5
+0,4,-8,8
+-3,-5,-8,0
+2,-6,-2,-1
+5,8,-6,4
+-5,-1,0,-6
+-8,-5,8,2
+5,6,-3,-3
+-4,-7,2,6
+0,-3,-6,7
+-4,-6,-8,-8
+6,7,1,3
+7,-2,4,-3
+4,2,3,1
+0,8,-3,-8
+-8,0,1,0
+4,5,-4,-2
+-2,-6,4,2
+-4,0,-4,0
+8,-1,2,-2
+5,-7,8,1
+-2,5,-6,1
+6,-7,3,-7
+2,1,0,6
+-8,-3,-1,0
+8,-1,8,-3
+0,-6,6,0
+7,3,7,3
+-8,0,6,-1
+-5,-4,-5,0
+-2,0,3,-7
+0,2,0,0
+-3,6,6,3
+-6,-3,-1,-3
+8,0,1,5
+-7,4,-8,0
+8,8,-5,4
+-2,0,-7,-4
+-8,5,-7,-7
+8,0,-1,4
+8,-7,5,0
+-6,-1,-4,2
+-8,-8,6,-5
+7,2,-3,1
+2,0,2,6
+8,-7,-8,3
+-2,-7,-8,0
+0,3,-1,4
+-8,7,5,3
+0,-4,0,3
+6,6,-2,-6
+-4,8,6,-3
+0,3,0,-4
+6,-2,1,5
+1,4,4,3
+0,-7,4,-1
+1,3,-8,-2
+-5,0,4,0
+8,2,-6,-4
+-8,8,-2,6
+-5,7,-7,-2
+5,0,-4,-4
+-1,-5,3,7
+-2,-3,7,3
+-3,4,2,0
+-7,-8,1,3
+-8,-8,-3,2
+0,5,-8,7
+1,7,-6,5
+2,-6,-5,0
+-8,4,4,2
+7,3,1,-6
+-5,-4,8,2
+-7,7,0,0
+8,6,-1,6
+2,5,3,-7
+-7,3,1,5
+-8,-3,-4,3
+0,-2,0,8
+-7,-7,-5,8
+3,6,3,0
+-4,2,8,-4
+-6,2,6,-3
+0,-7,-6,-7
+0,-6,3,-6
+-4,-5,-5,-2
+1,-7,-2,-5
+5,7,0,4
+2,-1,3,-3
+7,1,-5,8
+0,3,0,2
+5,0,-5,-3
+-2,6,2,5
+6,4,-4,-7
+4,-8,4,8
+-5,-2,-6,7
+-1,-4,-4,5
+-2,-7,3,7
+-3,-8,-2,2
+1,-2,-5,-3
+0,-4,-1,3
+4,8,2,-5
+8,6,-6,1
+-8,-1,1,-4
+5,6,4,-8
+-7,-6,-5,4
+-3,-3,5,0
+-6,7,2,1
+-5,5,-1,0
+1,-8,2,0
+0,-3,-7,6
+4,-4,1,0
+-4,-6,0,4
+4,0,4,0
+4,-7,3,-2
+0,-3,0,4
+2,-3,2,2
+2,0,0,-4
+-8,6,6,4
+7,7,4,-2
+0,5,0,-1
+5,7,3,6
+5,2,4,-3
+5,4,-7,-6
+-8,1,7,2
+0,5,8,-1
+5,-3,-6,0
+-6,0,4,6
+-2,-2,6,-6
+-6,3,5,2
+8,-2,-3,-1
+-8,1,3,-4
+1,-6,-5,-6
+8,-4,6,-1
+-5,-7,-7,-5
+-1,-6,1,-4
+4,2,-3,0
+7,1,-4,4
+2,6,-8,0
+7,7,2,-5
+5,-2,-8,-3
+-5,0,3,2
+-1,6,-1,-4
+6,4,-3,-4
+4,1,4,-6
+3,5,0,-1
+5,-3,7,2
+3,-3,-7,5
+-3,-6,-1,2
+-7,-6,5,5
+-3,-7,1,-7
+5,5,-4,3
+6,-4,0,-1
+-7,-8,-1,7
+6,1,3,8
+8,-3,-5,2
+-3,1,-2,7
+-3,8,3,-4
+0,-8,7,3
+5,0,-4,-3
+3,-8,2,4
+-8,-3,6,-3
+0,6,-5,4
+-2,-8,-2,0
+-4,-4,-4,8
+-6,8,-5,-1
+-8,0,1,1
+-4,3,1,-2
+-1,-7,4,8
+3,0,7,-4
+5,7,3,-1
+7,-8,-3,1
+5,5,0,1
+-3,-1,0,8
+-6,-8,-4,1
+-3,-1,-6,0
+0,-1,0,0
+6,0,0,8
+3,-1,-4,6
+-4,4,0,-5
+3,7,1,7
+-5,0,6,7
+5,-5,2,3
+5,-7,2,1
+-6,1,-3,-6
+7,8,-2,8
+5,4,0,6
+-8,-3,4,-3
+-3,-6,2,6
+1,4,2,5
+0,7,6,-5
+-1,7,5,4
+4,-5,-4,0
+-2,1,4,-7
+-2,0,0,8
+7,0,1,1
+-3,-7,8,6
+-2,-8,6,7
+6,3,-4,5
+5,2,-5,8
+4,-2,5,-2
+8,5,-4,-4
+2,6,-7,6
+-4,-2,-6,-5
+0,5,-6,-1
+5,3,4,3
+4,2,1,5
+6,-6,-8,3
+-7,2,3,-2
+0,2,2,1
+0,1,2,3
+-6,4,1,-4
+7,-4,-1,4
+-5,3,-3,0
+3,8,-3,-4
+-2,-3,4,2
+4,7,-2,4
+4,-4,-3,-8
+1,0,-2,-6
+6,7,-4,0
+-2,-7,2,-2
+0,4,2,2
+-4,8,-1,0
+-4,5,1,1
+-2,-8,-1,4
+2,3,-3,4
+-8,-4,-5,0
+-6,3,0,2
+6,-5,1,0
+4,-2,-8,4
+0,7,-5,-2
+-7,-3,5,-1
+5,7,-4,1
+-3,-3,3,5
+2,0,-4,-4
+-7,0,6,6
+4,-4,-3,-1
+-6,6,-1,-6
+-1,2,1,-8
+-2,3,4,6
+5,8,-4,-8
+0,5,0,-4
+-5,-3,7,7
+5,4,5,-2
+4,-2,8,-5
+-4,2,-7,4
+1,-8,4,-4
+7,8,-7,3
+2,7,-8,-5
+-1,-5,6,-7
+5,-4,7,-2
+0,-3,0,6
+0,-7,-2,2
+4,8,0,-1
+0,-3,5,-3
+5,-6,0,4
+1,-7,2,-2
+-1,0,-3,1
+-4,0,4,-6
+5,3,7,3
+7,-4,7,-8
+-3,-5,3,7
+0,-6,8,2
+4,-6,-1,8
+0,-7,0,-8
+-4,5,0,6
+7,6,-6,2
+-6,-5,-7,3
+0,-1,4,-8
+4,6,-4,4
+-4,-2,5,4
+-8,-8,0,4
+2,-8,4,-1
+2,4,0,0
+-6,-1,8,7
+-6,5,8,-5
+-3,-5,-7,-3
+3,-1,-5,-7
+0,4,-4,-7
+2,-4,-1,-6
+-6,-6,0,5
+0,6,3,-5
+0,-3,8,2
+7,-6,6,-1
+-3,7,-4,-5
+-3,1,3,7
+5,-2,-6,-7
+-6,3,-1,8
+0,0,-4,-2
+-8,2,3,-4
+0,-2,-4,0
+1,8,-3,-7
+-2,-4,3,0
+3,-8,7,0
+-1,-6,3,-4
+3,0,8,4
+3,3,-5,-6
+5,0,-1,-2
+7,1,-4,8
+4,-5,3,-2
+4,-4,0,8
+-4,2,1,-8
+-8,0,-7,-2
+4,-2,0,0
+-8,3,7,-8
+8,-8,6,-5
+-8,0,3,-5
+6,3,-2,-3
+4,0,-5,7
+-1,-5,-6,2
+4,-1,-7,2
+-8,-1,-2,0
+1,7,-7,-2
+5,0,-5,-7
+8,-3,6,-2
+1,-6,2,-3
+6,-1,6,3
+-7,4,3,4
+-7,-5,-5,-4
+-7,2,-8,-4
+-5,8,3,-3
+1,2,-3,4
+-6,-5,-4,1
+5,4,5,7
+0,0,-1,-4
+5,-8,3,-1
+5,6,-5,0
+-7,-3,-6,0
+2,-8,0,1
+1,4,-7,-8
+-4,-7,-6,3
+0,1,-1,0
+-6,-1,6,0
+1,6,-4,-2
+8,-3,0,0
+-2,0,-3,7
+3,8,-4,3
+-8,7,2,0
+1,4,-6,3
+5,-3,4,-4
+-3,-5,5,5
+-6,4,-2,2
+-4,0,2,4
+-7,1,6,1
+-2,2,4,6
+-5,-2,6,0
+-1,4,8,0
+0,8,6,-6
+-6,6,-4,-7
+-6,-7,3,0
+4,-1,3,4
+0,-7,-4,-6
+-6,-5,-5,0
+-2,-5,-4,0
+2,0,-8,6
+-1,1,0,0
+-6,-4,-3,-1
+7,5,-7,1
+-5,-1,3,3
+6,1,0,1
+6,7,6,7
+-3,1,0,-3
+-5,-1,-6,4
+-5,1,1,8
+8,-1,-2,-6
+3,0,6,7
+0,8,4,0
+-8,0,-2,5
+-4,-3,-5,5
+-5,3,2,5
+-2,-3,0,-6
+-3,-4,1,-2
+8,-4,-7,-6
+2,8,6,-7
+3,-1,1,-6
+0,-8,1,3
+-2,-4,8,0
+7,-7,-3,5
+8,5,6,-5
+-3,7,2,8
+6,-1,-7,1
+-4,0,-2,-2
+7,8,1,-3
+-2,5,8,6
+-7,-5,0,3
+-7,3,-1,6
+2,-1,-4,0
+-8,-6,2,-8
+-7,-5,-5,1
+0,-5,-4,4
+5,-2,-3,-8
+-5,-8,1,4
+5,0,7,-4
+8,7,1,-1
+-4,-1,-5,2
+4,8,-6,1
+-3,2,3,4
+-5,-2,1,3
+-3,5,5,4
+-6,4,-1,5
+6,1,3,0
+0,-4,-5,0
+-4,4,2,6
+-7,-8,-6,7
+8,4,5,1
+0,5,-3,-1
+3,6,5,-8
+1,8,3,-6
+3,-3,-5,-8
+-7,5,-5,0
+-6,4,0,-6
+-7,7,6,-3
+-3,-1,7,8
+-7,-7,1,-4
+-7,-1,-8,6
+6,0,-2,2
+-5,-8,0,7
+-5,-4,8,4
+1,5,4,2
+8,8,-2,6
+-3,2,-2,1
+-5,-2,1,-2
+8,8,-8,-4
+-7,-8,8,-4
+0,-6,8,-2
+-6,8,1,0
+-8,0,8,-4
+-6,5,1,2
+1,7,5,-2
+-4,1,0,-7
+2,-8,3,7
+-1,-6,-2,-1
+3,-5,-1,7
+0,-7,2,1
+0,8,2,0
+-1,-2,-8,-2
+6,2,5,0
+7,-8,-8,0
+-2,1,2,6
+-3,-7,-4,2
+7,1,4,-3
+5,4,-1,1
+8,-8,8,-7
+3,7,7,-1
+0,-7,0,-4
+-4,2,7,-7
+-7,2,-5,7
+7,-3,2,0
+-8,1,2,0
+5,8,8,-3
+0,7,-2,7
+-3,0,0,-1
+6,8,3,-1
+1,0,-8,0
+8,-5,6,6
+3,0,0,3
+1,4,-4,4
+-2,-5,-3,3
+7,3,-1,-1
+2,-5,1,-5
+-3,-2,6,6
+0,7,-2,-2
+0,0,3,-7
+-1,-7,2,-2
+-6,-1,0,1
+-4,1,1,8
+-4,-6,1,1
+5,7,3,-3
+8,-2,4,2
+0,-6,5,-8
+4,5,0,-6
+1,0,-2,-1
+-6,0,0,-6
+-5,-7,-4,-6
+-8,8,-5,-2
+1,-7,0,4
+4,6,8,1
+-2,-6,6,6
+7,1,-6,0
+-5,6,-4,0
+-4,1,1,4
+8,-7,-1,4
+-7,8,4,-2
+8,5,-7,3
+2,-5,5,-1
+-5,-5,3,8
+-5,-3,-7,6
+5,2,2,1
+-1,-7,-5,2
+0,7,8,-5
+6,-4,5,0
+-1,5,-2,8
+-8,7,0,7
+-4,8,-1,1
+5,-1,1,-2
+2,-3,8,0
+0,6,-1,1
+-2,7,-7,8
+-6,1,-1,6
+5,7,-6,0
+-5,-1,-6,-6
+-2,3,-8,-5
+1,5,-7,-8
+7,-5,-2,5
+-5,7,5,-2
+-5,0,0,7
+-4,-4,0,0
+-3,0,2,-7
+5,4,3,-1
+-5,-7,7,5
+-2,-3,4,5
+-5,-3,4,2
+-7,0,-5,3
+0,0,-8,8
+0,5,-7,4
+-8,-3,8,-2
+-5,8,-2,-5
+-8,8,0,0
+-8,-3,5,-1
+-6,1,8,-3
+3,7,-6,3
+-6,6,2,5
+1,-4,-3,0
+-8,-8,5,3
+1,-4,8,-2
+4,7,3,1
+7,0,4,0
+0,3,-4,-2
+-7,3,7,4
+-4,-7,-1,3
+1,-7,2,1
+3,3,-5,-1
+5,-7,2,2
+1,-4,-4,0
+-8,5,-3,-1
+3,-3,4,0
+7,0,4,-5
+0,1,1,2
+1,-5,6,-5
+-3,2,7,7
+-3,-3,6,2
+2,-2,0,-3
+3,8,-3,2
+-1,1,3,-4
+2,7,4,8
+7,6,-1,6
+8,8,6,5
+2,8,-6,-7
+-1,-3,-3,3
+4,0,-5,-1
+-4,-4,-1,2
+2,-1,-2,-3
+3,3,-3,1
+-1,3,2,2
+4,1,4,7
+-1,-6,-4,2
+-5,-5,2,-1
+-2,2,0,-5
+-1,-8,5,-2
+-6,1,-1,-1
+-8,-8,0,2
+7,8,-7,-1
+-6,7,0,-6
+-4,4,8,-7
+7,1,5,7
+-5,2,2,-5
+1,-2,-3,0
+0,7,-8,-5
+-1,0,-5,6
+-6,1,-4,-3
+8,2,4,-7
+0,-3,0,-7
+6,-5,-8,-4
+-3,4,-3,7
+0,-1,-8,2
+3,1,-8,0
+-8,1,3,7
+-7,1,8,6
+7,7,-3,7
+4,0,2,-3
+0,-2,1,-7
+-7,6,-3,7
+-3,8,-7,4
+6,4,2,5
+3,-3,6,-7
+6,-8,-3,-1
+-2,-8,-8,4
+-3,-2,1,6
+3,1,-1,-1
+8,6,7,5
+5,7,7,-8
+-7,3,3,4
+8,6,-5,-4
+1,-4,-5,-3
+4,6,-6,-6
+-3,4,0,7
+1,-4,-3,8
+3,-7,-2,1
+2,-4,4,8
+-5,1,-7,5
+0,-5,0,3
+0,7,-8,5
+-8,-2,1,3
+-5,8,8,6
+0,5,4,-1
+0,-8,-7,8
+3,2,1,-7
+2,-3,4,1
+5,4,7,-3
+-8,-3,7,-3
+-2,5,6,-5
+5,0,0,-3
+-4,6,6,1
+8,-2,-5,2
+0,4,-2,3
+-8,-5,-8,6
+-5,0,5,7
+-7,1,-8,4
+7,2,6,-2
+-2,-7,-2,6
+-7,7,0,5
+-5,-3,1,4
+-4,8,2,3
+-7,0,0,-6
+2,4,0,8
+2,7,7,0
+7,4,-4,-3
+2,7,5,7
+-3,4,1,3
+-2,-3,-3,1
+2,8,-1,8
+0,-7,6,8
+1,6,5,5
+-8,-6,-6,-5
+6,-8,-8,-1
+-8,3,3,3
+5,-7,7,-2
+5,8,1,6
+0,2,3,5
+-2,7,-7,-3
+-5,6,1,-5
+6,7,-1,4
+8,-3,6,-7
+5,0,-8,3
+0,6,2,0
+-8,-6,-6,5
+0,7,2,-3
+1,-4,6,-7
+-6,7,0,4
+4,-4,0,4
+6,3,7,-2
+3,-8,2,3
+0,5,3,-8
+2,6,7,4
+2,-7,-5,1
+-8,-3,-2,4
+-7,-7,0,4
+-4,-5,-6,1
+-6,-6,0,-3
+-8,8,-3,-4
+-6,7,1,-6
+-5,4,0,7
+-4,-1,5,3
+5,-7,3,1
+0,-4,-6,-3
+6,-6,-1,-5
+3,1,5,-3
+-1,1,2,-3
+0,7,-1,-7
+-8,0,8,0
+0,8,0,-6
+2,-7,2,0
+0,-1,-2,-7
+-2,0,1,1
+1,-7,8,4
+3,-6,0,7
+0,0,-5,4
+2,-7,0,6
+-6,4,5,-7
+-3,5,7,4
+-2,-1,7,8
+-7,0,-2,-4
+3,-6,6,0
+5,-4,-4,4
+6,8,8,-3
+6,-6,-6,3
+2,-3,-3,-3
+8,-5,-2,0
+-3,5,7,-4
+-7,-8,1,5
+0,-1,-1,-1
+8,1,7,-8
+4,4,2,4
+6,2,-1,2
+-5,6,-6,5
+-2,-5,-3,4
+6,-3,-4,0
+8,8,-5,-7
+2,2,0,-3
+-5,-8,1,2
+7,-6,-2,8
+-5,0,-3,3
+-2,7,-4,-5
+8,-1,-6,1
+7,6,-1,-4
+-3,0,2,1
+0,0,5,0
+-1,8,-2,3
+-3,2,1,-8
+1,7,-7,0
+1,4,-1,0
+6,-4,3,-2
+-1,-6,-2,2
+-2,2,2,2
+2,0,-3,5
+-4,1,-8,-3
+-4,1,5,-7
+-6,8,1,4
+5,3,0,1
+-8,-7,7,-1
+-8,-3,1,-7
+0,2,4,7
+6,7,2,-8
+4,1,2,8
+3,-2,1,-5
+8,2,-7,6
+8,0,5,3
+-7,4,8,-7
+3,8,-1,-7
+-1,-5,-2,0
+-3,0,6,3
+6,5,-3,-2
+1,8,7,-2
+-4,-1,-7,-2
+-6,-1,8,3
+8,-1,5,-6
+5,0,5,2
+-4,8,0,-1
+-5,2,7,-3
+5,-2,-6,5
+4,-4,4,0
+-7,-1,-5,-5
+-8,-5,4,5
+4,-6,-8,3
+7,2,7,-5
+1,6,2,-3
+-3,3,-8,0
+1,-6,7,-3
+-5,8,6,-3
+-3,-2,-4,-6
+7,-7,-2,1
+5,4,-7,-1
+3,-4,-5,-1
+-1,-5,6,-1
+-8,4,-5,1
diff --git a/2018/inputs/3.txt b/2018/inputs/3.txt
new file mode 100644
index 0000000..4701818
--- /dev/null
+++ b/2018/inputs/3.txt
@@ -0,0 +1,1385 @@
+#1 @ 342,645: 25x20
+#2 @ 124,968: 28x19
+#3 @ 680,765: 26x20
+#4 @ 832,699: 12x15
+#5 @ 4,746: 29x14
+#6 @ 926,115: 19x17
+#7 @ 662,587: 28x12
+#8 @ 532,568: 27x23
+#9 @ 860,23: 16x21
+#10 @ 530,562: 12x27
+#11 @ 15,254: 10x27
+#12 @ 375,611: 18x10
+#13 @ 357,389: 22x23
+#14 @ 483,392: 14x16
+#15 @ 426,705: 17x13
+#16 @ 273,918: 23x28
+#17 @ 873,722: 13x13
+#18 @ 429,749: 12x25
+#19 @ 701,937: 14x11
+#20 @ 89,231: 23x26
+#21 @ 704,220: 10x27
+#22 @ 481,847: 21x24
+#23 @ 9,378: 14x19
+#24 @ 682,442: 10x21
+#25 @ 242,63: 21x23
+#26 @ 748,871: 20x13
+#27 @ 784,338: 25x25
+#28 @ 966,669: 20x20
+#29 @ 589,833: 22x25
+#30 @ 489,489: 16x24
+#31 @ 976,478: 4x4
+#32 @ 739,826: 13x15
+#33 @ 783,753: 21x17
+#34 @ 433,367: 22x11
+#35 @ 32,841: 10x20
+#36 @ 258,497: 26x28
+#37 @ 632,776: 18x25
+#38 @ 517,389: 20x14
+#39 @ 446,740: 19x26
+#40 @ 667,455: 15x14
+#41 @ 664,252: 25x26
+#42 @ 227,45: 29x21
+#43 @ 127,138: 29x27
+#44 @ 466,308: 19x17
+#45 @ 356,134: 12x19
+#46 @ 609,640: 28x24
+#47 @ 677,228: 16x27
+#48 @ 149,610: 10x28
+#49 @ 863,498: 21x28
+#50 @ 913,511: 12x27
+#51 @ 748,761: 24x11
+#52 @ 802,288: 10x22
+#53 @ 26,442: 29x20
+#54 @ 85,464: 20x21
+#55 @ 262,944: 21x18
+#56 @ 876,753: 15x10
+#57 @ 105,199: 23x19
+#58 @ 335,848: 23x24
+#59 @ 467,537: 24x22
+#60 @ 552,217: 14x13
+#61 @ 534,820: 10x19
+#62 @ 261,579: 25x13
+#63 @ 541,445: 19x17
+#64 @ 869,769: 28x11
+#65 @ 447,668: 25x26
+#66 @ 42,734: 18x16
+#67 @ 553,233: 13x13
+#68 @ 47,861: 12x16
+#69 @ 33,834: 21x14
+#70 @ 240,174: 29x13
+#71 @ 611,362: 24x14
+#72 @ 899,371: 21x21
+#73 @ 340,5: 23x23
+#74 @ 69,246: 14x18
+#75 @ 432,558: 11x10
+#76 @ 737,175: 27x20
+#77 @ 623,365: 15x22
+#78 @ 666,453: 26x28
+#79 @ 368,774: 25x10
+#80 @ 923,879: 18x16
+#81 @ 37,315: 16x23
+#82 @ 119,279: 18x26
+#83 @ 928,850: 20x18
+#84 @ 896,902: 18x16
+#85 @ 332,590: 28x13
+#86 @ 902,815: 27x21
+#87 @ 215,508: 19x12
+#88 @ 981,57: 10x15
+#89 @ 706,393: 21x24
+#90 @ 975,369: 10x11
+#91 @ 635,845: 29x18
+#92 @ 831,543: 15x16
+#93 @ 296,865: 19x10
+#94 @ 889,189: 24x19
+#95 @ 59,749: 11x22
+#96 @ 739,946: 24x27
+#97 @ 536,759: 27x29
+#98 @ 982,234: 17x11
+#99 @ 639,615: 26x25
+#100 @ 867,397: 26x29
+#101 @ 881,784: 19x19
+#102 @ 215,912: 22x28
+#103 @ 127,336: 10x15
+#104 @ 313,729: 15x12
+#105 @ 695,74: 17x28
+#106 @ 748,187: 11x16
+#107 @ 809,2: 16x27
+#108 @ 891,192: 17x18
+#109 @ 72,920: 16x20
+#110 @ 41,967: 22x28
+#111 @ 91,733: 22x20
+#112 @ 464,641: 13x13
+#113 @ 464,860: 17x10
+#114 @ 623,106: 13x28
+#115 @ 358,85: 24x21
+#116 @ 774,944: 19x28
+#117 @ 752,587: 11x20
+#118 @ 635,103: 25x11
+#119 @ 498,36: 17x11
+#120 @ 227,659: 15x13
+#121 @ 924,553: 13x13
+#122 @ 775,297: 23x24
+#123 @ 479,866: 10x11
+#124 @ 387,798: 11x28
+#125 @ 526,847: 19x27
+#126 @ 747,861: 11x25
+#127 @ 789,652: 14x10
+#128 @ 419,7: 17x13
+#129 @ 356,142: 26x10
+#130 @ 436,239: 14x27
+#131 @ 555,710: 14x23
+#132 @ 871,447: 13x27
+#133 @ 473,730: 14x14
+#134 @ 558,170: 16x18
+#135 @ 888,882: 29x25
+#136 @ 834,147: 24x18
+#137 @ 721,467: 28x12
+#138 @ 223,105: 28x26
+#139 @ 285,326: 28x23
+#140 @ 584,300: 3x6
+#141 @ 710,754: 23x21
+#142 @ 283,892: 21x14
+#143 @ 448,894: 18x3
+#144 @ 380,479: 16x15
+#145 @ 703,57: 16x20
+#146 @ 692,448: 24x11
+#147 @ 926,350: 20x26
+#148 @ 167,528: 25x12
+#149 @ 444,722: 28x21
+#150 @ 166,183: 15x18
+#151 @ 546,472: 29x18
+#152 @ 532,900: 12x22
+#153 @ 215,490: 29x20
+#154 @ 678,458: 25x23
+#155 @ 601,462: 24x11
+#156 @ 484,514: 12x11
+#157 @ 863,763: 10x18
+#158 @ 653,452: 16x23
+#159 @ 464,302: 13x21
+#160 @ 868,65: 21x18
+#161 @ 227,824: 20x11
+#162 @ 111,629: 29x19
+#163 @ 55,554: 27x21
+#164 @ 0,757: 21x17
+#165 @ 418,861: 13x16
+#166 @ 932,903: 12x16
+#167 @ 429,772: 11x14
+#168 @ 706,805: 11x23
+#169 @ 487,24: 26x15
+#170 @ 806,900: 16x16
+#171 @ 580,719: 24x22
+#172 @ 458,481: 20x17
+#173 @ 343,488: 18x11
+#174 @ 734,342: 12x27
+#175 @ 320,439: 4x3
+#176 @ 446,635: 26x25
+#177 @ 552,683: 11x23
+#178 @ 181,168: 26x24
+#179 @ 851,583: 27x28
+#180 @ 879,363: 10x11
+#181 @ 884,139: 11x21
+#182 @ 912,88: 24x27
+#183 @ 52,35: 22x18
+#184 @ 657,705: 11x14
+#185 @ 370,777: 11x17
+#186 @ 801,354: 21x24
+#187 @ 773,546: 16x20
+#188 @ 888,322: 19x11
+#189 @ 807,788: 27x13
+#190 @ 465,956: 19x29
+#191 @ 369,770: 13x21
+#192 @ 311,137: 12x14
+#193 @ 148,150: 19x29
+#194 @ 389,613: 28x25
+#195 @ 429,373: 10x25
+#196 @ 892,148: 20x15
+#197 @ 890,271: 11x19
+#198 @ 58,861: 18x19
+#199 @ 449,255: 9x5
+#200 @ 257,887: 27x15
+#201 @ 383,616: 20x18
+#202 @ 663,657: 18x21
+#203 @ 331,648: 25x13
+#204 @ 509,53: 10x28
+#205 @ 86,287: 15x20
+#206 @ 753,190: 20x20
+#207 @ 922,527: 19x12
+#208 @ 132,948: 20x26
+#209 @ 883,786: 15x21
+#210 @ 117,592: 27x15
+#211 @ 960,611: 13x22
+#212 @ 829,769: 14x19
+#213 @ 669,686: 17x13
+#214 @ 276,787: 27x10
+#215 @ 619,909: 18x22
+#216 @ 418,209: 21x25
+#217 @ 231,831: 27x18
+#218 @ 336,538: 22x18
+#219 @ 180,783: 14x23
+#220 @ 609,263: 22x10
+#221 @ 360,982: 21x16
+#222 @ 775,813: 14x26
+#223 @ 906,198: 10x24
+#224 @ 937,144: 28x28
+#225 @ 475,903: 24x12
+#226 @ 887,149: 11x16
+#227 @ 927,259: 20x25
+#228 @ 71,862: 29x26
+#229 @ 136,954: 26x17
+#230 @ 721,827: 15x13
+#231 @ 769,931: 21x25
+#232 @ 728,119: 13x28
+#233 @ 654,942: 13x27
+#234 @ 434,737: 18x13
+#235 @ 672,331: 27x20
+#236 @ 816,17: 25x21
+#237 @ 251,781: 28x20
+#238 @ 342,209: 16x10
+#239 @ 581,434: 23x22
+#240 @ 782,100: 14x11
+#241 @ 878,831: 14x12
+#242 @ 667,233: 19x28
+#243 @ 237,650: 28x24
+#244 @ 425,738: 11x15
+#245 @ 936,470: 23x23
+#246 @ 68,321: 21x19
+#247 @ 356,539: 27x29
+#248 @ 945,353: 18x23
+#249 @ 906,933: 22x28
+#250 @ 360,812: 10x29
+#251 @ 884,774: 17x27
+#252 @ 413,769: 23x20
+#253 @ 594,75: 21x15
+#254 @ 676,702: 15x11
+#255 @ 233,529: 27x25
+#256 @ 173,236: 15x17
+#257 @ 907,949: 16x13
+#258 @ 809,570: 24x10
+#259 @ 67,678: 29x22
+#260 @ 176,951: 25x18
+#261 @ 754,625: 10x18
+#262 @ 142,270: 26x29
+#263 @ 558,673: 24x19
+#264 @ 224,27: 24x14
+#265 @ 725,829: 7x6
+#266 @ 703,941: 9x3
+#267 @ 880,864: 28x27
+#268 @ 727,445: 25x24
+#269 @ 747,520: 17x15
+#270 @ 850,410: 26x21
+#271 @ 363,964: 10x16
+#272 @ 752,721: 23x16
+#273 @ 295,351: 26x20
+#274 @ 899,877: 26x16
+#275 @ 95,804: 20x28
+#276 @ 543,866: 20x16
+#277 @ 917,887: 19x27
+#278 @ 449,474: 16x22
+#279 @ 673,459: 28x23
+#280 @ 971,786: 13x17
+#281 @ 42,176: 21x18
+#282 @ 531,886: 15x13
+#283 @ 679,438: 15x22
+#284 @ 161,659: 19x25
+#285 @ 838,148: 15x23
+#286 @ 496,732: 26x14
+#287 @ 482,256: 19x26
+#288 @ 389,941: 27x25
+#289 @ 352,255: 23x15
+#290 @ 825,688: 25x24
+#291 @ 894,313: 23x20
+#292 @ 906,553: 21x17
+#293 @ 293,130: 21x13
+#294 @ 549,80: 25x18
+#295 @ 85,871: 20x10
+#296 @ 876,734: 20x24
+#297 @ 831,935: 14x17
+#298 @ 618,819: 23x20
+#299 @ 750,70: 24x14
+#300 @ 749,711: 22x17
+#301 @ 555,801: 17x12
+#302 @ 544,64: 28x21
+#303 @ 114,413: 21x22
+#304 @ 215,526: 13x21
+#305 @ 147,31: 25x12
+#306 @ 679,427: 18x17
+#307 @ 634,930: 23x24
+#308 @ 41,419: 21x28
+#309 @ 892,162: 18x24
+#310 @ 812,886: 19x14
+#311 @ 440,700: 28x13
+#312 @ 586,832: 28x21
+#313 @ 255,687: 13x22
+#314 @ 945,879: 22x16
+#315 @ 480,731: 18x11
+#316 @ 738,731: 15x10
+#317 @ 528,621: 11x16
+#318 @ 243,787: 28x26
+#319 @ 512,493: 22x13
+#320 @ 762,692: 27x11
+#321 @ 316,57: 12x14
+#322 @ 410,860: 17x12
+#323 @ 772,591: 14x24
+#324 @ 813,221: 13x11
+#325 @ 161,271: 12x14
+#326 @ 520,597: 26x19
+#327 @ 577,129: 25x20
+#328 @ 448,31: 10x15
+#329 @ 594,33: 16x27
+#330 @ 170,498: 25x19
+#331 @ 882,833: 6x4
+#332 @ 190,548: 12x26
+#333 @ 639,879: 28x25
+#334 @ 473,817: 19x26
+#335 @ 543,458: 11x23
+#336 @ 676,657: 26x25
+#337 @ 786,353: 28x17
+#338 @ 873,508: 14x17
+#339 @ 208,782: 17x27
+#340 @ 392,542: 10x26
+#341 @ 672,650: 29x23
+#342 @ 446,637: 20x18
+#343 @ 534,58: 16x15
+#344 @ 696,760: 23x17
+#345 @ 265,767: 18x15
+#346 @ 105,750: 12x16
+#347 @ 731,438: 28x10
+#348 @ 535,833: 24x21
+#349 @ 72,531: 18x28
+#350 @ 640,734: 27x21
+#351 @ 156,265: 15x16
+#352 @ 227,299: 24x22
+#353 @ 552,492: 11x29
+#354 @ 605,95: 14x20
+#355 @ 665,490: 11x25
+#356 @ 456,289: 25x12
+#357 @ 876,516: 13x18
+#358 @ 26,163: 20x28
+#359 @ 228,769: 19x11
+#360 @ 766,766: 16x12
+#361 @ 167,654: 13x28
+#362 @ 728,185: 20x25
+#363 @ 321,340: 23x20
+#364 @ 327,175: 18x14
+#365 @ 83,860: 10x19
+#366 @ 361,177: 20x24
+#367 @ 282,505: 18x16
+#368 @ 780,44: 29x28
+#369 @ 854,406: 15x25
+#370 @ 142,928: 10x19
+#371 @ 114,594: 11x20
+#372 @ 775,78: 26x24
+#373 @ 264,791: 28x12
+#374 @ 789,217: 24x20
+#375 @ 931,559: 19x22
+#376 @ 523,549: 22x20
+#377 @ 744,356: 23x24
+#378 @ 630,746: 25x11
+#379 @ 339,201: 11x28
+#380 @ 777,698: 25x14
+#381 @ 198,933: 29x21
+#382 @ 222,919: 27x25
+#383 @ 356,648: 16x19
+#384 @ 237,915: 10x12
+#385 @ 10,864: 17x26
+#386 @ 494,808: 29x23
+#387 @ 440,547: 24x25
+#388 @ 688,247: 10x16
+#389 @ 95,580: 16x19
+#390 @ 374,8: 12x27
+#391 @ 287,332: 20x26
+#392 @ 453,940: 24x22
+#393 @ 344,878: 10x22
+#394 @ 541,277: 16x18
+#395 @ 965,360: 24x12
+#396 @ 280,878: 21x20
+#397 @ 680,384: 25x19
+#398 @ 670,76: 12x12
+#399 @ 540,457: 18x20
+#400 @ 524,406: 17x16
+#401 @ 625,272: 25x22
+#402 @ 100,906: 26x12
+#403 @ 281,871: 7x10
+#404 @ 275,849: 21x26
+#405 @ 357,559: 13x13
+#406 @ 918,753: 25x21
+#407 @ 270,837: 25x17
+#408 @ 780,84: 20x20
+#409 @ 503,893: 11x13
+#410 @ 154,609: 12x23
+#411 @ 871,739: 21x22
+#412 @ 529,698: 27x27
+#413 @ 376,844: 14x23
+#414 @ 498,876: 13x21
+#415 @ 893,958: 15x27
+#416 @ 635,498: 20x20
+#417 @ 571,884: 24x21
+#418 @ 336,586: 24x24
+#419 @ 0,206: 29x16
+#420 @ 655,64: 24x11
+#421 @ 436,648: 28x16
+#422 @ 952,593: 17x11
+#423 @ 643,6: 17x18
+#424 @ 224,166: 29x11
+#425 @ 818,905: 15x14
+#426 @ 18,863: 18x11
+#427 @ 497,902: 15x10
+#428 @ 564,545: 16x29
+#429 @ 657,446: 18x20
+#430 @ 245,25: 17x11
+#431 @ 936,346: 23x24
+#432 @ 127,152: 24x19
+#433 @ 563,928: 19x27
+#434 @ 684,407: 27x13
+#435 @ 737,584: 15x15
+#436 @ 644,837: 16x14
+#437 @ 702,978: 20x15
+#438 @ 422,65: 11x16
+#439 @ 121,142: 13x20
+#440 @ 68,437: 19x16
+#441 @ 121,382: 24x28
+#442 @ 805,910: 29x14
+#443 @ 795,432: 21x20
+#444 @ 269,735: 25x22
+#445 @ 226,877: 11x17
+#446 @ 550,450: 29x18
+#447 @ 606,726: 14x25
+#448 @ 46,546: 10x19
+#449 @ 320,95: 11x25
+#450 @ 935,419: 12x15
+#451 @ 453,862: 13x16
+#452 @ 315,500: 23x12
+#453 @ 181,127: 17x18
+#454 @ 243,907: 19x13
+#455 @ 263,960: 29x22
+#456 @ 509,159: 14x17
+#457 @ 486,810: 23x21
+#458 @ 560,945: 25x13
+#459 @ 6,400: 24x28
+#460 @ 368,783: 17x23
+#461 @ 75,792: 26x29
+#462 @ 543,395: 22x23
+#463 @ 47,464: 19x10
+#464 @ 342,494: 27x24
+#465 @ 911,861: 19x25
+#466 @ 94,272: 23x23
+#467 @ 420,516: 15x26
+#468 @ 146,233: 20x27
+#469 @ 201,907: 10x23
+#470 @ 446,887: 23x16
+#471 @ 468,702: 14x27
+#472 @ 799,865: 23x25
+#473 @ 451,242: 27x20
+#474 @ 915,801: 28x27
+#475 @ 471,445: 23x16
+#476 @ 381,751: 26x28
+#477 @ 903,539: 23x21
+#478 @ 621,280: 13x26
+#479 @ 658,132: 27x19
+#480 @ 136,639: 22x26
+#481 @ 24,185: 22x23
+#482 @ 732,779: 25x25
+#483 @ 760,858: 20x22
+#484 @ 24,408: 26x19
+#485 @ 457,627: 20x16
+#486 @ 353,284: 20x10
+#487 @ 920,899: 10x3
+#488 @ 436,694: 11x17
+#489 @ 849,162: 17x16
+#490 @ 786,236: 27x20
+#491 @ 709,245: 11x28
+#492 @ 462,389: 13x17
+#493 @ 738,88: 27x21
+#494 @ 111,617: 24x24
+#495 @ 896,764: 11x23
+#496 @ 473,321: 23x16
+#497 @ 589,67: 17x16
+#498 @ 183,298: 18x17
+#499 @ 557,675: 10x11
+#500 @ 875,298: 21x17
+#501 @ 128,420: 18x25
+#502 @ 158,17: 27x26
+#503 @ 966,380: 13x29
+#504 @ 571,449: 15x28
+#505 @ 968,404: 12x27
+#506 @ 722,350: 10x24
+#507 @ 247,595: 17x25
+#508 @ 65,734: 22x21
+#509 @ 411,715: 25x12
+#510 @ 123,742: 15x12
+#511 @ 439,687: 19x12
+#512 @ 829,932: 12x13
+#513 @ 893,146: 23x19
+#514 @ 861,131: 15x23
+#515 @ 551,85: 20x7
+#516 @ 957,437: 22x17
+#517 @ 777,65: 22x24
+#518 @ 638,851: 24x21
+#519 @ 116,492: 12x29
+#520 @ 187,785: 3x18
+#521 @ 791,56: 17x27
+#522 @ 406,108: 28x28
+#523 @ 695,252: 21x16
+#524 @ 498,247: 24x17
+#525 @ 301,235: 19x27
+#526 @ 14,173: 13x10
+#527 @ 116,587: 11x29
+#528 @ 170,247: 18x22
+#529 @ 714,745: 20x23
+#530 @ 682,474: 27x19
+#531 @ 838,605: 23x22
+#532 @ 684,330: 20x18
+#533 @ 754,852: 27x25
+#534 @ 885,197: 24x26
+#535 @ 97,256: 16x18
+#536 @ 604,669: 20x19
+#537 @ 612,14: 18x29
+#538 @ 278,738: 8x14
+#539 @ 102,976: 13x15
+#540 @ 50,860: 16x12
+#541 @ 574,411: 16x22
+#542 @ 124,894: 26x20
+#543 @ 848,521: 25x25
+#544 @ 271,287: 25x27
+#545 @ 253,656: 21x16
+#546 @ 547,979: 18x11
+#547 @ 444,332: 12x26
+#548 @ 106,753: 15x16
+#549 @ 886,615: 14x15
+#550 @ 549,216: 27x24
+#551 @ 481,720: 23x13
+#552 @ 505,7: 17x22
+#553 @ 539,106: 28x27
+#554 @ 395,174: 24x12
+#555 @ 547,490: 10x22
+#556 @ 950,79: 21x12
+#557 @ 529,817: 12x23
+#558 @ 40,270: 19x24
+#559 @ 556,127: 25x14
+#560 @ 407,39: 16x26
+#561 @ 130,852: 29x14
+#562 @ 144,368: 27x22
+#563 @ 980,174: 18x22
+#564 @ 285,98: 16x24
+#565 @ 648,686: 16x26
+#566 @ 361,487: 21x16
+#567 @ 471,380: 23x14
+#568 @ 167,331: 23x25
+#569 @ 768,773: 14x16
+#570 @ 328,13: 29x15
+#571 @ 444,697: 14x17
+#572 @ 215,301: 27x27
+#573 @ 238,207: 23x14
+#574 @ 252,346: 21x20
+#575 @ 910,272: 11x18
+#576 @ 751,833: 18x13
+#577 @ 781,221: 10x17
+#578 @ 538,775: 14x26
+#579 @ 982,705: 11x21
+#580 @ 205,805: 25x27
+#581 @ 948,713: 21x12
+#582 @ 647,249: 11x20
+#583 @ 841,156: 19x21
+#584 @ 401,835: 13x28
+#585 @ 637,819: 24x12
+#586 @ 286,241: 19x23
+#587 @ 661,878: 15x24
+#588 @ 115,774: 19x14
+#589 @ 353,655: 22x14
+#590 @ 838,616: 25x23
+#591 @ 573,395: 28x27
+#592 @ 321,67: 26x13
+#593 @ 371,931: 17x19
+#594 @ 765,719: 24x10
+#595 @ 595,574: 21x21
+#596 @ 346,497: 10x16
+#597 @ 67,869: 16x19
+#598 @ 133,284: 10x25
+#599 @ 464,174: 20x25
+#600 @ 613,82: 29x28
+#601 @ 98,519: 27x12
+#602 @ 896,934: 14x17
+#603 @ 645,205: 23x23
+#604 @ 810,96: 9x15
+#605 @ 91,464: 14x23
+#606 @ 798,67: 18x21
+#607 @ 560,243: 27x20
+#608 @ 486,52: 14x12
+#609 @ 623,174: 11x20
+#610 @ 203,404: 10x14
+#611 @ 927,293: 12x10
+#612 @ 457,860: 26x14
+#613 @ 690,648: 13x15
+#614 @ 673,615: 23x22
+#615 @ 399,718: 16x14
+#616 @ 309,695: 23x17
+#617 @ 881,450: 10x24
+#618 @ 879,295: 12x29
+#619 @ 914,865: 5x4
+#620 @ 692,653: 28x26
+#621 @ 468,183: 19x11
+#622 @ 487,258: 13x25
+#623 @ 458,724: 13x16
+#624 @ 793,416: 28x23
+#625 @ 804,843: 28x13
+#626 @ 345,711: 15x20
+#627 @ 679,461: 28x23
+#628 @ 652,655: 20x20
+#629 @ 330,343: 12x13
+#630 @ 919,801: 16x11
+#631 @ 974,473: 10x28
+#632 @ 112,537: 11x18
+#633 @ 680,494: 23x25
+#634 @ 307,283: 16x28
+#635 @ 904,314: 11x25
+#636 @ 718,778: 12x22
+#637 @ 30,550: 23x25
+#638 @ 146,964: 14x18
+#639 @ 167,242: 28x19
+#640 @ 228,443: 17x15
+#641 @ 914,547: 10x15
+#642 @ 931,708: 23x23
+#643 @ 105,180: 16x10
+#644 @ 455,283: 14x16
+#645 @ 491,723: 28x17
+#646 @ 618,6: 17x27
+#647 @ 635,361: 24x25
+#648 @ 883,585: 26x16
+#649 @ 131,346: 17x26
+#650 @ 78,25: 22x12
+#651 @ 611,643: 28x22
+#652 @ 647,114: 15x23
+#653 @ 229,550: 21x28
+#654 @ 190,124: 15x14
+#655 @ 903,330: 13x16
+#656 @ 750,722: 20x19
+#657 @ 26,456: 25x13
+#658 @ 414,283: 16x16
+#659 @ 940,221: 28x25
+#660 @ 585,932: 20x18
+#661 @ 96,398: 20x17
+#662 @ 371,915: 12x19
+#663 @ 819,706: 22x25
+#664 @ 347,500: 15x9
+#665 @ 275,85: 24x10
+#666 @ 435,743: 26x26
+#667 @ 535,568: 22x20
+#668 @ 46,389: 17x25
+#669 @ 584,880: 24x18
+#670 @ 630,266: 18x18
+#671 @ 431,377: 26x14
+#672 @ 559,677: 4x3
+#673 @ 701,439: 16x14
+#674 @ 829,446: 20x11
+#675 @ 555,565: 20x13
+#676 @ 917,846: 14x17
+#677 @ 593,676: 18x16
+#678 @ 542,798: 20x19
+#679 @ 6,372: 24x29
+#680 @ 578,809: 24x24
+#681 @ 64,522: 11x4
+#682 @ 591,896: 13x26
+#683 @ 932,572: 11x25
+#684 @ 867,131: 27x19
+#685 @ 495,889: 23x22
+#686 @ 367,827: 21x13
+#687 @ 232,45: 18x28
+#688 @ 704,711: 11x27
+#689 @ 309,517: 23x13
+#690 @ 429,199: 17x11
+#691 @ 717,52: 20x15
+#692 @ 912,877: 27x25
+#693 @ 447,764: 16x11
+#694 @ 799,769: 28x22
+#695 @ 361,912: 27x26
+#696 @ 891,829: 10x28
+#697 @ 233,895: 20x23
+#698 @ 806,276: 16x13
+#699 @ 377,966: 21x18
+#700 @ 792,875: 20x22
+#701 @ 255,807: 18x19
+#702 @ 634,238: 15x26
+#703 @ 492,519: 13x24
+#704 @ 953,632: 19x26
+#705 @ 684,587: 10x17
+#706 @ 391,424: 16x17
+#707 @ 654,158: 14x27
+#708 @ 118,638: 23x11
+#709 @ 302,282: 17x13
+#710 @ 662,54: 14x19
+#711 @ 909,835: 14x23
+#712 @ 558,971: 18x11
+#713 @ 90,774: 11x28
+#714 @ 745,346: 15x11
+#715 @ 488,860: 22x14
+#716 @ 848,568: 26x23
+#717 @ 6,625: 28x25
+#718 @ 34,388: 15x18
+#719 @ 965,778: 23x24
+#720 @ 103,500: 20x18
+#721 @ 506,222: 29x17
+#722 @ 226,197: 24x25
+#723 @ 129,939: 15x25
+#724 @ 140,644: 11x18
+#725 @ 905,904: 20x25
+#726 @ 423,276: 13x12
+#727 @ 62,511: 17x24
+#728 @ 932,814: 19x26
+#729 @ 9,810: 11x26
+#730 @ 32,624: 16x20
+#731 @ 967,236: 28x18
+#732 @ 616,948: 27x12
+#733 @ 714,733: 15x17
+#734 @ 277,783: 25x24
+#735 @ 482,675: 16x12
+#736 @ 862,11: 19x26
+#737 @ 667,668: 27x15
+#738 @ 131,406: 13x28
+#739 @ 707,788: 26x27
+#740 @ 859,505: 21x21
+#741 @ 968,785: 4x6
+#742 @ 813,939: 11x27
+#743 @ 611,781: 28x17
+#744 @ 298,82: 28x27
+#745 @ 352,828: 16x27
+#746 @ 920,831: 20x23
+#747 @ 967,694: 19x29
+#748 @ 370,50: 25x18
+#749 @ 545,724: 13x16
+#750 @ 102,391: 13x22
+#751 @ 904,122: 22x19
+#752 @ 118,439: 23x10
+#753 @ 793,859: 23x27
+#754 @ 722,798: 27x29
+#755 @ 97,774: 24x10
+#756 @ 326,707: 26x14
+#757 @ 559,909: 28x14
+#758 @ 33,822: 29x21
+#759 @ 508,227: 24x7
+#760 @ 115,427: 26x16
+#761 @ 665,766: 27x25
+#762 @ 303,847: 19x28
+#763 @ 157,535: 19x12
+#764 @ 968,680: 18x10
+#765 @ 668,464: 20x9
+#766 @ 114,534: 27x10
+#767 @ 841,609: 17x21
+#768 @ 972,671: 20x13
+#769 @ 490,506: 27x18
+#770 @ 0,407: 13x26
+#771 @ 626,219: 11x14
+#772 @ 174,512: 12x24
+#773 @ 162,251: 10x18
+#774 @ 612,206: 11x25
+#775 @ 97,517: 11x10
+#776 @ 31,916: 11x17
+#777 @ 261,148: 17x16
+#778 @ 815,577: 26x24
+#779 @ 545,521: 29x23
+#780 @ 842,800: 25x23
+#781 @ 391,437: 23x20
+#782 @ 333,886: 20x14
+#783 @ 109,171: 11x14
+#784 @ 344,483: 28x16
+#785 @ 581,195: 15x24
+#786 @ 608,372: 12x13
+#787 @ 740,279: 14x18
+#788 @ 653,626: 27x22
+#789 @ 308,182: 24x20
+#790 @ 899,219: 16x12
+#791 @ 515,556: 21x11
+#792 @ 171,0: 18x29
+#793 @ 204,304: 27x14
+#794 @ 488,289: 25x25
+#795 @ 479,382: 14x18
+#796 @ 626,889: 25x11
+#797 @ 604,948: 16x10
+#798 @ 182,277: 21x18
+#799 @ 623,205: 24x20
+#800 @ 720,654: 11x25
+#801 @ 731,103: 26x17
+#802 @ 829,581: 14x25
+#803 @ 431,738: 17x29
+#804 @ 524,620: 15x12
+#805 @ 512,539: 23x23
+#806 @ 829,943: 29x18
+#807 @ 93,176: 13x26
+#808 @ 883,796: 12x12
+#809 @ 214,543: 28x16
+#810 @ 518,231: 15x14
+#811 @ 213,502: 21x20
+#812 @ 255,598: 10x22
+#813 @ 352,477: 24x16
+#814 @ 664,653: 15x20
+#815 @ 741,338: 28x26
+#816 @ 361,174: 25x22
+#817 @ 101,582: 14x27
+#818 @ 237,103: 13x12
+#819 @ 814,157: 20x17
+#820 @ 182,216: 28x21
+#821 @ 194,282: 17x18
+#822 @ 247,657: 20x14
+#823 @ 0,647: 14x29
+#824 @ 899,959: 12x23
+#825 @ 151,90: 20x20
+#826 @ 341,562: 25x22
+#827 @ 895,137: 28x18
+#828 @ 853,703: 16x11
+#829 @ 8,934: 11x17
+#830 @ 395,528: 28x13
+#831 @ 874,122: 13x28
+#832 @ 605,187: 19x17
+#833 @ 684,219: 24x24
+#834 @ 382,885: 13x21
+#835 @ 751,858: 19x21
+#836 @ 518,38: 11x27
+#837 @ 812,383: 21x28
+#838 @ 904,886: 21x19
+#839 @ 356,751: 25x24
+#840 @ 586,554: 28x20
+#841 @ 98,582: 10x25
+#842 @ 438,552: 11x21
+#843 @ 231,601: 20x20
+#844 @ 906,176: 11x21
+#845 @ 237,52: 12x23
+#846 @ 81,19: 15x21
+#847 @ 600,731: 19x14
+#848 @ 553,43: 10x22
+#849 @ 703,825: 14x21
+#850 @ 193,283: 10x26
+#851 @ 73,407: 22x26
+#852 @ 226,602: 25x21
+#853 @ 515,223: 26x15
+#854 @ 95,363: 28x13
+#855 @ 927,2: 28x22
+#856 @ 457,470: 16x13
+#857 @ 67,23: 24x14
+#858 @ 435,244: 10x16
+#859 @ 640,450: 29x22
+#860 @ 385,778: 16x23
+#861 @ 734,157: 23x25
+#862 @ 516,727: 11x15
+#863 @ 488,733: 16x12
+#864 @ 83,719: 19x21
+#865 @ 530,287: 15x15
+#866 @ 729,671: 24x16
+#867 @ 240,320: 26x18
+#868 @ 311,583: 13x24
+#869 @ 224,956: 10x13
+#870 @ 662,482: 17x14
+#871 @ 533,896: 12x17
+#872 @ 844,440: 10x26
+#873 @ 104,625: 16x11
+#874 @ 632,431: 25x17
+#875 @ 735,292: 22x24
+#876 @ 74,625: 22x24
+#877 @ 752,738: 24x25
+#878 @ 599,594: 18x10
+#879 @ 220,951: 15x26
+#880 @ 339,67: 14x19
+#881 @ 856,704: 15x22
+#882 @ 829,158: 10x13
+#883 @ 823,838: 27x11
+#884 @ 368,952: 10x15
+#885 @ 32,281: 23x28
+#886 @ 700,84: 11x26
+#887 @ 800,342: 23x9
+#888 @ 392,728: 18x10
+#889 @ 488,802: 22x26
+#890 @ 206,785: 18x25
+#891 @ 411,294: 24x11
+#892 @ 566,932: 24x10
+#893 @ 529,409: 15x17
+#894 @ 477,549: 24x24
+#895 @ 816,957: 14x22
+#896 @ 256,719: 23x20
+#897 @ 860,304: 15x16
+#898 @ 881,268: 27x10
+#899 @ 470,387: 17x10
+#900 @ 173,25: 24x13
+#901 @ 144,28: 26x16
+#902 @ 685,372: 14x23
+#903 @ 695,681: 22x14
+#904 @ 748,874: 29x22
+#905 @ 897,765: 18x17
+#906 @ 880,756: 24x12
+#907 @ 627,112: 24x18
+#908 @ 655,479: 16x11
+#909 @ 392,560: 15x16
+#910 @ 61,740: 23x20
+#911 @ 696,232: 11x20
+#912 @ 452,30: 11x24
+#913 @ 581,289: 16x23
+#914 @ 786,561: 16x19
+#915 @ 774,346: 23x28
+#916 @ 537,171: 25x11
+#917 @ 326,723: 11x27
+#918 @ 224,914: 17x16
+#919 @ 906,176: 25x18
+#920 @ 878,572: 27x25
+#921 @ 391,561: 19x27
+#922 @ 715,976: 19x12
+#923 @ 275,748: 23x19
+#924 @ 381,802: 10x14
+#925 @ 940,217: 24x23
+#926 @ 741,53: 27x15
+#927 @ 104,445: 16x18
+#928 @ 519,127: 27x20
+#929 @ 445,598: 23x21
+#930 @ 126,601: 29x13
+#931 @ 658,225: 24x19
+#932 @ 920,952: 26x23
+#933 @ 110,776: 16x14
+#934 @ 896,945: 24x14
+#935 @ 733,125: 11x17
+#936 @ 849,555: 23x17
+#937 @ 376,546: 24x18
+#938 @ 153,930: 24x24
+#939 @ 470,855: 22x21
+#940 @ 45,321: 27x10
+#941 @ 773,553: 26x14
+#942 @ 749,180: 12x14
+#943 @ 736,631: 28x26
+#944 @ 737,871: 11x14
+#945 @ 447,253: 14x11
+#946 @ 825,628: 27x26
+#947 @ 749,435: 11x20
+#948 @ 919,271: 10x14
+#949 @ 556,558: 10x14
+#950 @ 258,595: 14x28
+#951 @ 324,858: 12x15
+#952 @ 54,735: 24x20
+#953 @ 718,354: 25x10
+#954 @ 954,20: 22x17
+#955 @ 625,176: 15x28
+#956 @ 828,374: 26x14
+#957 @ 946,677: 29x25
+#958 @ 94,678: 12x26
+#959 @ 657,251: 16x22
+#960 @ 537,124: 26x14
+#961 @ 893,609: 14x11
+#962 @ 131,596: 12x13
+#963 @ 436,44: 18x17
+#964 @ 359,651: 18x21
+#965 @ 427,288: 29x14
+#966 @ 521,545: 13x22
+#967 @ 558,231: 17x28
+#968 @ 179,334: 26x28
+#969 @ 801,166: 20x29
+#970 @ 542,41: 25x27
+#971 @ 545,606: 24x29
+#972 @ 278,868: 20x17
+#973 @ 46,956: 16x25
+#974 @ 62,784: 26x15
+#975 @ 346,55: 13x26
+#976 @ 772,213: 22x28
+#977 @ 581,146: 29x17
+#978 @ 283,845: 16x13
+#979 @ 961,683: 19x13
+#980 @ 968,686: 25x17
+#981 @ 637,18: 29x22
+#982 @ 558,932: 24x10
+#983 @ 376,193: 26x10
+#984 @ 884,430: 15x10
+#985 @ 317,13: 21x18
+#986 @ 568,56: 28x13
+#987 @ 661,718: 25x15
+#988 @ 715,672: 20x20
+#989 @ 861,782: 17x26
+#990 @ 455,852: 12x25
+#991 @ 889,802: 17x11
+#992 @ 879,106: 25x23
+#993 @ 867,347: 15x21
+#994 @ 924,422: 18x10
+#995 @ 814,942: 18x29
+#996 @ 84,858: 12x22
+#997 @ 581,427: 28x24
+#998 @ 247,182: 27x21
+#999 @ 971,182: 23x21
+#1000 @ 978,776: 11x17
+#1001 @ 1,786: 13x26
+#1002 @ 977,224: 20x25
+#1003 @ 576,413: 12x12
+#1004 @ 892,182: 23x11
+#1005 @ 680,350: 26x15
+#1006 @ 489,881: 21x15
+#1007 @ 900,891: 21x17
+#1008 @ 591,883: 12x22
+#1009 @ 826,602: 14x24
+#1010 @ 366,486: 23x22
+#1011 @ 711,115: 19x19
+#1012 @ 707,116: 27x10
+#1013 @ 826,817: 27x19
+#1014 @ 315,770: 14x11
+#1015 @ 296,676: 21x26
+#1016 @ 713,373: 19x18
+#1017 @ 7,925: 28x26
+#1018 @ 821,893: 26x19
+#1019 @ 679,85: 28x11
+#1020 @ 2,802: 27x12
+#1021 @ 335,491: 27x22
+#1022 @ 299,337: 12x21
+#1023 @ 804,708: 20x18
+#1024 @ 903,888: 26x19
+#1025 @ 264,744: 29x26
+#1026 @ 813,823: 18x29
+#1027 @ 757,36: 12x18
+#1028 @ 589,217: 14x29
+#1029 @ 761,553: 16x15
+#1030 @ 632,430: 10x13
+#1031 @ 855,795: 28x27
+#1032 @ 93,625: 15x26
+#1033 @ 139,934: 19x20
+#1034 @ 561,850: 12x17
+#1035 @ 834,159: 23x13
+#1036 @ 479,845: 29x16
+#1037 @ 767,935: 10x29
+#1038 @ 506,816: 18x17
+#1039 @ 670,548: 25x22
+#1040 @ 415,58: 14x27
+#1041 @ 943,188: 12x26
+#1042 @ 7,381: 22x17
+#1043 @ 674,568: 12x17
+#1044 @ 410,2: 12x10
+#1045 @ 685,688: 13x23
+#1046 @ 609,566: 18x10
+#1047 @ 484,48: 29x22
+#1048 @ 676,659: 27x14
+#1049 @ 0,812: 12x28
+#1050 @ 282,572: 20x23
+#1051 @ 898,860: 17x25
+#1052 @ 892,949: 14x20
+#1053 @ 580,906: 14x16
+#1054 @ 65,234: 20x19
+#1055 @ 856,479: 10x24
+#1056 @ 475,143: 13x13
+#1057 @ 822,556: 14x27
+#1058 @ 970,678: 22x16
+#1059 @ 488,191: 19x10
+#1060 @ 843,298: 23x10
+#1061 @ 686,225: 17x12
+#1062 @ 224,784: 24x19
+#1063 @ 104,978: 6x10
+#1064 @ 809,756: 29x23
+#1065 @ 851,756: 28x21
+#1066 @ 144,943: 13x26
+#1067 @ 491,667: 10x27
+#1068 @ 383,574: 29x19
+#1069 @ 525,485: 13x11
+#1070 @ 494,721: 21x14
+#1071 @ 670,473: 16x16
+#1072 @ 923,103: 20x23
+#1073 @ 425,367: 27x11
+#1074 @ 975,667: 18x23
+#1075 @ 607,94: 16x25
+#1076 @ 29,617: 10x14
+#1077 @ 741,763: 27x15
+#1078 @ 907,281: 24x21
+#1079 @ 527,545: 21x24
+#1080 @ 751,599: 26x28
+#1081 @ 129,945: 10x28
+#1082 @ 545,718: 17x21
+#1083 @ 833,143: 14x23
+#1084 @ 678,337: 13x22
+#1085 @ 450,473: 10x20
+#1086 @ 883,388: 17x28
+#1087 @ 865,314: 16x21
+#1088 @ 861,408: 20x22
+#1089 @ 582,264: 15x26
+#1090 @ 612,913: 10x11
+#1091 @ 868,575: 11x15
+#1092 @ 854,596: 14x18
+#1093 @ 551,232: 22x24
+#1094 @ 675,898: 24x10
+#1095 @ 70,425: 12x16
+#1096 @ 325,763: 29x19
+#1097 @ 907,855: 16x21
+#1098 @ 770,817: 11x25
+#1099 @ 370,788: 20x22
+#1100 @ 883,426: 22x13
+#1101 @ 718,42: 10x23
+#1102 @ 670,568: 19x28
+#1103 @ 556,702: 23x27
+#1104 @ 224,245: 17x19
+#1105 @ 861,50: 18x25
+#1106 @ 840,622: 21x16
+#1107 @ 827,711: 13x21
+#1108 @ 211,46: 12x16
+#1109 @ 243,918: 19x19
+#1110 @ 855,323: 17x14
+#1111 @ 409,758: 27x24
+#1112 @ 337,193: 26x24
+#1113 @ 272,288: 12x26
+#1114 @ 197,340: 22x21
+#1115 @ 950,574: 16x21
+#1116 @ 311,508: 27x13
+#1117 @ 798,339: 29x17
+#1118 @ 892,173: 10x15
+#1119 @ 779,604: 11x12
+#1120 @ 225,818: 13x15
+#1121 @ 784,25: 19x11
+#1122 @ 88,25: 25x27
+#1123 @ 246,755: 25x28
+#1124 @ 239,175: 26x24
+#1125 @ 398,547: 18x23
+#1126 @ 756,193: 29x25
+#1127 @ 96,680: 4x20
+#1128 @ 916,826: 20x12
+#1129 @ 457,578: 29x29
+#1130 @ 91,576: 23x27
+#1131 @ 618,39: 29x18
+#1132 @ 621,960: 25x21
+#1133 @ 275,936: 14x27
+#1134 @ 130,144: 29x16
+#1135 @ 400,747: 15x29
+#1136 @ 619,221: 20x15
+#1137 @ 734,169: 17x11
+#1138 @ 359,635: 18x16
+#1139 @ 244,349: 29x22
+#1140 @ 202,270: 14x29
+#1141 @ 461,556: 29x28
+#1142 @ 503,155: 24x21
+#1143 @ 857,610: 18x15
+#1144 @ 660,592: 29x27
+#1145 @ 218,446: 12x13
+#1146 @ 149,850: 28x14
+#1147 @ 564,679: 16x11
+#1148 @ 709,112: 28x22
+#1149 @ 465,713: 17x19
+#1150 @ 36,827: 17x21
+#1151 @ 755,284: 14x29
+#1152 @ 313,74: 12x28
+#1153 @ 371,863: 25x26
+#1154 @ 908,817: 10x28
+#1155 @ 561,136: 17x13
+#1156 @ 449,55: 25x14
+#1157 @ 229,617: 18x11
+#1158 @ 841,529: 23x27
+#1159 @ 946,219: 4x17
+#1160 @ 255,612: 15x28
+#1161 @ 617,908: 28x23
+#1162 @ 830,821: 10x15
+#1163 @ 936,168: 15x27
+#1164 @ 275,84: 11x24
+#1165 @ 182,337: 22x18
+#1166 @ 722,642: 17x19
+#1167 @ 120,542: 20x22
+#1168 @ 377,916: 20x26
+#1169 @ 407,724: 25x10
+#1170 @ 380,470: 23x27
+#1171 @ 235,732: 28x15
+#1172 @ 485,445: 19x21
+#1173 @ 8,248: 11x10
+#1174 @ 96,594: 28x10
+#1175 @ 417,110: 13x17
+#1176 @ 316,128: 15x28
+#1177 @ 895,164: 11x10
+#1178 @ 720,148: 28x22
+#1179 @ 932,807: 13x25
+#1180 @ 615,487: 23x12
+#1181 @ 291,846: 21x21
+#1182 @ 931,467: 13x21
+#1183 @ 766,736: 27x13
+#1184 @ 345,728: 19x12
+#1185 @ 781,161: 17x27
+#1186 @ 262,891: 15x25
+#1187 @ 219,755: 12x20
+#1188 @ 681,109: 23x11
+#1189 @ 941,959: 29x16
+#1190 @ 800,13: 23x25
+#1191 @ 51,902: 28x24
+#1192 @ 261,704: 18x12
+#1193 @ 63,438: 20x17
+#1194 @ 428,339: 22x23
+#1195 @ 732,860: 18x25
+#1196 @ 132,750: 23x12
+#1197 @ 771,59: 26x18
+#1198 @ 19,322: 24x17
+#1199 @ 558,119: 11x22
+#1200 @ 213,33: 13x14
+#1201 @ 746,843: 13x12
+#1202 @ 607,223: 15x25
+#1203 @ 744,185: 13x16
+#1204 @ 896,863: 14x11
+#1205 @ 781,653: 20x16
+#1206 @ 519,411: 14x10
+#1207 @ 587,708: 27x14
+#1208 @ 353,41: 29x16
+#1209 @ 555,555: 14x11
+#1210 @ 408,553: 25x22
+#1211 @ 639,190: 27x29
+#1212 @ 149,88: 12x27
+#1213 @ 988,44: 10x20
+#1214 @ 617,812: 26x19
+#1215 @ 308,435: 25x12
+#1216 @ 629,405: 11x29
+#1217 @ 732,761: 11x25
+#1218 @ 802,229: 16x17
+#1219 @ 302,310: 28x26
+#1220 @ 918,368: 16x10
+#1221 @ 66,423: 12x16
+#1222 @ 917,267: 23x28
+#1223 @ 601,956: 3x10
+#1224 @ 653,919: 14x24
+#1225 @ 144,271: 20x16
+#1226 @ 508,421: 27x15
+#1227 @ 519,505: 18x11
+#1228 @ 530,385: 12x13
+#1229 @ 665,446: 18x16
+#1230 @ 520,399: 19x25
+#1231 @ 637,653: 22x29
+#1232 @ 583,956: 14x11
+#1233 @ 484,567: 23x21
+#1234 @ 216,301: 17x12
+#1235 @ 691,507: 12x17
+#1236 @ 854,476: 12x11
+#1237 @ 64,49: 11x16
+#1238 @ 863,564: 16x10
+#1239 @ 360,381: 16x17
+#1240 @ 925,888: 10x18
+#1241 @ 665,330: 12x18
+#1242 @ 228,601: 16x13
+#1243 @ 574,908: 17x13
+#1244 @ 597,953: 14x20
+#1245 @ 954,866: 17x19
+#1246 @ 791,870: 14x12
+#1247 @ 667,476: 13x28
+#1248 @ 662,488: 10x12
+#1249 @ 497,34: 10x27
+#1250 @ 110,132: 22x24
+#1251 @ 177,93: 4x11
+#1252 @ 721,114: 10x20
+#1253 @ 476,376: 21x27
+#1254 @ 384,888: 6x14
+#1255 @ 698,514: 16x26
+#1256 @ 779,308: 16x11
+#1257 @ 701,777: 26x22
+#1258 @ 933,733: 15x26
+#1259 @ 934,70: 24x26
+#1260 @ 72,787: 22x27
+#1261 @ 449,652: 18x15
+#1262 @ 425,558: 16x22
+#1263 @ 622,445: 15x16
+#1264 @ 157,175: 20x23
+#1265 @ 887,212: 21x21
+#1266 @ 514,490: 16x20
+#1267 @ 368,488: 4x6
+#1268 @ 797,41: 18x27
+#1269 @ 91,685: 22x23
+#1270 @ 277,115: 27x28
+#1271 @ 297,360: 27x20
+#1272 @ 195,559: 3x11
+#1273 @ 719,686: 23x10
+#1274 @ 397,818: 29x15
+#1275 @ 487,267: 27x10
+#1276 @ 711,388: 20x18
+#1277 @ 309,496: 27x27
+#1278 @ 414,173: 29x11
+#1279 @ 857,568: 12x18
+#1280 @ 165,155: 19x28
+#1281 @ 656,714: 12x26
+#1282 @ 255,921: 3x12
+#1283 @ 276,163: 12x14
+#1284 @ 634,812: 16x29
+#1285 @ 340,248: 23x23
+#1286 @ 193,268: 12x10
+#1287 @ 383,629: 21x26
+#1288 @ 933,297: 8x16
+#1289 @ 613,167: 13x25
+#1290 @ 852,118: 15x25
+#1291 @ 661,343: 11x20
+#1292 @ 827,119: 14x28
+#1293 @ 636,46: 27x11
+#1294 @ 629,202: 11x15
+#1295 @ 361,286: 18x23
+#1296 @ 539,925: 10x26
+#1297 @ 489,869: 15x18
+#1298 @ 415,45: 26x17
+#1299 @ 94,358: 20x17
+#1300 @ 413,552: 13x17
+#1301 @ 529,918: 16x24
+#1302 @ 400,808: 10x21
+#1303 @ 940,370: 21x27
+#1304 @ 813,185: 29x14
+#1305 @ 95,28: 24x11
+#1306 @ 249,327: 24x16
+#1307 @ 760,926: 26x12
+#1308 @ 732,957: 13x12
+#1309 @ 582,910: 13x13
+#1310 @ 0,162: 17x20
+#1311 @ 747,594: 10x11
+#1312 @ 712,513: 20x23
+#1313 @ 489,795: 26x29
+#1314 @ 474,335: 11x11
+#1315 @ 928,854: 27x16
+#1316 @ 7,377: 14x23
+#1317 @ 923,373: 20x22
+#1318 @ 411,954: 16x11
+#1319 @ 9,935: 20x14
+#1320 @ 887,848: 26x10
+#1321 @ 404,860: 11x11
+#1322 @ 475,281: 24x22
+#1323 @ 710,774: 21x22
+#1324 @ 794,158: 17x24
+#1325 @ 513,797: 25x28
+#1326 @ 707,755: 26x26
+#1327 @ 53,33: 29x24
+#1328 @ 506,184: 13x26
+#1329 @ 829,145: 20x10
+#1330 @ 891,774: 16x12
+#1331 @ 807,597: 26x27
+#1332 @ 375,313: 16x25
+#1333 @ 918,895: 16x11
+#1334 @ 884,128: 24x23
+#1335 @ 340,833: 25x24
+#1336 @ 202,485: 26x10
+#1337 @ 279,681: 21x10
+#1338 @ 199,913: 19x14
+#1339 @ 537,813: 26x29
+#1340 @ 89,723: 10x24
+#1341 @ 286,935: 22x27
+#1342 @ 347,72: 22x25
+#1343 @ 805,893: 11x28
+#1344 @ 917,81: 18x11
+#1345 @ 630,949: 21x16
+#1346 @ 526,905: 22x17
+#1347 @ 908,578: 17x15
+#1348 @ 235,237: 10x25
+#1349 @ 224,798: 20x23
+#1350 @ 759,525: 24x27
+#1351 @ 738,299: 25x16
+#1352 @ 224,888: 25x14
+#1353 @ 319,601: 28x26
+#1354 @ 212,397: 11x25
+#1355 @ 102,538: 21x28
+#1356 @ 457,251: 14x17
+#1357 @ 931,293: 13x24
+#1358 @ 808,93: 14x22
+#1359 @ 593,814: 12x23
+#1360 @ 468,131: 10x21
+#1361 @ 593,251: 15x15
+#1362 @ 362,16: 20x19
+#1363 @ 862,511: 14x11
+#1364 @ 671,626: 17x16
+#1365 @ 473,697: 16x14
+#1366 @ 368,329: 28x18
+#1367 @ 925,194: 24x29
+#1368 @ 875,511: 12x12
+#1369 @ 967,411: 25x27
+#1370 @ 89,411: 15x18
+#1371 @ 307,943: 12x28
+#1372 @ 119,13: 29x16
+#1373 @ 806,710: 15x11
+#1374 @ 544,534: 13x18
+#1375 @ 672,698: 14x17
+#1376 @ 645,848: 23x20
+#1377 @ 889,954: 25x13
+#1378 @ 378,24: 12x14
+#1379 @ 542,442: 22x15
+#1380 @ 42,454: 18x28
+#1381 @ 175,91: 11x22
+#1382 @ 840,533: 12x21
+#1383 @ 792,736: 24x27
+#1384 @ 731,713: 17x27
+#1385 @ 614,449: 22x20
diff --git a/2018/inputs/4.txt b/2018/inputs/4.txt
new file mode 100644
index 0000000..4a0ff6e
--- /dev/null
+++ b/2018/inputs/4.txt
@@ -0,0 +1,1088 @@
+[1518-09-17 23:48] Guard #1307 begins shift
+[1518-06-03 00:00] Guard #3217 begins shift
+[1518-07-28 00:49] falls asleep
+[1518-03-30 00:57] falls asleep
+[1518-07-01 23:58] Guard #409 begins shift
+[1518-04-13 00:25] wakes up
+[1518-04-09 00:22] wakes up
+[1518-11-02 00:41] falls asleep
+[1518-11-21 00:23] falls asleep
+[1518-05-03 00:59] wakes up
+[1518-11-21 00:02] Guard #1459 begins shift
+[1518-08-18 00:27] wakes up
+[1518-08-09 00:48] falls asleep
+[1518-09-23 00:23] falls asleep
+[1518-03-29 23:57] Guard #113 begins shift
+[1518-04-16 00:43] wakes up
+[1518-05-13 00:33] falls asleep
+[1518-05-19 00:58] wakes up
+[1518-07-09 00:44] wakes up
+[1518-04-26 00:03] falls asleep
+[1518-08-24 00:55] falls asleep
+[1518-06-30 00:51] falls asleep
+[1518-10-14 00:06] falls asleep
+[1518-04-28 00:23] falls asleep
+[1518-10-05 00:57] wakes up
+[1518-09-02 00:56] wakes up
+[1518-03-11 00:38] falls asleep
+[1518-07-30 00:54] wakes up
+[1518-09-15 23:58] Guard #1811 begins shift
+[1518-08-08 23:58] Guard #1033 begins shift
+[1518-08-07 00:08] falls asleep
+[1518-06-13 00:46] wakes up
+[1518-10-08 00:54] falls asleep
+[1518-06-08 23:46] Guard #557 begins shift
+[1518-06-01 00:22] wakes up
+[1518-08-05 00:59] wakes up
+[1518-03-08 00:03] Guard #3271 begins shift
+[1518-07-18 23:59] Guard #449 begins shift
+[1518-09-24 00:00] Guard #389 begins shift
+[1518-04-22 00:45] wakes up
+[1518-07-31 00:41] falls asleep
+[1518-03-24 00:02] falls asleep
+[1518-05-21 00:29] falls asleep
+[1518-05-27 23:59] Guard #449 begins shift
+[1518-10-30 00:52] wakes up
+[1518-08-09 00:51] wakes up
+[1518-03-16 00:54] wakes up
+[1518-04-11 00:28] falls asleep
+[1518-04-25 00:58] wakes up
+[1518-10-06 00:07] falls asleep
+[1518-08-15 23:49] Guard #557 begins shift
+[1518-10-17 23:51] Guard #739 begins shift
+[1518-06-27 00:00] Guard #3217 begins shift
+[1518-06-30 00:01] Guard #1237 begins shift
+[1518-04-29 00:01] Guard #3271 begins shift
+[1518-11-12 00:19] falls asleep
+[1518-07-27 00:50] wakes up
+[1518-03-06 00:42] falls asleep
+[1518-11-17 00:57] wakes up
+[1518-07-21 00:48] wakes up
+[1518-03-04 00:28] falls asleep
+[1518-08-24 00:37] falls asleep
+[1518-09-19 00:21] wakes up
+[1518-11-05 00:24] wakes up
+[1518-06-24 00:02] falls asleep
+[1518-10-24 00:55] falls asleep
+[1518-06-14 00:56] wakes up
+[1518-06-29 00:47] wakes up
+[1518-04-15 00:14] wakes up
+[1518-08-21 00:08] falls asleep
+[1518-09-16 00:48] falls asleep
+[1518-10-11 00:42] wakes up
+[1518-03-04 00:09] wakes up
+[1518-03-13 00:18] falls asleep
+[1518-10-28 00:56] wakes up
+[1518-03-27 00:20] wakes up
+[1518-05-24 00:03] Guard #739 begins shift
+[1518-08-31 00:54] wakes up
+[1518-06-22 00:50] falls asleep
+[1518-06-15 00:45] wakes up
+[1518-07-22 23:47] Guard #2647 begins shift
+[1518-09-02 00:00] falls asleep
+[1518-05-04 00:14] falls asleep
+[1518-03-06 00:51] wakes up
+[1518-10-02 00:35] wakes up
+[1518-10-05 00:20] falls asleep
+[1518-05-06 00:53] falls asleep
+[1518-10-12 00:47] wakes up
+[1518-04-08 00:30] wakes up
+[1518-11-19 00:40] falls asleep
+[1518-11-13 00:32] falls asleep
+[1518-08-21 23:46] Guard #3271 begins shift
+[1518-05-31 00:56] falls asleep
+[1518-05-18 00:57] wakes up
+[1518-05-17 00:56] wakes up
+[1518-05-24 23:51] Guard #601 begins shift
+[1518-10-30 00:32] wakes up
+[1518-10-05 00:13] wakes up
+[1518-11-02 00:03] Guard #2647 begins shift
+[1518-05-02 00:36] wakes up
+[1518-07-29 00:40] wakes up
+[1518-07-16 00:53] wakes up
+[1518-09-04 00:18] wakes up
+[1518-05-11 00:33] falls asleep
+[1518-03-09 00:00] Guard #1811 begins shift
+[1518-10-24 23:57] Guard #827 begins shift
+[1518-11-18 00:46] wakes up
+[1518-08-14 00:27] falls asleep
+[1518-05-25 00:17] wakes up
+[1518-03-03 00:02] Guard #947 begins shift
+[1518-05-29 00:00] falls asleep
+[1518-06-05 00:04] wakes up
+[1518-07-26 00:42] wakes up
+[1518-10-01 00:39] falls asleep
+[1518-06-22 00:54] wakes up
+[1518-09-06 00:24] wakes up
+[1518-08-04 00:24] falls asleep
+[1518-04-25 00:35] wakes up
+[1518-11-11 00:11] falls asleep
+[1518-09-27 00:58] wakes up
+[1518-09-16 00:15] falls asleep
+[1518-07-25 00:55] wakes up
+[1518-08-28 00:27] falls asleep
+[1518-08-12 00:39] falls asleep
+[1518-11-05 00:32] falls asleep
+[1518-05-29 23:52] Guard #3209 begins shift
+[1518-04-27 00:35] wakes up
+[1518-04-20 00:06] falls asleep
+[1518-03-21 00:47] falls asleep
+[1518-10-18 00:55] wakes up
+[1518-09-29 00:31] falls asleep
+[1518-09-17 00:40] wakes up
+[1518-04-22 00:19] falls asleep
+[1518-06-14 00:32] falls asleep
+[1518-10-07 23:59] Guard #1307 begins shift
+[1518-04-25 00:55] falls asleep
+[1518-08-27 00:24] falls asleep
+[1518-08-01 23:56] Guard #389 begins shift
+[1518-09-04 23:56] Guard #409 begins shift
+[1518-09-29 23:56] Guard #449 begins shift
+[1518-10-05 00:23] wakes up
+[1518-04-04 00:58] wakes up
+[1518-08-05 00:54] falls asleep
+[1518-07-20 00:46] wakes up
+[1518-04-08 00:46] wakes up
+[1518-06-18 00:52] wakes up
+[1518-05-03 23:59] Guard #1033 begins shift
+[1518-11-01 00:37] wakes up
+[1518-03-11 00:30] wakes up
+[1518-06-06 00:42] wakes up
+[1518-06-20 00:06] falls asleep
+[1518-04-05 00:55] wakes up
+[1518-09-13 23:57] Guard #3217 begins shift
+[1518-04-21 00:00] Guard #1459 begins shift
+[1518-03-18 00:00] Guard #1307 begins shift
+[1518-09-13 00:03] Guard #557 begins shift
+[1518-05-28 23:51] Guard #3217 begins shift
+[1518-10-23 23:49] Guard #113 begins shift
+[1518-03-11 23:59] Guard #113 begins shift
+[1518-09-06 00:07] falls asleep
+[1518-03-03 00:42] falls asleep
+[1518-07-21 00:57] falls asleep
+[1518-06-12 00:08] falls asleep
+[1518-10-04 23:59] Guard #1237 begins shift
+[1518-08-19 00:36] falls asleep
+[1518-10-13 00:09] falls asleep
+[1518-08-18 00:57] wakes up
+[1518-08-28 23:52] Guard #1307 begins shift
+[1518-09-09 00:58] wakes up
+[1518-10-11 00:14] falls asleep
+[1518-07-25 23:50] Guard #1559 begins shift
+[1518-07-14 23:59] Guard #1237 begins shift
+[1518-09-26 00:58] wakes up
+[1518-05-22 23:59] Guard #3067 begins shift
+[1518-05-22 00:57] falls asleep
+[1518-05-02 00:58] wakes up
+[1518-05-14 00:52] wakes up
+[1518-04-18 00:51] wakes up
+[1518-06-17 00:35] wakes up
+[1518-05-18 23:59] Guard #389 begins shift
+[1518-08-16 00:12] wakes up
+[1518-11-08 00:49] wakes up
+[1518-08-18 00:04] Guard #1307 begins shift
+[1518-07-13 00:48] wakes up
+[1518-08-18 23:58] Guard #1459 begins shift
+[1518-03-09 00:52] wakes up
+[1518-03-16 00:00] Guard #1237 begins shift
+[1518-06-13 00:24] falls asleep
+[1518-08-16 00:04] falls asleep
+[1518-09-19 00:55] wakes up
+[1518-10-04 00:47] wakes up
+[1518-05-04 23:50] Guard #389 begins shift
+[1518-07-03 00:57] wakes up
+[1518-04-24 00:14] falls asleep
+[1518-09-03 00:22] wakes up
+[1518-11-09 00:54] falls asleep
+[1518-09-02 00:36] wakes up
+[1518-06-30 00:56] wakes up
+[1518-08-26 00:51] wakes up
+[1518-04-27 23:56] Guard #1307 begins shift
+[1518-11-02 00:10] falls asleep
+[1518-09-20 23:57] Guard #1811 begins shift
+[1518-03-14 00:48] wakes up
+[1518-05-31 00:30] wakes up
+[1518-08-07 00:03] Guard #3209 begins shift
+[1518-08-07 00:50] falls asleep
+[1518-09-25 00:57] wakes up
+[1518-10-18 00:08] wakes up
+[1518-10-03 00:56] wakes up
+[1518-05-27 00:46] wakes up
+[1518-06-07 00:18] falls asleep
+[1518-06-06 00:55] wakes up
+[1518-03-18 00:56] wakes up
+[1518-04-04 23:59] Guard #449 begins shift
+[1518-09-28 00:59] wakes up
+[1518-08-10 00:12] wakes up
+[1518-05-30 00:21] wakes up
+[1518-11-09 00:57] wakes up
+[1518-11-15 00:13] falls asleep
+[1518-06-10 23:57] Guard #1811 begins shift
+[1518-11-04 00:01] falls asleep
+[1518-05-21 00:47] falls asleep
+[1518-10-07 00:05] falls asleep
+[1518-03-12 00:36] wakes up
+[1518-08-09 00:37] wakes up
+[1518-09-23 00:58] wakes up
+[1518-04-14 00:22] falls asleep
+[1518-07-07 00:35] falls asleep
+[1518-03-15 00:59] wakes up
+[1518-03-14 00:44] falls asleep
+[1518-11-06 00:04] Guard #3067 begins shift
+[1518-07-14 00:01] Guard #3217 begins shift
+[1518-10-23 00:09] falls asleep
+[1518-07-01 00:38] wakes up
+[1518-11-05 00:51] wakes up
+[1518-04-08 00:52] falls asleep
+[1518-09-22 00:40] falls asleep
+[1518-09-08 00:20] falls asleep
+[1518-05-09 00:49] falls asleep
+[1518-10-17 00:02] Guard #3067 begins shift
+[1518-10-01 23:56] Guard #3217 begins shift
+[1518-05-10 00:58] wakes up
+[1518-11-11 23:57] Guard #3271 begins shift
+[1518-09-27 00:49] falls asleep
+[1518-09-30 00:48] wakes up
+[1518-06-06 00:01] Guard #601 begins shift
+[1518-03-18 23:59] Guard #3217 begins shift
+[1518-03-20 23:57] Guard #2647 begins shift
+[1518-07-29 00:52] falls asleep
+[1518-04-01 23:51] Guard #1459 begins shift
+[1518-03-23 00:14] falls asleep
+[1518-07-28 00:38] wakes up
+[1518-09-04 00:49] wakes up
+[1518-06-10 00:57] wakes up
+[1518-10-26 00:57] wakes up
+[1518-04-01 00:52] wakes up
+[1518-07-10 00:47] wakes up
+[1518-03-24 23:56] Guard #3217 begins shift
+[1518-07-07 00:58] wakes up
+[1518-08-10 00:11] falls asleep
+[1518-08-22 00:56] falls asleep
+[1518-11-03 00:21] wakes up
+[1518-03-28 23:59] Guard #947 begins shift
+[1518-07-29 00:35] falls asleep
+[1518-09-09 00:05] falls asleep
+[1518-04-11 00:58] wakes up
+[1518-10-12 00:55] wakes up
+[1518-11-14 00:44] wakes up
+[1518-03-17 00:47] wakes up
+[1518-03-29 00:13] falls asleep
+[1518-06-04 00:40] falls asleep
+[1518-11-16 00:14] falls asleep
+[1518-05-11 00:04] Guard #1459 begins shift
+[1518-06-03 00:11] falls asleep
+[1518-10-22 00:58] wakes up
+[1518-04-15 00:57] falls asleep
+[1518-07-12 00:59] wakes up
+[1518-05-21 00:31] wakes up
+[1518-06-27 00:09] falls asleep
+[1518-08-07 00:41] wakes up
+[1518-10-22 00:11] falls asleep
+[1518-09-02 00:43] falls asleep
+[1518-05-31 00:28] falls asleep
+[1518-05-25 00:07] falls asleep
+[1518-07-25 00:13] wakes up
+[1518-06-13 00:35] wakes up
+[1518-08-17 00:40] falls asleep
+[1518-08-02 00:58] wakes up
+[1518-03-26 00:23] falls asleep
+[1518-11-04 00:59] wakes up
+[1518-03-28 00:38] falls asleep
+[1518-10-29 23:57] Guard #113 begins shift
+[1518-09-11 23:59] Guard #2647 begins shift
+[1518-03-09 00:48] falls asleep
+[1518-08-18 00:53] wakes up
+[1518-09-02 00:46] wakes up
+[1518-06-18 00:02] Guard #739 begins shift
+[1518-10-22 00:00] Guard #1811 begins shift
+[1518-09-23 00:27] wakes up
+[1518-08-31 00:38] falls asleep
+[1518-09-25 00:39] falls asleep
+[1518-08-08 00:03] Guard #2647 begins shift
+[1518-09-14 00:23] falls asleep
+[1518-08-21 00:04] Guard #877 begins shift
+[1518-10-09 00:31] wakes up
+[1518-06-20 00:51] wakes up
+[1518-06-06 00:17] falls asleep
+[1518-08-10 00:17] falls asleep
+[1518-05-08 00:57] wakes up
+[1518-11-10 00:06] falls asleep
+[1518-05-30 23:58] Guard #1559 begins shift
+[1518-10-12 00:44] falls asleep
+[1518-09-08 00:53] wakes up
+[1518-04-08 00:28] falls asleep
+[1518-08-17 00:52] wakes up
+[1518-05-02 00:57] falls asleep
+[1518-05-06 00:56] wakes up
+[1518-03-23 00:00] Guard #1811 begins shift
+[1518-04-27 00:10] falls asleep
+[1518-06-09 00:04] falls asleep
+[1518-08-18 00:10] falls asleep
+[1518-07-25 00:46] falls asleep
+[1518-10-10 00:43] wakes up
+[1518-04-19 00:48] wakes up
+[1518-10-20 00:49] wakes up
+[1518-04-17 00:01] Guard #1237 begins shift
+[1518-05-21 00:06] falls asleep
+[1518-11-15 00:37] wakes up
+[1518-05-04 00:24] wakes up
+[1518-10-04 00:01] Guard #2647 begins shift
+[1518-03-26 00:00] Guard #389 begins shift
+[1518-08-29 00:23] wakes up
+[1518-04-02 00:03] falls asleep
+[1518-05-14 00:12] falls asleep
+[1518-04-14 00:57] wakes up
+[1518-06-01 23:56] Guard #449 begins shift
+[1518-08-11 23:56] Guard #1811 begins shift
+[1518-07-04 00:01] Guard #3271 begins shift
+[1518-07-22 00:38] falls asleep
+[1518-11-13 23:58] Guard #2647 begins shift
+[1518-05-07 00:59] wakes up
+[1518-06-22 00:26] falls asleep
+[1518-08-28 00:01] Guard #3067 begins shift
+[1518-10-31 00:03] Guard #113 begins shift
+[1518-06-24 00:48] wakes up
+[1518-03-18 00:28] falls asleep
+[1518-03-16 00:13] falls asleep
+[1518-04-27 00:57] falls asleep
+[1518-07-14 00:24] wakes up
+[1518-11-18 00:59] wakes up
+[1518-05-01 00:00] Guard #739 begins shift
+[1518-11-08 23:56] Guard #3209 begins shift
+[1518-06-20 00:36] falls asleep
+[1518-09-21 00:20] falls asleep
+[1518-05-28 00:21] wakes up
+[1518-03-05 00:23] falls asleep
+[1518-03-30 00:38] wakes up
+[1518-07-12 00:56] falls asleep
+[1518-04-03 00:25] wakes up
+[1518-03-21 00:58] wakes up
+[1518-08-11 00:17] falls asleep
+[1518-08-12 23:59] Guard #947 begins shift
+[1518-04-29 23:53] Guard #947 begins shift
+[1518-05-10 00:03] Guard #3209 begins shift
+[1518-03-04 00:38] wakes up
+[1518-05-14 00:03] Guard #947 begins shift
+[1518-03-22 00:57] wakes up
+[1518-07-15 00:37] falls asleep
+[1518-06-11 00:48] wakes up
+[1518-04-14 00:01] Guard #557 begins shift
+[1518-07-24 00:49] wakes up
+[1518-09-01 00:56] wakes up
+[1518-08-26 00:59] wakes up
+[1518-08-25 00:15] falls asleep
+[1518-07-06 00:04] falls asleep
+[1518-07-03 00:03] Guard #557 begins shift
+[1518-10-20 00:45] falls asleep
+[1518-10-18 00:53] falls asleep
+[1518-06-19 00:53] wakes up
+[1518-03-27 00:51] falls asleep
+[1518-07-11 00:43] falls asleep
+[1518-05-03 00:55] falls asleep
+[1518-09-21 00:49] falls asleep
+[1518-09-20 00:54] wakes up
+[1518-06-01 00:04] falls asleep
+[1518-05-13 00:37] wakes up
+[1518-06-27 00:46] wakes up
+[1518-04-03 00:01] Guard #601 begins shift
+[1518-03-13 00:55] falls asleep
+[1518-10-10 00:13] falls asleep
+[1518-10-31 00:21] falls asleep
+[1518-03-14 00:54] falls asleep
+[1518-04-06 00:02] Guard #1237 begins shift
+[1518-10-15 00:48] wakes up
+[1518-03-27 00:02] Guard #1559 begins shift
+[1518-10-12 00:14] falls asleep
+[1518-07-11 00:25] falls asleep
+[1518-03-04 00:43] falls asleep
+[1518-04-16 00:53] falls asleep
+[1518-06-11 00:54] falls asleep
+[1518-06-16 00:15] falls asleep
+[1518-10-18 00:46] falls asleep
+[1518-07-24 00:02] Guard #389 begins shift
+[1518-04-04 00:26] wakes up
+[1518-04-07 00:21] falls asleep
+[1518-04-12 23:56] Guard #2647 begins shift
+[1518-07-18 00:49] wakes up
+[1518-05-07 00:04] falls asleep
+[1518-10-06 00:04] Guard #947 begins shift
+[1518-09-18 00:43] wakes up
+[1518-04-29 00:33] wakes up
+[1518-07-29 00:57] falls asleep
+[1518-08-27 00:42] wakes up
+[1518-03-16 23:46] Guard #739 begins shift
+[1518-05-20 00:23] falls asleep
+[1518-07-27 00:09] falls asleep
+[1518-08-18 00:37] falls asleep
+[1518-06-26 00:01] Guard #1307 begins shift
+[1518-09-30 00:20] falls asleep
+[1518-04-11 00:44] falls asleep
+[1518-04-09 00:12] falls asleep
+[1518-03-31 00:03] Guard #1559 begins shift
+[1518-06-08 00:00] Guard #449 begins shift
+[1518-11-07 00:46] wakes up
+[1518-04-11 00:04] Guard #409 begins shift
+[1518-03-04 00:56] wakes up
+[1518-07-24 00:47] falls asleep
+[1518-08-25 00:21] wakes up
+[1518-05-24 00:06] falls asleep
+[1518-05-08 00:52] falls asleep
+[1518-08-29 23:57] Guard #3067 begins shift
+[1518-05-18 00:00] falls asleep
+[1518-08-19 23:59] Guard #1459 begins shift
+[1518-05-31 00:58] wakes up
+[1518-06-13 00:00] Guard #947 begins shift
+[1518-10-28 00:48] falls asleep
+[1518-05-20 23:58] Guard #877 begins shift
+[1518-08-20 00:28] falls asleep
+[1518-06-17 00:12] falls asleep
+[1518-08-19 00:51] falls asleep
+[1518-03-03 23:48] Guard #557 begins shift
+[1518-10-28 00:30] falls asleep
+[1518-03-30 00:11] falls asleep
+[1518-06-07 00:53] wakes up
+[1518-07-22 00:01] Guard #557 begins shift
+[1518-11-11 00:58] wakes up
+[1518-08-27 00:00] Guard #3067 begins shift
+[1518-06-06 00:19] wakes up
+[1518-10-24 00:59] wakes up
+[1518-11-03 00:26] falls asleep
+[1518-08-19 00:41] wakes up
+[1518-03-19 00:33] falls asleep
+[1518-10-02 00:53] wakes up
+[1518-07-31 23:58] Guard #1723 begins shift
+[1518-08-23 00:53] wakes up
+[1518-03-13 00:59] wakes up
+[1518-10-20 23:59] Guard #449 begins shift
+[1518-05-12 00:09] falls asleep
+[1518-05-17 23:54] Guard #1811 begins shift
+[1518-06-25 00:53] wakes up
+[1518-06-17 00:55] wakes up
+[1518-05-09 00:24] falls asleep
+[1518-08-14 00:01] Guard #739 begins shift
+[1518-03-20 00:06] falls asleep
+[1518-11-20 00:28] falls asleep
+[1518-04-15 00:58] wakes up
+[1518-05-22 00:36] wakes up
+[1518-04-12 00:04] Guard #877 begins shift
+[1518-06-04 23:52] Guard #877 begins shift
+[1518-10-09 00:07] falls asleep
+[1518-06-05 00:15] falls asleep
+[1518-06-28 00:34] wakes up
+[1518-11-13 00:37] wakes up
+[1518-09-24 00:48] wakes up
+[1518-05-15 00:02] Guard #557 begins shift
+[1518-05-27 00:21] falls asleep
+[1518-11-12 00:34] wakes up
+[1518-06-06 00:51] falls asleep
+[1518-11-21 00:43] wakes up
+[1518-09-01 00:28] falls asleep
+[1518-10-13 00:00] Guard #947 begins shift
+[1518-11-20 00:46] wakes up
+[1518-05-22 00:01] Guard #1559 begins shift
+[1518-04-05 00:07] falls asleep
+[1518-06-11 23:56] Guard #3209 begins shift
+[1518-07-11 00:51] wakes up
+[1518-08-30 00:17] falls asleep
+[1518-05-12 23:57] Guard #3271 begins shift
+[1518-03-15 00:24] falls asleep
+[1518-04-26 23:59] Guard #3067 begins shift
+[1518-03-09 00:06] falls asleep
+[1518-03-09 00:57] wakes up
+[1518-03-08 00:58] wakes up
+[1518-04-13 00:22] falls asleep
+[1518-04-14 23:46] Guard #1033 begins shift
+[1518-07-28 00:54] falls asleep
+[1518-09-20 00:00] Guard #3067 begins shift
+[1518-05-09 00:43] wakes up
+[1518-11-01 00:03] Guard #3067 begins shift
+[1518-05-12 00:55] wakes up
+[1518-03-08 00:09] falls asleep
+[1518-03-10 00:40] wakes up
+[1518-03-28 00:00] Guard #1459 begins shift
+[1518-10-14 00:34] falls asleep
+[1518-09-22 00:26] falls asleep
+[1518-10-30 00:26] falls asleep
+[1518-09-12 00:07] falls asleep
+[1518-03-26 00:58] wakes up
+[1518-07-20 00:20] falls asleep
+[1518-06-28 00:25] falls asleep
+[1518-09-12 00:24] wakes up
+[1518-05-22 00:13] falls asleep
+[1518-08-13 00:42] wakes up
+[1518-08-22 00:04] falls asleep
+[1518-07-28 23:59] Guard #1559 begins shift
+[1518-08-24 23:59] Guard #2647 begins shift
+[1518-10-24 00:05] falls asleep
+[1518-06-22 00:47] wakes up
+[1518-10-26 00:35] falls asleep
+[1518-08-10 00:58] wakes up
+[1518-03-14 00:57] wakes up
+[1518-07-09 00:32] falls asleep
+[1518-04-28 00:55] falls asleep
+[1518-10-13 00:41] wakes up
+[1518-07-02 00:17] falls asleep
+[1518-04-17 00:58] wakes up
+[1518-05-22 00:58] wakes up
+[1518-09-01 00:48] wakes up
+[1518-04-01 00:48] falls asleep
+[1518-07-01 00:00] Guard #557 begins shift
+[1518-04-18 00:40] falls asleep
+[1518-03-13 23:57] Guard #449 begins shift
+[1518-04-08 00:00] Guard #877 begins shift
+[1518-09-16 23:57] Guard #1459 begins shift
+[1518-11-06 00:57] wakes up
+[1518-07-19 23:56] Guard #1459 begins shift
+[1518-03-07 00:42] falls asleep
+[1518-06-10 00:02] Guard #1559 begins shift
+[1518-06-20 00:25] wakes up
+[1518-04-08 00:44] falls asleep
+[1518-06-22 00:01] Guard #113 begins shift
+[1518-07-08 23:46] Guard #1811 begins shift
+[1518-07-23 00:03] falls asleep
+[1518-04-23 00:31] falls asleep
+[1518-08-20 00:58] wakes up
+[1518-09-30 23:57] Guard #3217 begins shift
+[1518-10-28 00:00] Guard #449 begins shift
+[1518-06-02 00:30] falls asleep
+[1518-09-04 00:36] falls asleep
+[1518-07-24 00:56] falls asleep
+[1518-04-16 00:04] Guard #601 begins shift
+[1518-05-20 00:38] wakes up
+[1518-10-29 00:33] falls asleep
+[1518-07-17 00:42] wakes up
+[1518-04-07 00:01] Guard #449 begins shift
+[1518-08-29 00:54] wakes up
+[1518-04-08 00:54] wakes up
+[1518-03-12 00:32] falls asleep
+[1518-05-06 00:43] wakes up
+[1518-03-05 00:00] Guard #3271 begins shift
+[1518-07-30 00:04] Guard #389 begins shift
+[1518-07-26 00:00] falls asleep
+[1518-10-17 00:23] falls asleep
+[1518-09-06 23:53] Guard #389 begins shift
+[1518-03-08 00:56] falls asleep
+[1518-09-13 00:55] wakes up
+[1518-07-20 00:31] wakes up
+[1518-10-14 00:02] Guard #557 begins shift
+[1518-05-26 00:01] Guard #1811 begins shift
+[1518-05-29 00:29] wakes up
+[1518-07-08 00:57] falls asleep
+[1518-07-10 00:21] falls asleep
+[1518-08-24 00:50] wakes up
+[1518-03-09 00:09] wakes up
+[1518-08-16 00:22] falls asleep
+[1518-05-01 00:52] wakes up
+[1518-06-01 00:25] falls asleep
+[1518-07-01 00:26] wakes up
+[1518-09-08 23:52] Guard #389 begins shift
+[1518-09-17 00:35] falls asleep
+[1518-05-30 00:58] wakes up
+[1518-11-11 00:54] wakes up
+[1518-04-30 00:37] wakes up
+[1518-05-06 23:54] Guard #1033 begins shift
+[1518-11-08 00:25] falls asleep
+[1518-11-15 23:58] Guard #3217 begins shift
+[1518-11-01 00:14] falls asleep
+[1518-10-08 00:57] wakes up
+[1518-08-18 00:56] falls asleep
+[1518-11-10 23:57] Guard #2647 begins shift
+[1518-03-21 23:57] Guard #389 begins shift
+[1518-09-22 23:59] Guard #3209 begins shift
+[1518-08-24 00:58] wakes up
+[1518-10-19 23:57] Guard #389 begins shift
+[1518-09-07 23:48] Guard #3209 begins shift
+[1518-08-10 23:57] Guard #1033 begins shift
+[1518-03-13 00:03] Guard #3271 begins shift
+[1518-03-19 00:37] wakes up
+[1518-06-18 23:59] Guard #877 begins shift
+[1518-10-04 00:51] falls asleep
+[1518-09-28 00:42] falls asleep
+[1518-05-06 00:00] Guard #1459 begins shift
+[1518-05-03 00:26] wakes up
+[1518-06-26 00:55] wakes up
+[1518-09-15 00:59] wakes up
+[1518-07-22 00:35] wakes up
+[1518-09-03 00:51] wakes up
+[1518-07-22 00:58] wakes up
+[1518-04-29 00:15] falls asleep
+[1518-10-29 00:58] wakes up
+[1518-07-27 00:46] falls asleep
+[1518-07-29 00:54] wakes up
+[1518-11-23 00:54] wakes up
+[1518-04-25 23:48] Guard #877 begins shift
+[1518-08-16 23:57] Guard #1559 begins shift
+[1518-09-25 00:47] falls asleep
+[1518-03-06 00:18] wakes up
+[1518-10-18 00:00] falls asleep
+[1518-10-01 00:48] wakes up
+[1518-04-12 00:59] wakes up
+[1518-11-13 00:50] falls asleep
+[1518-09-10 23:58] Guard #3209 begins shift
+[1518-09-27 00:00] Guard #409 begins shift
+[1518-09-21 23:51] Guard #3209 begins shift
+[1518-11-03 00:11] falls asleep
+[1518-11-18 00:06] falls asleep
+[1518-03-06 00:56] falls asleep
+[1518-07-14 00:17] falls asleep
+[1518-08-05 00:40] falls asleep
+[1518-04-23 00:43] falls asleep
+[1518-09-18 00:00] falls asleep
+[1518-08-02 23:56] Guard #2647 begins shift
+[1518-09-22 00:34] wakes up
+[1518-06-19 00:08] falls asleep
+[1518-06-01 00:41] wakes up
+[1518-09-08 00:11] wakes up
+[1518-04-17 00:54] falls asleep
+[1518-05-27 00:02] Guard #3271 begins shift
+[1518-08-07 00:53] wakes up
+[1518-07-20 00:39] falls asleep
+[1518-11-07 23:58] Guard #449 begins shift
+[1518-09-24 23:57] Guard #1459 begins shift
+[1518-04-28 00:57] wakes up
+[1518-08-28 00:53] wakes up
+[1518-04-16 00:29] falls asleep
+[1518-07-12 00:42] wakes up
+[1518-06-22 23:56] Guard #3067 begins shift
+[1518-03-20 00:46] wakes up
+[1518-05-07 23:50] Guard #409 begins shift
+[1518-08-25 00:48] wakes up
+[1518-04-06 00:56] falls asleep
+[1518-09-03 00:06] falls asleep
+[1518-09-10 00:01] falls asleep
+[1518-07-17 00:11] falls asleep
+[1518-10-23 00:49] wakes up
+[1518-05-30 00:03] falls asleep
+[1518-10-12 00:51] falls asleep
+[1518-11-17 00:00] Guard #1307 begins shift
+[1518-03-23 00:28] wakes up
+[1518-08-02 00:54] falls asleep
+[1518-08-16 00:53] wakes up
+[1518-06-09 00:43] wakes up
+[1518-04-23 00:50] wakes up
+[1518-11-02 00:51] wakes up
+[1518-08-25 00:46] falls asleep
+[1518-06-27 00:36] wakes up
+[1518-04-08 23:57] Guard #1559 begins shift
+[1518-07-09 00:58] wakes up
+[1518-10-28 23:56] Guard #449 begins shift
+[1518-04-02 00:53] wakes up
+[1518-05-17 00:45] falls asleep
+[1518-03-15 00:04] Guard #601 begins shift
+[1518-03-17 00:15] wakes up
+[1518-05-05 00:59] wakes up
+[1518-05-25 00:03] wakes up
+[1518-10-18 23:57] Guard #1559 begins shift
+[1518-10-21 00:27] falls asleep
+[1518-05-12 00:40] wakes up
+[1518-04-06 00:58] wakes up
+[1518-05-23 00:20] falls asleep
+[1518-07-16 23:56] Guard #1459 begins shift
+[1518-06-12 00:51] wakes up
+[1518-04-19 00:34] falls asleep
+[1518-06-14 00:09] falls asleep
+[1518-08-08 00:19] falls asleep
+[1518-09-04 00:02] falls asleep
+[1518-05-23 00:57] wakes up
+[1518-03-27 00:17] falls asleep
+[1518-04-15 00:28] falls asleep
+[1518-09-23 00:30] falls asleep
+[1518-10-08 00:44] wakes up
+[1518-08-29 00:29] falls asleep
+[1518-08-03 00:52] falls asleep
+[1518-10-24 00:45] wakes up
+[1518-05-12 00:45] falls asleep
+[1518-09-12 00:29] falls asleep
+[1518-04-16 00:59] wakes up
+[1518-07-11 00:31] wakes up
+[1518-07-04 00:39] wakes up
+[1518-05-16 00:44] wakes up
+[1518-06-21 00:45] wakes up
+[1518-07-26 23:58] Guard #3209 begins shift
+[1518-05-08 23:58] Guard #877 begins shift
+[1518-11-07 00:20] falls asleep
+[1518-08-26 00:04] Guard #389 begins shift
+[1518-03-11 00:16] falls asleep
+[1518-11-17 00:20] falls asleep
+[1518-09-10 00:49] wakes up
+[1518-05-10 00:36] falls asleep
+[1518-05-16 00:55] wakes up
+[1518-08-04 00:01] Guard #409 begins shift
+[1518-04-26 00:45] wakes up
+[1518-09-07 00:46] wakes up
+[1518-10-21 00:47] wakes up
+[1518-05-15 00:46] wakes up
+[1518-08-21 00:50] wakes up
+[1518-08-08 00:58] wakes up
+[1518-08-26 00:57] falls asleep
+[1518-07-02 00:51] wakes up
+[1518-03-25 00:16] falls asleep
+[1518-08-11 00:59] wakes up
+[1518-04-19 00:58] wakes up
+[1518-10-15 00:56] falls asleep
+[1518-06-15 00:14] falls asleep
+[1518-04-03 00:42] wakes up
+[1518-11-14 00:18] falls asleep
+[1518-05-12 00:02] Guard #947 begins shift
+[1518-04-15 00:05] falls asleep
+[1518-04-23 00:39] wakes up
+[1518-07-22 00:19] falls asleep
+[1518-07-31 00:44] wakes up
+[1518-10-27 00:43] wakes up
+[1518-09-22 00:03] falls asleep
+[1518-03-07 00:02] Guard #3067 begins shift
+[1518-03-03 00:55] wakes up
+[1518-06-02 00:56] wakes up
+[1518-03-04 00:23] wakes up
+[1518-08-06 00:37] falls asleep
+[1518-06-23 23:50] Guard #1559 begins shift
+[1518-09-27 00:50] wakes up
+[1518-07-08 00:19] falls asleep
+[1518-05-09 00:52] wakes up
+[1518-03-06 00:02] falls asleep
+[1518-06-05 00:01] falls asleep
+[1518-05-03 00:47] wakes up
+[1518-05-29 00:41] falls asleep
+[1518-10-25 23:58] Guard #947 begins shift
+[1518-10-14 23:59] Guard #3209 begins shift
+[1518-03-04 00:02] falls asleep
+[1518-07-28 00:03] Guard #3217 begins shift
+[1518-09-12 00:09] wakes up
+[1518-03-09 00:35] wakes up
+[1518-10-27 00:00] Guard #739 begins shift
+[1518-07-29 00:59] wakes up
+[1518-11-10 00:34] wakes up
+[1518-05-25 00:02] falls asleep
+[1518-03-10 00:30] falls asleep
+[1518-07-08 00:48] wakes up
+[1518-05-19 23:57] Guard #3217 begins shift
+[1518-03-31 00:40] wakes up
+[1518-08-02 00:28] falls asleep
+[1518-11-11 00:57] falls asleep
+[1518-06-27 00:45] falls asleep
+[1518-07-05 23:53] Guard #1559 begins shift
+[1518-10-02 00:17] falls asleep
+[1518-06-13 00:45] falls asleep
+[1518-10-04 00:18] falls asleep
+[1518-06-03 00:59] wakes up
+[1518-06-11 00:57] wakes up
+[1518-04-04 00:02] Guard #947 begins shift
+[1518-04-24 00:45] falls asleep
+[1518-03-20 00:00] Guard #1307 begins shift
+[1518-11-16 00:58] wakes up
+[1518-05-01 23:58] Guard #389 begins shift
+[1518-08-06 00:00] Guard #1559 begins shift
+[1518-03-05 23:49] Guard #113 begins shift
+[1518-06-23 00:56] wakes up
+[1518-09-28 00:48] wakes up
+[1518-07-19 00:49] wakes up
+[1518-07-08 00:58] wakes up
+[1518-04-03 00:41] falls asleep
+[1518-09-14 00:57] wakes up
+[1518-07-25 00:05] falls asleep
+[1518-11-12 23:57] Guard #1811 begins shift
+[1518-06-10 00:29] falls asleep
+[1518-08-21 00:58] wakes up
+[1518-03-17 00:43] falls asleep
+[1518-03-06 00:59] wakes up
+[1518-08-06 00:44] wakes up
+[1518-07-04 23:56] Guard #2389 begins shift
+[1518-06-21 00:03] falls asleep
+[1518-04-10 00:27] falls asleep
+[1518-03-30 00:59] wakes up
+[1518-03-31 23:57] Guard #449 begins shift
+[1518-09-08 00:01] falls asleep
+[1518-04-10 00:58] wakes up
+[1518-05-30 00:45] falls asleep
+[1518-09-26 00:51] falls asleep
+[1518-09-20 00:16] falls asleep
+[1518-05-08 00:05] falls asleep
+[1518-09-13 00:23] falls asleep
+[1518-09-12 00:23] falls asleep
+[1518-03-31 00:39] falls asleep
+[1518-06-08 00:40] falls asleep
+[1518-08-23 23:59] Guard #409 begins shift
+[1518-09-03 00:35] falls asleep
+[1518-06-04 00:00] Guard #1237 begins shift
+[1518-11-05 00:01] Guard #3209 begins shift
+[1518-07-21 00:36] falls asleep
+[1518-10-11 23:59] Guard #601 begins shift
+[1518-11-19 00:59] wakes up
+[1518-11-17 23:57] Guard #1559 begins shift
+[1518-06-07 00:04] Guard #3209 begins shift
+[1518-10-15 00:21] falls asleep
+[1518-04-07 00:58] wakes up
+[1518-07-09 00:19] wakes up
+[1518-08-05 00:51] wakes up
+[1518-05-01 00:22] wakes up
+[1518-03-07 00:59] wakes up
+[1518-08-12 00:33] wakes up
+[1518-05-03 00:18] falls asleep
+[1518-03-10 00:04] Guard #3271 begins shift
+[1518-10-31 00:55] wakes up
+[1518-07-03 00:48] falls asleep
+[1518-05-31 23:52] Guard #3271 begins shift
+[1518-05-23 00:37] wakes up
+[1518-06-13 00:59] wakes up
+[1518-11-06 00:29] falls asleep
+[1518-10-27 00:09] falls asleep
+[1518-05-07 00:50] falls asleep
+[1518-06-28 23:53] Guard #1459 begins shift
+[1518-04-04 00:37] falls asleep
+[1518-10-09 23:56] Guard #3209 begins shift
+[1518-06-29 00:02] falls asleep
+[1518-09-16 00:56] wakes up
+[1518-05-08 00:31] wakes up
+[1518-10-08 00:20] falls asleep
+[1518-04-21 00:58] wakes up
+[1518-03-09 00:56] falls asleep
+[1518-06-13 23:58] Guard #1033 begins shift
+[1518-07-22 00:42] wakes up
+[1518-05-28 00:11] falls asleep
+[1518-06-17 00:00] Guard #3271 begins shift
+[1518-09-27 00:56] falls asleep
+[1518-04-18 00:00] Guard #947 begins shift
+[1518-09-19 00:04] Guard #3209 begins shift
+[1518-11-18 00:49] falls asleep
+[1518-08-25 00:42] wakes up
+[1518-04-20 00:56] wakes up
+[1518-08-22 00:47] wakes up
+[1518-10-07 00:59] wakes up
+[1518-04-18 23:59] Guard #389 begins shift
+[1518-07-16 00:23] falls asleep
+[1518-07-30 00:17] falls asleep
+[1518-04-24 00:03] Guard #877 begins shift
+[1518-05-06 00:38] falls asleep
+[1518-05-28 00:44] falls asleep
+[1518-05-02 23:56] Guard #557 begins shift
+[1518-11-17 00:47] falls asleep
+[1518-06-18 00:44] falls asleep
+[1518-11-04 00:14] wakes up
+[1518-06-16 00:30] wakes up
+[1518-11-02 00:22] wakes up
+[1518-04-22 23:57] Guard #601 begins shift
+[1518-06-20 23:50] Guard #3067 begins shift
+[1518-07-28 00:06] falls asleep
+[1518-08-25 00:28] falls asleep
+[1518-11-06 00:47] falls asleep
+[1518-05-16 00:49] falls asleep
+[1518-09-15 00:40] falls asleep
+[1518-09-25 00:44] wakes up
+[1518-06-04 00:58] wakes up
+[1518-03-08 00:50] wakes up
+[1518-10-30 00:58] wakes up
+[1518-05-01 00:25] falls asleep
+[1518-11-13 00:51] wakes up
+[1518-10-06 00:54] wakes up
+[1518-04-28 00:51] wakes up
+[1518-04-24 00:33] wakes up
+[1518-03-25 00:51] wakes up
+[1518-11-02 23:58] Guard #877 begins shift
+[1518-07-12 00:00] Guard #1459 begins shift
+[1518-09-12 00:45] wakes up
+[1518-11-11 00:47] falls asleep
+[1518-10-08 23:57] Guard #947 begins shift
+[1518-06-08 00:59] wakes up
+[1518-07-10 00:04] Guard #3217 begins shift
+[1518-09-03 23:50] Guard #1459 begins shift
+[1518-09-01 23:50] Guard #3271 begins shift
+[1518-11-19 23:56] Guard #113 begins shift
+[1518-04-22 00:00] Guard #3217 begins shift
+[1518-07-20 23:58] Guard #877 begins shift
+[1518-09-28 00:03] Guard #3217 begins shift
+[1518-03-04 00:18] falls asleep
+[1518-09-03 00:03] Guard #1307 begins shift
+[1518-09-14 00:48] falls asleep
+[1518-09-02 00:49] falls asleep
+[1518-03-24 00:46] wakes up
+[1518-07-24 00:59] wakes up
+[1518-09-01 00:02] Guard #449 begins shift
+[1518-04-25 00:24] falls asleep
+[1518-06-11 00:28] falls asleep
+[1518-07-09 00:49] falls asleep
+[1518-08-31 00:02] Guard #409 begins shift
+[1518-08-05 00:02] Guard #389 begins shift
+[1518-08-22 00:58] wakes up
+[1518-09-29 00:52] wakes up
+[1518-09-07 00:01] falls asleep
+[1518-10-19 00:15] falls asleep
+[1518-07-18 00:39] falls asleep
+[1518-07-06 23:58] Guard #113 begins shift
+[1518-11-10 00:04] Guard #1033 begins shift
+[1518-08-15 00:01] Guard #1559 begins shift
+[1518-04-12 00:13] falls asleep
+[1518-06-05 00:56] wakes up
+[1518-10-17 00:54] falls asleep
+[1518-10-10 23:58] Guard #1459 begins shift
+[1518-08-13 00:14] falls asleep
+[1518-10-16 00:02] Guard #2389 begins shift
+[1518-07-11 00:01] Guard #557 begins shift
+[1518-10-02 00:42] falls asleep
+[1518-07-15 23:57] Guard #449 begins shift
+[1518-03-07 00:45] wakes up
+[1518-11-19 00:02] Guard #389 begins shift
+[1518-11-03 00:51] wakes up
+[1518-10-22 23:59] Guard #1459 begins shift
+[1518-07-08 00:02] Guard #3271 begins shift
+[1518-09-16 00:18] wakes up
+[1518-05-05 00:00] falls asleep
+[1518-09-15 00:01] Guard #2647 begins shift
+[1518-05-19 00:46] falls asleep
+[1518-10-17 00:48] wakes up
+[1518-03-07 00:57] falls asleep
+[1518-09-11 00:52] wakes up
+[1518-10-13 00:53] falls asleep
+[1518-07-13 00:43] falls asleep
+[1518-06-26 00:30] falls asleep
+[1518-07-28 00:59] wakes up
+[1518-08-12 00:15] falls asleep
+[1518-06-25 00:21] falls asleep
+[1518-05-26 00:38] falls asleep
+[1518-07-12 23:59] Guard #1811 begins shift
+[1518-05-28 00:47] wakes up
+[1518-10-02 23:56] Guard #1307 begins shift
+[1518-09-22 00:47] wakes up
+[1518-05-07 00:35] wakes up
+[1518-08-09 00:17] falls asleep
+[1518-10-30 00:42] falls asleep
+[1518-04-04 00:18] falls asleep
+[1518-03-22 00:44] falls asleep
+[1518-06-13 00:57] falls asleep
+[1518-05-02 00:29] falls asleep
+[1518-08-15 00:55] wakes up
+[1518-04-19 00:57] falls asleep
+[1518-04-19 23:59] Guard #947 begins shift
+[1518-05-02 00:46] falls asleep
+[1518-11-15 00:00] Guard #3209 begins shift
+[1518-10-13 00:57] wakes up
+[1518-04-03 00:07] falls asleep
+[1518-08-15 00:20] falls asleep
+[1518-03-13 00:47] wakes up
+[1518-09-19 00:09] falls asleep
+[1518-11-17 00:21] wakes up
+[1518-10-19 00:35] wakes up
+[1518-05-15 00:40] falls asleep
+[1518-11-03 23:48] Guard #1307 begins shift
+[1518-04-10 00:04] Guard #1307 begins shift
+[1518-06-20 00:04] Guard #3217 begins shift
+[1518-05-16 00:04] falls asleep
+[1518-07-19 00:12] falls asleep
+[1518-10-12 00:23] wakes up
+[1518-03-11 00:56] wakes up
+[1518-05-23 00:56] falls asleep
+[1518-06-28 00:32] falls asleep
+[1518-05-11 00:45] wakes up
+[1518-04-09 00:33] falls asleep
+[1518-10-05 00:10] falls asleep
+[1518-06-30 00:37] wakes up
+[1518-07-04 00:06] falls asleep
+[1518-05-02 00:53] wakes up
+[1518-10-06 23:54] Guard #557 begins shift
+[1518-08-23 00:17] falls asleep
+[1518-09-11 00:19] falls asleep
+[1518-03-27 00:58] wakes up
+[1518-09-06 00:01] Guard #1237 begins shift
+[1518-07-06 00:45] wakes up
+[1518-08-04 00:48] wakes up
+[1518-09-19 00:25] falls asleep
+[1518-04-11 00:31] wakes up
+[1518-04-21 00:20] falls asleep
+[1518-10-30 00:57] falls asleep
+[1518-08-03 00:58] wakes up
+[1518-04-27 00:58] wakes up
+[1518-10-15 00:58] wakes up
+[1518-11-23 00:42] falls asleep
+[1518-06-15 00:01] Guard #1559 begins shift
+[1518-04-24 00:49] wakes up
+[1518-09-21 00:31] wakes up
+[1518-05-26 00:41] wakes up
+[1518-07-28 00:51] wakes up
+[1518-11-22 23:58] Guard #2647 begins shift
+[1518-10-28 00:39] wakes up
+[1518-09-14 00:37] wakes up
+[1518-05-15 23:51] Guard #3217 begins shift
+[1518-07-01 00:33] falls asleep
+[1518-03-29 00:44] wakes up
+[1518-05-22 00:51] wakes up
+[1518-10-14 00:54] wakes up
+[1518-07-15 00:45] wakes up
+[1518-06-14 00:27] wakes up
+[1518-07-13 00:55] wakes up
+[1518-09-28 00:54] falls asleep
+[1518-10-18 00:50] wakes up
+[1518-08-26 00:27] falls asleep
+[1518-11-04 00:53] falls asleep
+[1518-05-01 00:10] falls asleep
+[1518-08-02 00:47] wakes up
+[1518-04-30 00:05] falls asleep
+[1518-09-05 00:56] wakes up
+[1518-09-01 00:55] falls asleep
+[1518-06-15 23:56] Guard #1559 begins shift
+[1518-09-09 23:46] Guard #947 begins shift
+[1518-06-06 00:36] falls asleep
+[1518-07-24 23:48] Guard #1237 begins shift
+[1518-07-01 00:08] falls asleep
+[1518-07-12 00:37] falls asleep
+[1518-03-30 00:54] wakes up
+[1518-06-17 00:48] falls asleep
+[1518-11-07 00:03] Guard #1459 begins shift
+[1518-03-28 00:58] wakes up
+[1518-08-03 00:48] wakes up
+[1518-06-09 00:32] falls asleep
+[1518-11-05 00:11] falls asleep
+[1518-11-21 23:52] Guard #409 begins shift
+[1518-11-22 00:04] falls asleep
+[1518-08-22 23:59] Guard #113 begins shift
+[1518-11-06 00:41] wakes up
+[1518-10-03 00:40] falls asleep
+[1518-06-25 00:00] Guard #877 begins shift
+[1518-05-17 00:00] Guard #449 begins shift
+[1518-06-28 00:03] Guard #3271 begins shift
+[1518-09-29 00:03] Guard #2647 begins shift
+[1518-05-21 00:19] wakes up
+[1518-03-30 00:53] falls asleep
+[1518-08-14 00:49] wakes up
+[1518-06-23 00:37] falls asleep
+[1518-07-31 00:00] Guard #3217 begins shift
+[1518-06-09 00:29] wakes up
+[1518-03-11 00:00] Guard #389 begins shift
+[1518-11-11 00:27] wakes up
+[1518-08-21 00:57] falls asleep
+[1518-08-09 23:56] Guard #1811 begins shift
+[1518-04-25 00:04] Guard #2647 begins shift
+[1518-07-09 00:03] falls asleep
+[1518-09-25 23:58] Guard #1033 begins shift
+[1518-07-17 23:58] Guard #409 begins shift
+[1518-05-22 00:47] falls asleep
+[1518-08-30 00:32] wakes up
+[1518-10-14 00:23] wakes up
+[1518-10-17 00:56] wakes up
+[1518-08-12 00:59] wakes up
+[1518-09-21 00:58] wakes up
+[1518-09-22 00:22] wakes up
+[1518-05-29 00:52] wakes up
+[1518-09-05 00:51] falls asleep
+[1518-10-05 00:52] falls asleep
+[1518-03-09 00:29] falls asleep
+[1518-04-09 00:50] wakes up
+[1518-10-04 00:59] wakes up
+[1518-07-27 00:33] wakes up
+[1518-07-13 00:51] falls asleep
+[1518-06-28 00:29] wakes up
+[1518-07-23 00:44] wakes up
+[1518-05-24 00:58] wakes up
+[1518-09-24 00:07] falls asleep
+[1518-08-19 00:55] wakes up
+[1518-04-15 00:53] wakes up
+[1518-08-29 00:04] falls asleep
+[1518-07-21 00:59] wakes up
+[1518-05-03 00:45] falls asleep
+[1518-03-17 00:01] falls asleep
+[1518-03-05 00:51] wakes up
+[1518-07-22 00:46] falls asleep
+[1518-06-30 00:14] falls asleep
+[1518-08-03 00:32] falls asleep
+[1518-11-22 00:08] wakes up
+[1518-05-21 00:58] wakes up
+[1518-03-23 23:46] Guard #3209 begins shift
diff --git a/2018/inputs/5.txt b/2018/inputs/5.txt
new file mode 100644
index 0000000..4d4b703
--- /dev/null
+++ b/2018/inputs/5.txt
@@ -0,0 +1 @@
+XxSsdDIijNnJACszZScZfFhHQyYrRqzdXTtxDEeNnGgOaAcCMcCLlMmogQeEqGgFfGyYuUOIiYyhHlLmUulAUKkudDOoDdaLGRrgoDdDdGgRruUhJLljQqdwWDZzHXxppPTwWCcZzDmfFlLPpdDSsgGtFfTEeTOotyYMOGgkJjKZUuQdNnDhHvVntKkTNqTjJeEVkZzttTYyTDdIiRrqQyYYyxbBXLlKHhvtYyzoKMmiIkaAUvVuvEejoOJUuQoOLlLloOxoOXaAqYYXxyzMmZyoOVhHIiIKfFkiIKAaUukRrKQqASsakLgGlGgLxXhHmcCzZxXMWdUulLJjDwnNYkKFfZzpPVuUvHhbQqIiLRrlEeVvBQJjlLGgjYyJoAalxXuUqgGQLQqOqNJjzZnyOusSUeEFfodcLuUlCcCIiNnGgaADVwWGgvZtTewWENnSszBKkDdeEYytTzpPsSjJpPZkNnIiPpDIideEcCKCcNABbKnpPGgtTNqQGgklLtTuUgGQqaNnnVveEgjJJEejGkKziIAaZmMbopPOgDdGubBIiUZGgzuUoOkMYymvBbVPpmMqQKDdCiDdIcpDjHhIiqQJLlFCcfqxXwWQdsSKkPgdqQDGjcFfCCceEsSkKjJkKKlcuUCsaUuASLAaEekmYqyXxkKYBbeEQuUZzpPeEdeEDKkNnuUQsSTtqufFUNIGginpAXZiJjJjhOWwkKBbogGHsSRNnqQrIzZxXhEeHKlLtTrpPsbBSbBDdlkSsKZXxnwTtWCrRcNfMmPpFzNbBneFfVYyvuUBjJbEzKkZuUkCcKTPptehHfJjEeBbuUioOIIiqQFDdFfvLUVDZaAkKHhEeAaHRrOohVxXHhvNnzQqdoOaAOxsSXogiEeIGvhWwHROoruVtTvaAUDdPpuImMVePCcpEUuFfptFMmfTVvhaAHUuoQwWlLqmMKkONnhNnIisSgGHPwWQVvroDOodgGORqvGgZRrEeMeEkKBbRyYrrzZREepPCcmJSstTNntTjvOoyyxXYzZIiYVUuUunzZBbNWvVPwnNWeVvLnNlpxvVXjJPDdZOozItTiYzRrKkZngGNiIyXiIxYyCcSsEOmMUeEqQAaINCcxXniuOeAamMmMmMRFfoOHhaArMmpPRGgrVVvvIiUudwPpWDuVvspPSbBUzrJmMjjJnNRAamVvfFMaCTTVYyvXxGRrgttkJjYmkKPpMyTtkKHoOhJnNjifFIKTmMuLFftTlwWUtAyYajJyZzmMhHhrRsSHGtTiIgBmEeXxMnNpKkSsDdbBpPPZJjHRrhKQquUkzvQdDVaAWwveEqAaVSAasBbFftQqCcTuuUOVvoUccAaIiCnNCHhXxpPWfybBYOoFwarPptTRRrArRrRusScOoCUMqpPLlfFMmjJHhDdpDOpPoAabBwWdQqfFPDdeCHSHRrhlLszqQZhVvnNodDQqOPVvpcAnNLlfFSoOsiIOoSsJvOoNnVJjxXjkKuEsSEeWbBnNEewpPbBANnakKkKHhMNnrXxjJREyYemoOqQeTbgGBtIWwiIFfHhiCcEKkeHZzhhHRshzkAajlLJKZVvEeCgGdDhHSPpEQqOoescCuUcPYypJaQqFfGgPpAPpeEjZzXxbBNqQfFRPTIRraAFJjsSfibBZztJjrRprlLiIycCBbYKknrvVHNmMneEhSshHGgSbnNgGBqQDwWdUutxXxFfXGNngaYyGgHSshfFrRjAaJAVTKktzMuviJjIVUmbTtgGBzZmMFfwlwWtHhTLfFWYycXxCrEeNsHhSrECceRTJjtyYRrGgrRZsSiIzpjJgGPeEhHWNnwSsZmOoRrMzxSsQqaAzZKtTkWsSyuvVbBVvUYChHOCcoeEciIwZzWlqQLnNpnNmMPwIiTbNnBLaAlJPpSaAsjGTtyYMZzfFmiaOBboAOAalLEejIikKqQSsXxAaJJpzZwBbBbnEearRAmMNDSsdyxqJjlLQHhpSsPEqQeAauUJKkmkKLlMjvVoOPpPpCBbGgoORrtTXuUxfaIwWiAsIKkpPifFSQqZpPAXxazEpKkPtTqQeaAnLdKOokLlDlpNngGcCmhHMrRiIqWwqQVabBARrcCUuviIvpPbBwnNWHONnIioGgOoIiVvAuUaoMrZzRugGUmMmxXMmaANLAalnOhbZBbzMmZzmMuWwnNUJjdDBqQHjJqQaAbBhNdDnzZZztThHeTtDUTtQquaAkCcGgKkjdDJKZzbcCBwWjBacCAYygGiILtTfdDEeLlFkKiQqItkKDAaKkaloOLARraApFfzZtTYkKcJjdDGgDdfFCPpQzZqvVcCgGfTtJjbBCLlAgGacYyFFfyqQYyPVvvCcrRQqVwWkEeFfpPKBcEeCnBbAarRNnNnCcTtNbYyhHGgPOGZzgopHMmNnIdDihyYHhEeLplLPieENnfFXxAavVIJjJLlAavVJjBHqQmMhbiImMbBEejrRQBbjJKkwiIWqKnpYyPVvNbCcZzBrGgRPpiISszZAazZBbzGgZUuyYbBKkoQXxIiTtOolLfFNnUuqjKRLlbBrNnMmkyOoyYWgOozZlLBbYyOojJDaAkKmMtOoXxqQAaTncCBCcaAevVEeMIQqiQqXxsSmEDdWIiwWIiqYyQwhHXJjxxMmXNwWFfnxRrXXtoOTxzZpPrmMsSRpPbefFEkBbKtTMmYyXgGVvWOowRWwreExUuyYFpPfztTGgNoOFfMmnXoEeOBbxRrUuZzxZCczrdDRxMmZzWOowTtJjanfkZzwWoOfFKuoOUFUuHhFfKLlkyHOovVrvVRHhRrSsJTAPiIpjJoSsOQnNqaQxXLlfnNhHnNlLFiIsSqtVvltcPOozSsjJHhLbBlZrLifFIhBbkKHldDsvVcCSMmtTlLBbumMOovVUWyYcCNnRQqrKkwRpmMBUuASsoOqQabAayuUFfEeVvUuTtJjxXmcYyFfCEeUuPzdDZDdpOWwZyVvQqYfWwNnFzWVvwaAARrkKaoiIcCsWFfbQqBGgnNZzyYcjGgJCrkKFfRZFfzZHhzvVUbBumEkaAlLKsEeVvSIiezZhHisSsSeLlEIxXcLlCMFQqfGgmsLlaAMmaACctTAaYySENoODdEeutHhTKFfTtkkgVvWfiIDdLllSSssLbIhHmMeEgRrGiiIufCZzcFUBFMmdDHhqpOoNnWWwKYySseEKkxZKkzXiIdGgzZMmDhyYHsMmIiCcnbHSXxsTTtthRjJhXxJXxjBbUuPQqUTtupLNnVvtTlHjJqQrBJhHHbBkKhyuUYKknNoOcvVTtyYeESsCqQQKkqQqQRrqHmMZfFnNXVvCcXxgGxzmaAMjJvVTtTtRzZjJrPVpPkaAzZnCtTLlTMmtuUAazXJtgGTjRrSsrRqQqWJnQuUjfGHbBRQqhrRHrtTdyAaKkOoSsYQarRxVqkKngQqGpPHfYyPoOvJvVjVrRpMmFcCkwWaAYfQqtDdNMbBmVvqQpSMdDmgGsPEeyHgBbPZDdGgrPsSsGgrRCcSequTtUQoOKkSsfFflPpLFILliWwEkKcCxnNXYeErRyZztTpHhSBbsmMgXxGRrmMReNnEHheGWwgvVgGEzhHRrlHhhRrhHqQHLwtYwQqWbBjJeQqRZzrEfMmKoOXXxxkYObBoqaAQRrCcLlyhNnEOoebNnKrRTaAtuUkbBbBNuAaoOUnbDdGgZzYyKkbBuCXrRxcAaPfFpGFNZznkBboOsSggGiItXxEeTgGGKsSfrRvbcqQCBVbBqWvVbBIiAaRryYTOotHhwMmSqQjaJVJjvcaACrTjJcCSsQqDUTtucCdtIiHhQVxXdDvVkKvLlqPgYdmMDKrRjrRTKktQqOoAawBbDivVIdWnqFBbfZoOzQOoDRrdYLlhHxNhHnGghsSHVUuvsvuUuoOlEefNnFfWwCclLYyYyZzRroOTtFNnhkKiIHKkqMmwWYyMmPGTpIiwWzZTtpPhnNHmToOTttfFYKkPplPpOoLVUBbuRrVfFFJjffSTtsVvJjFcCgCUueEcoQqyYNnqIeEiTtQpCcWtTpPYyycaACYSyYsJiGgrRIGGgDNGgxyuUYXXxhvVHqQnDDsSukKiIEeUeJjmMGgLlGgtTKwWkxXxEeXEHNTtnhSXDbLlBddLlDzZNyYKYDRrXxGgzZdVvSgaAGsWwlbBIWwzZiiIXxLYyuUllLlXxSsvVLVvQqIgOoGeehzwWdDyiICpPIgGNnanNJjWDdwOoiIAicCxXWYEDbBavuUQQqUbBuuiIUHhWzZZzmMwKkqiiIIhYTtyvwPpTtKksSmMnGgDdNRrHhKhxXOXxpIiPzTteEZVWwvRaArCSIixXFfTtQqsclLmMPpCmxmMBbXMQYfYyPCczpPZqvFlLlyHhYHhjlLlLJOkKdsSDXxovMCcmmCcMqQLlVHLlFfhwWADdREerBbpVmlLMJjIiqQvPbeEBqQJjNnvdDVxZzXYVOFTiImkJjKNnDdMkKqQFfUueWwEhHSsxXKkmnVoOrWAawRvglLPpZCcpPYASstTGyLlSsYCcqQeEgIiVvauZzUnZcCzKkNFfTtWstTSWwzZlrRLMmEwWBRrPpbsSCgcWwJcCIAaijCRrmMdBLlrffFFBbdaAkpPKDRPpBwWbuUGgMmpsSPCcQKvVyYwCcSsuIiLlUHHhDTtlLvVkKIidYyhiIXxxXuLlUzwWiITteEmMiINFfnNnZNDnNcGgdDCveEVdjJnYyBbVvhHyYrRwAKkaChHIiMmcCcICcuKkUjNnJyZzYyYoOrRrRWwefFaAHhPpNvfdeEgGdDbFfBbmMJEejAwWaDnNvVdpPRrMrmIBvVbSsiaJjqmCcMQudDfxXPpIihrRkYylLRruRrUaAKoOyYbvVHuuxXUUxGgXSAPpNnKicCXWuUYyweEuaAUlLOgaAGXxtOoTgBbGCczIiZUuXKkXClLeErUVaAvwWlLXcCxnoQPpqFfOecCjJLlEoOzDdZSzZiuUFUuIifbBiISSlLsQoOqEeBqQbrRxXaAIiOojjJJVzqSsrRwWBqQYybQUCeFfclLCspPSEPGgYyfFpGgnNNtTnQqeKkUuMxXvVmRrhQDdCZzcCCUuccoOeEJjxXMmqHDtnNAvVEezfFAaZUuLlDdcIiZzZzCrTtdDRVdDvLsSlTmMGnNfFeEvVqyfaAFQqBbehHELyjFfJGgNyYTtxSsXkKOoSsJjKkQEebsSGQqNnFfYygmMUbBKggOohHWhHXzburReEUyYRroOnNpPBtfRZzrMEemWwFTklLZzZOozSseESYysszZSqHhQRrnNKpPfFDqBCxXcmMgGbQdsSAadDEAoOoOGeObBoLlEgaUDdVvOooOrUaAOouXhHRrdDUHhudDLlPpsVvSxRrUrNBbTtTwWtCyYcqQrRJTtJjWwXxFfHhseEzEemEkKxXtTerRiIHhamaAbcCTtBteETzZINXxniiRrIMYaAyxKkWwzbcCwuUWBMfRruUFVvvVXxmBbCcpfFOoPQcMmMmBbLljJwWVcCSsPpsSvCMoODdYDeEdyPqQplLlFfxXLmJSsVnNvTtIiUuOoFRHRrhwAXxukCcwWfFQuUcgpPGCqWTkYyjWwJKmMAZvVzaBbaQqACmMcnIiNweEWSoOstTBvcCVouqQUkKdzZNqQnHDwnNNnhHuVvJoOcCskKSPpXWVvxyYXwCBPpIibcesSExqbBqmFRxXrhZYCckUAaaXUrlnNLJxXUUvUMmPiQqZkZztTJWwyMmKkSMSaJjNnpPAQfWTtKKkoOBWwbhDDddQAaqHWwBbhrYyRNnAaNRIireEoObBWUuwnoOBbPlLpwyRrYDdTthHNrRnUTEetWwSbBnMmNgHhGsKkdDErRHbBoraAROpvVVvPGEegrRrdDNRrNndLywWYpTtKkPpTILliAatPlDLvVlFsSfKYTcCIxXVvnfFRrWwWwmmMMmMbRrBVvDdRrsSeiIEUpGtVvTCXxcbPpBjbBJBAVvaDqPpcgGCQOoPjJXxpftNXxVvRAaeEKkpPMHhdDbBiImkKKcCsFVvfvVkKSDdQqAafFAaZxXwWNnzlLnMbBmmMqAaQwTKnkMdDdlLzZDCcmuIcCGgzZiWwGRCcrgUiILUAWwaeEXxFfCciXeEfbBlqaAEBbVQqIYyifZzsSFItTDdanEeNsSlLldDoOeEHhMqSsQaAsmRrMjCcJXRrxScCkKJjfvFbBfVvVlXlgGLbBiQiEyzZYyYehtrRTHiIGpOaAokKkGgKTtVvCtUuTfFcCcuUEmMixXITsSwWgExXYBbBvVbaAfJjLdDSsKkDdAaVRrvpPBbZzjJQqSAaNnsyHhsdDzZlLSYbBdxXetTEgGSsYymlauUeYyEfFaNnAALiIXlJjLxjwWPCcoEecCOJjhpwWPbWKFfIizTeEMmlLteEtTRrCcGgrWCcYgGTHhtydNgAaGnDwTiItYWwUhHwLFKksSflWnXxNaABLTtAaMmlPaAheEHpnNOAaSRrCGDdxKkXlKknNIDdiqQqQoOuTJjtUTtXxUUumMtNnTYmMoWWGgwCcYUumMmMPpvnXxnJjjJNNDdXiBbIxVwWTtFfWwLIiSslqLQqNnXxwfFWyYGgDdQevVARryVoKWCcNnwkGgOMmvVwOocCXkKEehHtBhHbICsSciYytTZaAUGgbBuZbBzzsSTDdPpJXxlLNnzZwygpzZwWtTsAaQqvUpiIiIiIPRrgFMmJjWESseEbBewTtfWwrjJYVSanNhHAfFsVvzZbFfzZBhFKgGKoOkcBEeWwoeEObCpnNPpPlEOCczMmGgZoewNnJjUPkKpkPpRrZzAQqaumMqrXtOoTcCNoFfOnNTtnAaPUuEeesSEwWVvpAaeENhbBHnJjNnZvaAAaVQqQqPpgbBGlukAiIaRFpPfrxXaMsBcCaAbBIiPpbOojUutTbhHXcCrZzoOZzRJjmgGMeGgeNnyYmyYdwWDMVklLKrRvVvjJrtTuUWbBUcCuDdlLyoOYyYmMjRrsVcCPpjniSsOoCcgXCcfNnwWFFVvfnWzZkLlgGwWKdDSsGEhHWsAaSZEUXxLlyYMmdDMmrRupPeAaCcWwzwDQqiIqQfVvQHhwWbTobBsSZXUuXxbsSyFtTjGgSkBbnNKGgtWyYEwWevAaEeVMmDdQqOUuiIbBhHqvVQHAgJjGaAjJbBonHwYyUpPnNuJgGjSsTmImMZuFfmPpsSTccCCiIpfiIFPHhTtPpKkUTlwWLtnNSsdRrXxKkAMqQoOrZYywWzOoqQNFfYyjJnNjJZYyvEeVzfjJZzVVvFdDYQqysSfNwkKWrRdTiAWwahHqcCQRrrbTtJNXxnZmmMJjJjgwFmRrRrAaquUKkXTUuDdbtTBkKmMqQlLEeSsGtlTtoOHhSdDKMmsLlPpgjJGvVSoOPpGggGwWhJaASszZaAPpUqeEVacCAfQqiqpPSstEDdxkKaAxXXenleGguflLRDdrqQwWDdVdeEjRrqHhQuAaOoUgBzZAFfajyJjJXxvVvKrNnplGgpPXiIHhxBlHhHtThLNnnNzZbLCYycSdDsCceuzEIielLCcZiUuEqQtTqQiIIioODXxxXdUlLUiIPZhXFfqQzTtZaomMeEvVDBboOdOxXaAWzsRkyYgSqatTAQsOoGCQqcEedDKMNtXxmuUMgdDGpPTgGWwuUmMncCmslCaUuAcLSrMSwAakZzpzZMmeXQlLwLlWAaBqQNnhoOrCcxXLlRMRrKOorQiwWIlOAaoBBbsSTtbqnMmYcChHUYlRkKqQHkaxpPriIoOPpXvhiYyRrqQqQIHUxXjMmmMrRxcnNeAXUpNnPIipoQqOZWweEXQqDvVSsdtOZzogaAaAUqjAaJhFFYykeEKXWwxQJjfFWzGgugGTJXGgKkgpPGSWwSsPiFpMmPvVfIwHhWpelXxLdDqQwWxXiIVrqyYLOfYyFtOoWHhwDJjGgqkZzKPpsyIQqHXxhNniQUuqcCzZzyaJjvVqgGnDVvnGgKkEevVIxXNniVvTndDQhHpPqmpPMqdpdDWwRrPeEiEeOBboZzZZiIVvzzzZhHIDAaMmXxNnQNRrhHtiLsSCDMjJqQmfFPplIiRreEMPKkpNnzZGgPRrQqpBbDdWtHdDqQhzSLlsZMffSsFFmukKbsSQRrqadDXUuxAXYiIyWwpuUgGHpGgAaPHhXxKklLhfFKzZIikPLlxXjJHhtjJTHhNnNnxMfexkKqQsStpEehJjhvVIRrTtkKNvqQVfFAKdvkCuUKkcOJmTtUqQlLtRKkrXjJoOxLKaAhHTttTkYgsSGyBbXxQqpjdjxFfYyXJDFfVvadkSuUmqSshHQqAaBbAaUxXuXxtNnEeaoOyXxYbBkCcgGFNnPhnNHTnNYyoOxXFBuOowWUbCaAthxfFXjJhHHCcYdQvVOkCLlLlcoOEpPGgLleqfwWFQTTtNRluULrntNdyYJDdyYDdaYpPjrvMoOpIitTPaAqQssaUuLlAkKCcSRHcefCSsOoevVrREvVcdwWwWabBADkKgdTIgGiteTtWtbBTwCeEJkIQkKlLMIlLiGgpTiInaAvOkLDvAaFAdDaXzZxwWuUOnzZlLEcCemzZwVvyEePpYWuUbIitOoeETyNndDYOoyiIYmMIoOeFfEVviWyYwUutQqQzQYyYypuQqkKrRLlDrZKkXOLsSeMmrRFfipPJjnfFLfFSLqQCcwMmKkWuUmSarRAsruXpSsPJMmDdPTtpTtpcCcZzCmMVbBlLXxAamMmjuABbauUddfFmMWUiIfEhHEeseETjpPOoHJZruAaUtLrRlgMmodLlyYOoVvuUDdnNSkuUgGwIKKkYyjsPpmJKJjCcFHhfUYyFfeyfRrJmMjFTthqvBfFdocCnFfRcCgGYyBbrRrEqaAsUulLSKMRrOokKRrKkKlLJWIjJiwdDWwcCGgIixGJrRRrAGgaqOogghHGrRKIcEegdJjDGVKWwfFkxQqmeEMCcXIivmMtYyTGuWtTlRyJjYrXxRrZtTFfzLKHhCAacgGuRrAajbpPBTBbtQqrTtOoeEJjXLmMyYeElbBZzlMwIAaOoUuKkiXGghHxWUiVuvVUvvVrwVaEeOghHGEeHhoAwBIUpAagUuuUGfFqQRNnjJhPeEjKkGDdgIZzKpLlaoOKgGALlaFfLDCcLeECOUubBotgGiINnTjJcEBbelIiTlLeEXmAaMxuUtMzZmYyuRrpPOojJcPxIiXEeaAYKkyEeeEBjJwWExfFXejtTJNVqQoOtTfFvRSsrQEjCDdgGcSsgGJXUuxhHlqQthxXkuytTYUKVsIiwWSNPpnBbZHhzFQqflzZMmGgkcOcCGYyEeWwhHDdgANVvNnBbVLeEmMiFpPfLlKksIMRrmUIiKQqkIiZzuTXeExQqSrFqQPpFbByYTuUlMmThHrEFLZzlZnNzfIsdYhJjHWcCRxXEeSueXpPjyYmMnrRNxXrZzmMPpIiiInNRIhHDpPQqdVxXutTUJLYOodrRDxXmlLEgGeMyDVvdikGgbBRriRrdOouvVdXxRvIlLPpwKsSMmHlLhfvVJmMOiRxXjJaAjJrxAaYyEezZDznSssSQqjlsSWwCMAamiIcqKzEzZZzeBbTESsTnqfFprRPZnNGuUmSfFIkQPqQHhjJpqqQQRfyoLLllnPkcKkSXxTtsxXCgPPsSppNnPdAeQqBbvVcZDdOiMmyqJBiIQTklLKPpsbBGgMntTLlNfFTtWwtPsSppzZSjJsnNTAZOxHRrkKvHUutIsEeJjSiBETCctyvVrUrRRAUuXxarNnuIQqYJjwVsSIiZzdTsnmCcQNnTAHhatHhnkKcYDdyCKbByYkGgYywWuuUQLlqxmIZziJJjLAlgGLacXxYyCKwfFxXxXWCchHkKkpPdDgaALlOqUuFfLlcSsqUuPTtEeMWwMnNmJjNnvKkAaiIKhtjJIaAFfrjJQqrRtTRxvVxXWuUPIiTtpAwWeEaKkwlgGLuUIuUjMgGlwWtTFCdDcxXIbdFCcIwEeWjJiCxXTNzZvVdbvVbBBkKCWwFgGfcRAarmuUNRrGgfVbmEeMHhyLlsOefFEQDaAxXXZmMztKqQlLktTYyLlnNrlLVvRTuUPiIHhXuUagGulVvoVeZztbBUuAKTzZtjJkgZxqQXOqQoFrRzaAGgBbPpVsScCMDdpPGgmEeGIWKkrRnNXxwVoOvPpCcbBZziaAEFfEuUeERreYqeEYgyYQBbqGKknNLzOopPCtcCRrAulLhTtuqQnNtTaAFkWdDMmEepPdDJjssfXtTzwaAZiIzYnlLZzvHhbBUpOEXxeyYyYvVIiwWITgjLlJNnXxfFdEeKbBUuZztTRAafFrkPtfFcCTtTdDhHNEzxXZeeurDdRMzZQqmrvVLlRvKkQaApPlLWwLDdEeOoEZtKkTWYSsFfypPbBqnNmnnNNUuMeEGaAgKEekFfEBbGZzvVmMEegKPpkYyzJjRsAaSoqFcCjFxyAajJYRrCYyXIicCXxvqQVEJKqQBbkYpPyjeEhrrRYEeJwpPWlVvLwWRrAzTKzQqxjJPNsSMmYybqQiUXuUhHFyYfbBKCcksSiIxucCvzYGVvjSPpnzYuuUAaUWwYyuEeUFfzFcqSsjYyBbgmqQMWwkKeEdDsyCgCcGWwRrZzIgGiLrVvtYyDXgNfGgPpnNbBDIiqjJQdzZgMJaMJsSGgjVviINuPIZzJCcooOlLqnNQTtOXxrRyTgGkKABbRrUukKrRsdDSGdPEsSepDoceAaEgwWWwhfVvoSsOeEtZiIMkKpPYqQVDoOdvEetTyMmnNjJwVPbytXxjJTyYFTXxtzKzZkbBhIZOnEeYyywWEeYeESUusudDpQqNiInPAlDdkJlOBbaAqQMFfbZzGgTtBieZpPQqEeoQMMhAakSsKHAakKWUuGoOGgKkgoEehHeEQqlLOVvWwPkHNEBOVLpPAamRTtDdrSswWMWwEeqQxRrXeEPLgLQeZyYzERlHhPqmMQOtIvVwaNncJjuUnNzZOqQWRrQqsgGRrSOmCSEOKSHhseHcHhKkCzLXpRrPrIKHhtmQKHnNVxXOMlFdDkcCKTtQVHhyjJUVZNFflLngGgGuUpPkKkrMXxXnerREhbHhpGFyudwvzaAZKkBbALDYpPSHhsjXwqOodDwfFWQWrtWoMmOwKyYiVqQvPpPubHfFUuYcKYyiIqOSsPpovQQSsoEAwWUuvekKueEAAaUuKXxNEeWgGwcbBCKXxhHQAaFQqWmgrUAJjlNAtTanIZbBDdiIzZggTDdnNJjtCtTIpzQqgMFfCcaAmcChiFfUuHhMYBbymMnuMmUqrRFROEeoEeJjhZzahHJjlFYygGAPtmmMnNdDRrZEzOoZaAaFYpHhPzZyAavbBzZPtrFKtJyYjnYyXWwxZzNdDTNOohHFfquzDdZhkKHUCchsSJYQMmDJjuMmCZzbBcoiwWIiIHJjtTtFfSsHxXhTVvIiaUuhAadyOOeEoWDdeXxoOpSsPEZzCcsSipmSLyKksuUSJTonNOXxGVpPczEebQqkKoKOoXdDxKOnaAECcAxXAGgsWwSaZUwWxcCXuKkwehHXxUuUadDAFHORrohfuaMmASsEjcKTDdDdKNgGksYylLsmMnqeXxPxXceEPpCIlLANqQyYEensSTZiImMzSVJBhHBBbBbKktTJIJMmYyGgSsayJYJxkqdDFfQKPpMmWwXjSprRkKDdnIcCbgGBikgUucCGnSCcsfFJLEDKlAagaJjAjrqQRJZzTGlTtjJfFrHWwhRfqRwXxAaPpWcMmZuULZhHzpPmureEjSsJSJjnNnNcoOCOnNdDEeJjBEHwWcCEzwEkhHAPpnNjPpAYykxVlLlLvWwXXPpxGgmMxXOoFfyYPpPpzgGiBuUYgjYyJVvVvtSMYhAJcgGZXemdRCgmXxMFdDpPzZIvQqBYybVxIiXtVPvHxXBGCcuUgbbeERbBPriIWwRYyMEepPmJAawkKaRyoIiOfZGncCrIifqQKkJOojfHbBlLhFyVvPaGgwyYBFXxpPnNuUNnhSsbBlLpPEMmFffFeHPmdDNnMpwWfjpPLyNnqcuWXzOoZtTzZxjJLlUuXxGgQqVEeFBJjoxfFXeLlMmHCcLGbBqvswbnaZoOzCcVvCGXABBbziITmMUutwWKjJfUuuUMwWaAlLiNsSnAaCcEhHmMHhJOoKkjeIrIEUuyFbiaAIWUuwDeEFrRTtFfLoFTtDSsjUuWwWuUcykKTdvBbFyYfVuBSsbUaAdbBDrYBWwbyVNnGNneEgYONnrRIdmVbOxhWhBbuUoOaBAsbhbBvFfVzLlhOLloZzuMmomtTMiSsiZuUoOBkKbPJYyjISsSshHgxXkaAAaKBDdfbBFfFKfuUsYyiqQXxItEeBFdDhHnNyEevHHFPpvVZzLDdlDHhkKnNqgXwWbBZzPJLlKkMJjjJWDdmMWwwKkFDdjSsoEeRzZeBZzNuHhdOoDJdDDWwqIfFiSsXxKxWmMwXqQjJNpjXRMmsnaArJjCcsSpPlLCclXxdpmMmMbBwPpMbBteCcDTeljbfiIGKkbtcVvCTrRfFrnNmrRHTtXxLVFnTtCcCUTKVcCpPVvwWvxXoXxOvaUAagCcTtQzZFcRrAaAxpPxXhHkKJSsugGlgGLbgVvVKkYRrJjlCQqaHKkeEhHIyixUuMmkKqnNczOgyYexbcCBIibBRWkBbKoXDFPcSseaAKkfbBEeAEeHhqQylLCcHhPpEJxXRrSHhUZzzYyTtnNZzEBxmtTtdtTIiDgoORgGuBbDgeksSzbBPsSPWMmITtFfiKkmjUujJlLJMEcsnNNnIwWJYyxWPpSCcsGgCgMbWrRwRrOdDwWHcChGgoIiBDxFfzFAafnuUzmMjJmMgGInNievVEKMmIGgiuwWUhcAaOeGnCcLUulaAXMmxCctKXxkXRrUowVrYyRlLzlpPyYZUojMYyqhkKHzeMmEMdDmrRAJjDdRYlKkPpaREehHxHhtTLjJIilcJjoZzOEIWwrRDdimoOMsSRJCwWMmMmmIiMmMNNnnSNgGThHtnnNmWwvNMOWOdDonjcCcROoOoFPxUPpHhsSuXSvVsMmVvtTJZWGJjDHIkJZzzZoOTNnaCghyYxgZfnNJDdKUNnBPbBplwNeXxbFfcYPRjJrtTpLXxebBEhNnhHzFUEeriXxZZAogGVvzhbBHIECcBbVvZzDMmKgcCDcCdLxDdcCXlwQqjJWVaknNmMdDLJjlIHhLnsSaAJjrrSpbBPwIMZzYeuUUuBHhbwGQqHhZvfFVvVgGsCUuuHhweNRrqipDIidWbBwDddDZYhHlxKfQwUugVLMDdxXfFPpmhiVeWwrlJLlYyvzPpzVfFvZOogmYXpaAPruUAfoPOomFfRXxjtqnfFNOSsoXBXxLlNnaANnbylLxZkRXvgGZziIZyYpmMPxXaAuOoTtVgaAEeGPGgLlzzGgHhSnNsYxtpPTpvxXkHUuoOVjuUJvMmLlbraglLfFqEezWZzuUfFwkhJjBbhgWwewZzWECWREdDmOoJjwWJjxaAXkTQLlqOofCqQetTOgWxXwvVGtAaesSETyFfYxXoxtkKwxXWCcTdKiIkYyDlFEefFyYMPaPpPCcklLXkKnNoOlAdJOSUuYyrRrThHBbqLMxbBhfFOoHCUucmMeXxdDjnuJcCgiInNrfFvVQsSpPAaAmbBMdadRidDYyRrfZzdbBDLlSopPJjXyRiIMCIMojJXxIxeGtiyYKkioldDdDFTbutTUSsKlLmMXxksSLlrJIaKkOoSNnoOUbucyAjeCcXCctTanNnNAWDjJDNndGgVFsCuUcSwWfBpJjxXBbWYyzZvyhUuHYvhHuUftTFCDRSXyYxseEMmnNZQqOYymXxEeyYbRzaIywWxXSsgsSGtaLlNrRDzwWZdAanZzqQpMmJrqPFElTUutJjwzZlwSaAmzZZrRzoSbBsOCpmMPccnNuUOocMYMnNOTtcLlCPpwWyqQeNGgnMmEEPAaKkZRhHrsSjYyJgiIUtLGgTpgTSQGgqZlowWOLzvzkcCrDjIXxkdDKaAEeElIiCTtcIGMmbBVvIjJJeSkuoBPpzZbphHTxXtoGqScBbElLheXxrREeromMORGgyALXxqjkKJnNSDdNnKlLLlkotgLEelPpmSsMqmDdTtVeEvWLFfloOJiIiTtzWwJkiIKrRrRrlLQqOUxsSXxoOlLoOTvbBVBUulLPLlAxIiqQFzZPpDmMdVvoqdDqQNjJnQwlLFfTtWkIZziKfFhgYueEUjJuZlOrRrHhoOxlLOoXpPRooqxXrRQSsOvzZjhHdyYDWwJTYytwWuUXxMbBmAiInNFQqQKtXxRKUuBkgTtGKxoOcCEsctTCPwWpHhbBfiXDpPIiTtdyYFfwWxdnpPqFTPFfpGQZzJetTPUuplLTtwlLtKkaxMiIfMmOoPrLlfFVJFfPCcloOLSsrRejBbSjJsJUuEHLluvVrHAAadiIgIiaAGqTtxDJfoTBbtCcVvbnmMNPpBSsaeUSLhHjSsEvlLVvVjAaLzZYywUDdWNnwcCKkSyYKuULUDdnsRrSrRNuoTtdDSsprRtTTuUPxNCcBbzZrXVMmQqbBkJjMMmmKCTcmwWpPQhHetTjJUucCUHoPpRLlhHrkIWwWRrhbBftzZTmMFPGgnNuVvrFfxXRciqESsYkKyYymPpMeZzucbBSgGwWvVeLlBbzFfhbiILPpxrRrRQqVdGgjJGxXGgmMLlnNJjqnTtNYyvQrxXRZzOVusGCcPmMpgSDdkuoOxcBbChvrSsYfHcChDdFPUzZnNiWeqQvVkcCKEwzZIbIeELlqWDdPtgGjMmPpFfVLlvZzGFfMOmJjIiykcCFfdRrdDDEOTtoDeWwHhdFfDpsSPzZlawWAVvjNEeyHsSRzzJRUurjPpFiWwnfFsoeETbYbBRiIrOoIiOEqQKSwJhHhHEwWncCPpntMmQKkqmccCwvcCcRBcCzNyMmvOoVvjJLYyloOVNnMjGgyAVpPxXqQgrvVxsCbdDBcGQIipPNDdspQNnqPaARrpnsScCTrRXZKsVbBeDkKdZQtTqhpGvVLDidDEnNeydTVcfLlFImWYQZhhawojJjJQORrousSVwfFPenAaAaPpkgGUuKMmAaNpceEVGKkXxXePjTUgLnNlGGgLNnqpNimMvVOtkAlLayYkUuKrRxTBbAatBkKdDknNKkMmnUgOBbooOMmMeEpjvLlSsIqxLlJjZzUKkTtYyAawuUNEJuUjfLkINVuCArRQqkKJZKTRDhkpPIiBtTCvVHAahcLJjaxBbeEBFYSQqxHhdCUlLAmiaAjLlaAJgLlimMITtFfjZYzuDdoPlLIwWaAIipqsxXBAaVvbjJuUGgFXYyadsBbSYXeIYyeEvVijYAQIiOozZcgGBbcvkBLluURVvAdfzWhHwPbRrvVjKkBdrRDguHkKoOAZVPUDdIYrTLlQPpqsSNZcSsdAWziFfLlqQwWmaAMmMQBZzbUpMVvmoiIsyNeGgkKeEFvVrRMVBhHCcMcljMQkPbLzZwJASMmHpPtTHcBbYPpgGsxXZzUuZlkBbKjJgYyDPpSXxghHCuUGpPggfyYOoLnBVvzTIrGchotThHJRlFBvgghHGXxzPLlpHeLgiIiIVgNnGnYWwySDdpSsMglLzZGkavMPDdBbGUrKkaARuqjJQJwWjbBgPpqQQuoaAOnAduDqHhQdUtOoGsSYynEpLlQqbBMmgyrUDMmnKpPkNdTtLacDgGAaxZqQNnOoAKdFfFHTVBafFAbptTFfOoRLihKkccLEiPLAZFCcYfFyImQLlqZcEVveHMDddnMTwWsKwxRnNYWwyugQqGwWPpIKbBPpkjRrSOoExVvJjNPBodDUukKTwhfFpNnWXxIilyHhzxBGOoYPpDdDayXxzRrZkbaPAhqQzZHfgkkKQBrhJjroHfSsCcNiIcCFjUwWPpsSjJVGMhaALVvlHEeyYuUNnLwWDEeIPfFpvVAPpagGJIihGgaCcFfAzZIZDeNnEdzMmUkyVvWcCGwQEYygKkGNukwWymMYcWqQSrRWEIEeYyEJjMmRreZctbAavVECphHXUuxYtoOTHDdhIiWcCrMmRwvVDdAirRCTVsUuSDvVJwWjMmdkKFfwWuoOYduBdaLVyYbfoLyYlEPpFjCmOoMlLMwWmyJjmMVOafFDIBbLoDdbBLlIiUwWuLxvVXlnNkDzZnNcZhHrRMmzllzNnqTeEmvpPCcWBklLDdrqQoUXxZmMxDfeicCUNqmVvGDoOevBUWwusVyRhGgOocCLQDdqhzgNuUwWaAyqFFLLzZZfbBNnFzISjyYQqWwWwhiIHIiJOoYyskQDpPtTBAaMbRbYyBuUrBSZzJYbqCtpAaPTcAqQawDdZcyOxXzHhzZSssbBdPdRUuBeEbrsRarzkLBQqIYoOpPNnbhfFHcGvVgSsShHYynYyKkiIwWHhNGNPtBkKWbyzlIZzoVvwWiIVvbBRrOPVvNnwWpurIyHYHhPpyfHCMmIiJrrRRjNnSstmRXOoOoSBlJjlrIivNrRngPpGNEVvSLpUvVhHXxfFnNPpzpPZtNAoOYyIOoJjQpJjPiIhcCmMXDdYyYgFkZEIidoOdDmNnJlXiIhnDdQqtWjAIiIbBIiiIgGWLlGoOKruFfUTtTtutTUdQqXOAaMQqmEeGsTKkaArTZoWwOsPwWpVvJjFiumhHAaNSsbBzZblLIfFVviBUMmYskCsSMeEbsGgGYyQqgSgGrsSSmMshKkHRKkVvvzwBwjcCJEPqNvsSCRwuCcUHhcSsOMGPJNCcnMmjHhNnRrtTiQqnNZqtmzZMiNNNnnoHCcuZzgogxXgNnGGgBbUuGPpYpHhnNPsDhCcTNqcCKGhPqQSjkgxFfXwUlCcDdozZCXasRuUQGArgOxXGTtznNZxXgoGRFqQmMKkxjJAwMcTtCUkyYKQPpSspUnNAazZLlnNyWwYKkueMBoOmxUuiISsdDbBDVMwWmnRroiqQBIzjCZDdSsVviNIsQqMmHcRrMzpHhCcPdbDXsuFTPjPpqYuUkKsSfFtTUuuicCiIIULAaiFVBsSmQqDkBHhbUdIiBjyWwDtJjcMwWzbBZhgGrvVMJjJfnNenNulLByaAYcZzgGpkXeZziSQqEnsSGgnNNCgYyPqQvWwOoVcCTiuUrROZEkJjGvVkDdzZbaUWnLppPKyYTtkPRrgYYLfiJZNnzYTbroXKbFwWfXGgUnNJpmMPvoOmMbZzbBkNyvmMVtkKTxXEyOBrEeRbMsSmIiMmdDpgFfGPDbBdmMWwpPPVBzZbKfdlLQqrRlHnoXEeVvaAxXJjxPvOtTwWiWxNrRnXYGgyYzZUxLtTIVTtHsiUmaMmeEAaRluiIUfFvpPvhMXxRrVBMmhHblLtiKDKkgaApPcCNwzWvfFeEeHhWMmwvjAaWwoeLlEgbXxQZAFsxXSfHfFkrLDAaIjJvGuUgBbVEffFjnkwLFjxgGcCVTOotjJeEnVvZRrzkIeEaAIiVBbvLewmMWEcRxXaAtyYtcCyYNRrwWBwWbCchsSzZtbBlLhHhLBblbBemOdCVmMvTtWwcCDdBSXGsOvVZoFNtrRuCbBKkfFcUfxkVvVOalvbBVLduULlpnNhgUMmPpRrulLlLHWoYwWLkVbBHfFKUuAaqhwBIibhHIiOpgGkDDdqQZEscxoOfFXCSiIezZPUMmPMtTebqQMHhzujJtTBnNKjogGsyszcMPIoOvAaSTcORXOTtoOhQaqZzWlWwNzZIiPEfYmRIiUuDdbMsSpPDIwWjJeyYEryYzekKEGgsjUxXuYbTtYVIVJFfojkYDdyaAxoOusYkKErmxaWzCzhHZcLkXAlCjJcRrJAZGgzaeEfPyYQTWbBwuUSXOoFfuSVBbcCviUuxitTSokKuUHXYKGZzPpjHhbXECbBVvcDyVlIqnCcEeyfIoOiHYzSWwqSWwsMztHWwbQcCnbBoKuDlyYPpgRVUayYAFWwfbKnNkrRUukIruuYyyYsSoOUbaABCJjZbDdBbnuzzZgmzAaWfrFLiISVvsCNQNjaAUEKkegGuDyYdgGWwJWnxWJtlBLqQlJCOodNnQCVsTNyYpPJjntetlMmBbkvVcCDdQyjJqQHknTtNsxXWKkoIiOfTXyYvoOVprXWifFIwWwWwLrKEeksZztTOHHhZMKbBZmMJjuTqNwRrWohHOzrBbXxHjZzJhMFpwpAaAahLluUlLHRTtDrcCRbZzmeELrRiIldDEmeEIuUjYjJtTtTIrOoRisSIqQpclLOdDoOoftTrxWlMLtzszUuZPpMIiQqrRmgGgWXnNVvFAUNKhHkWCcAFAtTucCRCrRZPOoYOTOhDJjVvhrRkTtKHzjEQfMKScLlYyWsSwfQFZzfspPVgGbTZKUunNIlRoMmDZbBiManLlIHhibrCsHKeElqKkXrmMCJFUrRcCgNMaTDRNnNVCTjcGgCHeytNnSPlPKkpwshXTbFhZzJKAjMmJgwTfpPkkKKxXRrZzRfzZzZvVflLqQLFfBoObgSsUumMUZzdDormXRrpPiaOFUunZoxsSWwXOQTthHkVBxhHttTCchBmgLlGTpPsbhKDgWRrwGnsGgQqnIixjQqOoJlLlmtTkKmGfFlLtHtTZzhHMmiSeERfGpchHhHYyXrnJAnaALeEEeyTgGdbxXGPpmMCMgPqsSVvphfSNnsFAfCckKDvVDddtTkKZTwhmLBbhHNnlWgVrpSEeNjHhChzZmxPpUuubBUPpEeZzoclVvuApPaCMmQQGgYyVvQSoObrbVvTSCcOoHtTgaMQWnNPcFfteGCOCcgGocSBABbSswWtqwLLloEeDdQoOkDdKpPxFfFzZIiDTtfLlQZzvqQViWthVaFYyDzcsSUuNAaqQeKXoAAYVIiBmfFZSubBUgXyWdYyweEeGgevsgEeGMgKiIMMmIimVirRxXUuaQleRrpWwmCMPFBbvNpZzjnNJVvTADyylErReLZzfrcxNnXebCcEeiIRrxroORPcHdDQexXwRVvrzZrRqQTtAWwaZzMmWmCcFIsSAzQFfyEkkKeYicCPpWwIfFkKSXzvbNBbwWvVOonPpBNnLlRIYQqWAwvWwVWZzatkKxmJPpsZqQLXvKkViQqzZApPCcMCcRroOxXXiIUTtuxOEeoEwWYRbBTtwjINvlLcyYCVXHuUhvJkLIilzGllWgbBWgBmMpHCcVpwWPsKLlUuOiIFcCfowoepsetTaXxmMFfNnNuvEXrRlLHpCjSCnoOJjLcClXvdLnXxHWTtKGrxXbBlvpPVriIxmMcGgrQoONnnIYxGbBVRrOooOvyzWwdyGgPpMHfiIRrFtaASrRsYYsSJHhjUulGsFSgGaAdDsQqiIfSDxvVXdXxXxgTIPyYeNAwjvVhbBHNSsAanzMmZFfcCnXxJzZjCUUuJxISeTyYaAthUuOkquTtrHFfcXjxYygtTWzNnZuGgAZVUYNXxnAaFfBbxKkgwWuUqQGWwzIiBrRqQMmEjgUZRryvKkVFkltTLJjlOEeFfXNwWnLYytJjTXxkpPrBttiIYyIYsSdDmMtTKrfofFOyUuLllhUuHqIQiHhImXxaAHzZJlcQxXqxGQnFOofzZNxXdtTFfwKZBbVNAnXxNEekeqQPcjxkhHgTtXxQmGgmGrPCKjJUuxDLlNuspIUVWJJjLgfYsPokKOIWwcCbWKkqgFsSBcCKavVooFpLlPxXpgkPEStTsFxLlHhXnBbErSsqQRHpMvVmbDprsgtTGSZzRIihPZhHzZdbwpPDDddEkeELlKsNnudTTQqnrqUumFZNUIiDsKdikKIFLWnapPGmUHBbWKkjJHOohhHCnNcdDdQqIJjigRVifPtyYnfLlqQFNLlDFMJJjjVtOQtTUuGgqoqXxQWzkmscIwbBNnocZYyYWmMqQZTNCcnSsfwZzaImMhTOocGgCtvcwWXBuQquFCbZeEJjqQVdDsSerLhZzRJjyOoYDdWKkVvBgQqGhGgbBcCZAUupxOSuAPcCypPYpgGavYEfFlDHeXugrrBTrnOoNqQBNFiRrHhmHgQyrRhHDdYrlsSKNnnHhNxWwumgRTwWtMmgqQjiqQBIQqVvirKUgryMmYCLloiarLOxJTSuSsTgjJGfAdyCcwCFzLcMfFCcxTtIXhyYQqHxauCeEcUWFikIiOLDdlGdQNnqDoOywWdDYYyVvThHJjHhLhlLBbsRrPxhTYpPmMmMyMmlWfWoWWsAkmMNnkNyYoWSCYAWwEJdHOoGsVRfFOoqJEejQiIVvrlzzZhwgGWTPxUuEyYOoIRAariPpXTMIFlLiiIWJjEkcCKejZzJZYwUuwFfWhEQHuWwGHhKgyoOkFYybyYBfjJGBbgTcjOGZRrzgoBMeWNlIFNGbPptvVTruvJJoOQEeIiAzLhHyYmGgMIiCctTODtTdaLZdDZsIiSSsaEzNjmjouTVDVUuvmiWwkYyuUPIEeHTtrOJjYtTutfTtiITBEupPSsUNnZzkOUTtZzeUuvVVvExZRHhahKkgGcCcCtCNnTZzzQdUkjJRfFiIrKVVvvHVvfFcngiVKkiSsSTmRQfFwPpRrgIpgOoGGLdOoDlwWLlLEGbSsqykKzYyRLlIintpPcCYaAkPHwWhpvzKdBKOTzZDdyrRpPVvWwbcdhuKqFKGgkKkHpPGSsgsMmgiIIaACcERAaBbkoyWwnLvchHfeoUNeRrMeScCFhBLFZzcCfcwwWXmMDwYztHdDUuWwYzuUHmYzrXMurRYBarRFdDvvUVSdyYBkgGdDkemMgGJPilLlGoqRrRrLWwOowLOAJhROozHhZNitTtTkKITsQXtnXxRMmooFIWlAiTtkwzkNngRGxXvVXwWABGgnAaNBbqQJgbGSsbEGVvgSsfFvVBXeEIGtRlLrGIiKvvoOtklaAfjdDxogMmxXTNTvxAauiIUzsSqQOEejNvVnjJkcCSjtTBeZdDfFKicYukKqQJjUyWgXXxZSOThHtdDuQtezXxTGfiIFfEcmiIHhMfVkXeEgGgAaGgeUUuAyYzZaaYfFylETvVtHheLsFpPfGgSaOnNYHhNnyYsbAnNjWRCcrcGQnQqYuvHgGJgaABNTSNuUdyYMximDahuTdDwWQXxVxyYUIWMtApCczxIAlLOwKpPTtJXAavfFiZbBnrqnNhHqjJmUEHfFFYyJPySQEQVvwWhqQEmMewJNbnzQNlVvLPQHpwLwWlJWShFasowWdFtCDduiIaAizEJWwKpPHhFkKKoVvVDSsYytAeEtjUpJXmdkhHKceBbWXopxSJLaOomQWmMlZIizNEeEpPeGuhHoKcrleTZQquOoUmMqknNKkdDRfFfdDmMFtJbJjfSgGhHGBLeEJjlvlcCLVrhqVvBvVbzqPpyYxWwHJZwdDdXxOBtZtgGTzTgGaqJXsSVIimWFfmKNMOphpPHShlDBjsSsVouBBVFcGeEzRrRSsrZFBvVMpSRUYCjJjmGuUbOfuzyHhkbBGgkfFcdXZHmMWBbRgNmTbBnleEkdfFwAzzMkEguUuUXrtYgGNnyxbBylLYwbBEjDduUJEeSHYyXLxRIsSVMxXmtJqOozbVxgUEeAmMHhasmxXelNqQQqCuPygHtssoDdCcAsSTaBbqPYyEBbeqQnqQNYewzZpOJTaAtTvoXFaYytTAQYIdqQgbpdDDZFFUmevRKkQqraJjxZkKZjKWwlLQqAkKLliIeCxXcfFIizZEjhHGsiKtMpWiIwPQwbJWvVxmVGgvWwfFWeEaAEeDdDankdeEDJaAjSscChHrRLAsNBfMmFYLllovDNZJluUCcAmMMmTDdtvVvXxIiFavNnozzNOocChHnFpkAZCfAcdNgAMnIiNoGoGKqyYPpsQkeEEkYmMLlWZzkMmdOoKHyYYvVUCobYhcCwEeUuOoWVvTtqdDciKktTILHKGLQMmIHhCVwHhFCcjGocpbcCuqQUTtqQDsoBXxLJevKkCZHYcMqfFrMhHYynolQbBVFfvEeUuAbNEendwfFUrUHhiIKkAiIyYRrauRqtsGmMcPIGjEecpPODWVddWSswKZzNAINyYyYpCTrbRGEfhOtZXuUxlLMmzTsHhiImMqQopTtKkVPLEyWwNnAoOQJTPpgniVpJUumMNIntorHhnNacXxeezEqHTPpUrOfapExqBlFdGzNnkKVVXxKWInNLfHzZXSyHhvqDJzbTkKPQehLpxKlLJOooTtuaAUOjCcNcCPUuztDzYyZyHlsSYHnkykzZKlsBbrMSnieBbEXSbCUQtetBbTVlQqLtoJjQqTtHeEcsViIkpjYLnfFwWyYkKwvVkBGaHVedAWwXoCKPpIpBsxaAXSTEezZvputBSPpSQqzDdaYDiGKnNiaoqQayYQZzEQPVnNKpPSsXmbfwOsDPxUuuRgBmMDdsxbcCcCoOGZdhHffrRFFniXSCcFfsxrRAweMDEiIhHULXpxXMmfroaWwAWwUugGCfaYLqIidDdDKePpqgJItuQqUVSOoYdDPhVRDdrwWxWwAaPSzOoTmUaMKkBHGgdppmMpztLlLFUuRyfaAZAipMhHmJwqQYmkKMvaALnYyAIKMseESmdtyYFquUwWcCkxpuddOmBbwWMOnnKkAzLuUlHeyVdpJjPDdcZqmEUugsRrIcTTpRrzZPjJjJjtKVskDMmCcGgPpoSsBHeEjIYOoCcwLlcCDdBbWWBIefhHrRHFfOoeEhDdRBKbBWwkjFIiIlPnqfwFPjDdJgAztTsmhHGyaUuTtGYfAStcjWwkXGkLlKjxAJiMmGgmHbjJbyYyTyYttTYewWSKTtNnuUoYyKzZsqAFIiIXBRqSDbBdKkxBckKHTtYjocCOSGgsDqfyYiIJjFhHlLQKLGaAeWwsAHqvxPuXnNekKsWVaAVeIiLlccZtTzcCzCErPoHOohOdmMeElOYyNnvVpauWVvwfbBdTAUuCcLEyyWlLeucwFeLIRrffXxdDrRLRrpPSFfxgGOogGiIYGSqtKVQqpPkYitCHqIibBEbWwBDdEeoOLleAaCLlcjSvJOoDFODrRdsQVvqBEMmrmYqFLlXxKfMUbapScjPpbuvlLrAahXgGVvViKkepPosAxXLSsXcWyYSVxRXxreEXowZDzXxUJjLUOeyQMmzZAHhMAamNjyYXIixJUrRkKbeOnOGDAXfoOhQqzKfQqFjzPPJUWYNqWCBbckkuuHoSswxXWkOouMmUPNEXwxOxXJXwNbQqOoBkBbvzZMmuUUuBbqVulLCmytsgGaASkdFfDToQqOsLlMWwZCcHheiIuUkRWgpMvVmMgGYyLLkeBxOoaAEgcCqnNQYyQkkKTtySsYfFtxXbjlNsSoOpItBlBblgFfOoxrPdeyzOXsGgplLbBMfhtTeCcEMHhmMmAayYjJfFmMdIisRUGPpHDdhqoZzMjdDwVYNnDdGTtgyxyNnppPPkKJsUuYSTrRhfFHFfzxMTnnlLunKurRUVvwOoWCtTmfFwsLYUhHQquyaQTtFfrnFYWbckSqQsYklJKkjULBRzZrblEgrmMQdaCSxPwOzgmUhSmjJMcEZdlUpRgdLlCcXxewWlTtLEXIYoOyyYiddamchnGspRxtaANnPEpFfxoDmMoIiRymYkvVWwKyTtMVQRrgGRUDduyRGtTFuEYckVvaAsSmFfMxdDXvBedDdCHuMmRkiGHHMmhhhjlUuJtTEUuYQqUOnOMaasSdniILOorsSTQpPqugxICdpaCezBzJoOUujnNeQqwtlGPpHhKkgDAPfYyDDQvvVeEHjrOoRVOcCmuNnUGEeEeoZztjBbgKQqXxDAadTtIiJTtjhpUNaDeGsGbBsCChiIoOVqQLlzPOomMwFkKfrRYftmMTRnqQYsSyySjjWbzxqPsRrSNtqQaUtIiugGUTlLPMPLlqTqwpPWbGHrRTtAaGKkEeMDWRCBRrRrFaAfjGqCqQRrcQgoUuOJjOogTbKkGgdJvVaAjDyTtCIXZzxrIPQlMRrSeEBeEbhHsAaJRmWwMEeViiIXxYIRUuriGseDoldvcNoXfOSsslkTexBbniIcBpXmLWqbFqQCzNmMnZXuglWwvAUrWwffFUuFOUuIVhvbLxTYgzJjdkZnrRDClUpQqNZzYKkRjuLvVNwlkMKSIfjJejsFjuZWwIgTYHHhgqYyIbBuVbGszvyYVfCcIRtlLvVqQDdIgwjIGXxbyiKBbXkMzothtkKYyCcEuPEeLlmIiCcdOvHCPxXpjJzhHsJapSTauUJjfLSgsSrjhHhfjjJdDezAabmYyhHTkuOTkWhMmloSBaoYyYNEmtTHgUtpRrgCRxhcyYoOgGdzcBhiIiVekdYkUbqsXLiekmgnLODwPpwhwMmwfoWXxvvVAbCCciHdDHBbDerveysGHFvfFVhopPykoOjHIErKvrKCCDdLCizZIlLchLYnJKZsSxyYeEoPHhglLSQqQKkqsoOOokZzKVhtcCTUcLlCEaBQocjhEQwWqzZtWTtUpQqPjsSMfpjJAHfFhToOoOqtCBbJSdFdDlLfSsSsmemMaAXVIIiSLlqQOdMSXHhuUMbBIsgVvGcCzhHnNJjhZHgownefCXmMRrpEPTfWwOvLdDvUunNKpmFfiIMslEgPCcEjJeOoHTtYDZpPzAtTLeEJjlBVvpIXzpYyPuUajLXRmLWWLUFfrtQqFFUwlLNndcUNjhQkUZdnNgQlAaLyYkFFqoEdgwWDzZdbKsMYDlxXMpVEXuUFfsPpGgKARQFeEYzZnMEPOYyjJCcGPkKGfFjUOmMoHrWwwWqtTkKtTEePHNvMmVdTyYjJyJjsceuUNJEegFVrRvvLkvVxXEEstTwUuwgGwPdwsMYGoAcMqfTjqwUKbMxYyXFRNGgnrfmBkuWUuQJtwWFQmsJjSCaOgylLmSEMmgGeWDpWnGXxgNaAWtTWtTSeDCcdYyeKUulNniGgIVDpWwPdfGjNnKkqQnuUECSYtDPLkKlcCpnhpKkDdQRhuJgcCpgpPoTfFtpemeENykKMmfqrakVvLvVWVvwIilSyYxevPmLdymjCcJGXxgSqTtQkBGgGDeOQfIiwWfKTyfFYtqsSGDzuPpKqHJnAaudAaDCDdDWuCcCcfdDfTRulcCwvWwVwlqUuQMrxlJSsAVyYvJjZxiPnNbadyqQkVZzvKhphHGpPeLSPkVRcCrBblVoDdFRFfyYrtpePZzxcFECcNWOGhzEeHmMZSstTaASimxsWwmDoWwsAarRivxAaCcEMFfDsjylLYcTQDdtaPFmHheEKktToOJuUuIdDiwTeHJuUCOqbAbBvVeHhusSHxXvoOmMGpOXQqzkjqdDQNylHvVlvVcMmckOoRVpHhkKPkReihJKYDdbBOHfkKhgQBbqSYEVREdoOrRhhPpIcBjJacCmMsSVxXOowOFWWHWWdolcCNGMKEIlxSQBuKyDRrAaKSsEvIHbCZDCHXrcGPTuGwWhHhMenyOAbsbBOdDlLLvVHwKtoUKtMBTtZEuUgGRrJFHJRGslFAtnNsPAjSGgZXxchVgGoDZzMpUelLaATHTOcCZmKxkIYQqBgiJWGiTriFmMZSgBvUiQGhytIgaAFfGiGiBbzUJfjJSJdDMmEiIFiskmKzZLWnvVlUJrynPuGgLcdNzKDZIiGytXlBVXxHvjJinNxXoyYSEesRuaVLGUoOlLkKxzLlZDdcqQfBQiIwlMxbBPbCNLlXEtKLSHhoBNwWFfVvnuUbFyYxBbvVOnUuCVDSsLOdiIESgsSKkyIvkKkEeKrwWVvjRrmfFLqpikKRicDdCcYLlEeBaiIAdDuUtGJbeEEecrwdmKkgTSstNxXUunoOhgBQthtbBTHgGQpmpFftTuVvATnpJjQXTtnjJxvVXyYFiIfcRgGrCNZBwJsSJsYNrFjJYyyoOAaWSspZvHcvVcSgSgEdAnuPHkGJTDdMFfjJmOfFtWwTgMovPpAaJGghVNnqddFpUuadLqQhvKkVHTbMmBWEZbZEcAPDciXnNGoOUtRlNDbBVvGgAAKkmoNLlkKouyejZzLJHOogEeIhHYyKrUhcDOoEbVQqKCyeUIifgiJjIEerYrqkKBsSsSbvgGgGQqWwVvYrOdOXPepTXeErPSgNHCMANnDDxeUsfFSuZzEHhjJDGrPuLjJDzeCkKsHuMGZoWpOoXscADqRGeuLWwaAKyKCBwJjyjJfNRqAMmlSRrWMcMmkNUcCeENrRNGgtmXZsSzrRZJNsvVhOoaAHSnjtsySjYXYiIyvSsWuUJmOQgBburQqSIinNoODAUuayEqQWwCcRJjfBYyMpPmbFrlgGkvVaAKLeYHFmPSxoZYEDGgpCcRXGLLvvVVbTiDWwPyjJNnYsSnLJBTMmfFvVtIiTvVKqGevVrBwIFfiWbRXbEKlcClmPKSskEeGwDdrQqKEzmStKTYMciuUIUvQVKnWxjfFoXWxenpnNfFKWwNnOhUlLUKKwQnywUwWuujpPppZJkZHFjJUuxadgoNoYyEBunakKEeqpyYPYuUEYqQqQyouCcluZdnNzjJWOnNRrvswCdDxlaSOECcIZzvxRrHRAaaAVUsSBJlLCsPABuSRrsmFQqUugGkqZzQfQyMRDdFbHhBfebBbYySDPpdoRreEfdjVsEoOeJQhCcgGcTIIiyvVKpPvkTQPpsgyXsclLBgcCGbCrRlFFiIFfRrijQuUqJnNBbgGlcCEfFfWCRrUxXnswPhHpWSQqNEwIiYYelatDFUuUjJAKkPKkoPHhpCGgBbcLfFDpRecZkKCCbtTBEvvwSExUpXeEeEVCcOoQhaSEglkqUuQdJyhCbuyYUXsQrbLlxiJjfaQSkOksJjEyYXMmxjJBBhMXxIjzZaUGguXJgxoOKJCSZzsTsoOdDaFyOogAYgVvMqQSZaIiGpRrfWtTFQNpLiCcIkDdKifJKkbrCcAaHGTtGgsSfFghMKkjJmFfPiLlIpFfFEiaAbwRrycCiJhLlbOdKFfSvkyYTAacCVvJtcYyUuCZztCiSGGmMNngpPeMTtQzCDvYEhrRZPpaNNooDkKDQqUPXKEQqeQfTDkiaNlVNnyqQWjPIazFYXxrlLiIfvVlTZBbPPqHhuUQPZzDCcsTtSsShbRrmAuMfWWwDrRdRrwFtZspXvHpqcCQyIiDdFfsvTijGQEktTRrQlyAFcXqCcQBbxzZTcCtORFPeECcwWxluedmFfEWaINhHDzIigEeuUBXSbGrUUudDXpdSoiIWFqQBMxkvpUuqeqkKAqtTQOgGAIyYkgIdyXxAIPpifFZsmMsblLTUmMfFJjPVIitbPikcRrOxXxaDEvhAgbfFKWmMNQqeUuElyJPKvSTtChBbOeETNnvETzZqaAucBsxIaANuuUUsuUmRoIvRrDdiIViRDdrOSLiIkuUKYKNhyLhYkKLldmMGZzMbBmcfFCvXxJjVAaNngTZpRzZrZznJFffFjkXkBzZbKtTPlLbBlHEqptBZjdQVIiCcJjYsxhhHSsFlifFwkvvcCZggGZzDfLgGBbbQXePAFoRDduthQePpZdDEECnNAWwROTNinjaAPvINGXxdDYytjqFfaYTtelpvPKkOrRZzSoHwWFiIegmMrBRhHtcPniankXxDdPpDDvZlLzvVuUwsSdopPCJgipvVsSEeCdDgSTQfiSueEUsIFuWPpDunNUiIBafFbBkKbBqLONrXxRmRCcXxfFcCDdQmCyhzEeRrcxQqIiLlXWwVEjlbOPpSdZLlzVvTtBPCOgJCcfWqQvcPpQqihJjHPpMViIQqvrjXxJRmqxXlgLlkJjhlCQHOoyBLlOcuyQqjUuJhksGAaHhgSNnDyYKEewMmeEkKyKePpKqXxSySsYQLlrRLlKXkxXKkKKkxkkrRgOgOqQmaGnDCaFczvVaKPfZcCmFfYyMoeEwWOZNnlLDdqQnNyRPprJjXxYgGahHAOVAfVYyaLjzndVOLybnSoOmMalcCKNkKAdPpwMQqXwCcjBVvWcCqmTkKkIwWSgQqvMmVwWbBBGgbJazdDZBbqQkTtJzCcUuzXuUAVLlEMuffzHhdJjdDIZzivVPBGDiQqyqGgYyfxOVtjoPWEyCcpDdxXGghPpHQAtaOBPpbHhSSThGYpUcnLEYyMSuZzGXvBZzZQGgjTvvVsSirXlxhspPeqQWwsSWXOoTRxuycCYmVKkKkvMAaWDdwUfKkzZFGMmeKmZZaWDKLNtMnGKtTkrwmFmMfMGgOohzZzxDCKmMKYZUFoBgMJNncyursPZzmbAafgfFRrCfhYyyYHgfFGbBxXvbbWwUqdDlLQOvBbSJpuUPbdLHsFfPaAomEenkMwmMUuMZzqQvfUufFFEexjBGUugbQAboxXDWzjhXQCcZjJAuUaEelLQHRbOogvyYVsFBjTdDrKQztELVvRUuCkOvVTtUgnLwrRqMAljrcClLRHhsXPOcCxwECLlDPpMxjvVfFPpPuJHhTaTpPkKvVWwdjJvYyTHhgbBGtOkfRrkjeZIUDdcTfuUIiDOSAfGgHswjBbLlxXIiWPBoObhqpWwnRrqZNBnjWHqeqsMTtmTJjtYpjfwWheuMmSsZzMsSQEeuUQRNzIzZVxjkWoNnaiXZPJjaTmwiuoOIiuUXvqLKklBbtUHwWAdMIXUuJjmAaDUunstYynbGjhUuEeVUyNqgsSZzkquUQKCAawJaQgGqBSyoAdDZzgGAKMmkuEHhGtzZTxfFUYhHyoPeEpOlQqLuKvFCWweoiIOeEFgtZETqYUXxuyESsgGeUoszkKmZzMxGwSsCIkzEeEuUbJsKxuUfTtFBbJjXLlJoZmMaAXxXsjJSVtntMmGOXJDdFeELPpKtTTVNnmMVhkKnNHkFfsSgTgixdCcDWwbQWwsSqeBgPOoPppBGjKkbaFfxblLBgyqQYpqQPrGKZyYWeEUuKIaIiLwifOuwWUOrNTxkKqStnrHjaolWlQiIOgZdDzhHLIiIpjEsRrSXxMmWwKKbDsvOouVdDVflrRLAbyUmLloOMmsSxRZyMhZyBbhTZMmfHhFyWdBbxWClbHoOdfFyYzZIiDfeEsWpPqQKkwoOEmERdDrnyYLluOEFIsSiCVlpPNJjYSsOKreyYimMOoGyYShfQknNUHDCBlLsSNnYzZSskKUutyYoBbsSkbDkZVjJKwWyaATVvNrZYQBgelWyYiHNnhMmIwgPiGWiAgGaIqrMtsIvOoIpSsPGXMmxTtpuUfErzBbZyYReFPNChHhMrVvRLlmuDdpPDqZtTtVvcTcCHArzXMmuoKebtTtFTNnUyowWRhiprRXxKiITaAtIMdvtUOJkKHuUhMJnkKZeAzKkzlzZPpAofFTtlwWZaXxAaqjjVUuURSsFRrfBiIgqGgaAHhQHhnfiLoOnwEmqQbPpwWJCtZzWwKYGkQqgUAaWwhqAaeHWyIiOozWCcwwxXIHhfimtxrReKkFfSsXptFfFfGRrgHZLvSghzZDjkPpKepPaysScswOnYyKmMKaSwwOwFfFlLwLZzYmrRMyttTHXpSHEelyuUYzgGZtKkoOxXgDdoKIfHgGhwOoAkBJjbKRWcCEewoOriqQrRXmClZfcWYDaFsStUdDstjXoCclRgGAIOcRGukRbImMJBbGvyYVrbBGRrKoOPpkSsMwWUXkLRIiqnNOogGjJWwGhMIfnbRtbRRGwWJjVvUxEhdLeyVxXUsvVoXtTPazcCHWwbwKkrHleERKkEvzoOBcfWVvwUUboOvVxCVHzZdDibrRBALlQqIiWwWFtzwyFfeEzMmCONnWEeiCSMKqQZwIiTvmtDdQqTjJfHhjJZzdWwTpuUFmMIyYvAarGDOopPwhHhuMgANwljJfAazqQEeZDCckpPSdunzfMQZzRNttDtTUxXAmMauUQqNnpPSEqQFuGgUfeecCrReEbBWBDLlGBbguUzWwpHPdBCcPhUubBeNtTpPfbBiILlepKWwGUuPJjfOOAktTbyyTtYYfWtTwGdjJDQKkwiIBHdrRDhirRpSyFGljyYbHhBwvzuUZuiPSUndXgKeEPpmMrRkWwpPoORyYrzZGkcpRIigMMqGKXOoOoJCpfFEKanOovzdDkWDqdFfFfDMmgDdQqDSsBbdXCLjlLhAaGgMqiQeEhrRHLYFwWRkyZzXxiLldwWDTTbCcRKtKkcCMmmMjJmMFeEfTlxoYyVvLKfYxXkKRrzuGJebZtTsSXyBbuvzuUaUwtTGvVXJxCmMhRTtUQXxmMdXxPpDKorRzZxXHDdwqKAakQWVvEsiXxXjucNJWanEpkpVNnvDjKkJrcCRdLlKksSPKityWwYSsaAGgLyyaATqHhQhmYDZAaYRrSsgXkKpPGgyigpPGNNcJjCnkKqbQqBlLRCXRLnNRgkYyaAvVwbBwWwWhNluCFfJjcCcpPUDVVvxNchHsJhHcPhxeTCcaAQqtlLVRrLDdlmJjixXQqEeIMUneEAESPtTGgHhEOWHhkzbBZnHhNSvhDsSdPbBbuUGwFfGRvVrsSwLLcCgZKXxyYjZzVxUuniLlJWryeKIhHrnNRikTpPtvWeyYEEewVbBqQkKSsKkmaIRrvVxlzZzKkgGSsSjMmMXHhTdDlLwynNirFfOooOTtHhVZWwxsyEJjFkKfKeYqZaifMwBbDdWEqqQhCpXRLlrBEeECeERFXxYYdatQqPnVfpmzZcMPELqioOIAIvwKlLWwkvVWbYylBbLBSgGsFfksMsSYymCcSGmSmoOMqQVkKEjJKkEfFWDwwWYxJjGszJjMbvyMmayYeaOxnNkKWwTtkUuEAanCZuUdfAyYDdvuUHTwIYZzgnrRNGMmVvzZHhyqFFfdRrgGfXqQqOlWQTaxXbsbBnLlXxNgETGgCpwqmkwWKgGAGULlpBbPuPphtTsMmtBRlLBAasMmqtTIiVvqqJjYycfFULCOQqokKOSsaAWwgiIGXMgGBbNnkrgGRKHCccJnkKTtstTPRuUvGwMHPpLlWtzFfFaHSsPdDQpGmcVvgBDnNtYlNajNRxHhvVhHCiIPgFrsIozcCZOtTVvCchTRraARrCcgMMLXNKkSNdkHBmMStEeMWwGgbHSsTXbcCvKGgRrqzNXxwWfBboAIpPxMqYyfFXqQxQROaAuLjJiIlwWVgGvHhKSTiItnNsZSszkGBblFwWZsSzaAFrnVvNGhHgFTttLlWiIpPXxGgGaOouUVvkjHfBtSsxVvHSWAaLpCcjJfsSFsWwTHhYEhJtcvcCncCrdtAmnGcCBbuIifjJjcmMJjRxQLXxkzZhSAaczZRBzZNAmGgSSssIUuzHhdOcCrLmMaAikztBvpjJGgPwaAWSkKqFCsKkkLlZzmnUuNCcJjOoFqOoeJZTtdHotAaocCzZypzoOYycrUMmafaylQqLxXYwKkJnNjmjJRrMnuaKkfxwEeGSZYyTlmLwRrUuXhDdHRFCPiIiPpyJiBbMekKMGgBgUusSGsSdrcCPWPfmRZfFnJjzhHZQsStUiLlPpIzuQqUaAkmQqzhbBoeESqEeQxXDdgGfFGnNghPKkpHbBRuUlWIiwsSxTtRPxtFyYwSAapPKhaAXxZzYsSqKkKLuUdDTEWwCcSWwfkKtAaTXxFvcqDcHhjbxXLTjIiwXNwjJpRrBbPjJjOoJnJjqeEnIiuQqUcoOtTlfRRrFAawZkKMGZUNBzcURiKoOsSKkBdDuvrGLZAazdUkOvJjuUVNqhHBhTYyZSsmUuSsQoOrBbRsWwhHZyhWwIijJFYNyiIYQieELbkKBdDnaANvYJjdRrCcQqJjeEexBJQqnNgFiuHhUIfkKrRkCcyxhwWnNOiIxXZzsIXVkKvUuIlQlLmMqtTtTLsUxYystTpPGgtqpFjCiIcLaxKlcCZFfwAJjXUuMQOoaRrkKAqReLlySzZUXKJOFWwfjNnviIivyxXFfBcCyHhJSZynNeEZzYRidmBHhrMycCeEZzFVvegGPpHhkuUcCdDKpNnUunLwCcQAqHoxroCtLlsVYSsyipmHhCZSHhYSTtaAOJlLkmjvVJZzlLMbTtyYUuUnNZmSsLlBEmXxBbUupGgupCczYydKPovVsStAaTWIiHQkhvKlyDdOtTwhKkGHAkKaszZJjSPDTtDdAovKXFTnfGyYgZzOzoSuUgxsaAbjJcGgWwDwWojJMMmEbBHHhTfFHnTThuUrRHrClpNnPwWiKBHNGgnhbNvXJfldDWKuPpUtTfFNJFeidlLlRKAhHagGhaSsGDdgrReEzqBUuGVvOnNyYJAapZzPVEVwZWncCFyYfvVGdkrRITNnvmHVaAVLqQkKoOrAMuQqSsIShvigaAGlXgGuuUrHhRnNeEywISsoVpONhLDaAFkXnNxHhEeviRrtTIDdpGgKkRroYxXuURretCcvlLVTHhsYySbBYnKBVwpVvTtKkrRFfPWBbKkjCcuxqQBkxORBtyjIFlyySsAmMwWTtaUuGlYyNwurRiIAaAcCBKgKezoFfqfuUnNvVjJVvpPUuFQItpGceabBAszZQqIVJjvVvvVEAaxKtTtuUTMmPmMpPXIixCbUEFPpxXjPpEemRHVvMmmCaADdTdYoOJUubDuKQHhqVvdOoMbKkvaAmDdsSYyMfIlxGgXflLFfsCcSFZzjJuxXeEUdDFwWfyQPBbSsMmVPpvpJptfUSxIidBDZmChMmSyYDdinPpIwWLRrlzTWwsStrRuUcqQJjJZibEeIAavVGgFfOlsZzpPSLNRrNnoXxOvdXMbmiIEQqICcixXPVvFfqeEumFfWaaBxXiFfIbAOoXyYZzfwWboOBzZayYgJnNjqrSRrMmjJAxDdcOLyYNnuWeKkrREGKiIVvJWwoOsWwoOpHgkQntbBHdSIiyOgGRrNnGUhVvCcOnITdDQNnzfFvMmVImMpMmgdyYDmoCZkKzYykKDdYyWrcVvdDVnQpehHWRrbhHWZLlVELleKkBzZmoOiIciIKIOoiFfStTyunEXxeMUIiIfSFfztRtSkKgeEoxwWDRkgwiBbaJwMmTXxNHxUuLjmOoCgGdUuDcMMzWwZDezKflZzvVLvVGKkyxXujJoOrGgRUxdDKUVvukHqiaBbgGqQnTumRraABbkKMPluUsOonNKkeOoGgeEAanCcVIiRLLbstTetiITEeExrMTcvVhFjJhTtYutTUiRURKkriLCcBbQCcqZYBwbHVvRrHhhcWwCoOTuGgQqhHxXUpkKnWwgCiIcsCBybBcCiEeblBbKZujJURAxXrSDpDRrNnSZoYzhHbBZCwRrWwWzWSsQByzCcZjiIDdMmsqQVvKIiDrRrRdkmMmbhHBbdMmqKJjVviZqQplLzZVvoOPzliXqQxIlrRWwffAaQYFfnGZnaANHFfYdDylHoOrRhDdHrYIivSFfZzTtbbBcCVMFfmEdWwgANnaMQnOdDCcoLlhHCcuIBbIiEFdIimMXzuaAcJjSsCORKxXbwVjJMtQDdLlhHAaZLLZzCdKOlidAovYiImMVvcYyJfezZOFBvlADbUlLXxsSoODuUyXxuUrRaAUXfFxvtcILVeEvcClqQaRrnNyPcJjeBTCQuUqPfSsFpziUuewswCKUneqWgwYygGrRDdhHYKrrRRuiatlLTHhAHRrjidlmgvuYyJfnnNFsShORHUuRbqKGlLiISsFxAasSXapAvVBKsSbBYkKAjGgJjJdygbnNXNnZaAUuHhYwWLlLtTlEeTtLmEeMjJwPHWtOkKzZbpnXesJtTiUuUrXWkSfFkKGgttTmUujJNEeDpPmhEoOlLdDCcWweCYyPvVWwpzMtTiQFfqfzalpEeMmIiIuUeDvVQqqQdllLCCHIlrOlLoFffFIiPQqBWCcwbvthDdpywWYPEefDkacoOCDdzuUKkXdoOkKCAlqQXxuRYfFnNGPexXCcNgwWTDaAaNUwWqRrpmfFVUuGgOovrReEVAyYKcCmPsSsNtTacCANQqnvuYyUwDkKdFfWGQqlmMhDdHELloOhQqjPpoOJZGVDdbfFfLrjFfOHCahHrTtRAgrRRiIiNnEetZbsSNoOmrRMlFGsSLlCcoOlGGSsggLcGqQzZsdMmYybBGjJLzfZzZhHzFbBcCEefFaAlLSSvIiVsyCNnhhsTQRjwWJvAaVrqtTtaeEzZjWlBpKoOeVvEqmhHvVvVJLCVdpPmMDvcCSsmbvmfqQoOEnYDdSOPHpPALQqlahuqFMmfIZwaDCznzZeAaEuUvVuULlvVtaNnAtTXdcCVvDxVvRTtyiupvTtzavtTVhfLIvVFfpPilFUGqQfFbJOoVvwGgUuWBkKpZFDvVjJarbUuKVCCqoOHcChayJgGExRriIqPpxXQPpyiIcCpPDAxfPpxMmXSQUuPNnRriNnlLpOUSsZySszvVJGIMOhHoamMmMucuUDMReEwWYujJUeEymMrVvYbBypPmXsBbyfevVEbXAlbBhHhIihHnNxYyXHhNnHbKmMHdCDdDdlLDdcrtkzjVvbBacUvfFniwHhuUmtTMWKpkKrTtFfBbRPlFuUJjJjjJTthHenWuXGgQiHhAxXaVJxXPIimGLlNEnuTtVvNNnyYkKKbXdwqCcQzZcCkKoOWKTovrRIieVvEVVvInPQDdZzlgGutKwWkJpPpExgvCPuUEpWvvVfFsSUhHqptTPOyybBYYBbWyYAHHzqywMkKKRrkiCvtQYyqDDdYPpKkIdDlLdgIiGlgPLlHOocCzEvSkgGzxtJSsBbjNPSngGpPqiIgSuUMmXHgGhRSFfssSGvaNnYJmQqvVvVvVrYzZyYeEyooOYyORYnqQZbnNrCVWCwWMBbTNhIiqQTtHIiiIzZZzNfEcCooOOFfgGeFejWskeYyoyBAatiIOSsSsSNIfZVUuvZqQoOrhYnzFtNfFnTaAfZJLxXEdOoCcfNnFDdxXeDdKYIIiWPpwiSwWVvsMoKkmgFkKaAfCcJTpIWwiHhwQkWwKHhiBLlvMmPbBVTtvTtuUpeEhHVuHhpyvQqVRnNEaAeVHXUXDdxfFfyYnNmGgLliIIiMdiIDFdDKWwAaDCcdUvVvoqjJAaVQgmMjwWJfFDoOvVvXfFVvlEeBbRrBHZEsCUoOVvQICIiUpAajJHwbBiEeKOzGgKkbBUxXzZYyjJxXuZhuRrEvVqnNnNqQMCivIiEDdeVNnItcdDvxRrMmRnXVvKkOopttTSsRrPPpRrOlkZfFznuUniINPBbpNsYyuWRZzrlJhHzZenNJliIgGsrRCctTaAZzuEAkKPxXpXUfFuHhQqxOVUVvuvBbFrRqQjRYyrdeEeEZzcCXbBwWapPAQsSDMnNmahRUhFiIfbxrRXBivVIQqHhpzZRrjGgvRpFtTmXcCPprRATWwcCWEjqgtfQNDIFhHBbtTEebLlBSeRrwWXbkUurTkqfiIaOoVXxLzUyWwGHkDdSrHUuhRdKkDsCclLhHKgGOfhHmMXaLlpbtXxXxXuoDsSdsFflLSRGOogrRjYyfFrnEeDdNnNaoOPpHhARtTRrZfRrXxGnNgFITHxXhtXxjMmwyYJjJjWwMQGTYyOsQlagGAaYEHezZCPKkpsQgIiOfFPOqQEeUKsjJEVvMmuUjigiGgjJFfjJLAMmaQSsqbBFfEonNOBbcCxXoURruVvjJNnPpOqQoTgGtOebBelLiZzJdRKZqQVHhstGsSXxPtkKjJlRHhrTsSvVusSGiIzpeYKkcFhHcCfPpiICxXyYomysQWwqZnNpOyYogGPEezUuSmlLCZzFfVWwvCLlMsXxlLWLWwWcCLelLaAfsSYyRreEUuNnpQRjPARrdDTYiAnNfFZrBoOMHhozOoAardctcCTcCuUCcVVEeSGgswvVPbvdwxEJiIaYCUJjBusMmAijRJjBCcHhtjcCJfLePpzZXxEjJCcyYODdIHvVhITgWwEeEXiOiILlmsSnIiNCcZziFfcBbBbTtmrYdDXxrRxwUujJWwWOsZzfarRAFIiFJjIrDyYnIiNADmhHMaqRgGGUujUNJEAabBLlRrXKkmlQQqtRsCciIJjoeEHhjDPpeEaQqxXLxKldDiIiILpkXxKApTtcCmDEeTtdfLoQqOXoOZzOoYyLlEcFNnztTXxrpPRZTEetQOoqtxXCcKUusSJjMerwceEGFfHHKikKIaVvLlPpAIiloPpOuULZQLlIiOoGgGAqQRBUuMmAsSavVeEhKVSsPXydDGgZZpvUzVCMmcxrKmMzXYWEewWwxrRhHQBbTJKkpDdKkiIPcqQCdDNnrMpPXsSsSEexUCcjJRrDduLlpOFZzSscvVUuBbiOoIyYkKCcFfCoOjJaRYyxyMNnGHhAahHFZzdjJDfUUNCcnuBbuUfFuIiZVaTtAjiILRvVEsSEeAavCCccIrRHPplvGWqFkzJjAaMmZtoOwWTKkXLuUyzPIwWwWvBbVLlYwWyQlLjJeEnEfFWUcVOfFdDOoYyxXovShRwWrHzzZJjgWCcPpnNEymcXxPpCLliWsDdRRjbBWMmzLlVvkKZUGguwJcdDstTSCNliXxKAvmMGkdeilLZKkOoOazrwWRNnzRrIRcCzYyZufZDdUuaCcAHlyCBEnaAZzIimMWhHqQyYLtTbDCcdukuxXUjFzWwUuARraGXxXHrVvlAaLRGgGTtcKkAteEjBbKAaiQqhdeEJSsjgwzrRHhcDdCjLlMmWwpfvVrCJNwocEeCoOmnRrVMjJscjraAtJjlLTeAaoFfOCgGuUqHvVhVvQoOhHuUMmmMXrALpPKkyraZXvVxQmdDJObBFfeExXuUuIiVntTNyYvgGwCcWuUzxXLZVuUvfFvnNKkBbcCWGguUmMBbSsOuxTLlVSsvHsSBbsShNmMAagFfaAETtoCHoEemMOkZNZtTqQdDFfXdNcCnJjmOoqQBnNbGFfFfCcgiIGSsxXcvVwrcCRsSoOXUiIujUuibBSCekKwpWwpcCEeZXxKEsSGsSEedlLUrJjfCchoOHuUFAMmDdaGAakKTjJMyYkpPKXbjJesoOKkSZuBbsWwjMmeZzYMmazZFEMmCpfJwhvVHWjmMyYSKksdxSsNnSsOwrdDXEGebBoOXxXxEnNuUCJjcoOskVvmMBbKSoXBbxZCQBbFfXIYhHqOovVQiXxiIvaArtJjTdDMmRVqQiIKkpPXcCnNxhGgAcLyphHPiMmITsSHhAaLltyCcYKkvlLaAGGgiTtvVIIiBURrjXxNnqfkKFQXaCVvfBbqGuAVkttTujJrmMpPzZRcNfvlhfFMRBgFtEeTBJNnyYLEFTtftdETLTtlmqQWHhPmMfFFRrzZfDyiIYUujJwWLRNSEeWwrBbBbOhHMmoxeEJPfFnoAaWidDIwOkQdoOjUnUubEJjUuEeVveEtTrOJJjfCcmjphHGqQgxFgGfqPpQGAaQnNkKdUufUunNlLhyYhVzsSZYYyfbOuUpPoTSzZFBbkDCcdCcbYyYykKgxXGGiJxXBbxXjrREepbBzGgIzZIEeOoOUtTHIiZHBSabAyLlYHwHkKIiEeJjXoreERBUcCnNuLxXlvMDirRoyPpvxXRtTDtjJvVYCdDwlLJdxXfPpOVvoOPplfBbsSdBhHfAaYYMYyRrzZmdDyeiXxREeZzmrRFqQkKkIHhibBYyZbanNyYxgcfFALlNuUBWpQqPeESVvWvVdDFfwDdkKxrRXXKkEerRaAxVhAuUaHQglhEqQOWuUwLlSsblLpPfJjvfEeFHhycCYcCqQdDfyYFIiwUCFUAajJufQYlJPpbPpCcLvVlAauUWEebBAphHBbhHYFRgGNgrRzgGRrFYrUuAWNndDjtTpoOtyYTrxXzZBYypPmMBbhVQqpQGaAgAxXaYycCqvTizLlZfGcrePmMpkKEDMJjBeiIEuEedDUuDdAaUbzIiZEDdxzmLlLlMCjgGaHymsTgGGenNEjJyLlbIZaMmAAamZzzZMKaJHhjCcsSJaduUDKeuUUuWZehebossSaAjzZJsSRQqUMlzpEepPHhPLlCLRrlzZrQNnHhEpPkyYKegGFoOmzZMLgtnNGcCLkdelpPiIjomMoOOwWNEexXGgKpqQPNlLKzZkPXxskKJMmYyjyeEjCfFcxXEjJnFfNWjDdJOoweYAjiMAdCcDZYyzlLavVtTmjlLbCcuUbmMjvoOYDdIZziysyYuUkKeIRriEgQqGtaipmMQqOtTpPoEVmMXxxXvQNEeLZdDzlJjbBroOsdHhkKDSRVvdxXDSDdSKnfFkWNnwtkCcCQqKkJjJuULlWeEzpPYyaeEeNuUoKkuILliUkkYyOBEGWwLlVYyvgeZRrCmMdogGOxXDvgMmtmMFfjYlVvzZulLbBAaUPpsMbBPIwhHfFoKkrPpRzZaAYDHAhOJjUFfeEuUoOdqVvpPEeyjMmHQnKkMmQqyYmMtTkjWwJEexXVHhvfRTGjcCJksSKgpVDuwWUdlLOXxoBbKkLRZLlzrlfAeWuUxXPsSpqQWzZwpPnNaAZzZzSsFeXxEfwzjCcxXJMTpaftTaAXxGgLgGHDtTvVhHdmMhlLAHrOofQTtNmIlLHGZPiuUcDdGGRrCIicziLatTUuubBbBzZFfjJRGMwfqoOknLlkaOoUBbEakKlLAVabBkKexXOqQqqVhHgGQMmJjkOoCdDaNnAyiPpIHZzhhXxBchHCUpPpIMmkuUXjJxtThyoOYHTRBlLwoJjOtsqQQqOoiISTdDWvXUuGuUgrRxLlVbxrRFfJiCcIqQSsyLldlyoOIifFYaVWDjJgGYyUYfiIgPBUuHNxmJjCccCLlcCMdDmRKbBZzzvujJYiIvGgMmpPZkKzbBAaWwqkbBBmMuUqQbYyKfLmovTtWwtUuThkqMhFeCcEnNfbBHMygjJGYmbBTkiRlLxlZSJjshEzZQqkALlkKIiaoNnCcdDeWwDvVlkKLJdDjdcCcCscMiIoHRrhsEzZeSmMwNnomDdMEeCAWiToAapLrXxqllLBbuUGlJjplvDdobenhKdzZDpyUuYwmDdmqOySsYWwzEIfbBFbAaBpPmZnpPtyYTNzhOoHoLjbBKLqQanNRaArUrgGLlJjRNozWwiZvBbVUusSzHsSBbjJwWsSZfYBpbBSsvWhHbBoMmCcpfFPWwOWsjJnNOoSTtfFwmzTFHVNZznvXxSTtsmMGCOjgpgYyGeEPGuUtiITJTBbFftgSsTtatYjoOipUnmLlGgAqQjyYRrJIFfpTtaAPxXSsiqQjzpIiPsSZTyYtudDdDUmVvLlNnKUTtukXhHsSxGFIiGiIgfeEFnuUlLGxdZzTRldDWwcYSGRtTKkcCjJrBbJQCfWpPpPwZjJyMmdDmgGMReELlHhrZNLldDsCcdDoOJgyZNnVHhBDdbIBnHhZFZzfzeEDxXbBfFdpXZlLktZaZXxzvOkQZzqhHEeEecCKUuaAdKkcCDoVWwGNnKkKkNngpwiIWPjqQRFfryRjJAaHrRegGoxXOxkoOKczZJnNqQbsJjSBjvVXfdDfFJfnNQfFIkKipPOZziIrZeEevVeEPpQyiIYwiIzmpPMMmmiIMqQeTtZzWGgwlxXqIrRiHhVUPpKkEOoEMmewWDdplLPpPnpwWKjJkvVAtTaqQWwpmMOoPDnNGtioIinNPuVNNnoOaiIAyWDDdGgHhRrdZVvxFqQnNPpkWwKSSkNaAdDnKwKfMyYbBmnNUHUaTOoIgNnGyDdYpPitTcZlyQyeiIRrSsZzEeNniwWIgvZiIfxXzGasZzaASTEIipEeERrHbBlLbBhrRePvOWwVvLpVDDMBbmddvPUAGgxpxdJbUuBjSsRLlrqzZwXxsSWoSwBbzZWrRVvYBvFnMFpbBiIPfGgrRNnmMDNXxSsnOonwWZzKkJjDdLGgltcSsfzZvVDGMmgBiWwfLlLmJiCcVvVgpPGvYtOoTyWwXMuUmLliznNZPpgGTsSaAHkVWjJIcCiwrhHRmpKTtkQCVvQoGmMbBIiuUuUdDhHvMmVljDdMkKcCXUsIiSNqBbMoAYyabrRBOIiNuEeULtTlbBNGgnQqStDvFOofWwWiIyiHhiIRYebTzZhVvEHUuheULlOmMmMobBMvVZzEelLmucCVrRhXozaKklLXxtPXxYyvVLlDdbBTnNqQiIXoOxmStqbjQyYYIozGgyYmMCndDeSsENjJEaBYyaAbzZDlLpCcoOQqSsGKCcNnpNvVYblLBygGlLosQqSdDOKFfkOJjYFrtTaAqKVvEeiMZzmsFfFfMgzQNbBRrtfFCcfhHFTtgGetZiqQIkQLJNXCcxKpUuPPTtpkUutTsSXxfFZOodnSsNXIoVvjBbbBBbWjJzZxyYXwFaAkWlVvbBLhHSsiVaxXAQqJjNnXxfFQqrRrDUDAaIKICclYygGjlxXLvjJyYiJxEUuUmMgGnNsrrRkuUKwZqQzheEHyDqQSioOIimMvrRVPpnNFfeAaRtHhLtGgwWMmRrwWfrlLEIieYyIiRfRstUukKHhHZzhoOGWwgDuUrRdjJoLldmMyYDFfOUuiSdDyYIlgyYGQqQXxuPpHPpBbhUfFqvQqnHOohaoCGgKLvHTKEhHekPpZzLGgCcdFhHfDeqnbNRXxrnnNCcJjjJBDduUKkYybpCUmMWwYyddDGqQfFgWXDdxpPTtDWgqLlQGwdwlDrRHhEepPdOXxokZJcHhCjGEegzAJjzZmMSsPkiJsSSoOsSsYypHGuUgRrrPuibcCOoISsiWXxvdDWRINhHnYyuUQqVvnCcNTdDtuSsmLLrRlgjMmJgGGxRdgGQCcRrqlxMmXLNnDWpPwxXJyYBbUkhHCchGgbBHlBbLOowKkMmUgEeCiaAkcCDWwddPpPpFfDxXZzGaAjJQjgXvVXcCxqQGVvnNgqQnlLNjaAPppPkmBxYyzZuHdDhUXbkJjypPYQIiIiddDDBbSwWsegYyJjGYyFmMfBCcbXxNQqLlbbBBODBgGwWFfoOXlLxhPpHMmbyYbnXxNWgGwutTUVkeEKQHYrREukjMSJiJjIBbkiRrWxTtXKsDOlLGTRmMDXxdPqQpzjhWwJWwUutuUXxJjJBbjStTeyYgGQqFGguBbSBbsJjwDDUJMvDbBGjJxXgfGgqQFdzZPjxQqUmMzZQqpPnNOoOoOpPZzOooKkNnCcaARUCcuhHMLOPpollWwcCskKlQqNtTLlIwWEzXxJoOjZloRrxzRdfFUEePGgMmqZRrqeETtTJfFjmMBVvzZcCIiWwZhbBHFfzMPpLlcwWuUCcHKkhVvbgGBCNofVTwvVWtdlgGksSGgKKUuoVNkKtRrWwPmfFCcWwqwWiIzXxZifFKjQqiIfVvFiDdIcufFUiIZzlLEGgbBDbBTteEGFEzZCcboaAqQAajJoKkzZOOrReEBCheErIsSiZzdDSmiIVvVRkKEUuesSGbBgJyAtWwTjDnKkkKWwPpKJjofQqFvVqEwWyYeDvqQVyTZzcftJjqFeEfQbBphXxYfFZDdsStTziIydDHlLXKkxWwXxvVeMoOmEvVyYOzZyYoNnmMflVqQvUuSsywWBbFfbNnhHdDBhlLeEHzZvMmbBVYLKpPATQMscCKDjFfJAJPciIYyKkCcCJjlTGguMaAjoKNnVDkanDdMnNmGgiCcWwmMHyYsSLlnNHLlPSsTdDEMmSCMmcsCceetTEKkOqQAaoDdRoOHaAhrztTaUKYypPkuAvVZgGqQXEFmDyYdHhEeBUeElLSJjsTwPpwWmCOocpvSsVzdDZLlPLteEILlmFwWfHhMiXxTdFfcljpPJZaVvAXxzcCkKIdyYDNLlxXVWwiIzZCckKvdxXKkNQAaNnIFfiAYZYLlSQjJTtfyYFItKkTeEevMLlmkKVESsiMmZzdxXKkqQTMmlLoyNLlnYlQRhHvaAEsxjtnNUZwqdDffkoQqOKCcnNtThHHQYyhHBbeSsEJjuGBbTxzzZwWoOdDPKlLkTtuKlLkrRHhyYLlxaSUusDAadjJaAEHhVvkKYyCsSXrRJFdDfunNqQVxJjzZRXAtROoZzmMrGgCcgGTKhqQrtTSsMTtprOoRjJfNnFPmLkKyaWwAuEPpePSspOoyiWwIJeEfFjmOooOHhMNzZQLVvqTtRCckwWmOWwogGuUHbqaKkAxYaAyiIEWwPKHhWsKkmSeEZwjJkKDFfdKkAaWwYyAgGinNDdIxHWwrrTtRmMRDqQYydeEOoFfuUzVqaAQwWvpEeulLuTwWtUAEeKONnokWwyUuYtjJTauJYyjNnFfmMepPyYIJjUbBEPXxyYVvRkutTUVMmjYzZgGZzFOYyBbofJtTgNnGuUbrRGJWbqGgQBwDdDSsnuUNHhoxXjvVJQBbqOUuvstTShHzZSsvhHVFwWFgGfUljJtTLEVhHvEeGgLNFfexXEGIigTkKQvVIfFHhVvrRFlAaKwWkLvQuEeMGxXtTeEgmQCcaAqXnNxwWcCjJjGggGHjJsSkIisKkLHhowWQqOTgtnNxvVmxXMsSQxXFfMXxzZTtfEKgGMmkjDdJeWslLSlLGMzjrhHRgjJGPpBzZIiRaUoOuAItDJvVjVCcyYjJYyvlLvYyVnGgAakKSsbBAavTtFRzZrDdMIAqQlLWwKkapPimpPnkKRmbFfBiILlaLlDudDrRlLtMQFfVeEvquUulLfVvFPxXppPUUaAzPAabBLEtTewWlpcCcCilhHLPpfFfKkFMtQqEehFfEepPHTtvKkVWLlhNOyTtYahozTtjJZGSsgwyqWwocYDdyCOQYxlLXTsgGdDBbFUuUufUBbtBbTuUuYyDdRrgGZBbzZzJdDfYyJjYqQpOoPviIVhHAaArROoXxsuUSaicCIBxvVzZzOtgJjGBeEUuIyKkYbBixXJjWxXLlsSeEaAsOomMMmLlphHMsSwWUumDdPSrRwqFvVyYqgGQdhUmclLxXCMhHPpuNnaGgAvsShHVHSgGsQHhqegpbBfFPwNHqQhlLxDnNdGxrDdRDdGgowWOUSspPuvVXnNJjaoOYyAtTINXxJvaBbjJxXASJjJFMmfwRKXxQqakKAVvkEExOeEMvSsFfVmoBJSJjmAKIikWOoWIiwwWwKIiULfIiFzxRpPpqQPQUlLIiKjZzJudDyYIiaAiIWEezZLYSAasdDybBcCxYyRrZnNzpPcCgGwLlLlTtWGgvVYyXiIuUkfOoXxCZzcOuoOUoHWwvyRoOEeHhFfNnwWGCcQhHKkquAaVZzZDZzdYyCckKjJCcoOzIiqQSNhHnyaAlnNLYcqQBbMYynNqQkKmsSCnIiiIcCYFfyyYYyQqNPMmLaASsiIlGYoYyOdDnDdhHeENTtWjMmSsFWwMmfFMmfxJjfFFfWsiQqISDXxPpZzdMmFfMmlLvIiCUuceEYaEZPpzdBbgGDPpqzZQGIigGgoODMmMmdmJxXjMBbAayQqIjtTJJjiQqwMmyFfYOyuIhHiUuLgwWWiIwcMmqVvQCNnwWdDcsoOorRbuSsSsySCcsRZkVvwyYBPpHkmMKUuRriPpUuICLNnlcGgAFfaLlpfmMYyFJMfFuUZzEewrOYyoRhHLlYyxXGghHWxNnXnNcCwWRrZpPPpzLlyYbBDdDyeEtTYWhHwXNnxKkVvHhZzlfFFYyyeyYGtAKkaekEoOeKPgtwWTIqIwAaWmMKCckSbBqQSsoOVvsLJjlxuUHhVvhAaHLFmLAUqQuiLlolLOtTveVvdDQUucCpPLDdZzFGgrnNgxXGkKfFUuHhcCwjJWZzRHhKkxIKkulIiKNwuUvVWHhPpEekNhHndoODDdDderREtIiWbAafFniINSQqsBFfGgNPdDBbuWwvVqQUuUlLYJjypKkRrkrRQqLlpPTfFtAaKkrsSEzkKZowWOiIuUGglLQktTKqGgaANhHsSpPaAnenwzZWnNTyYxmnNMXNnBbFepPEFfCdDcdbdDKtTkYyzZrzZRTtGgGgJoMmOBbjXbBmZzMxgEePuZzNxOoXaAsSTXxtiFfOaAotykhHAiIOoPpaWrRmMwDdyYGgnNnRcChHblLxXBSsTthVLIaAilQqOoUuveuGgJjTtwWbBWolLsAaSOOoKPpwWqQkDLfFlzZdKknNfFPpSsPpkSsHhTvVtHhzZKXCcnNMmcCxxXHdDkTtxXiIwFXxqOorRsSzZgCeEcGoOsNnMmmmMXCcyjZMKkmzIiJYlFfhzZAdDwWaZzHJjLfFSsEetTxdXRrxDQqdDsVvCdDcAaYtbBXxyfFBbYfFOoqRrQTUuSsjjJKbBVvBbAaztTnNIxsFfSXpuFfVuujXxRyYulLVvsdDSxABbuRrEeKzZhpvVPAaHydUupPDgGeEJjDdztTHfBbgGVvMCyYvKkuFfUVfFcQQzZeEjiIUWdhDOjMmJzZbaAUuaAEeVSaAsvteEwKkDdKUpPHhaWzZcTDNndtCrCZzmgGMcfSsPpFWwlSsLfjqQQHhoOsSYrRfTteEFyYcCykKsbBgGSLUulqiNnIdDqgyYGHluULYyhIiZXAlXKkLyYkKlJjmMVvXrRxSwWsxTYWciICwytfFLMkKZMmyjfFJhHRrWwYdDfzZFSjnRTXxtnNeOhHoYybBEHhTtnNZzunNRZzVvrFoOfRziIbBYyZrRuevVAZzqQeEBbQNnqawWHoOhFftTaADyYFBbfaAdZxwGMmSsdDZzGCclDdLxXOokuTtuUBqTtHhOoUunYqQlYYVvUuKkyBbQgLhHgGlAWwsSGNngaBFfbtFfkSsKISsiNnTtjQqJaTdwvVWjJCcErREeUucuZvNnEGgeIigGqQsIsqOqQoQoTtbBBbObBuUNwWkKrReEegGEhHuSsyYtUuAjJakKfRrCcFdvVHtThDPpkLMmlKTRcVtTvxxJjoGgQuhHUUuglLGnLlORrcaACaAoNnNbBHhWkKZrRzAawxXsSyYhHqxvtTVPpIcEeCBbBbkTFftashHACcPpKklLuUabmMBhMmBbBcCHcCFeIiLlEVvqfFeEkKeEQRrEeIiUkKOQqoAyYYydDMRUuXOvVoxmNhHniIBDJjPMmppPFWwVmQeEqMqQBboOnEaAoaAOiWWEzZekYhHyoOdbBDqlLbGgXPpxDWwsIiRrEeTtbBiISyYGAXxBbdDacqQFbBfiIGjJdDDdgZzxXUcCaJzZLljAuewAaWwyVvzGNMtDdRcCrfiOoOyIiYoDdyIiYIovyaMmfVfFQAaVSsvpFluULKklLyqQJjuUvVqdDopJjEePOcFfzYyYysSZLlqQfFoHqjJQkYLlyuUWlfFLVMdDmtTLlHVuUAdTtfujJUFcIiCwPpWrRdDvVeYyexXEgGyMmwcsxXTtDdQQqsSqnNzZSsSMIimFfYZiIUuHhHEDYydEaAqQitYyTHhrRLcIiWbBwChHQMmqyXxnqQNEekyYCiIcdDeBbaYyAEcCncCoUuvVOeEoObBxnNsIiPAaplLXEJjiIehHxddcCdaAJjhHgSsFfjJjHWwTvVtAagGJjhiIIiSswHhYyrbBRPOosSvVhHOEeGEeDdvnNfycCYFvAabBqQyMWwPDdtBbgpQLTtvVTwWtlLlLUVOHhoOoOonNSxXGgwWVvEeWwNnGgFfNnCcQqnQqwgyYGWGwWgDduUKkhuUMmNnHNXZzOoRrXxrvVqQaAuUNdVviIDcCIfFiZImMizkKnBbBOobRFfyNbSsaABbAaGgBJkOhAavVFfHoybBcCGiIpoOxXVvXxWuUoOwRjAJwWlRrLsyTtEeYCcBbQpPqjJMmQgbOsLYylSoCcqQBgGUBLlDdiwWfFZWwzfFIqwWQbTHhtBwWlmMFfLgBbGLlDdKkhHBWwWwHhHCcBbFwWPhHMmJOorRTtjpbUBbujJWwBymMSsFfKkjJgGTzZWMmppPLUulGNnhzZYdDEeLlGCOocgnTyWwDdYLlNnFEONxXJgGjnHhRroeyyYPpsSlLBbFyYLlzZfKmMhNPaZzpPARrpRrRyYkKMmUwWurAaaALlyYVvfFOXxoUuDdmMQsSvaAYyFVGgsSvumMrIiRzBbZUfiWoOwIoOpfFCcPTGghHXxotTOtBYybMmfFwWQqdDSLlzZsXAPpqLldgGrRHrosBbSOtTRhwWDkKDnNhgGWjJVvwFfDdFfVPpvTtoOgFQqYQqzZOoCcyJjJxlLXLlqRvDdVRrrtTbBCcfFYyPpXxWwtTxXvVUuAabBNKtTMmkvVxXEHhzZTtRregWwYyGjKXxhHkJjwfFKkQBbsxXryYHhfFRyYSFfmMxvVHhKktTjJCcYyZcpPNKfFUugGMmvpPMmVvEvVewWpxeEBbbhHdDDdDdBXtjJTeEZzPNCctTadDFfAnjAaJUurzZRHhphHtThjtHhhHtTTNvcCVlmMLnNbBSkZaAHhzwlLGgFfnNJYyyYjJjJjgKkGzZPQVvwLlVvXxjJZteETgAaGDdWwzGKUuYyUneEehHMVMmvmQqMOoNmMIiUDCcjJoOdhHunwSFfaLlSsVzZvACcuUMiIPoWEewHhWIiwVvOgGyYYXxOnNoyTtpnNZOaAxKkTtMzZmIvVmMstTSWwPpBbgGiXLoOlBbosSzWbtTBwyncCNJhHcCjjEeSsHfjJbBFhJZzIiTtvgNnGeEVpZzthYyhBbHkKxXHKkrRTmnNxEeOokKbmmMTtMgGBXMTtpPWwKwWkJjLlPBOoiIbYGgXrRxrRmewWEMCcTRrpPPptMPpmXxYFaTtAfQJOsSoZzjqSsmhQqHMSschHeECylLxXYdLAadDvVlqQqQqQDMsSmRrEKkekOomMhHsZzpPUuUuonNXxjJOSAPpasdDSKJtTRrjhHKkCdPpsSPlKkLpDTLMmYyCcIAaicCeplLsSnpPNPEtFfTLlJjYkIiKyjPphPpXxuUyYYNEeMmmWwhHZzMvYydBbDVkKZzAHpPhnNPpXJjHvVHhKqQOcCotTMmhHkhkmMjJCNnczNnpaADdUuPZIiKaAXZBVjJvbpPvVRryYSsNdGrfNnezTtZEFRwjJduuxXUjJUXZLlzWwxKXxWpPbkKsSBwkiIlLDSsgleEWwuULEMEemsmyYMfkTtKFroTtORkKsSSrRfFeGoOxbBXSsYazbBeEZASnNsXotTOYyxnNSsJOBYybZztTNnyYYykXxXVvxNnmMOBbTASyYINnisauHhUtoxpPXNnxTtnNzZcHhCcCLlXIATtabBAaYyYyqQilkKWCcEFfewsXxSdnUlLuRrNZzqQDOpPoMEexXEesScCWwBiiidDIdDIHhpPHhIyqNnsSQFEeHnNhBbfYbmDdnNuUaAvrRsSVvVaDdRsSrcDdIiCAtTdmMOombBLlMwgGWqQTnoOwWsSaAWFSsfwNyYijQqSsJvVrROokKIlajJAyYkjJOoKbFmMfDdqQJRrztTLBblPpqQZTaQqZCczAXxclLOMmoHHXxhjJoOhnNMmLcCcfyYFCgGlNfFnCHsxXczZCShpPVKkvtdXxYySspPYyEEejJSsNzZkMmKwWnVUukiIKvEeVGSsZzdDwGWwgWgpPXSsZzxRPprQlNnLiIMmPqWCcwTtnNQNvRrVGkKgcCQgBbGysSYqCcpvVPDbBWwuUeAgGDdanhHgGRrNEHbEZSAaszeCcBhcCdlOoadDAWSswLZWwzFSsjJcXvVYmQqGgfFsSxiIXJjoOMlSsLwEeRrJjkKrIiuURWWQqPjTtCcBbodDJrRjIQrRqXxtTxcCXcCjRrpgGPJJlLjNiIgGaAuUqgGQfFcumMPhHpUCZzpPlLYyvVaAAarRgGWwukKBbUwWiItcCNnTvVmeEMMmuzDdpPZWwaAsUuSUngKktbXxBKkqQkKXQqGEegAyYAakKwWanVxXvTQqtHhwWRFoOlLLlgGXxoOfZvBbsxXovsSVJoOLljOoOlLRrSJNypYyPHhyzZYYWBbdDoOraAqQRwqKkQVvnjeEOoSPtQqTNnpIisbOoBJjTLlwWJjYSXxsGgyOosRNnNnndDNsSIqQkeEKiHhIiPphPpHrRkQqKTtuUcCVvkGSUupPsSXGgmMZzYyxIGdDgiEesHhgKxXFpPfhaARrPpEKkQqeHQWwqTgGdDtHjvVJKTtsqoJjOnNbBQiIuUSHhzZkDdSGgJjwOoWqQCsScMmVJjrRaASBbZzdDsvrEqQtLlTeGLlQqDiAloOnNLaoiIOfFYyIfFdgUfjWwTzMmZtJMmFJKkHhdDNzZnjJjbwJmMYyjTrRtWlLOoXXxnMmDSeEHhsdNmMVvDdxBvVyYPVUuvBbLleEOofFNnrRgGMmlLgGpgGjNgGvVwWnzZtTeJjXFWJjHhwfgGXxxzZVTtzvVZwWLlWwvVsSvWwgGrRpPtrRoOTEZzpFwWfPvVISwWsiTaAtYGgoDdLlOyQPHhdDCcpBjXxJbPZgGzpZzqtTOokKOoSsJiBbAaIgGssmMmMSSYyaNNnwWnEQVFfeWwEvpPAavVHhmXxbyYiIfrRFYANnGZzKkgLOolsSaVAIiaYysOouUPpxXQQqqwWQqrcCRMmPVvxXpSbWwOoAaBvPpsjJdDSgKkRrSGjpPJgJjSssGgSsUhHwWuMmAazZzZQzZlSsAaNnuFfUaALqbpPmMYyWwMmBvhHzZVXxXqyYQyYdDqQPpdDxZzhHRLxXlxXEemqQMIirRAaHhTGVFfvgvBbAaFflLvVVHhrRHhRQqsSrRrEYyUXxueVNxXnGgKpPkPpvCcttTPpryYoOGNTtUuQqIiTtEVvIieXxYyxXEiIvCcKkTbBtlaALniIzZNVvVeDdWNnziIZgzZGjGgTtJwHpfyYPpFPGghdhHSsJAajPrvVSsRpDKbzZBknwWyYiLlqQwUcCuWWKkwzZiIITtDdApPacAPRruUyqfFVvQYpcCZiUuAaIpPEqQoySsNnmMYfjJwWFZdDNnLlAalLOnNozoIOovVwWiUjhHJuVvXxlLCcJaAjCcOoVvCciGgIpqlbBLZDdzzZQgpPGwqaXxKkAjBbJmMQUukYJjaZznpPlLNrRALHhaAlBbbBPpywWiIQqsSKIioTtoOOzbdDvDdVBiFfSsjeEGUugzZJEeHhuUmMlfFSsBbRrvVyyYoOYdavVCUucWwADvVtTeEuUJjJHlLhjJrRjVEeYyRKkrFfWwDdRriIAQsSqHhaLMgGmYySszZsgcCGKoOkSBbljJFUufbBbBbBJjHhXxyYEeERKkBbIivVoOeErAaUuJjGgQqFfxXtTRwWwWrxXOoLVwHhWvGgYynNvJjSsmMhHjabBAJYyQqdxXpPDmrGgJlLjRMRwWrVxUEeuXDdDdRYyxXcCTthZzHUukoBbOiIVyFfYvgUuHhsSGvVjuUJVFfvzpPqgGQjJUuxEejJJsSFfUtTujqQkSsKhBrRbNyYZznjiIEcRrQnNqZzNnCeBbJHPpaSiIsATtaPZPpgGzyYlLyyrRvgGVLhHXxzZlYKVvhPpHpPIikMfFFLlfJLRrHWwGjJgegGCrRcEPLlNaAnpPpCsSdbBDIvVluUSsLiJuUSDdsjcGgMmuUvasSbBaAAIiUuTfFnNtHnNhNxXnFfRroOVniINhRqQrwWWwvqQvmMDdLlCcuFfUzZVVBboXxRrOlIimdDYyMtTUuJKktNNnnbBsmMEeSTwelLEWjVvWzZLlwobBpPIijJdDYyKkOWUuwJjyYAaxXxXIfFizZnNEVnNpPvQRrqeQnNMmqghHcXxXxCWwlLGTIAaUuTttTitltiIvVWwIiTAarRZzQNnoOqxXlLsSmMiOosSEegGQqdeEjJKkuUKkCaAKkCcbBcHfFeEhSseEPVvKklLYyGgpDdcCtSsglLrTtRGPphHNnuUfFeAaEnNWwNnPPpOokKcCCcmtTsSGPpgMa
diff --git a/2018/inputs/6.txt b/2018/inputs/6.txt
new file mode 100644
index 0000000..e544bbd
--- /dev/null
+++ b/2018/inputs/6.txt
@@ -0,0 +1,50 @@
+195, 221
+132, 132
+333, 192
+75, 354
+162, 227
+150, 108
+46, 40
+209, 92
+153, 341
+83, 128
+256, 295
+311, 114
+310, 237
+99, 240
+180, 337
+332, 176
+212, 183
+84, 61
+275, 341
+155, 89
+169, 208
+105, 78
+151, 318
+92, 74
+146, 303
+184, 224
+285, 348
+138, 163
+216, 61
+277, 270
+130, 155
+297, 102
+197, 217
+72, 276
+299, 89
+357, 234
+136, 342
+346, 221
+110, 188
+82, 183
+271, 210
+46, 198
+240, 286
+128, 95
+111, 309
+108, 54
+258, 305
+241, 157
+117, 162
+96, 301
diff --git a/2018/inputs/7.txt b/2018/inputs/7.txt
new file mode 100644
index 0000000..3fe80cb
--- /dev/null
+++ b/2018/inputs/7.txt
@@ -0,0 +1,101 @@
+Step E must be finished before step Y can begin.
+Step Y must be finished before step T can begin.
+Step I must be finished before step C can begin.
+Step G must be finished before step F can begin.
+Step C must be finished before step P can begin.
+Step B must be finished before step Q can begin.
+Step Z must be finished before step N can begin.
+Step J must be finished before step W can begin.
+Step W must be finished before step P can begin.
+Step K must be finished before step D can begin.
+Step Q must be finished before step L can begin.
+Step V must be finished before step D can begin.
+Step O must be finished before step M can begin.
+Step A must be finished before step P can begin.
+Step M must be finished before step L can begin.
+Step R must be finished before step S can begin.
+Step D must be finished before step X can begin.
+Step X must be finished before step N can begin.
+Step P must be finished before step T can begin.
+Step F must be finished before step N can begin.
+Step S must be finished before step L can begin.
+Step U must be finished before step N can begin.
+Step T must be finished before step L can begin.
+Step N must be finished before step H can begin.
+Step L must be finished before step H can begin.
+Step N must be finished before step L can begin.
+Step X must be finished before step F can begin.
+Step P must be finished before step F can begin.
+Step P must be finished before step H can begin.
+Step B must be finished before step D can begin.
+Step V must be finished before step H can begin.
+Step X must be finished before step S can begin.
+Step Q must be finished before step O can begin.
+Step Z must be finished before step T can begin.
+Step K must be finished before step N can begin.
+Step S must be finished before step H can begin.
+Step M must be finished before step P can begin.
+Step Q must be finished before step D can begin.
+Step R must be finished before step U can begin.
+Step J must be finished before step P can begin.
+Step P must be finished before step S can begin.
+Step V must be finished before step U can begin.
+Step R must be finished before step T can begin.
+Step F must be finished before step S can begin.
+Step D must be finished before step T can begin.
+Step E must be finished before step N can begin.
+Step J must be finished before step N can begin.
+Step J must be finished before step A can begin.
+Step K must be finished before step U can begin.
+Step V must be finished before step N can begin.
+Step V must be finished before step S can begin.
+Step U must be finished before step L can begin.
+Step F must be finished before step U can begin.
+Step I must be finished before step T can begin.
+Step J must be finished before step L can begin.
+Step E must be finished before step T can begin.
+Step T must be finished before step N can begin.
+Step I must be finished before step G can begin.
+Step R must be finished before step D can begin.
+Step E must be finished before step B can begin.
+Step X must be finished before step H can begin.
+Step P must be finished before step L can begin.
+Step Z must be finished before step J can begin.
+Step O must be finished before step L can begin.
+Step E must be finished before step H can begin.
+Step F must be finished before step T can begin.
+Step A must be finished before step F can begin.
+Step U must be finished before step H can begin.
+Step F must be finished before step H can begin.
+Step C must be finished before step W can begin.
+Step A must be finished before step L can begin.
+Step V must be finished before step M can begin.
+Step U must be finished before step T can begin.
+Step E must be finished before step P can begin.
+Step Y must be finished before step U can begin.
+Step W must be finished before step R can begin.
+Step E must be finished before step X can begin.
+Step Q must be finished before step U can begin.
+Step I must be finished before step F can begin.
+Step V must be finished before step F can begin.
+Step V must be finished before step T can begin.
+Step R must be finished before step P can begin.
+Step B must be finished before step A can begin.
+Step S must be finished before step T can begin.
+Step M must be finished before step F can begin.
+Step Y must be finished before step F can begin.
+Step C must be finished before step K can begin.
+Step D must be finished before step S can begin.
+Step O must be finished before step S can begin.
+Step M must be finished before step U can begin.
+Step Z must be finished before step S can begin.
+Step R must be finished before step H can begin.
+Step C must be finished before step O can begin.
+Step G must be finished before step Q can begin.
+Step Z must be finished before step D can begin.
+Step B must be finished before step N can begin.
+Step I must be finished before step H can begin.
+Step I must be finished before step P can begin.
+Step E must be finished before step J can begin.
+Step V must be finished before step L can begin.
+Step B must be finished before step U can begin.
diff --git a/2018/inputs/8.txt b/2018/inputs/8.txt
new file mode 100644
index 0000000..ecb2263
--- /dev/null
+++ b/2018/inputs/8.txt
@@ -0,0 +1 @@
+8 11 7 2 4 4 3 6 1 5 0 8 1 6 1 1 5 4 7 3 1 2 3 1 1 1 5 0 9 9 5 2 8 7 5 7 1 4 2 2 1 1 3 1 6 0 8 6 1 8 1 1 5 4 1 3 3 3 1 3 3 1 4 1 2 2 3 3 4 1 9 0 10 1 9 5 2 6 5 6 5 7 1 2 3 1 3 3 2 3 1 1 1 7 0 11 2 5 1 1 8 4 9 1 5 4 7 3 1 3 3 1 1 3 1 7 0 8 5 2 7 8 5 4 1 1 1 1 3 2 1 3 2 3 3 3 2 3 7 1 8 0 9 2 5 4 6 7 2 9 2 1 3 1 3 3 2 1 2 2 1 5 0 9 1 1 6 1 4 2 9 4 3 1 1 2 1 3 1 6 0 9 7 2 9 4 4 5 1 8 6 1 3 1 3 1 1 5 3 3 4 4 3 4 3 7 1 6 0 11 1 3 1 1 1 7 3 8 2 1 6 1 2 1 3 1 1 1 9 0 7 7 2 1 8 1 9 8 2 1 1 3 1 1 3 1 2 1 7 0 8 5 7 1 9 7 6 5 3 1 1 1 2 2 2 2 2 2 1 2 3 2 4 1 4 1 2 5 5 3 4 1 8 0 9 1 3 7 1 2 1 3 9 8 3 1 1 3 3 2 3 1 1 6 0 7 2 4 2 6 8 1 6 2 1 1 3 3 2 1 5 0 10 1 6 6 9 7 8 4 4 9 7 1 2 1 2 3 1 1 4 4 3 6 1 6 0 10 1 7 2 8 1 6 9 3 6 7 2 2 1 3 1 3 1 8 0 8 1 8 9 7 6 1 3 4 1 1 3 2 2 3 2 2 1 6 0 8 1 8 2 3 9 5 1 6 2 1 2 1 2 1 4 2 3 5 5 5 3 4 1 6 0 10 5 7 6 5 7 1 7 4 1 5 1 1 3 2 2 3 1 8 0 7 7 1 8 1 6 4 3 3 3 2 1 3 2 1 1 1 7 0 10 6 1 1 5 9 3 2 3 3 9 3 3 3 1 1 1 1 1 2 1 1 3 5 1 8 0 11 1 3 1 6 6 6 5 1 5 1 6 2 1 3 1 3 2 1 2 1 8 0 6 1 1 2 1 9 9 1 3 1 2 2 3 1 2 1 6 0 9 8 4 2 8 8 7 1 8 1 1 2 2 1 1 2 5 1 1 4 2 3 6 1 8 0 8 4 1 8 1 3 6 9 8 3 1 2 1 3 2 3 1 1 6 0 7 9 1 6 4 9 4 6 1 3 1 1 1 3 1 8 0 7 5 4 1 5 7 1 8 2 1 1 2 2 2 1 2 1 2 1 1 4 4 2 2 3 3 2 4 4 3 7 1 9 0 8 3 3 7 1 1 5 3 3 2 2 1 1 2 1 2 3 1 1 9 0 8 5 9 8 9 4 4 8 1 1 3 2 3 2 1 1 1 1 1 9 0 8 3 6 5 1 8 4 5 2 1 1 3 2 2 1 1 1 3 1 1 5 5 5 5 1 3 4 1 8 0 8 8 5 8 6 7 1 3 5 1 2 3 1 2 3 2 1 1 8 0 9 4 2 8 6 6 2 2 1 2 3 1 1 1 1 3 1 3 1 6 0 7 5 4 4 2 2 2 1 1 1 2 3 1 1 5 5 2 3 3 6 1 8 0 6 1 5 6 4 3 8 1 3 2 1 2 3 2 1 1 6 0 11 7 1 3 7 3 5 3 9 1 5 6 3 2 1 1 1 1 1 7 0 8 7 6 2 8 5 1 3 4 3 2 1 3 2 2 2 1 4 5 4 2 1 3 4 1 6 0 11 7 4 1 1 8 4 6 3 9 2 8 1 1 3 3 3 1 1 8 0 7 1 4 9 2 1 4 6 1 2 2 3 1 3 3 3 1 6 0 8 7 6 2 1 8 4 8 7 2 1 3 1 3 2 2 1 5 3 4 4 4 4 5 4 3 4 1 7 0 10 1 3 1 7 1 1 7 9 5 7 1 2 1 1 3 3 1 1 6 0 11 4 1 7 7 2 4 6 1 7 8 3 1 1 2 1 3 2 1 9 0 9 6 2 9 1 9 9 5 6 1 2 2 1 2 3 3 3 1 3 2 2 2 1 3 5 1 8 0 11 4 8 7 1 3 2 3 6 1 3 9 2 1 2 3 3 2 1 3 1 8 0 6 4 4 3 6 1 2 1 3 3 1 3 2 2 1 1 9 0 10 7 5 1 7 6 1 3 6 6 6 3 3 2 1 1 2 1 1 2 3 1 2 5 5 3 6 1 9 0 10 9 9 2 1 6 4 4 4 1 2 1 2 1 1 3 3 1 1 1 1 6 0 8 1 4 6 1 4 5 8 6 2 1 2 1 1 1 1 7 0 7 3 9 1 1 1 1 1 1 3 1 3 1 3 3 3 3 5 4 2 2 3 5 1 5 0 8 7 6 5 7 1 9 4 5 1 2 1 2 1 1 8 0 10 5 3 2 8 3 6 1 7 9 1 1 3 1 1 2 1 3 2 1 6 0 10 2 6 1 6 9 9 7 6 1 4 2 1 2 3 2 1 5 4 3 1 2 3 4 1 5 0 10 6 2 1 7 1 1 7 5 1 8 1 1 1 1 1 1 7 0 6 1 3 7 4 7 1 3 2 3 1 1 1 1 1 5 0 8 6 5 1 4 4 1 7 2 2 1 2 3 1 3 4 2 5 2 4 6 5 5 4 3 7 1 9 0 6 4 4 1 8 4 1 1 3 1 2 2 2 1 3 1 1 5 0 8 1 3 2 8 1 5 5 5 3 2 3 3 1 1 6 0 7 2 1 8 7 2 7 8 1 2 2 2 3 3 3 5 4 2 5 5 4 3 7 1 6 0 10 6 7 5 1 7 7 5 1 9 1 2 3 1 3 2 2 1 6 0 7 8 6 4 5 6 5 1 2 3 1 1 3 2 1 7 0 7 9 1 1 1 6 3 9 2 1 3 2 2 1 2 2 5 1 4 3 5 1 3 7 1 6 0 7 4 6 1 5 3 1 3 1 3 2 1 1 1 1 9 0 9 1 3 8 4 5 7 9 2 5 3 3 2 1 3 1 2 3 1 1 9 0 8 2 5 6 1 5 5 1 8 2 3 1 2 1 1 2 3 1 3 4 1 2 4 3 2 3 7 1 5 0 9 4 8 1 8 7 1 1 7 6 1 2 1 3 2 1 8 0 8 8 3 5 4 1 3 3 3 1 1 2 1 2 1 1 2 1 5 0 8 1 5 7 8 5 7 3 5 3 3 1 2 1 2 2 5 4 3 5 1 3 6 1 5 0 10 8 6 1 6 7 3 4 2 1 7 2 2 1 2 3 1 5 0 7 4 2 9 1 3 5 1 3 3 3 1 1 1 5 0 11 7 8 2 5 9 5 2 2 5 1 7 1 3 1 1 1 2 4 1 3 4 2 7 3 5 2 5 3 3 5 1 9 0 11 6 2 2 1 7 8 4 6 8 9 1 2 3 1 1 1 1 3 3 3 1 5 0 11 3 4 8 3 9 1 2 5 4 1 2 2 1 1 3 3 1 8 0 6 2 1 2 8 1 1 3 2 1 2 3 2 1 2 1 3 3 3 4 3 4 1 8 0 9 9 8 4 1 3 6 4 1 3 1 2 2 1 2 2 2 1 1 8 0 8 1 9 1 1 7 2 1 5 1 3 2 1 1 2 1 3 1 7 0 6 1 8 7 8 5 4 1 3 2 2 2 1 2 3 5 1 2 3 4 1 9 0 6 1 1 2 7 2 8 2 3 3 3 2 1 3 1 3 1 6 0 9 9 7 7 3 8 5 2 6 1 1 3 1 1 3 2 1 7 0 8 5 4 5 1 7 3 8 1 2 3 1 3 1 3 3 2 3 3 3 3 6 1 6 0 6 1 1 1 6 6 3 2 3 3 2 3 1 1 9 0 10 6 6 9 5 9 2 9 7 6 1 1 1 2 2 3 1 1 1 2 1 5 0 10 4 1 7 4 2 8 3 3 7 3 3 1 3 1 2 2 3 5 2 3 3 3 4 1 6 0 8 4 3 7 7 5 2 4 1 1 1 3 3 1 1 1 8 0 10 5 9 8 3 9 1 1 8 4 7 1 1 3 3 1 2 3 3 1 8 0 8 4 9 1 1 9 4 6 3 1 1 1 1 1 1 3 1 3 2 2 3 3 7 5 4 5 3 5 1 8 0 7 1 6 1 8 5 9 2 2 1 3 3 3 1 3 1 1 5 0 9 3 6 2 2 4 1 4 1 7 1 2 2 1 2 1 9 0 6 4 7 1 1 1 8 2 1 1 1 2 1 2 2 1 4 3 2 4 5 3 6 1 7 0 10 3 2 6 2 1 5 7 8 9 5 1 2 1 3 2 2 3 1 7 0 6 3 6 6 1 4 6 1 1 1 3 2 1 3 1 7 0 9 6 1 3 1 3 8 5 9 4 1 2 2 2 1 1 3 2 3 2 1 2 3 3 4 1 5 0 11 1 3 8 7 7 7 7 2 2 3 1 3 1 1 1 2 1 9 0 10 4 5 1 3 2 8 8 8 3 9 3 1 1 2 3 1 2 2 3 1 7 0 6 6 3 1 3 2 4 3 1 3 1 3 3 2 2 1 3 4 3 5 1 5 0 10 7 8 5 2 3 3 7 1 6 6 1 1 3 1 1 1 9 0 8 5 1 6 1 2 7 4 3 1 3 2 2 1 3 2 2 3 1 9 0 8 9 8 1 4 4 9 3 8 3 2 3 2 1 1 1 1 1 4 4 4 3 1 4 4 6 5 3 5 5 6 3 5 5 3 5 1 6 0 11 8 3 8 1 1 1 6 6 7 5 6 2 3 1 1 3 2 1 9 0 7 4 1 2 1 8 1 2 1 1 1 2 3 3 3 2 2 1 7 0 7 5 6 4 7 3 1 1 1 2 1 2 1 2 2 4 4 1 3 2 3 5 1 9 0 8 5 8 2 3 6 1 9 9 3 1 3 1 3 1 2 3 2 1 8 0 10 2 7 5 2 2 1 5 1 7 9 1 1 3 2 3 1 2 2 1 8 0 8 8 7 5 9 9 8 1 1 1 1 2 1 1 1 2 2 2 2 2 2 2 3 5 1 7 0 11 7 2 2 5 7 1 4 9 4 6 4 2 3 3 2 3 2 1 1 9 0 7 1 3 3 5 2 1 9 3 1 1 2 3 1 3 3 2 1 7 0 10 1 7 6 1 9 3 6 2 4 4 1 1 1 2 2 3 3 2 2 1 2 1 3 4 1 9 0 7 3 6 9 6 7 1 3 1 2 1 2 1 1 1 2 1 1 8 0 10 1 3 9 1 3 8 7 6 6 4 2 2 1 3 2 1 1 1 1 5 0 6 9 8 1 3 5 4 2 2 3 1 3 5 2 3 5 3 4 1 7 0 9 2 9 6 9 1 2 9 2 2 3 1 1 3 3 2 2 1 6 0 11 9 7 3 4 2 9 5 1 6 5 4 3 1 2 3 1 3 1 6 0 7 5 9 3 9 1 1 6 1 1 3 2 3 3 2 3 3 4 6 5 3 5 4 5 3 3 5 1 7 0 6 9 1 6 2 1 6 1 1 3 2 3 3 1 1 7 0 10 6 1 2 9 7 1 8 5 9 1 1 3 2 3 1 2 2 1 7 0 11 2 6 4 4 1 2 2 5 6 2 8 1 3 3 1 3 2 3 4 1 1 5 4 3 4 1 8 0 7 1 6 5 8 5 8 9 1 2 3 3 3 1 2 1 1 5 0 8 3 5 2 4 1 9 4 5 3 1 2 3 3 1 9 0 9 9 2 1 7 2 9 8 5 1 3 1 3 2 2 1 2 1 2 4 3 4 1 3 5 1 9 0 10 5 5 6 1 5 5 6 1 3 7 2 1 1 1 1 1 2 1 2 1 5 0 6 1 5 7 2 3 9 1 2 3 2 3 1 7 0 10 7 8 4 8 9 8 2 1 2 5 1 2 2 1 2 3 3 3 4 4 1 3 3 4 1 8 0 6 3 4 7 1 3 1 3 3 1 3 2 3 3 3 1 5 0 7 6 2 7 4 3 1 1 1 2 3 2 1 1 5 0 8 1 1 4 5 6 3 5 7 3 1 1 3 2 3 1 5 2 3 6 1 6 0 10 1 8 1 1 2 2 5 5 1 3 2 1 1 1 3 1 1 6 0 8 4 2 1 7 7 8 8 5 1 3 1 2 1 1 1 9 0 7 5 8 3 6 1 7 5 3 3 1 2 1 2 3 3 2 5 5 5 2 1 1 2 4 5 4 4 3 5 1 9 0 8 2 1 8 2 4 1 3 4 1 3 2 1 2 1 1 2 2 1 9 0 6 8 8 1 8 8 6 1 1 1 2 1 3 2 2 1 1 7 0 7 7 8 1 8 7 7 8 1 1 1 1 1 3 3 3 5 2 5 2 3 6 1 9 0 8 9 2 8 3 4 7 1 1 1 3 3 3 2 1 2 3 1 1 6 0 7 2 1 9 4 1 3 1 1 2 3 1 2 2 1 5 0 9 8 2 2 7 3 4 1 6 3 1 2 2 1 2 4 3 1 2 1 5 3 7 1 8 0 7 1 6 2 5 3 8 3 2 1 1 1 1 2 3 1 1 8 0 10 5 2 1 1 1 5 7 1 4 9 2 1 1 2 2 2 1 3 1 6 0 10 5 4 8 1 6 2 7 1 6 1 1 3 3 1 3 3 5 3 5 1 5 1 5 3 7 1 8 0 9 6 5 9 1 1 8 5 5 7 2 1 2 1 2 1 3 3 1 6 0 7 9 8 1 2 1 2 5 1 2 1 2 3 1 1 8 0 6 5 3 1 5 3 7 1 3 3 1 1 1 1 1 4 1 1 2 1 3 1 1 2 2 6 5 4 3 6 1 6 0 6 9 5 7 8 1 4 3 1 2 1 2 1 1 8 0 8 4 6 3 1 9 7 1 6 1 1 3 1 3 3 2 3 1 7 0 6 1 1 8 2 3 3 3 1 1 2 2 1 1 4 1 1 2 2 2 3 4 1 6 0 8 8 5 1 1 5 1 7 9 3 1 3 1 1 3 1 5 0 10 6 9 5 9 3 5 2 8 1 1 1 1 2 1 1 1 5 0 10 3 6 7 9 9 1 6 4 2 8 2 1 3 1 1 2 1 2 4 3 7 1 8 0 8 1 3 7 9 5 8 8 3 1 1 1 1 3 1 3 2 1 5 0 10 8 1 9 9 1 5 9 8 4 3 1 2 3 2 3 1 6 0 6 9 9 5 1 7 9 1 2 1 1 3 3 2 3 2 4 1 3 1 3 4 1 7 0 10 3 5 8 9 6 4 1 8 9 1 3 3 1 1 2 3 1 1 6 0 6 3 8 2 1 2 5 3 2 2 1 1 1 1 6 0 10 3 2 6 6 1 2 1 6 4 4 1 1 3 1 3 1 1 5 2 2 3 6 1 5 0 6 2 6 6 1 1 9 1 2 3 2 1 1 8 0 6 6 3 3 6 1 1 3 2 3 2 1 3 2 1 1 8 0 9 1 1 6 8 4 6 2 9 9 3 3 2 2 1 1 3 1 2 1 5 1 3 3 1 5 6 6 5 4 3 4 1 7 0 7 3 5 1 9 7 3 3 1 1 1 2 1 1 3 1 6 0 9 8 7 7 2 1 1 4 5 7 1 1 1 1 2 1 1 8 0 11 8 7 9 1 1 2 9 7 1 8 1 1 2 2 2 3 2 2 2 5 4 2 2 3 6 1 9 0 10 5 4 3 9 1 1 6 9 4 5 1 1 1 3 1 1 3 1 1 1 5 0 6 1 2 1 6 4 8 2 2 3 2 1 1 7 0 6 5 4 5 5 1 1 3 1 2 3 1 3 3 1 1 3 2 1 1 3 4 1 7 0 10 4 4 9 1 5 8 1 2 7 8 2 3 1 1 3 3 2 1 7 0 7 4 9 4 4 1 4 4 3 3 1 2 1 1 1 1 5 0 11 5 3 6 6 4 8 6 5 6 1 3 1 1 1 1 1 4 1 3 3 3 4 1 8 0 8 9 8 1 6 9 8 5 6 1 2 1 1 1 1 1 2 1 8 0 9 1 3 3 5 9 1 1 3 6 1 1 3 2 2 1 1 3 1 8 0 10 8 3 5 6 2 5 7 4 1 4 1 2 1 3 3 1 2 1 2 3 5 3 3 5 1 8 0 11 5 4 9 9 7 9 4 2 7 5 1 3 1 2 1 1 1 2 1 1 5 0 6 1 1 9 9 1 8 2 2 3 2 1 1 7 0 7 3 1 4 2 2 5 5 1 2 3 3 1 3 1 3 1 3 5 1 2 2 7 6 5 3 3 5 1 9 0 10 1 2 7 9 6 4 5 6 9 1 2 2 2 1 2 1 3 2 3 1 5 0 6 8 7 5 1 2 5 3 2 1 2 3 1 6 0 7 9 4 2 9 2 3 1 1 1 3 3 1 1 4 5 3 2 3 3 5 1 8 0 9 3 4 3 1 9 9 3 1 4 1 3 1 2 3 2 2 3 1 9 0 9 7 7 3 8 9 9 1 5 8 2 1 2 2 1 3 2 3 3 1 7 0 9 4 1 6 4 5 4 3 9 1 3 3 1 2 2 2 3 5 5 2 2 2 3 5 1 7 0 7 1 5 7 1 5 1 4 3 1 1 1 2 1 3 1 6 0 6 1 3 2 1 4 5 1 1 3 3 2 1 1 9 0 10 9 4 5 3 8 5 1 3 3 5 2 3 3 1 2 1 1 3 1 1 1 3 5 1 3 7 1 8 0 7 7 3 4 5 1 1 1 1 2 2 1 1 2 1 3 1 9 0 10 9 1 5 3 7 2 2 1 1 7 3 3 1 2 3 3 1 2 1 1 5 0 11 1 1 3 3 3 4 5 2 6 5 1 1 2 2 2 3 1 4 1 2 5 2 4 3 4 1 7 0 8 7 1 8 1 4 2 5 8 1 2 2 2 1 3 2 1 6 0 7 3 5 9 4 1 6 1 1 3 2 3 2 2 1 5 0 6 5 8 6 3 9 1 3 3 1 2 1 3 4 4 2 5 3 2 6 4 2 7 3 5 4 3 5 1 6 0 10 3 5 9 1 1 3 7 1 1 2 1 1 2 3 3 2 1 9 0 7 8 2 9 2 4 1 1 1 1 2 3 2 2 2 1 2 1 7 0 7 6 1 1 8 6 8 6 1 3 1 3 2 2 3 5 3 1 2 3 3 7 1 6 0 11 4 2 7 6 1 2 8 8 1 7 1 2 3 2 1 2 1 1 5 0 9 1 9 1 3 6 7 6 4 4 2 1 3 2 2 1 9 0 8 2 9 1 5 7 2 4 6 2 2 3 2 1 3 1 3 1 5 3 1 4 3 3 4 3 4 1 9 0 8 3 5 3 2 1 2 3 7 1 1 3 1 2 1 3 1 2 1 6 0 8 1 5 7 9 3 7 4 7 1 3 3 2 3 3 1 9 0 8 8 2 9 7 1 6 7 2 1 2 1 2 3 3 3 1 3 5 2 3 2 3 6 1 5 0 6 5 3 2 1 5 7 1 1 3 3 1 1 8 0 10 7 1 7 1 4 5 9 7 9 8 3 3 1 2 1 1 3 1 1 6 0 7 7 1 3 8 1 7 4 1 1 3 3 2 2 2 3 2 2 3 2 3 4 1 8 0 6 2 4 4 6 9 1 3 3 1 3 1 3 3 1 1 8 0 6 9 1 2 9 8 3 1 2 2 1 2 1 1 2 1 7 0 6 1 5 1 9 1 2 3 1 1 3 3 2 1 1 3 2 5 1 3 4 3 5 3 3 4 1 6 0 11 9 5 9 6 3 9 9 4 4 1 2 1 3 1 1 3 3 1 9 0 7 8 8 1 3 5 4 7 2 3 3 2 1 3 2 2 1 1 7 0 10 9 9 1 7 7 4 7 8 1 7 3 1 3 3 1 3 3 3 1 4 2 3 5 1 7 0 11 2 9 9 1 5 7 1 1 5 6 8 3 3 3 1 3 2 2 1 6 0 7 5 7 1 2 6 9 5 1 1 3 1 3 1 1 7 0 8 1 3 2 2 2 5 4 8 3 1 3 3 3 1 2 2 5 5 1 2 3 4 1 7 0 10 4 3 3 5 1 4 9 9 3 1 1 2 2 1 1 2 3 1 8 0 7 8 5 8 7 2 2 1 1 2 1 1 3 3 2 1 1 9 0 7 3 7 5 1 1 5 3 3 1 1 2 2 1 1 1 1 4 2 1 2 3 4 1 5 0 7 4 4 1 6 8 6 1 2 2 1 3 1 1 8 0 6 1 5 9 9 1 2 2 3 2 2 1 3 3 1 1 6 0 9 6 5 4 2 3 1 5 2 1 3 3 1 1 1 2 2 4 5 2 3 5 1 7 0 10 1 7 1 4 1 1 1 1 1 2 2 2 3 3 2 2 1 1 5 0 8 7 6 3 1 1 9 4 1 1 1 2 1 1 1 8 0 9 1 9 1 8 3 1 2 9 5 3 1 2 2 2 1 1 2 3 2 3 5 2 4 5 5 4 3 3 6 1 5 0 6 3 1 5 1 1 9 1 2 1 1 1 1 8 0 9 6 1 3 9 4 4 4 8 6 1 2 2 2 1 3 1 1 1 8 0 7 2 8 1 7 3 3 1 2 1 1 3 3 2 1 3 5 3 3 1 4 5 3 7 1 5 0 6 4 2 5 5 1 1 1 1 2 1 2 1 6 0 6 8 9 9 3 1 7 1 3 3 2 1 1 1 7 0 6 9 3 6 9 1 3 1 1 1 2 1 1 2 1 4 2 2 1 5 5 3 4 1 6 0 6 2 3 9 1 5 3 3 3 1 3 1 1 1 5 0 9 1 1 7 2 8 1 6 2 7 1 3 1 3 2 1 8 0 7 1 9 1 5 2 5 9 2 1 1 1 3 2 2 3 2 1 3 4 3 7 1 8 0 8 8 1 2 7 6 1 9 2 1 3 2 3 2 3 3 2 1 5 0 6 9 8 9 8 6 1 1 3 2 3 1 1 6 0 6 5 1 3 7 1 1 1 2 2 1 1 1 3 1 3 2 2 3 1 2 4 4 5 3 3 7 1 8 0 8 8 2 1 2 3 4 5 2 2 2 1 1 2 3 2 3 1 9 0 11 2 8 2 9 6 1 5 9 9 7 5 3 2 2 3 2 2 1 3 1 1 9 0 9 5 1 1 9 2 1 6 5 4 2 1 3 3 2 2 1 3 1 3 3 3 5 2 2 2 3 5 1 8 0 6 7 7 1 5 9 1 3 1 2 2 3 2 1 3 1 9 0 7 2 9 1 2 4 5 3 2 2 1 3 2 1 2 2 2 1 9 0 7 9 1 1 3 1 4 9 1 3 3 2 1 2 1 3 2 4 2 2 1 4 3 7 1 5 0 11 9 9 5 6 3 1 9 5 7 5 3 1 2 3 1 2 1 7 0 7 5 9 1 3 7 2 1 1 3 3 1 1 1 3 1 5 0 9 3 3 1 5 4 4 2 8 1 1 1 1 2 1 4 4 2 2 5 2 2 3 5 1 9 0 10 2 4 2 1 5 6 2 3 9 6 1 1 1 3 2 1 2 3 3 1 8 0 8 1 7 7 5 7 5 5 9 2 2 1 1 2 1 1 3 1 7 0 9 9 4 4 6 1 5 1 4 1 3 2 1 3 1 2 2 5 2 2 3 3 3 7 1 9 0 10 3 1 9 6 4 7 1 8 8 2 1 2 3 2 2 3 1 2 3 1 6 0 11 9 6 5 3 8 1 8 1 7 5 7 1 2 3 2 1 1 1 8 0 9 3 5 2 1 6 8 9 5 3 3 3 1 2 1 1 3 3 3 3 5 4 3 2 3 2 5 5 5 3 3 6 1 7 0 6 1 8 1 1 8 1 1 2 3 1 1 2 2 1 9 0 10 2 3 6 9 9 7 3 5 1 3 2 2 3 2 2 3 1 2 1 1 8 0 6 9 1 7 1 4 8 1 3 3 2 2 2 1 2 2 2 5 4 1 1 3 4 1 9 0 9 2 2 2 4 9 1 2 8 7 2 3 1 1 3 1 2 1 1 1 8 0 7 4 7 5 4 1 1 7 2 2 1 2 1 1 3 3 1 9 0 10 8 5 1 9 4 5 8 7 2 1 2 2 3 2 2 1 1 3 2 5 3 1 1 3 7 1 6 0 10 8 1 6 8 3 4 6 6 3 7 1 1 3 3 3 1 1 8 0 8 3 1 7 5 1 4 2 2 1 3 1 3 3 3 1 3 1 7 0 9 1 9 8 7 3 3 6 3 6 1 1 1 3 2 3 1 1 3 5 3 2 4 4 3 4 1 8 0 6 8 7 8 4 9 1 1 3 2 1 1 3 3 1 1 8 0 9 8 4 1 9 2 2 7 4 1 3 1 2 3 2 1 2 3 1 8 0 11 2 7 8 5 1 3 1 8 3 7 5 2 3 3 2 3 1 1 3 4 5 5 1 3 7 1 5 0 10 7 8 9 5 9 6 4 3 2 1 3 1 1 3 1 1 7 0 8 4 4 3 5 3 7 9 1 3 1 1 1 1 1 2 1 5 0 8 2 3 5 8 4 8 1 2 2 3 1 3 3 3 3 5 3 2 4 4 6 5 1 5 3 3 5 1 8 0 8 6 1 6 6 6 1 9 7 3 1 3 3 2 2 1 3 1 9 0 9 3 6 3 1 1 1 2 9 2 1 3 2 3 3 1 3 3 3 1 7 0 9 1 2 5 2 1 7 9 9 6 2 3 1 2 2 3 2 4 1 1 1 1 3 4 1 6 0 6 1 6 9 9 2 4 1 2 3 1 1 2 1 5 0 7 1 1 5 2 9 8 9 1 1 1 3 2 1 8 0 9 9 5 1 1 6 9 6 6 9 1 1 2 1 1 3 3 1 2 3 2 2 3 6 1 8 0 6 1 8 4 4 6 9 3 1 3 2 2 1 2 1 1 7 0 7 1 3 5 3 1 7 1 2 3 3 2 2 2 1 1 7 0 8 2 6 8 6 1 1 5 6 2 1 2 1 3 1 2 4 4 3 2 2 3 3 6 1 8 0 10 5 8 3 9 1 9 8 3 5 6 1 1 2 1 1 2 2 2 1 8 0 8 4 1 2 7 1 7 5 9 2 1 1 2 3 2 2 3 1 7 0 8 4 1 8 2 5 6 4 8 3 1 1 1 2 1 3 3 2 3 3 4 5 3 6 1 9 0 6 2 4 1 9 1 2 3 2 2 1 1 3 2 1 1 1 8 0 10 4 2 8 8 5 5 9 5 1 5 2 3 2 3 1 3 2 1 1 6 0 10 7 6 1 2 1 6 1 2 5 3 3 3 3 1 3 1 4 2 1 1 3 3 7 4 1 5 4 3 4 1 5 0 9 8 8 7 5 3 3 4 1 5 2 3 1 3 2 1 8 0 7 8 9 6 6 1 1 1 3 2 3 1 1 1 2 3 1 8 0 8 8 4 1 2 7 1 5 8 3 3 3 1 2 2 2 2 1 5 2 4 3 7 1 6 0 11 3 6 9 1 6 9 5 1 6 4 2 1 2 1 3 3 1 1 8 0 7 1 1 6 4 7 9 7 3 2 1 1 3 1 1 2 1 8 0 6 1 1 3 9 1 9 3 1 3 1 3 2 2 2 3 3 3 1 3 5 1 3 5 1 8 0 8 7 2 6 8 1 1 2 9 1 3 3 3 1 2 3 1 1 7 0 11 9 5 3 3 4 9 8 7 9 4 1 1 1 3 3 2 3 2 1 9 0 9 9 3 1 6 1 6 8 4 1 3 3 3 3 1 2 1 1 2 4 5 1 5 4 3 4 1 7 0 8 1 2 2 4 9 6 1 1 3 1 3 1 2 1 3 1 6 0 7 3 4 5 9 7 1 5 3 2 2 1 1 2 1 9 0 6 5 3 1 4 5 1 1 1 3 1 3 1 1 3 1 1 4 1 2 3 6 1 5 0 6 7 1 6 8 3 1 1 1 3 1 3 1 7 0 9 1 2 2 9 8 7 7 1 9 1 2 3 1 2 3 1 1 8 0 11 7 5 6 5 1 4 4 4 7 1 4 2 3 3 3 1 1 3 2 5 5 3 5 2 3 5 1 7 5 8 8 1 6 2 4 5 3 4 1 9 0 8 3 8 1 3 6 9 4 1 1 2 3 3 1 3 2 3 1 1 7 0 10 8 5 2 1 3 4 7 2 3 5 3 1 3 1 3 1 3 1 8 0 7 2 1 4 3 9 1 6 1 1 3 2 3 2 3 2 3 4 5 4 3 7 1 6 0 6 1 1 7 9 9 5 1 1 1 2 3 3 1 7 0 10 8 7 4 5 6 4 1 1 3 7 1 2 2 3 3 3 3 1 6 0 7 4 3 7 1 3 8 2 3 2 1 1 1 1 2 3 1 4 4 2 1 3 7 1 7 0 6 7 3 6 3 7 1 3 1 1 3 2 2 1 1 8 0 6 4 5 6 9 1 5 3 1 1 1 3 2 1 2 1 6 0 10 7 6 5 6 4 2 3 3 1 6 3 1 2 3 1 3 3 3 4 5 2 2 4 3 5 1 9 0 9 8 1 3 7 4 9 9 1 1 2 1 1 1 1 2 2 1 3 1 6 0 9 3 7 4 2 1 6 8 4 9 1 3 3 3 1 1 1 7 0 6 4 6 8 7 3 1 2 2 3 2 2 1 2 1 4 2 5 4 6 6 2 5 1 5 4 3 4 1 6 0 9 1 2 7 3 3 9 1 6 9 1 2 3 2 1 3 1 5 0 8 3 8 8 9 9 2 5 1 3 1 1 3 1 1 9 0 6 7 4 1 4 1 9 1 3 1 2 1 1 2 1 1 3 1 3 1 3 4 1 9 0 9 4 1 1 4 3 7 6 4 6 3 1 2 1 3 2 1 1 1 1 6 0 7 8 1 6 5 8 3 1 3 2 3 3 2 1 1 6 0 11 2 3 3 6 1 3 7 1 7 7 1 2 3 2 1 1 3 4 3 4 1 3 4 1 5 0 9 1 5 4 7 6 1 1 5 3 3 2 1 1 2 1 6 0 10 6 9 1 5 5 5 9 8 6 3 1 1 3 3 1 1 1 6 0 11 1 9 3 2 3 1 4 9 2 4 4 2 2 1 1 3 3 2 3 3 4 3 6 1 9 0 6 1 9 9 6 6 2 1 3 3 1 3 2 3 3 1 1 6 0 9 7 5 1 1 4 4 9 4 1 3 3 2 1 1 1 1 6 0 7 5 7 1 8 7 3 9 3 1 2 2 2 1 3 1 4 3 3 2 3 5 1 7 0 10 6 1 1 6 1 9 4 9 2 3 1 2 3 3 2 3 3 1 7 0 8 1 6 1 2 4 1 2 8 1 1 1 2 3 1 2 1 7 0 6 2 3 1 4 2 6 3 1 1 1 1 3 1 3 2 3 3 1 7 3 4 3 5 3 3 4 1 9 0 8 1 4 6 6 4 9 1 2 2 2 2 2 2 1 3 3 2 1 6 0 7 6 1 1 5 9 5 7 1 3 3 3 1 1 1 8 0 10 6 1 3 3 1 7 2 8 9 9 1 1 2 3 2 2 3 1 1 3 3 2 3 6 1 7 0 6 8 2 2 7 1 6 2 1 3 2 1 2 3 1 6 0 8 2 5 1 8 1 7 6 6 2 3 1 2 1 2 1 7 0 9 6 3 9 1 7 3 5 2 8 1 3 1 1 1 1 2 4 1 5 3 5 3 3 4 1 6 0 8 3 1 1 9 2 8 2 1 2 3 3 1 2 1 1 7 0 6 1 9 4 4 8 1 3 1 2 1 3 1 1 1 9 0 10 5 2 5 9 4 2 1 8 1 5 3 3 1 3 1 1 3 3 2 2 3 4 5 3 7 1 8 0 11 7 6 3 6 2 1 6 3 5 3 1 3 1 3 3 1 3 3 2 1 9 0 8 5 4 3 4 7 1 4 2 3 3 2 1 3 1 3 1 3 1 8 0 6 1 9 1 5 2 4 1 1 3 1 3 2 2 2 5 5 4 4 4 3 1 3 4 1 8 0 9 3 2 1 6 5 9 6 5 7 2 3 1 2 3 2 3 2 1 5 0 11 7 6 8 6 4 3 1 8 2 1 6 1 1 3 1 1 1 5 0 9 3 1 8 3 9 4 8 8 9 2 3 2 2 1 5 1 4 1 3 5 2 5 3 3 5 1 5 0 9 7 8 2 2 2 2 5 1 5 1 3 1 2 1 1 5 0 7 1 4 2 8 1 6 1 1 3 1 3 2 1 5 0 8 2 7 2 9 1 6 1 8 3 3 1 2 2 3 5 1 3 4 3 5 1 6 0 6 9 7 1 2 3 8 2 2 2 3 1 1 1 6 0 8 1 4 8 8 9 8 6 2 1 3 1 1 2 1 1 9 0 11 7 2 1 1 7 6 3 2 6 7 2 1 1 1 1 3 2 3 3 2 1 4 3 4 4 3 6 1 5 0 10 2 9 1 1 7 1 3 9 2 6 1 3 1 3 2 1 7 0 6 1 7 8 2 8 2 2 1 1 3 3 2 1 1 9 0 10 8 5 7 3 1 2 7 1 6 1 1 2 2 3 1 2 1 1 3 4 2 5 3 4 4 3 7 1 5 0 11 1 8 2 3 7 8 2 1 3 7 4 1 2 2 1 1 1 9 0 9 6 2 7 6 9 3 6 2 1 2 1 2 2 2 1 1 1 1 1 7 0 7 3 9 8 1 4 1 6 3 1 2 2 2 1 3 2 1 2 5 4 1 3 3 6 1 8 0 11 4 6 2 5 2 5 5 5 1 3 1 3 1 1 3 1 1 2 1 1 9 0 8 2 5 7 9 1 3 5 1 1 2 1 2 1 1 1 2 3 1 6 0 11 7 1 3 2 8 9 7 8 5 1 1 2 3 3 1 2 2 3 5 3 1 3 2 1 4 4 5 4 3 4 1 9 0 7 4 9 7 2 7 1 8 3 3 3 1 2 1 1 1 3 1 5 0 7 8 1 2 8 5 3 7 1 2 3 1 2 1 5 0 6 1 5 7 6 1 8 2 3 3 2 1 3 2 4 2 3 4 1 9 0 7 1 5 4 7 8 1 3 3 1 1 3 1 3 2 1 1 1 7 0 11 6 6 3 2 2 3 1 3 9 6 3 1 1 1 2 3 2 2 1 9 0 6 1 1 3 3 4 3 2 3 1 1 1 1 1 1 3 3 3 3 3 3 7 1 5 0 9 9 1 5 5 4 8 2 5 4 1 1 2 2 2 1 7 0 9 5 1 6 8 5 3 7 4 1 1 2 1 3 2 1 2 1 9 0 8 7 8 3 7 5 4 1 5 2 3 2 1 1 1 1 1 3 5 3 1 2 1 3 1 3 4 1 9 0 6 1 6 5 6 8 4 3 3 1 1 3 2 2 1 1 1 9 0 7 9 5 3 1 5 2 1 3 2 3 2 1 1 3 1 3 1 5 0 9 3 1 8 1 4 4 5 9 6 1 2 1 1 2 1 2 1 1 3 7 1 5 0 11 7 4 4 6 1 7 6 1 1 6 2 2 1 1 3 2 1 9 0 6 1 9 9 1 3 6 3 1 1 2 1 1 1 2 1 1 8 0 7 8 7 2 2 1 6 3 2 3 1 1 2 2 3 1 4 5 5 1 4 5 2 3 4 1 5 4 5 3 4 1 6 0 10 6 9 8 8 5 5 8 1 4 7 2 1 1 1 2 3 1 8 0 7 6 3 2 4 7 4 1 1 3 2 1 3 3 2 3 1 9 0 11 6 9 3 7 8 6 5 6 4 1 7 2 2 2 1 1 1 2 1 3 3 3 3 3 3 6 1 5 0 7 3 8 6 2 7 1 9 1 1 1 2 1 1 6 0 8 8 9 7 1 1 7 2 6 1 1 2 3 1 3 1 8 0 8 1 6 9 2 6 6 3 6 3 1 3 2 1 3 2 1 3 4 1 4 2 1 3 5 1 9 0 6 2 6 7 3 1 2 2 2 1 2 3 2 1 2 3 1 9 0 7 7 5 7 6 1 8 1 1 1 2 1 1 3 3 3 2 1 9 0 7 6 8 4 1 2 1 3 3 3 3 3 1 2 3 1 2 2 1 5 2 3 3 6 1 8 0 7 1 1 5 7 9 1 3 3 1 3 3 1 1 2 1 1 7 0 11 5 9 1 3 5 8 5 8 2 2 8 3 2 3 1 2 1 3 1 5 0 9 6 9 4 2 1 1 3 6 2 1 3 3 1 1 3 3 4 3 5 5 2 3 6 1 1 2 8 7 3 5 3 3 6 1 6 0 6 1 1 1 8 7 6 1 2 3 3 1 3 1 8 0 9 1 3 7 5 6 7 5 1 6 3 3 1 1 1 1 3 2 1 7 0 7 2 1 8 9 3 8 1 3 2 1 3 2 2 1 2 2 2 1 3 4 3 7 1 5 0 9 2 2 9 6 7 9 7 1 7 3 2 1 1 1 1 8 0 7 7 6 8 1 2 6 8 3 3 1 1 3 2 2 1 1 9 0 9 1 1 7 1 3 2 5 5 5 3 1 1 2 1 3 2 1 3 5 4 1 5 3 1 1 3 7 1 9 0 7 2 1 1 7 5 5 3 1 3 1 3 1 2 1 3 3 1 7 0 10 2 3 7 7 3 6 2 3 1 7 3 2 3 1 2 2 3 1 9 0 8 9 7 7 3 9 3 1 4 3 1 1 1 1 3 3 1 1 3 4 1 1 3 4 3 3 5 1 9 0 9 1 2 3 9 6 3 7 6 1 1 1 2 1 1 3 2 3 1 1 9 0 6 1 9 1 4 3 3 2 1 1 3 3 1 3 1 3 1 8 0 11 3 3 1 3 6 7 1 8 6 4 3 3 3 1 2 1 1 1 1 1 5 4 1 1 3 5 1 8 0 8 4 8 1 6 3 1 6 3 3 2 2 3 1 3 3 3 1 5 0 10 1 1 8 1 1 7 1 5 4 6 3 3 1 1 3 1 6 0 7 1 9 5 1 3 2 6 1 3 3 2 2 1 3 4 1 2 4 2 3 2 5 3 3 6 1 6 0 10 3 7 9 5 6 1 7 2 3 1 2 2 3 1 1 2 1 7 0 7 1 7 5 6 2 6 7 1 1 1 2 1 1 2 1 9 0 11 3 6 7 9 8 8 8 7 3 1 3 3 1 2 1 1 1 3 2 3 3 3 3 1 4 3 3 7 1 5 0 7 8 3 6 1 3 6 4 2 1 2 1 3 1 6 0 10 7 4 6 9 1 6 5 5 2 8 1 1 1 1 2 2 1 8 0 6 2 6 8 7 1 2 3 2 2 1 3 1 1 2 2 2 2 5 3 1 4 3 4 1 5 0 6 2 1 7 4 4 5 3 2 1 3 1 1 8 0 10 4 4 5 1 1 7 2 2 8 6 2 1 3 3 1 2 1 1 1 6 0 6 6 6 1 3 6 3 2 1 2 1 1 1 1 4 1 2 3 6 1 5 0 7 1 8 5 2 7 3 4 1 1 2 2 2 1 6 0 8 7 8 1 7 7 4 1 1 2 3 3 2 3 1 1 6 0 8 8 1 1 4 8 4 4 4 1 3 2 3 1 1 4 3 5 2 1 2 3 5 1 8 0 6 1 3 8 5 2 1 2 1 1 2 2 1 2 1 1 7 0 10 9 6 9 8 4 8 1 2 2 4 1 1 1 1 2 2 1 1 5 0 7 1 7 3 9 6 1 3 2 1 2 2 2 5 3 5 1 1 3 7 4 5 4 3 5 1 5 0 6 5 1 5 2 4 6 1 3 1 2 3 1 7 0 7 1 8 4 1 5 1 3 3 1 2 1 1 1 1 1 5 0 9 5 1 1 4 8 1 4 6 8 2 2 2 3 1 4 2 2 2 4 3 4 1 6 0 10 8 2 9 4 6 2 1 7 9 3 2 2 1 2 2 2 1 5 0 7 1 4 9 4 7 9 6 1 1 2 2 3 1 6 0 10 1 1 3 5 6 2 4 5 4 3 3 1 3 1 1 1 5 3 5 3 3 4 1 5 0 7 1 1 5 3 4 7 9 1 2 1 3 1 1 6 0 10 7 6 7 8 2 2 5 8 3 1 2 2 1 1 3 3 1 8 0 11 2 1 3 8 9 1 5 4 7 3 4 1 1 3 1 2 2 3 2 1 1 4 2 3 6 1 9 0 8 2 9 1 1 7 4 8 7 1 3 2 1 2 3 2 1 2 1 8 0 10 1 7 3 6 1 6 1 9 3 3 2 3 1 1 2 2 1 2 1 6 0 9 2 4 2 1 6 6 8 4 1 2 1 3 1 1 1 2 1 3 2 4 2 3 7 1 7 0 11 7 7 9 6 3 3 4 5 5 1 5 1 2 1 3 3 1 1 1 6 0 8 6 6 7 2 9 1 6 5 2 3 2 2 2 1 1 5 0 6 3 1 1 2 4 2 1 2 2 1 2 3 3 4 2 5 5 2 4 2 4 3 5 5 3 7 1 7 0 6 1 9 3 8 7 1 3 3 3 2 3 1 2 1 5 0 9 3 7 1 6 1 2 7 4 3 3 1 1 1 3 1 5 0 11 1 8 9 9 9 6 1 8 6 8 3 3 1 1 1 1 2 3 5 2 2 1 4 3 5 1 5 0 8 8 3 5 4 1 1 9 5 1 3 1 3 1 1 8 0 7 1 7 5 1 6 4 8 2 1 3 2 1 1 3 2 1 9 0 11 9 3 1 4 9 8 6 9 3 8 8 3 3 3 3 2 1 1 1 2 3 2 3 2 1 3 4 1 5 0 8 1 7 5 3 9 3 3 9 2 1 2 2 1 1 5 0 7 3 1 9 3 9 3 6 3 3 3 2 1 1 5 0 9 5 6 4 8 3 1 1 7 6 3 1 3 3 1 3 5 5 3 3 4 1 8 0 8 1 3 1 6 1 5 9 8 3 3 1 1 2 3 1 1 1 8 0 8 1 7 8 1 9 6 9 6 1 1 2 1 1 2 2 3 1 6 0 7 4 8 2 4 7 7 1 1 2 1 1 2 1 2 3 3 5 3 7 1 5 0 10 9 2 9 7 1 2 1 1 4 2 3 1 2 1 1 1 8 0 10 4 1 1 2 1 5 7 3 7 5 2 1 1 2 1 2 2 1 1 7 0 7 4 4 5 1 4 2 1 1 2 1 3 3 3 3 1 1 1 2 2 1 4 1 3 6 1 6 5 4 3 7 1 7 0 6 7 3 3 5 8 1 1 1 2 2 3 3 1 1 5 0 8 8 1 8 8 4 9 1 1 2 3 1 3 3 1 5 0 7 8 8 8 1 5 5 1 3 1 2 1 1 1 4 3 1 5 5 3 3 5 1 5 0 10 3 9 5 9 5 9 8 3 1 2 1 1 1 1 1 1 9 0 7 6 2 1 3 3 7 2 2 2 2 3 1 2 3 1 2 1 5 0 9 3 7 3 7 1 9 7 3 7 3 2 2 1 2 2 1 4 1 5 3 7 1 5 0 7 1 8 6 6 9 5 5 2 3 2 1 1 1 8 0 9 5 3 2 1 5 3 7 3 9 3 2 3 3 1 2 1 3 1 6 0 10 1 6 5 8 9 5 3 1 2 6 1 2 3 2 1 1 4 5 3 4 3 2 3 3 5 1 5 0 11 7 5 2 1 4 7 4 9 4 3 6 1 1 2 1 2 1 7 0 8 6 8 6 6 1 3 3 1 1 1 1 2 3 1 3 1 8 0 7 3 1 9 4 8 7 4 1 1 3 1 3 3 2 1 2 4 3 4 1 3 6 1 6 0 8 9 1 3 7 2 1 1 1 2 3 1 2 2 1 1 6 0 8 3 5 4 6 6 3 7 1 1 1 1 2 2 1 1 7 0 10 3 6 4 1 1 7 1 6 1 8 1 2 2 2 1 1 1 2 2 3 3 3 3 1 7 2 5 5 5 3 4 1 6 0 9 1 7 1 1 8 6 2 5 1 1 1 2 1 1 1 1 5 0 11 9 2 1 2 7 5 5 8 6 1 7 1 3 1 1 2 1 7 0 7 4 7 8 4 7 1 8 3 3 3 2 2 1 1 1 3 1 2 3 6 1 7 0 9 7 5 1 2 7 9 8 3 7 3 3 1 3 1 1 1 1 6 0 9 6 6 1 3 9 3 8 4 7 1 1 1 1 3 2 1 6 0 7 8 5 6 6 1 5 5 1 2 3 1 3 1 1 2 3 3 5 5 3 6 1 5 0 6 3 4 1 1 7 9 3 2 2 2 1 1 9 0 11 7 1 2 6 7 2 8 5 4 5 7 2 2 3 1 1 2 2 3 1 1 6 0 9 6 6 2 9 5 7 2 1 6 1 1 2 3 3 3 4 2 3 1 2 2 3 7 1 7 0 11 2 9 8 1 1 7 7 4 6 7 5 3 1 2 1 2 3 3 1 6 0 7 9 2 1 3 2 7 8 3 3 2 2 1 1 1 5 0 10 5 5 3 1 8 5 2 2 3 6 1 2 1 2 2 1 4 2 3 2 2 2 3 4 1 5 0 7 1 3 7 2 9 2 9 1 3 3 2 1 1 9 0 7 5 1 4 4 3 3 1 1 1 1 2 1 2 3 1 2 1 8 0 11 3 6 1 3 3 2 8 6 2 6 7 3 1 1 1 2 1 1 3 5 3 5 3 3 3 4 7 4 5 5 3 5 1 6 0 8 3 2 8 1 9 6 1 9 3 1 1 2 2 1 1 9 0 8 1 9 4 6 1 9 9 8 1 3 2 3 1 2 2 3 3 1 8 0 9 5 3 1 9 6 6 7 7 4 1 1 1 1 2 3 1 1 1 1 1 5 4 3 6 1 9 0 11 1 7 4 2 7 4 8 9 3 5 4 1 1 3 3 1 1 2 1 3 1 7 0 9 1 2 2 7 5 5 9 5 3 2 2 3 1 3 3 3 1 8 0 6 1 6 1 2 4 1 3 1 1 2 1 3 1 1 2 2 3 2 3 4 3 7 1 7 0 8 5 9 7 1 5 1 7 7 2 1 1 1 2 1 1 1 9 0 8 3 4 9 3 6 1 2 3 3 2 2 1 2 3 2 1 1 1 8 0 6 2 4 5 5 7 1 3 2 3 1 2 2 2 2 1 1 5 5 3 4 1 3 7 1 8 0 9 1 6 3 9 4 1 9 4 8 2 3 2 3 2 1 1 1 1 9 0 10 4 1 4 5 2 6 1 6 2 2 1 3 3 1 3 2 3 2 2 1 5 0 6 1 9 9 6 5 1 3 1 2 1 1 1 1 2 4 3 3 4 3 7 1 9 0 7 5 5 5 5 1 3 3 3 2 1 3 2 1 2 3 1 1 7 0 6 6 9 7 9 1 5 1 2 3 1 1 3 1 1 9 0 11 5 3 7 6 7 4 8 1 1 8 3 2 1 2 3 2 1 3 1 1 2 3 3 1 4 4 2 4 1 7 5 3 9 7 8 7 2 5 4 3 7 1 6 0 8 9 1 1 7 4 1 1 2 3 2 1 3 2 2 1 8 0 7 8 4 5 4 4 1 2 1 2 2 1 3 3 2 1 1 6 0 10 7 8 4 1 1 7 5 9 5 2 1 1 1 3 1 1 1 2 2 1 5 4 4 3 5 1 8 0 10 3 1 2 1 8 1 5 4 2 7 2 1 3 2 3 2 1 3 1 8 0 10 4 1 8 6 8 6 4 2 5 1 1 2 2 3 2 2 1 1 1 5 0 9 1 5 8 4 1 7 6 7 1 1 1 2 2 2 4 1 3 3 1 3 7 1 8 0 8 1 6 3 2 6 7 2 7 2 2 3 3 1 1 2 1 1 7 0 9 7 1 3 4 5 8 9 1 6 3 1 2 2 2 1 2 1 5 0 7 8 1 8 4 2 5 6 3 1 3 2 2 2 5 3 1 4 2 1 3 5 1 8 0 10 1 1 5 7 3 7 5 1 3 7 1 2 3 1 3 1 2 1 1 8 0 9 3 1 2 1 1 7 8 1 6 3 3 2 1 2 1 1 1 1 5 0 11 5 4 1 5 2 1 6 2 2 6 9 3 3 3 2 1 4 1 1 3 2 3 4 1 7 0 7 5 9 1 2 7 3 9 1 2 3 2 3 2 3 1 5 0 7 4 7 5 8 1 5 3 2 3 3 1 1 1 6 0 9 2 2 8 5 3 1 2 1 6 3 2 2 1 1 3 4 1 3 5 5 1 4 3 4 4 3 5 1 8 0 10 9 5 8 8 3 3 3 1 8 1 2 3 2 1 2 1 3 2 1 6 0 11 4 9 1 2 8 6 7 7 9 6 4 2 1 1 1 3 2 1 6 0 8 2 3 1 3 6 4 8 8 2 1 3 2 3 1 1 2 4 3 2 3 4 1 9 0 10 5 6 5 8 4 1 5 8 1 5 1 3 1 2 1 1 1 2 1 1 8 0 7 6 2 8 3 9 6 1 2 1 1 3 2 3 2 2 1 7 0 6 9 9 2 5 6 1 1 2 3 1 2 3 2 1 5 4 2 3 5 1 6 0 6 1 4 4 1 9 1 1 1 2 1 3 2 1 5 0 10 9 9 4 1 6 5 3 8 3 9 3 1 3 3 1 1 8 0 9 6 8 1 3 8 6 1 4 5 3 1 2 3 3 1 3 2 3 5 2 4 3 3 6 1 7 0 6 8 1 2 4 5 9 1 3 2 3 3 2 1 1 6 0 6 6 1 8 7 5 1 2 3 1 2 1 1 1 5 0 8 9 1 7 5 3 9 5 5 2 1 2 2 1 1 2 2 2 4 1 4 1 6 5 4 3 3 5 1 9 0 10 3 6 1 2 9 6 8 2 9 5 1 2 1 1 3 3 2 1 3 1 9 0 9 6 3 4 7 5 1 6 4 9 1 2 2 1 3 1 1 2 1 1 8 0 8 7 2 6 6 1 3 8 1 1 3 3 1 1 1 1 1 2 3 1 2 5 3 5 1 7 0 10 8 8 8 1 8 5 4 6 1 3 2 2 2 3 1 3 1 1 8 0 10 1 2 1 8 7 3 2 2 6 3 1 3 2 2 3 3 1 1 1 5 0 11 1 9 6 7 1 8 8 8 2 6 6 2 2 2 1 2 4 3 2 1 4 3 6 1 7 0 10 3 6 1 7 9 3 3 1 8 9 3 3 2 3 2 1 3 1 9 0 7 2 2 2 4 5 9 1 2 2 2 2 2 1 1 3 2 1 7 0 7 1 1 3 9 5 3 4 1 1 1 2 1 3 1 3 2 3 1 4 3 3 7 1 6 0 10 6 7 4 3 1 1 8 4 3 6 2 1 1 3 1 3 1 7 0 6 1 1 4 2 8 3 1 2 1 1 1 2 2 1 9 0 10 6 9 1 8 5 5 4 8 5 1 2 3 3 2 1 2 1 3 3 4 2 2 5 3 3 1 4 2 3 5 5 3 6 1 7 0 9 9 9 8 1 7 5 1 3 3 2 3 2 1 3 1 1 1 7 0 7 4 1 9 9 3 1 8 1 1 3 1 2 1 1 1 9 0 9 9 9 8 5 2 7 2 5 1 2 1 1 1 2 2 3 1 3 1 4 1 2 3 5 3 4 1 7 0 6 7 4 4 3 6 1 1 3 2 1 1 2 3 1 6 0 6 3 1 9 5 5 5 3 3 1 1 2 1 1 9 0 8 8 8 4 5 4 1 5 7 1 3 2 3 1 3 2 2 2 1 4 3 5 3 6 1 9 0 10 7 7 2 9 5 1 4 2 1 4 3 2 3 3 2 1 2 3 1 1 9 0 8 1 6 4 7 1 4 9 1 1 3 2 3 3 2 2 2 3 1 6 0 9 9 8 6 6 6 1 6 4 9 3 2 1 3 3 1 1 2 4 1 3 4 3 5 1 6 0 10 3 1 7 3 9 7 5 6 7 8 2 1 1 1 2 2 1 5 0 8 1 9 1 4 8 1 2 5 1 2 1 3 2 1 7 0 9 4 6 9 6 1 6 8 5 6 1 3 1 1 1 1 2 3 2 1 3 1 3 5 1 7 0 6 9 8 8 1 3 5 1 2 1 1 3 2 3 1 9 0 8 4 8 7 9 3 7 1 7 2 2 1 3 1 1 2 3 2 1 9 0 7 3 2 8 1 8 3 2 3 3 1 1 3 1 1 1 1 1 2 3 3 4 5 5 5 2 2 5 3 3 5 1 7 0 8 1 1 1 5 1 8 5 3 3 2 1 2 1 2 2 1 7 0 9 5 1 8 1 5 4 8 6 5 1 1 2 3 1 2 3 1 6 0 10 1 9 8 4 5 7 1 7 5 1 3 1 2 2 1 1 2 2 1 2 5 3 5 1 6 0 9 8 3 3 1 2 5 1 3 6 1 2 2 3 1 2 1 6 0 8 5 2 5 1 4 4 4 1 3 1 2 2 1 1 1 5 0 10 6 3 3 1 3 7 5 3 8 8 1 3 2 2 1 1 3 4 2 5 3 6 1 9 0 8 6 8 1 4 8 1 6 8 1 3 2 3 1 3 3 1 3 1 7 0 7 7 1 1 1 3 4 9 2 1 3 2 2 1 2 1 8 0 8 3 6 2 8 5 1 6 1 2 2 2 3 1 1 2 1 4 1 1 3 1 3 3 6 1 8 0 10 3 2 9 1 3 1 6 8 4 3 1 1 2 1 2 2 2 2 1 8 0 10 4 1 3 7 4 4 2 3 6 1 1 1 3 1 2 1 3 1 1 5 0 8 8 9 1 3 1 6 5 2 2 1 1 2 3 2 5 2 2 3 1 3 6 1 7 0 6 6 6 1 1 2 3 2 1 3 1 2 2 3 1 5 0 11 9 3 2 7 4 7 6 3 1 6 6 3 3 1 2 1 1 8 0 11 9 1 5 8 7 1 2 1 1 9 2 1 2 1 2 2 1 1 1 2 4 3 5 2 3 3 2 1 5 3 3 4 1 9 0 6 8 8 5 6 1 2 2 3 3 1 2 2 2 2 1 1 7 0 6 9 7 9 1 3 9 3 3 1 1 2 1 2 1 5 0 6 2 5 1 5 9 5 1 2 1 2 1 3 5 5 2 3 7 1 7 0 7 2 2 2 1 3 5 1 1 3 1 2 2 3 3 1 9 0 10 4 1 3 9 5 4 4 1 5 1 3 2 2 3 2 1 1 2 3 1 8 0 11 2 9 6 8 3 6 1 1 1 4 4 3 1 3 1 3 1 2 3 2 1 4 5 4 4 1 3 6 1 7 0 8 1 3 6 4 1 5 7 7 1 2 1 3 3 1 2 1 5 0 10 9 1 4 1 3 3 8 4 5 6 3 2 1 1 2 1 9 0 9 2 6 9 1 5 9 6 4 4 3 1 1 1 2 2 2 2 3 2 2 1 2 5 1 3 7 1 6 0 8 9 1 4 4 1 2 6 8 1 1 1 3 3 3 1 5 0 8 1 6 7 1 4 4 8 3 2 2 3 3 1 1 6 0 10 1 4 8 7 1 2 9 8 9 7 1 2 2 3 1 3 5 5 2 4 2 2 3 3 4 1 5 0 8 1 5 8 2 7 9 8 1 3 3 3 1 1 1 5 0 9 5 1 2 4 6 8 2 4 1 3 3 3 1 1 1 7 0 7 7 4 9 4 1 7 1 3 1 3 3 3 3 1 5 5 2 1 3 1 4 5 5 3 4 1 8 0 10 7 1 9 2 7 1 6 9 6 8 1 1 2 3 3 2 3 1 1 7 0 7 3 1 9 8 1 4 2 1 3 3 2 2 3 2 1 7 0 10 5 6 5 7 8 1 6 6 8 4 2 1 1 3 2 3 3 2 2 5 3 3 6 1 9 0 9 7 9 4 5 1 1 5 7 2 1 1 1 2 3 3 1 1 1 1 6 0 9 9 2 5 3 7 1 1 8 3 1 1 3 3 3 1 1 6 0 9 5 2 7 2 1 8 1 8 1 1 1 1 2 1 3 3 5 1 1 2 4 3 4 1 8 0 10 3 6 3 8 4 5 1 6 8 2 1 1 1 2 1 2 1 2 1 7 0 7 1 5 6 1 4 5 9 1 3 2 2 1 3 1 1 8 0 8 9 2 9 9 6 8 1 1 3 3 3 2 1 1 1 3 1 4 3 4 3 4 1 6 0 10 3 9 2 3 9 1 1 4 2 1 2 2 1 1 3 3 1 7 0 10 1 5 1 7 2 1 2 2 8 3 1 1 1 1 2 1 3 1 8 0 6 9 8 1 3 4 6 1 1 3 2 3 2 2 3 3 5 5 4 3 6 1 5 0 11 1 8 8 4 9 1 3 4 3 7 5 2 1 1 2 3 1 8 0 7 1 3 5 6 7 6 4 1 1 1 3 2 1 1 1 1 7 0 11 3 3 7 3 7 7 8 3 3 5 1 3 3 1 3 3 2 2 2 5 5 4 2 5 6 1 6 5 3 4 5 6 3 5 3 3 6 1 6 0 8 1 1 3 4 2 1 1 7 3 1 1 3 1 1 1 8 0 8 4 1 1 9 2 9 9 4 1 1 3 1 1 3 3 1 1 5 0 10 1 2 9 3 8 5 9 3 4 8 3 2 3 1 2 3 5 2 5 3 4 3 5 1 9 0 6 2 3 7 1 6 7 2 1 2 3 2 2 2 3 1 1 6 0 9 8 1 8 9 5 7 4 1 4 2 1 1 3 1 2 1 6 0 9 6 8 6 1 5 2 1 3 6 1 3 1 2 1 1 3 3 3 2 5 3 5 1 9 0 7 6 3 3 3 1 3 3 1 3 1 1 2 1 2 2 2 1 9 0 10 3 6 8 7 4 4 9 1 1 3 3 2 2 3 2 1 2 1 1 1 6 0 6 1 8 4 3 8 8 1 2 1 3 3 3 3 3 2 4 1 3 6 1 8 0 11 8 9 6 2 1 1 1 9 8 2 5 2 1 3 2 1 1 1 1 1 9 0 10 9 5 8 1 1 4 4 1 7 7 2 3 1 1 2 2 3 2 3 1 6 0 11 1 5 8 9 5 7 6 8 6 1 6 1 1 1 1 2 3 4 1 1 4 2 3 3 4 1 9 0 9 4 1 9 6 6 9 8 1 2 2 3 1 2 1 3 2 2 1 1 6 0 9 3 7 1 2 2 5 4 2 2 1 2 2 1 3 2 1 7 0 9 5 5 1 6 1 5 1 6 6 2 3 1 1 1 1 1 1 5 4 5 3 4 5 4 4 3 5 1 7 0 7 5 6 5 7 1 4 9 3 3 1 3 1 1 3 1 5 0 9 1 1 9 9 2 9 9 5 9 2 1 3 1 1 1 8 0 8 8 1 4 6 4 7 8 4 1 3 3 1 3 2 3 3 3 3 5 1 4 3 7 1 9 0 7 6 8 2 1 8 3 9 3 1 3 3 2 3 1 1 3 1 7 0 8 1 5 9 4 2 7 2 9 1 1 1 1 2 1 1 1 5 0 11 8 5 1 4 2 6 1 1 4 9 4 1 1 1 2 1 3 2 5 3 1 4 4 3 4 1 7 0 11 9 5 7 1 8 1 2 7 9 7 5 1 1 2 3 2 3 1 1 6 0 10 2 1 9 3 8 3 1 5 4 5 3 2 1 3 1 1 1 9 0 10 3 5 8 9 4 3 1 6 3 3 3 3 2 3 1 2 3 3 2 3 1 1 4 3 7 1 9 0 8 1 1 8 5 2 6 8 7 2 3 3 2 1 1 1 1 3 1 6 0 7 7 5 8 3 1 1 1 1 2 1 3 1 1 1 6 0 7 1 8 3 8 2 5 5 3 2 2 2 3 1 3 2 5 3 3 5 2 2 6 4 5 5 5 3 6 1 9 0 10 8 9 6 9 9 6 1 1 7 3 3 2 2 1 1 3 1 2 1 1 6 0 11 1 4 7 8 9 5 4 2 1 6 1 1 2 1 1 3 3 1 8 0 8 8 1 7 6 7 5 7 9 2 2 3 2 1 3 3 3 1 3 5 2 1 3 3 5 1 5 0 9 3 7 2 1 2 7 5 1 1 3 2 2 1 1 1 8 0 6 7 1 6 9 1 8 3 2 3 2 2 1 1 1 1 7 0 9 7 2 9 4 1 8 1 1 1 2 1 2 3 1 1 3 2 1 4 4 3 3 4 1 7 0 7 9 7 1 6 2 6 1 2 3 1 1 2 1 2 1 9 0 8 9 9 3 3 5 3 1 1 2 1 1 1 2 1 3 1 3 1 5 0 6 1 1 6 6 2 5 1 2 3 3 1 4 2 3 5 3 4 1 5 0 10 2 6 1 4 1 7 4 2 3 2 1 2 2 3 2 1 7 0 11 1 3 5 1 3 3 7 1 5 1 5 2 1 3 2 1 2 1 1 8 0 8 4 1 8 2 8 4 3 1 2 3 1 2 2 1 2 2 2 2 1 3 3 4 1 8 0 8 5 6 9 5 7 4 1 4 1 3 3 2 2 3 2 1 1 5 0 10 4 5 5 2 7 6 3 1 9 5 1 2 2 2 1 1 8 0 7 2 9 5 1 2 5 6 3 1 1 3 1 1 1 3 2 3 1 4 2 2 4 2 3 5 3 3 4 1 6 0 11 1 8 7 7 1 6 6 5 3 1 2 1 2 3 3 1 1 1 5 0 9 5 1 1 8 1 9 3 3 6 3 1 1 2 3 1 5 0 11 9 5 6 8 6 2 1 8 7 4 1 1 3 2 1 1 2 4 1 1 3 6 1 9 0 6 9 3 3 4 1 7 1 3 2 1 1 1 2 3 1 1 6 0 10 1 3 8 2 8 5 4 8 2 8 1 2 3 2 3 2 1 5 0 7 7 4 4 7 1 7 8 1 3 3 1 3 2 4 1 3 2 3 3 6 1 5 0 9 4 5 7 7 3 2 2 1 5 1 3 3 3 1 1 6 0 11 3 5 1 5 4 9 9 4 2 9 7 3 3 1 1 3 2 1 7 0 10 9 7 8 1 9 3 2 2 9 6 2 3 1 2 2 1 3 3 3 3 1 2 1 3 7 1 6 0 7 7 6 4 7 8 5 1 2 3 1 2 3 1 1 9 0 7 7 4 1 5 5 7 8 3 1 1 1 3 3 1 2 2 1 8 0 6 3 1 8 2 4 3 1 2 3 1 1 2 2 2 5 4 1 2 4 1 1 3 6 1 5 0 6 3 7 1 6 4 6 2 3 1 1 1 1 8 0 10 1 8 3 1 5 1 4 1 3 6 1 2 1 2 2 1 2 1 1 5 0 11 8 5 2 3 4 4 4 5 1 1 8 3 1 3 3 2 3 1 2 1 2 1 4 2 1 5 3 3 4 1 7 0 9 1 1 9 6 3 9 2 5 5 3 3 1 2 2 1 3 1 8 0 9 6 9 8 4 8 1 6 2 4 1 1 1 2 1 1 2 3 1 7 0 9 6 8 4 4 1 1 3 1 2 1 3 2 2 3 1 3 3 5 1 2 3 6 1 9 0 7 7 5 1 9 9 3 6 3 1 3 2 1 2 3 1 1 1 6 0 6 7 1 6 9 2 3 2 3 2 3 3 1 1 6 0 8 3 6 5 9 1 7 9 7 2 1 3 2 1 1 3 5 1 3 1 3 3 4 1 5 0 8 1 2 9 1 9 7 7 5 3 3 2 1 1 1 5 0 11 5 5 8 3 1 7 5 8 4 1 1 1 1 3 3 2 1 7 0 10 8 3 2 1 7 2 8 7 9 7 1 2 1 3 3 1 3 1 2 2 1 3 6 1 6 0 10 2 8 7 5 1 7 1 8 4 1 3 1 1 2 2 2 1 6 0 9 8 9 8 1 9 1 1 1 3 2 1 2 2 1 1 1 5 0 8 1 5 1 5 8 6 4 6 3 3 2 1 2 4 2 3 2 2 2 3 4 1 8 0 6 4 4 6 5 1 9 2 1 2 1 3 1 2 1 1 8 0 10 2 1 1 8 1 3 2 1 2 1 2 1 3 3 3 1 2 2 1 6 0 8 2 4 1 1 3 4 7 1 2 1 3 1 1 1 1 1 3 3 3 5 2 4 3 3 7 1 6 0 10 1 2 4 5 3 5 9 7 8 1 1 1 3 1 3 2 1 5 0 8 7 1 4 1 2 7 4 1 3 1 3 3 2 1 9 0 11 9 9 7 4 3 4 4 9 1 2 3 1 2 1 3 1 2 1 3 1 2 3 4 3 2 2 1 3 6 1 9 0 10 3 4 6 5 8 1 1 9 2 2 3 3 2 2 2 2 1 2 3 1 5 0 9 4 1 3 9 9 5 5 1 1 1 3 2 1 3 1 9 0 9 1 6 2 6 9 2 1 9 9 1 1 1 3 3 1 1 2 1 3 3 1 1 1 3 3 6 1 5 0 11 2 7 7 3 1 1 3 8 1 9 6 1 1 1 1 3 1 9 0 8 7 3 1 7 9 5 1 8 2 1 1 1 1 2 2 3 3 1 9 0 11 9 1 7 1 8 1 1 3 4 6 3 2 1 2 2 3 2 3 1 1 3 5 4 4 5 5 3 4 1 7 0 6 9 2 6 1 1 1 3 3 3 1 3 1 1 1 6 0 11 9 2 2 1 2 5 7 7 4 5 7 1 3 3 1 1 2 1 6 0 7 6 1 9 9 1 3 5 2 1 1 1 3 2 4 4 3 1 1 2 1 8 7 5 7 2 4 5 3 6 1 7 0 8 1 6 7 2 5 2 1 1 2 2 2 1 2 1 2 1 9 0 9 9 4 3 4 5 9 1 2 8 3 1 1 2 2 1 3 1 1 1 7 0 7 6 4 8 2 1 4 8 3 3 1 1 2 2 2 5 2 5 4 1 3 3 7 1 8 0 9 8 7 3 3 6 1 5 1 9 3 3 3 1 3 2 1 3 1 6 0 11 4 7 4 3 8 7 1 7 1 2 8 1 1 3 2 1 3 1 5 0 8 9 1 1 8 7 2 2 1 1 1 1 1 2 4 5 1 5 3 5 3 3 4 1 5 0 6 8 7 2 1 1 1 3 1 2 3 2 1 5 0 6 9 5 1 5 7 3 2 2 1 1 3 1 5 0 6 9 4 1 3 1 5 1 2 1 3 1 3 4 2 3 3 7 1 6 0 9 9 8 3 1 7 6 8 7 8 3 3 2 1 1 1 1 7 0 10 2 7 5 2 8 7 6 1 3 2 2 1 3 1 1 1 2 1 6 0 7 1 1 8 9 2 7 2 2 3 1 1 3 2 5 5 5 3 4 2 4 4 2 2 3 1 5 4 3 6 1 9 0 8 7 5 1 9 3 4 7 6 3 2 1 2 1 1 3 2 2 1 5 0 6 9 8 7 3 8 1 1 1 3 1 2 1 9 0 10 8 5 5 3 1 3 5 4 1 7 2 1 2 3 1 1 1 2 1 4 1 1 1 5 2 3 6 1 6 0 6 9 9 1 2 4 1 1 1 1 2 2 3 1 5 0 6 8 2 4 5 6 1 2 1 1 1 2 1 9 0 7 4 1 2 2 2 4 5 2 2 1 3 3 2 2 2 1 2 1 2 5 1 1 3 5 1 7 0 11 5 3 1 7 1 8 8 8 4 9 9 3 3 1 1 3 1 3 1 5 0 10 6 5 1 3 8 8 7 2 1 5 3 2 3 1 1 1 8 0 11 1 1 3 7 8 3 5 9 5 2 3 1 1 3 3 2 1 1 3 3 5 3 3 1 3 5 1 5 0 8 9 1 6 5 1 4 8 1 3 1 3 1 2 1 5 0 6 1 6 2 9 9 4 3 2 3 1 1 1 5 0 11 3 5 4 2 4 1 1 1 3 4 6 2 1 3 2 2 3 4 4 1 5 3 7 1 9 0 8 1 5 9 2 6 8 4 1 3 3 1 1 3 3 3 3 3 1 7 0 8 4 1 1 1 7 2 5 5 1 2 1 3 1 1 1 1 8 0 8 8 5 9 2 5 7 4 1 2 1 1 1 1 1 2 2 1 4 2 2 5 3 5 4 2 1 7 5 3 3 6 1 9 0 9 5 1 7 6 2 1 9 3 1 1 2 1 3 2 3 1 1 1 1 7 0 9 6 1 5 4 4 1 3 5 4 1 1 3 3 1 2 3 1 6 0 7 5 3 8 3 7 7 1 2 3 2 3 2 1 4 1 5 2 5 2 3 7 1 8 0 8 2 3 6 6 4 1 1 4 3 2 3 3 2 2 1 2 1 9 0 10 4 2 5 3 6 3 9 2 1 1 1 2 3 2 2 1 3 1 3 1 6 0 9 5 4 8 8 3 1 1 3 6 3 2 3 3 1 1 4 3 2 5 3 5 3 3 5 1 5 0 11 1 6 8 1 2 3 5 7 7 3 8 1 3 2 1 3 1 6 0 10 6 9 3 7 5 5 1 1 5 6 1 3 2 1 1 2 1 5 0 10 3 7 3 1 5 1 7 6 2 9 2 2 1 2 1 5 2 2 1 2 3 7 1 8 0 6 6 5 1 1 3 7 2 1 3 2 1 2 1 2 1 7 0 7 7 5 4 3 8 1 3 1 2 3 1 1 1 3 1 7 0 11 4 4 6 7 6 1 5 7 2 8 1 2 3 3 1 2 3 1 1 4 1 1 5 5 1 3 6 1 5 0 9 6 2 4 3 5 1 5 1 7 3 3 2 1 2 1 9 0 10 6 1 3 1 8 9 3 8 5 4 1 1 2 3 1 3 3 1 2 1 7 0 9 5 3 7 5 4 1 1 1 6 1 2 1 3 2 2 1 2 1 2 3 1 5 6 1 6 5 3 3 7 1 6 0 9 8 1 9 8 7 1 5 3 2 1 3 1 3 3 1 1 5 0 8 8 3 8 5 1 1 5 4 1 3 1 2 3 1 6 0 9 6 7 2 3 1 5 5 7 5 1 1 2 1 3 3 5 3 1 1 5 4 5 3 4 1 8 0 6 8 6 7 1 5 8 1 1 1 1 2 1 1 2 1 7 0 9 1 5 7 9 1 9 9 1 4 1 3 2 2 1 2 1 1 5 0 11 6 7 1 2 8 3 2 7 4 6 5 1 1 1 3 3 3 3 1 4 3 6 1 8 0 9 8 2 2 1 6 6 9 2 1 3 2 3 3 2 2 1 2 1 7 0 7 4 7 1 1 2 8 3 2 1 1 3 2 3 3 1 9 0 6 8 1 1 1 7 2 1 1 2 3 2 1 1 3 2 1 5 3 5 3 1 3 5 1 5 0 7 8 3 3 1 7 7 1 2 3 3 3 1 1 8 0 11 3 1 6 8 7 1 5 2 9 5 6 1 1 2 1 2 2 3 1 1 6 0 7 1 6 2 6 9 1 1 2 1 1 1 1 2 2 4 2 5 4 3 5 1 7 0 9 3 9 3 8 8 1 2 2 8 3 1 2 1 3 2 3 1 5 0 7 1 8 4 7 7 2 6 2 3 1 3 1 1 7 0 9 9 1 4 8 7 8 9 9 1 3 2 3 2 3 2 1 2 5 4 2 5 5 5 6 5 4 3 4 1 8 0 11 2 5 5 4 1 6 4 1 4 1 4 2 2 3 1 2 2 2 1 1 6 0 9 1 8 3 5 6 1 2 3 2 1 2 2 2 1 3 1 5 0 8 8 1 5 8 1 5 2 7 2 2 1 3 1 4 3 2 3 3 7 1 5 0 7 7 6 9 1 6 1 7 3 1 3 1 1 1 5 0 6 7 8 3 1 2 8 1 3 3 2 3 1 9 0 9 7 9 3 1 7 1 9 9 4 1 1 1 2 1 1 3 3 2 2 1 3 3 3 1 5 3 6 1 7 0 11 7 1 3 2 1 1 6 5 4 5 5 1 2 1 3 1 3 3 1 6 0 6 1 2 9 7 7 1 2 1 2 3 1 3 1 8 0 10 6 9 1 9 8 9 3 4 1 5 1 1 1 1 2 1 1 1 3 3 3 5 1 4 3 7 1 5 0 8 8 3 4 8 7 1 7 9 1 3 1 2 1 1 6 0 11 9 1 7 1 6 8 8 9 3 5 5 3 2 1 2 1 1 1 5 0 9 9 9 7 1 7 1 2 1 4 2 2 2 1 2 3 3 1 5 1 1 3 3 6 1 7 0 10 3 4 8 6 8 6 1 9 3 3 1 2 3 3 1 2 3 1 9 0 9 1 9 8 3 9 1 8 7 2 1 3 1 3 1 3 3 2 3 1 7 0 8 9 1 4 8 7 5 5 6 1 2 3 3 3 3 2 4 5 4 2 4 1 4 5 5 7 5 4 3 4 1 5 0 8 8 1 6 6 6 8 8 1 1 1 1 2 2 1 6 0 10 5 9 1 3 8 8 9 7 2 9 3 1 3 2 2 1 1 6 0 8 5 7 2 1 3 3 6 1 3 1 1 1 2 1 2 1 2 4 3 4 1 7 0 10 1 2 2 5 9 1 1 7 1 6 3 2 2 3 3 1 2 1 8 0 10 1 9 4 7 7 8 3 3 9 4 2 1 2 3 1 2 2 1 1 7 0 8 7 4 6 4 1 2 6 7 1 2 1 2 1 1 2 1 5 5 3 3 5 1 5 0 10 6 7 2 1 5 1 9 8 8 9 2 1 1 1 1 1 8 0 10 2 1 9 6 1 1 4 7 9 5 1 3 3 2 3 1 3 1 1 5 0 11 5 4 7 7 5 9 5 5 7 1 7 1 1 1 1 3 4 3 1 1 2 3 7 1 8 0 9 9 5 1 7 6 5 7 4 8 1 1 3 3 3 1 1 2 1 5 0 9 1 8 5 3 4 8 5 1 6 1 2 3 1 3 1 5 0 7 1 6 6 8 7 3 7 3 1 3 1 3 1 2 5 2 3 5 3 3 4 1 6 0 10 1 4 2 2 6 8 6 6 3 6 1 3 1 2 1 2 1 7 0 11 3 3 2 1 1 9 1 1 4 7 7 1 3 1 1 1 2 3 1 8 0 11 6 2 1 4 3 9 8 4 4 6 2 2 2 1 1 1 2 2 2 3 3 3 5 1 4 4 6 5 5 3 7 1 7 0 7 6 6 3 2 7 1 5 3 3 1 3 1 3 1 1 6 0 11 5 7 1 2 5 5 1 5 5 9 4 1 1 1 3 1 2 1 6 0 7 5 5 6 5 4 1 8 1 1 2 2 1 2 3 3 5 5 2 3 2 3 5 1 6 0 9 4 6 5 8 4 5 1 1 5 1 3 1 1 3 3 1 7 0 10 3 2 1 9 3 2 3 4 9 1 1 3 1 2 1 1 2 1 8 0 9 9 1 3 1 1 4 4 9 9 3 3 1 3 1 3 2 2 1 3 3 2 2 3 7 1 8 0 6 1 7 2 7 1 5 1 3 3 1 1 3 2 3 1 9 0 9 3 2 4 1 9 1 8 1 9 3 1 3 1 3 3 1 1 1 1 6 0 9 5 5 1 6 4 7 2 8 6 1 2 3 1 1 2 2 4 2 1 4 1 2 3 6 1 9 0 10 1 5 1 3 7 4 6 3 7 2 3 1 1 1 2 1 1 3 2 1 9 0 6 7 4 1 1 1 8 2 2 1 2 3 2 3 1 2 1 8 0 6 8 1 5 2 8 4 1 3 2 2 3 2 1 1 1 2 5 1 4 2 3 4 1 8 0 11 1 5 8 3 4 7 8 5 6 5 8 3 3 3 2 3 1 2 3 1 5 0 6 1 7 9 6 1 1 2 2 1 2 1 1 5 0 11 4 1 4 1 7 4 3 3 2 2 3 1 3 2 1 1 4 2 3 3 4 7 4 3 2 7 5 7 6 10 3 1 4 3 1 4 6 2
diff --git a/2018/inputs/9.txt b/2018/inputs/9.txt
new file mode 100644
index 0000000..eaf3e92
--- /dev/null
+++ b/2018/inputs/9.txt
@@ -0,0 +1 @@
+438 players; last marble is worth 71626 points
diff --git a/2018/license.org b/2018/license.org
new file mode 100644
index 0000000..8d31e87
--- /dev/null
+++ b/2018/license.org
@@ -0,0 +1,21 @@
+* The MIT License
+
+Copyright (c) 2018 Justin Worthe
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/2018/readme.org b/2018/readme.org
new file mode 100644
index 0000000..7fe82e4
--- /dev/null
+++ b/2018/readme.org
@@ -0,0 +1,38 @@
+* Advent of Code 2018
+
+** What is Advent of Code?
+
+Advent of Code is a programming advent calendar. On the 25 days of
+December leading up to Christmas, each morning a new programming
+challenge is unlocked. The race is then on to see who can solve the
+challenge and get the answer to their particular input first.
+
+It's a lot of fun. I have my solutions posted here so that I can share
+them with my friends, as well as the broader community if they're
+interested.
+
+** A note on error handling and code quality
+
+The only important metric to consider in terms of taking the Advent of
+Code challenges seriously from a competitive point of view is how
+quickly you arrive at an answer for your particular input.
+
+These solutions should not in any way be seen as an example of good
+coding standards in Rust. The error handling in particular is
+appalling. The reason for this is that I can look at the input data
+and be certain that some error cases won't come up, like empty
+lists. I can also assume that things like file system access will
+always work because I'm only running it on my machine under my
+supervision.
+
+When my assumptions are wrong, the program panics and dies, but I'm
+currently there programming it when it's running so that isn't really
+a big deal.
+
+The short version of what I'm trying to say is that even though I use
+~unwrap~ all over the place in this particular repo, I still think
+it's a really bad idea to use it in a real project.
+
+** License
+
+See [[./license.org]].
diff --git a/2018/src/bin/day_1.rs b/2018/src/bin/day_1.rs
new file mode 100644
index 0000000..4693579
--- /dev/null
+++ b/2018/src/bin/day_1.rs
@@ -0,0 +1,32 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+extern crate im_rc;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use im_rc::HashSet;
+
+// cargo watch -cs "cargo run --release --bin day_1"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/1.txt"))?;
+ let input_ints: Vec<i32> = input.iter().map(|str| str.parse::<i32>().unwrap()).collect();
+
+ println!("Input: {:?}", input_ints);
+
+ let sum: i32 = input_ints.iter().sum();
+ println!("Sum: {}", sum);
+
+ let first_repeat = input_ints.iter().cycle().try_fold((0, HashSet::new()), |(acc, seen), &i| {
+ if seen.contains(&acc) {
+ Err(acc)
+ } else {
+ Ok((acc + i, seen.update(acc)))
+ }
+ }).err().unwrap();
+ println!("First repeat: {}", first_repeat);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_10.rs b/2018/src/bin/day_10.rs
new file mode 100644
index 0000000..082be7c
--- /dev/null
+++ b/2018/src/bin/day_10.rs
@@ -0,0 +1,82 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::i32;
+
+// cargo watch -cs "cargo run --release --bin day_10"
+
+
+
+#[derive(Debug, Clone)]
+struct Star {
+ x: i32,
+ y: i32,
+ dx: i32,
+ dy: i32
+}
+
+impl FromStr for Star {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let split = s
+ .split(|c: char| c != '-' && !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse())
+ .collect::<Result<Vec<i32>, _>>()?;
+
+ Ok(Star {
+ x: split[0],
+ y: split[1],
+ dx: split[2],
+ dy: split[3]
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/10.txt"))?;
+ let mut stars = input.iter().map(|line| line.parse::<Star>().unwrap()).collect::<Vec<_>>();
+
+ //debug!(input);
+ //debug!(stars);
+
+ let screen_width = 80;
+ let screen_height = 80;
+
+ for seconds in 0..1000000 {
+ let min_x = stars.iter().map(|s| s.x).min().unwrap();
+ let max_x = stars.iter().map(|s| s.x).max().unwrap();
+ let min_y = stars.iter().map(|s| s.y).min().unwrap();
+ let max_y = stars.iter().map(|s| s.y).max().unwrap();
+
+ if max_x - min_x < screen_width && max_y - min_y < screen_height {
+ debug!(seconds);
+ for y in min_y..max_y+1 {
+ for x in min_x..max_x+1 {
+ let star_at_point = stars.iter().any(|s| s.x == x && s.y == y);
+ if star_at_point {
+ print!("#");
+ } else {
+ print!(" ");
+ }
+ }
+ println!();
+ }
+ println!();
+ println!();
+ }
+
+ for star in &mut stars {
+ star.x += star.dx;
+ star.y += star.dy;
+ }
+ }
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_11.rs b/2018/src/bin/day_11.rs
new file mode 100644
index 0000000..0e458a3
--- /dev/null
+++ b/2018/src/bin/day_11.rs
@@ -0,0 +1,66 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::i32;
+
+// cargo watch -cs "cargo run --release --bin day_11"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = 1723;
+
+ println!("Input: {:?}", input);
+
+ let powers = precompute_powers(input);
+
+ let power_per_size = (1..300).map(|size| {
+ (1..302-size).map(|left| {
+ (1..302-size).map(|top| {
+ (power_for_block(left, top, size, &powers), (left, top, size))
+ }).max_by_key(|(p, _)| *p).unwrap()
+ }).max_by_key(|(p, _)| *p).unwrap()
+ }).collect::<Vec<_>>();
+
+ let (max_power_at_size_3, coordinate_at_size_3) = power_per_size[2]; // index from 0 vs 1
+ debug!(max_power_at_size_3);
+ debug!(coordinate_at_size_3);
+
+ let (max_power, coordinate) = power_per_size.iter().max_by_key(|(p, _)| p).unwrap();
+
+ debug!(max_power);
+ debug!(coordinate);
+
+ Ok(())
+}
+
+fn power_for_block(left: i32, top: i32, size: i32, powers: &[[i32;300];300]) -> i32 {
+ (left..left+size).map(|x| {
+ (top..top+size).map(|y| {
+ powers[x as usize - 1][y as usize - 1]
+ }).sum::<i32>()
+ }).sum()
+}
+
+fn precompute_powers(input: i32) -> [[i32;300];300] {
+ let mut powers: [[i32;300];300] = [[0;300];300];
+ for x in 1..301 {
+ for y in 1..301 {
+ powers[x as usize - 1][y as usize - 1] = power_from_coordinates(x, y, input);
+ }
+ }
+ powers
+}
+
+fn power_from_coordinates(x: i32, y: i32, input: i32) -> i32 {
+ let rack_id = x + 10;
+ ((((rack_id * y) + input) * rack_id / 100) % 10) - 5
+}
+
+
+#[test]
+fn power_from_coord_example() {
+ assert_eq!(power_from_coordinates(3, 5, 8), 4);
+ assert_eq!(power_from_coordinates(122, 79, 57), -5);
+ assert_eq!(power_from_coordinates(217,196, 39), 0);
+ assert_eq!(power_from_coordinates(101, 153, 71), 4);
+}
diff --git a/2018/src/bin/day_12.rs b/2018/src/bin/day_12.rs
new file mode 100644
index 0000000..65a966d
--- /dev/null
+++ b/2018/src/bin/day_12.rs
@@ -0,0 +1,102 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::str::FromStr;
+
+// cargo watch -cs "cargo run --release --bin day_12"
+
+use std::collections::HashSet;
+
+#[derive(Debug)]
+struct Rule {
+ input: [bool; 5],
+ output: bool
+}
+
+impl FromStr for Rule {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ //##..# => #
+ let mut input = [false; 5];
+ let mut iter = s.chars().filter(|c| *c == '#' || *c == '.');
+ for (i, c) in iter.by_ref().take(5).enumerate() {
+ if c == '#' {
+ input[i] = true;
+ }
+ }
+ Ok(Rule {
+ input,
+ output: iter.next() == Some('#')
+ })
+ }
+}
+
+impl Rule {
+ fn matches(&self, state: &HashSet<i64>, index: i64) -> bool {
+ self.input.iter().enumerate().all(|(i, expected)| {
+ let pot_index = index - 2 + i as i64;
+ *expected == state.contains(&pot_index)
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/12.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let mut initial_state: HashSet<i64> = HashSet::new();
+ for (i, c) in input[0].chars().filter(|c| *c == '#' || *c == '.').enumerate() {
+ if c == '#' {
+ initial_state.insert(i as i64);
+ }
+ }
+ let rules = input.iter().skip(1).map(|line| line.parse()).collect::<Result<Vec<Rule>, Box<Error>>>()?;
+
+ debug!(initial_state);
+ debug!(rules);
+
+ let part1_time = 20;
+ let part2_time = 50000000000;
+
+ let part1_final_state = iterate_states(&initial_state, &rules, part1_time);
+ let sum_of_part1_pot_numbers: i64 = part1_final_state.iter().sum();
+ debug!(sum_of_part1_pot_numbers);
+
+ let part2_final_state = iterate_states(&initial_state, &rules, part2_time);
+ let sum_of_part2_pot_numbers: i64 = part2_final_state.iter().sum();
+ debug!(sum_of_part2_pot_numbers);
+
+ Ok(())
+}
+
+fn iterate_states(initial_state: &HashSet<i64>, rules: &[Rule], time: i64) -> HashSet<i64> {
+ let mut current_state = initial_state.clone();
+ for current_time in 0..time {
+ let mut new_state = HashSet::new();
+ let min = current_state.iter().min().cloned().unwrap_or(-1) - 2;
+ let max = current_state.iter().max().cloned().unwrap_or(-1) + 2;
+
+ for i in min..max+1 {
+ if rules.iter().find(|r| r.matches(&current_state, i)).expect("No matching rule").output {
+ new_state.insert(i as i64);
+ }
+ }
+
+ if current_state.iter().map(|v| v + 1).collect::<HashSet<i64>>() == new_state {
+ // Iterations are just shifting 1 to the right at this
+ // point. Found by inspecting a debugging log of the
+ // generations.
+
+ let remaining_iterations = time-current_time;
+ return current_state.iter().map(|v| v + remaining_iterations).collect::<HashSet<i64>>();
+ }
+
+ current_state = new_state;
+ }
+ current_state
+}
diff --git a/2018/src/bin/day_13.rs b/2018/src/bin/day_13.rs
new file mode 100644
index 0000000..005f216
--- /dev/null
+++ b/2018/src/bin/day_13.rs
@@ -0,0 +1,249 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_13"
+
+#[derive(Debug)]
+enum Road {
+ LeftRight,
+ UpDown,
+ LeftUpRightDown,
+ RightUpLeftDown,
+ Intersection,
+ None
+}
+
+#[derive(Debug)]
+struct Cart {
+ next_turn: TurnDirection,
+ facing: FacingDirection,
+ x: usize,
+ y: usize,
+ crashed: bool
+
+}
+
+#[derive(Debug, Clone, Copy)]
+enum FacingDirection {
+ Up,
+ Down,
+ Left,
+ Right
+}
+
+#[derive(Debug, Clone, Copy)]
+enum TurnDirection {
+ Left,
+ Straight,
+ Right
+}
+
+impl TurnDirection {
+ fn next(&self) -> TurnDirection {
+ use TurnDirection::*;
+
+ match *self {
+ Left => Straight,
+ Straight => Right,
+ Right => Left
+ }
+ }
+
+ fn rotate(&self, facing: &FacingDirection) -> FacingDirection {
+ match *self {
+ TurnDirection::Left => match *facing {
+ FacingDirection::Up => FacingDirection::Left,
+ FacingDirection::Left => FacingDirection::Down,
+ FacingDirection::Down => FacingDirection::Right,
+ FacingDirection::Right => FacingDirection::Up
+ },
+ TurnDirection::Right => match *facing {
+ FacingDirection::Up => FacingDirection::Right,
+ FacingDirection::Left => FacingDirection::Up,
+ FacingDirection::Down => FacingDirection::Left,
+ FacingDirection::Right => FacingDirection::Down
+ },
+ TurnDirection::Straight => facing.clone()
+ }
+ }
+}
+
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/13.txt"))?;
+
+// for i in &input {
+// println!("{}", i);
+// }
+
+ let mut map: Vec<Vec<Road>> = Vec::new();
+ let mut carts: Vec<Cart> = Vec::new();
+
+ for (y, line) in input.iter().enumerate() {
+ let mut map_row = Vec::new();
+ for (x, c) in line.chars().enumerate() {
+ let tile = match c {
+ ' ' => Road::None,
+ '-' => Road::LeftRight,
+ '|' => Road::UpDown,
+ '/' => Road::LeftUpRightDown,
+ '\\' => Road::RightUpLeftDown,
+ '+' => Road::Intersection,
+ '^' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Up,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::UpDown
+ },
+ '<' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Left,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::LeftRight
+ },
+ 'v' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Down,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::UpDown
+ },
+ '>' => {
+ carts.push(Cart {
+ next_turn: TurnDirection::Left,
+ facing: FacingDirection::Right,
+ x: x,
+ y: y,
+ crashed: false
+ });
+ Road::LeftRight
+ },
+
+ _ => {
+ panic!("Unknown character {}", c);
+ }
+ };
+ map_row.push(tile);
+ }
+ map.push(map_row);
+ }
+
+ while carts.len() > 1 {
+ carts.sort_unstable_by(|a, b| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+
+ for i in 0..carts.len() {
+ {
+ let mut cart = &mut carts[i];
+ let road = &map[cart.y][cart.x];
+
+ match (road, cart.facing, cart.next_turn) {
+ (Road::LeftRight, FacingDirection::Left, _) => {
+ cart.x -= 1;
+ },
+ (Road::LeftRight, FacingDirection::Right, _) => {
+ cart.x += 1;
+ },
+ (Road::LeftRight, _, _) => {
+ panic!("Sideways cart heading left-right");
+ },
+
+ (Road::UpDown, FacingDirection::Up, _) => {
+ cart.y -= 1;
+ },
+ (Road::UpDown, FacingDirection::Down, _) => {
+ cart.y += 1;
+ },
+ (Road::UpDown, _, _) => {
+ panic!("Sideways cart heading up-down");
+ },
+
+ // /
+ (Road::LeftUpRightDown, FacingDirection::Down, _) => {
+ cart.x -= 1;
+ cart.facing = FacingDirection::Left;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Right, _) => {
+ cart.y -= 1;
+ cart.facing = FacingDirection::Up;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Left, _) => {
+ cart.y += 1;
+ cart.facing = FacingDirection::Down;
+ },
+ (Road::LeftUpRightDown, FacingDirection::Up, _) => {
+ cart.x += 1;
+ cart.facing = FacingDirection::Right;
+ },
+
+ // \
+ (Road::RightUpLeftDown, FacingDirection::Up, _) => {
+ cart.x -= 1;
+ cart.facing = FacingDirection::Left;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Left, _) => {
+ cart.y -= 1;
+ cart.facing = FacingDirection::Up;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Right, _) => {
+ cart.y += 1;
+ cart.facing = FacingDirection::Down;
+ },
+ (Road::RightUpLeftDown, FacingDirection::Down, _) => {
+ cart.x += 1;
+ cart.facing = FacingDirection::Right;
+ },
+
+ (Road::Intersection, f, d) => {
+ cart.facing = d.rotate(&f);
+ cart.next_turn = d.next();
+ match cart.facing {
+ FacingDirection::Up => { cart.y -= 1 },
+ FacingDirection::Down => { cart.y += 1 },
+ FacingDirection::Left => { cart.x -= 1 },
+ FacingDirection::Right => { cart.x += 1 },
+ }
+ },
+
+ (Road::None, _, _) => {
+ panic!("Offroad cart!");
+ }
+
+ }
+
+ }
+
+ let collisions = carts.iter()
+ .enumerate()
+ .filter(|(other_i, other)| *other_i != i && other.x == carts[i].x && other.y == carts[i].y)
+ .map(|(other_i, _)| other_i)
+ .collect::<Vec<_>>();
+ for other_i in collisions {
+ let crash_location = (carts[i].x, carts[i].y);
+ debug!(crash_location);
+ carts[i].crashed = true;
+ carts[other_i].crashed = true;
+ }
+ }
+
+ carts.retain(|cart| !cart.crashed);
+ }
+
+ debug!(carts);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_14.rs b/2018/src/bin/day_14.rs
new file mode 100644
index 0000000..cb16623
--- /dev/null
+++ b/2018/src/bin/day_14.rs
@@ -0,0 +1,111 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_14"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = 540561;
+
+ let scoreboard = find_ten_scoreboard_after(input);
+
+ println!("Result: ");
+ scoreboard.iter().for_each(|s| {
+ print!("{}", s);
+ });
+ println!();
+
+ let first_occurence = find_first_occurence_of(input);
+ debug!(first_occurence);
+
+ Ok(())
+}
+
+fn find_ten_scoreboard_after(input: usize) -> Vec<usize> {
+ let mut scoreboard = vec!(3,7);
+ let mut elf1_pos = 0;
+ let mut elf2_pos = 1;
+
+ while scoreboard.len() < (input + 10) {
+ let next = scoreboard[elf1_pos] + scoreboard[elf2_pos];
+ for digit in number_to_digits_vec(next) {
+ scoreboard.push(digit);
+ }
+
+ elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len();
+ elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len();
+ }
+
+ scoreboard.iter().skip(input).take(10).cloned().collect()
+}
+
+fn find_first_occurence_of(input: usize) -> usize {
+ let target_sequence = number_to_digits_vec(input);
+ debug!(target_sequence);
+
+ let mut scoreboard = vec!(3,7);
+ let mut elf1_pos = 0;
+ let mut elf2_pos = 1;
+ let mut target_index = None;
+
+ while target_index.is_none() {
+ let next = scoreboard[elf1_pos] + scoreboard[elf2_pos];
+ for digit in number_to_digits_vec(next) {
+ scoreboard.push(digit);
+ }
+
+ elf1_pos = (elf1_pos + 1 + scoreboard[elf1_pos]) % scoreboard.len();
+ elf2_pos = (elf2_pos + 1 + scoreboard[elf2_pos]) % scoreboard.len();
+
+ if scoreboard.len() >= target_sequence.len() + 2 {
+ for potential_target_index in scoreboard.len()-target_sequence.len()-2..scoreboard.len()-target_sequence.len()+1 {
+ let found = scoreboard.iter()
+ .skip(potential_target_index)
+ .take(target_sequence.len())
+ .zip(target_sequence.iter())
+ .all(|(a, b)| a == b);
+ if found {
+ target_index = Some(potential_target_index);
+ }
+ }
+ }
+ }
+
+ target_index.unwrap()
+}
+
+fn number_to_digits_vec(input: usize) -> Vec<usize> {
+ if input == 0 {
+ return vec!(0);
+ }
+
+ let mut result = Vec::new();
+ let mut acc = input;
+ while acc > 0 {
+ result.push(acc % 10);
+ acc /= 10;
+ }
+ result.reverse();
+ result
+}
+
+#[test]
+fn vectorification() {
+ assert_eq!(number_to_digits_vec(10), vec!(1, 0));
+ assert_eq!(number_to_digits_vec(1), vec!(1));
+ assert_eq!(number_to_digits_vec(0), vec!(0));
+}
+
+#[test]
+fn part1_examples() {
+ assert_eq!(find_ten_scoreboard_after(9), vec!(5,1,5,8,9,1,6,7,7,9));
+ assert_eq!(find_ten_scoreboard_after(2018), vec!(5,9,4,1,4,2,9,8,8,2));
+}
+
+#[test]
+fn part2_examples() {
+ assert_eq!(find_first_occurence_of(51589), 9);
+ assert_eq!(find_first_occurence_of(59414), 2018);
+}
diff --git a/2018/src/bin/day_15.rs b/2018/src/bin/day_15.rs
new file mode 100644
index 0000000..c6f3cf2
--- /dev/null
+++ b/2018/src/bin/day_15.rs
@@ -0,0 +1,272 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_15"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/15.txt"))?;
+
+ let (round_hp_product, _) = calculate_round_hp_product(&input, 3);
+ debug!(round_hp_product);
+
+ for power in 3.. {
+ let (round_hp_product_without_losses, elf_losses) = calculate_round_hp_product(&input, power);
+ if (elf_losses == 0) {
+ debug!(round_hp_product_without_losses);
+ break;
+ }
+ }
+
+ Ok(())
+}
+
+fn calculate_round_hp_product(input: &[String], elf_power: i32) -> (i32, usize) {
+ let goblin_power = 3;
+ let initial_hp = 200;
+
+ let mut map = Vec::new();
+ let mut units = Vec::new();
+
+ for (y, line) in input.iter().enumerate() {
+ let mut map_row = Vec::new();
+ for (x, c) in line.chars().enumerate() {
+ map_row.push(c == '#');
+
+ let maybe_unit = match c {
+ 'G' => Some(Unit {
+ team: false,
+ x: x as i32,
+ y: y as i32,
+ hp: initial_hp
+ }),
+ 'E' => Some(Unit {
+ team: true,
+ x: x as i32,
+ y: y as i32,
+ hp: initial_hp
+ }),
+ _ => None
+ };
+ if let Some(unit) = maybe_unit {
+ units.push(unit);
+ }
+ }
+
+ map.push(map_row);
+ }
+ let start_elves = units.iter().filter(|u| u.team).count();
+
+ for round in 0.. {
+ // debug!(round);
+ // debug!(units);
+ // debug_print(&units, &map);
+ units.sort_unstable_by(|a, b| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+
+ for i in 0..units.len() {
+ if units[i].hp > 0 {
+ let battle_over = !units.iter().any(|other| other.hp > 0 && other.team != units[i].team);
+ if battle_over {
+ println!("Battle over");
+ let hp_sum = units.iter().filter(|u| u.hp > 0).map(|u| u.hp).sum::<i32>();
+ debug!(round);
+ debug!(hp_sum);
+
+ let elf_losses = start_elves - units.iter().filter(|u| u.team).count();
+ debug!(elf_losses);
+ return (round * hp_sum, elf_losses);
+ }
+
+ let is_next_to_opponent = unit_at_point(!units[i].team, units[i].x-1, units[i].y, &units)
+ .or_else(|| unit_at_point(!units[i].team, units[i].x+1, units[i].y, &units))
+ .or_else(|| unit_at_point(!units[i].team, units[i].x, units[i].y-1, &units))
+ .or_else(|| unit_at_point(!units[i].team, units[i].x, units[i].y+1, &units)).is_some();
+ if !is_next_to_opponent {
+ if let Some((next_x, next_y)) = find_next_step(i, &units, &map) {
+ units[i].x = next_x;
+ units[i].y = next_y;
+ }
+ }
+
+ let mut attack_candidates = adjacent_units(!units[i].team, units[i].x, units[i].y, &units);
+ attack_candidates.sort_by(|&a, &b| units[a].hp.cmp(&units[b].hp));
+ if let Some(&to_attack) = attack_candidates.first() {
+ let attack_power = if units[i].team { elf_power } else { goblin_power };
+ units[to_attack].hp -= attack_power;
+ }
+ }
+ }
+
+ units.retain(|u| u.hp > 0);
+ }
+
+ panic!("Match ended unexpectedly");
+}
+
+fn find_next_step(i: usize, units: &[Unit], map: &Vec<Vec<bool>>) -> Option<(i32, i32)> {
+ let mut explored = vec!(Explored {
+ x: units[i].x,
+ y: units[i].y,
+ distance: 0,
+ parent: 0
+ });
+
+ let mut explored_index = 0;
+ let mut distance_found = None;
+ while explored_index < explored.len() && distance_found.map_or(true, |distance| explored[explored_index].distance < distance) {
+ let distance = explored[explored_index].distance;
+ for (new_x, new_y) in adjacent_empty_spaces(explored[explored_index].x, explored[explored_index].y, &map, &units, &explored) {
+ explored.push(Explored {
+ x: new_x,
+ y: new_y,
+ distance: distance + 1,
+ parent: explored_index
+ });
+
+ if adjacent_units(!units[i].team, new_x, new_y, &units).len() > 0 {
+ distance_found = Some(distance + 1);
+ }
+ }
+ explored_index += 1;
+ }
+
+ if let Some(distance) = distance_found {
+ let mut candidates = explored.iter().enumerate()
+ .filter(|(_,e)| e.distance == distance)
+ .filter(|(_,e)| adjacent_units(!units[i].team, e.x, e.y, &units).len() > 0)
+ .collect::<Vec<_>>();
+ candidates.sort_by(|(_,a), (_,b)| a.y.cmp(&b.y).then(a.x.cmp(&b.x)));
+ let (best_index, _) = candidates[0];
+
+ let mut result_index = best_index;
+ let mut next_index = best_index;
+ while next_index != 0 {
+ result_index = next_index;
+ next_index = explored[result_index].parent;
+ }
+ return Some((explored[result_index].x, explored[result_index].y));
+ }
+ None
+}
+
+fn adjacent_empty_spaces(x: i32, y: i32, map: &Vec<Vec<bool>>, units: &[Unit], explored: &[Explored]) -> Vec<(i32, i32)> {
+ [(x, y-1), (x-1, y), (x+1, y), (x, y+1)].iter()
+ .filter(|(x, y)| *x >= 0 && *y >= 0)
+ .filter(|(x, y)| !explored.iter().any(|e| e.x == *x && e.y == *y))
+ .filter(|(x, y)| !units.iter().any(|e| e.hp > 0 && e.x == *x && e.y == *y))
+ .filter(|(x, y)| !map[*y as usize][*x as usize])
+ .cloned()
+ .collect()
+}
+
+fn adjacent_units(team: bool, x: i32, y: i32, units: &[Unit]) -> Vec<usize> {
+ [(x, y-1), (x-1, y), (x+1, y), (x, y+1)].iter()
+ .filter_map(|(x, y)| unit_at_point(team, *x, *y, units))
+ .collect()
+}
+
+fn unit_at_point(team: bool, x: i32, y: i32, units: &[Unit]) -> Option<usize> {
+ units.iter().enumerate()
+ .find(|(_, u)| u.hp > 0 && u.team == team && u.x == x && u.y == y)
+ .map(|(i, _)| i)
+}
+
+#[derive(Debug, Clone)]
+struct Unit {
+ team: bool,
+ x: i32,
+ y: i32,
+ hp: i32
+}
+
+#[derive(Debug)]
+struct Explored {
+ x: i32,
+ y: i32,
+ distance: u32,
+ parent: usize
+}
+
+
+fn debug_print(units: &[Unit], map: &Vec<Vec<bool>>) {
+ for (y, line) in map.iter().enumerate() {
+ for (x, wall) in line.iter().enumerate() {
+ let unit = units.iter().find(|u| u.hp > 0 && u.x == x as i32 && u.y == y as i32);
+ print!("{}", match (wall, unit) {
+ (true, _) => '#',
+ (false, Some(unit)) if unit.team => 'E',
+ (false, Some(_)) => 'G',
+ (false, None) => '.'
+ });
+ }
+ println!();
+ }
+ println!();
+ println!();
+}
+
+fn part_1_test(input: &[&str]) -> i32 {
+ let owned_input = input.iter()
+ .map(|&line| line.to_owned())
+ .collect::<Vec<String>>();
+ let (product, _) = calculate_round_hp_product(&owned_input, 3);
+ product
+}
+
+#[test]
+fn example_1() {
+ let input = vec!(
+ "#######",
+ "#.G...#",
+ "#...EG#",
+ "#.#.#G#",
+ "#..G#E#",
+ "#.....#",
+ "#######");
+ assert_eq!(part_1_test(&input), 27730);
+}
+
+#[test]
+fn example_2() {
+ let input = vec!(
+ "#######",
+ "#G..#E#",
+ "#E#E.E#",
+ "#G.##.#",
+ "#...#E#",
+ "#...E.#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 36334);
+}
+
+#[test]
+fn example_3() {
+ let input = vec!(
+ "#######",
+ "#E.G#.#",
+ "#.#G..#",
+ "#G.#.G#",
+ "#G..#.#",
+ "#...E.#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 27755);
+}
+
+#[test]
+fn example_4() {
+ let input = vec!(
+ "#######",
+ "#.E...#",
+ "#.#..G#",
+ "#.###.#",
+ "#E#G#G#",
+ "#...#G#",
+ "#######"
+ );
+ assert_eq!(part_1_test(&input), 28944);
+}
+
diff --git a/2018/src/bin/day_16.rs b/2018/src/bin/day_16.rs
new file mode 100644
index 0000000..275ec45
--- /dev/null
+++ b/2018/src/bin/day_16.rs
@@ -0,0 +1,205 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_16"
+
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, registers: &[i32; 4]) -> [i32; 4] {
+ use Op::*;
+
+ let mut result_registers = registers.clone();
+
+ result_registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize] + registers[self.b as usize],
+ Addi => registers[self.a as usize] + self.b,
+ Mulr => registers[self.a as usize] * registers[self.b as usize],
+ Muli => registers[self.a as usize] * self.b,
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 }
+ };
+
+ result_registers
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+impl Op {
+ fn all() -> [Op; 16] {
+ use Op::*;
+ [
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+ ]
+ }
+}
+
+struct UnknownInstruction {
+ before: [i32; 4],
+ after: [i32; 4],
+ opcode: i32,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl UnknownInstruction {
+ fn possible_matches(&self) -> HashSet<Op> {
+ Op::all()
+ .iter()
+ .filter(|&&op| {
+ let instruction = Instruction {
+ op: op,
+ a: self.a,
+ b: self.b,
+ c: self.c
+ };
+ let result = instruction.execute(&self.before);
+ result == self.after
+ })
+ .cloned()
+ .collect()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input_part_1 = read_file(&PathBuf::from("inputs/16_1.txt"))?;
+
+ let unknown_instructions: Vec<UnknownInstruction> = input_part_1.chunks(3)
+ .map(|chunk| {
+ let mut before_iter = chunk[0].trim_matches(|c: char| !c.is_numeric()).split(", ").map(|c| c.parse::<i32>().unwrap());
+ let before = [
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ before_iter.next().unwrap(),
+ ];
+ let mut after_iter = chunk[2].trim_matches(|c: char| !c.is_numeric()).split(", ").map(|c| c.parse::<i32>().unwrap());
+ let after = [
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ after_iter.next().unwrap(),
+ ];
+ let mut instruction_iter = chunk[1].split_whitespace().map(|c| c.parse::<i32>().unwrap());
+ UnknownInstruction {
+ before, after,
+ opcode: instruction_iter.next().unwrap(),
+ a: instruction_iter.next().unwrap(),
+ b: instruction_iter.next().unwrap(),
+ c: instruction_iter.next().unwrap(),
+ }
+ })
+ .collect();
+
+ let matches_more_then_3 = unknown_instructions.iter()
+ .filter(|unknown| {
+ unknown.possible_matches().len() >= 3
+ })
+ .count();
+
+ debug!(matches_more_then_3);
+
+
+ let mut opcodes: HashMap<i32, HashSet<Op>> = HashMap::new();
+ for unknown in unknown_instructions {
+ let matches = unknown.possible_matches();
+ let to_insert = match opcodes.get(&unknown.opcode) {
+ None => matches,
+ Some(existing) => existing.intersection(&matches).cloned().collect()
+ };
+ opcodes.insert(unknown.opcode, to_insert);
+ }
+ debug!(opcodes);
+
+ let mut known_opcodes: HashMap<i32, Op> = HashMap::new();
+
+ while known_opcodes.len() < 16 {
+ let (opcode, op) = {
+ let (opcode, opset) = opcodes.iter().find(|(_,set)| set.len() == 1).unwrap();
+ let op = opset.iter().next().unwrap().clone();
+ (opcode.clone(), op)
+ };
+ known_opcodes.insert(opcode, op);
+ opcodes.iter_mut().for_each(|(_, set)| {
+ set.remove(&op);
+ });
+ }
+ debug!(known_opcodes);
+
+
+ let input_part_2 = read_file(&PathBuf::from("inputs/16_2.txt"))?;
+ let instructions: Vec<Instruction> = input_part_2.iter()
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace().map(|c| c.parse::<i32>().unwrap());
+ Instruction {
+ op: known_opcodes.get(&instruction_iter.next().unwrap()).unwrap().clone(),
+ a: instruction_iter.next().unwrap(),
+ b: instruction_iter.next().unwrap(),
+ c: instruction_iter.next().unwrap(),
+ }
+ })
+ .collect();
+
+ let mut registers = [0; 4];
+ for instruction in instructions {
+ registers = instruction.execute(&registers);
+ }
+ debug!(registers);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_17.rs b/2018/src/bin/day_17.rs
new file mode 100644
index 0000000..f479c3a
--- /dev/null
+++ b/2018/src/bin/day_17.rs
@@ -0,0 +1,175 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_17"
+
+struct CoordBuilder {
+ xmin: Option<usize>,
+ xmax: Option<usize>,
+ ymin: Option<usize>,
+ ymax: Option<usize>
+}
+
+#[derive(Debug)]
+struct Coord {
+ xmin: usize,
+ xmax: usize,
+ ymin: usize,
+ ymax: usize
+}
+
+impl CoordBuilder {
+ fn new() -> CoordBuilder {
+ CoordBuilder {
+ xmin: None,
+ xmax: None,
+ ymin: None,
+ ymax: None
+ }
+ }
+
+ fn build(&self) -> Coord {
+ Coord {
+ xmin: self.xmin.unwrap(),
+ xmax: self.xmax.unwrap(),
+ ymin: self.ymin.unwrap(),
+ ymax: self.ymax.unwrap(),
+ }
+ }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum Tile {
+ Clay,
+ RunningWater,
+ HalfSettledWater,
+ SettledWater,
+ Sand
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/17.txt"))?;
+
+ let clay_coords = input.iter().map(|line| {
+ let mut builder = CoordBuilder::new();
+ for split in line.split(", ") {
+ if split.starts_with("x=") {
+ let mut range_split = split
+ .trim_matches(|c: char| !c.is_numeric())
+ .split("..")
+ .map(|s| s.parse().unwrap());
+ if let Some(min) = range_split.next() {
+ builder.xmin = Some(min);
+ builder.xmax = Some(min+1);
+ }
+ if let Some(max) = range_split.next() {
+ builder.xmax = Some(max+1);
+ }
+ } else {
+ let mut range_split = split
+ .trim_matches(|c: char| !c.is_numeric())
+ .split("..")
+ .map(|s| s.parse().unwrap());
+ if let Some(min) = range_split.next() {
+ builder.ymin = Some(min);
+ builder.ymax = Some(min+1);
+ }
+ if let Some(max) = range_split.next() {
+ builder.ymax = Some(max+1);
+ }
+ }
+ }
+ builder.build()
+ }).collect::<Vec<_>>();
+
+ let range = CoordinateSystem {
+ xmin: clay_coords.iter().min_by_key(|coord| coord.xmin).unwrap().xmin-2,
+ xmax: clay_coords.iter().max_by_key(|coord| coord.xmax).unwrap().xmax+2,
+ ymin: clay_coords.iter().min_by_key(|coord| coord.ymin).unwrap().ymin,
+ ymax: clay_coords.iter().max_by_key(|coord| coord.ymax).unwrap().ymax
+ };
+
+ debug!(range);
+
+
+ let mut map = vec!(Tile::Sand; range.vector_size());
+ for coord in clay_coords {
+ for y in coord.ymin..coord.ymax {
+ for x in coord.xmin..coord.xmax {
+ map[range.to_vec(x, y)] = Tile::Clay;
+ }
+ }
+ }
+
+ debug!(map[range.to_vec(500, range.ymin)]);
+ map[range.to_vec(500, range.ymin)] = Tile::RunningWater;
+
+ let mut last_iter = Vec::new();
+ while last_iter != map {
+ last_iter = map.clone();
+ for y in range.ymin..range.ymax-1 {
+ for x in range.xmin..range.xmax {
+ match map[range.to_vec(x, y)] {
+ Tile::RunningWater => {
+ if map[range.to_vec(x, y+1)] == Tile::Sand {
+ map[range.to_vec(x, y+1)] = Tile::RunningWater;
+ }
+ if map[range.to_vec(x-1, y)] == Tile::Sand && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x-1, y)] = Tile::RunningWater;
+ }
+ if map[range.to_vec(x+1, y)] == Tile::Sand && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x+1, y)] = Tile::RunningWater;
+ }
+ if (map[range.to_vec(x-1, y)] == Tile::Clay || map[range.to_vec(x-1, y)] == Tile::HalfSettledWater) && (map[range.to_vec(x, y+1)] == Tile::Clay || map[range.to_vec(x, y+1)] == Tile::SettledWater) {
+ map[range.to_vec(x, y)] = Tile::HalfSettledWater;
+ }
+ },
+ Tile::HalfSettledWater => {
+ if map[range.to_vec(x+1, y)] == Tile::Clay {
+ for xleft in 0.. {
+ if map[range.to_vec(x-xleft, y)] == Tile::HalfSettledWater {
+ map[range.to_vec(x-xleft, y)] = Tile::SettledWater;
+ } else {
+ break;
+ }
+ }
+ }
+ },
+ _ => {}
+ }
+ }
+ }
+ }
+
+ let water_tiles = map.iter()
+ .filter(|&&t| t == Tile::RunningWater || t == Tile::SettledWater || t == Tile::HalfSettledWater)
+ .count();
+ debug!(water_tiles);
+
+ let settled_water_tiles = map.iter()
+ .filter(|&&t| t == Tile::SettledWater)
+ .count();
+ debug!(settled_water_tiles);
+
+ Ok(())
+}
+
+#[derive(Debug)]
+struct CoordinateSystem {
+ xmin: usize,
+ xmax: usize,
+ ymin: usize,
+ ymax: usize
+}
+
+impl CoordinateSystem {
+ fn vector_size(&self) -> usize {
+ (self.xmax - self.xmin) * (self.ymax - self.ymin)
+ }
+ fn to_vec(&self, x: usize, y: usize) -> usize {
+ ((y - self.ymin) * (self.xmax - self.xmin)) + (x - self.xmin)
+ }
+}
diff --git a/2018/src/bin/day_18.rs b/2018/src/bin/day_18.rs
new file mode 100644
index 0000000..3908ea7
--- /dev/null
+++ b/2018/src/bin/day_18.rs
@@ -0,0 +1,123 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+extern crate arrayvec;
+use arrayvec::ArrayVec;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_18"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+enum State {
+ Open,
+ Trees,
+ Lumber
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/18.txt"))?;
+
+// println!("Input: {:?}", input);
+
+ let map = input.iter().map(|line| {
+ line.chars().map(|c| match c {
+ '.' => State::Open,
+ '|' => State::Trees,
+ '#' => State::Lumber,
+ _ => panic!("Unknown character {}", c)
+ }).collect::<Vec<_>>()
+ }).collect::<Vec<_>>();
+// debug!(map);
+
+ let after_10 = simulate(&map, 10);
+ let trees_count_10: usize = after_10.iter().map(|row| row.iter().filter(|&&x| x == State::Trees).count()).sum();
+ let lumber_count_10: usize = after_10.iter().map(|row| row.iter().filter(|&&x| x == State::Lumber).count()).sum();
+ debug!(trees_count_10);
+ debug!(lumber_count_10);
+ debug!(trees_count_10 * lumber_count_10);
+
+ let after_many = simulate(&map, 1000000000);
+ let trees_count_many: usize = after_many.iter().map(|row| row.iter().filter(|&&x| x == State::Trees).count()).sum();
+ let lumber_count_many: usize = after_many.iter().map(|row| row.iter().filter(|&&x| x == State::Lumber).count()).sum();
+ debug!(trees_count_many);
+ debug!(lumber_count_many);
+ debug!(trees_count_many * lumber_count_many);
+
+
+ Ok(())
+}
+
+
+fn simulate(start_map: &Vec<Vec<State>>, duration: u32) -> Vec<Vec<State>> {
+ let mut previous_maps = HashMap::new();
+
+ let mut map = start_map.clone();
+
+ let mut t = 0;
+ while t < duration {
+ let map0 = map.clone();
+ for y in 0..map.len() {
+ for x in 0..map[y].len() {
+ let adjacent = [
+ (x.wrapping_sub(1), y.wrapping_sub(1)),
+ (x, y.wrapping_sub(1)),
+ (x+1, y.wrapping_sub(1)),
+ (x.wrapping_sub(1), y),
+ (x+1, y),
+ (x.wrapping_sub(1), y+1),
+ (x, y+1),
+ (x+1, y+1)
+ ].iter().map(|&(other_x,other_y)| {
+ if other_y >= map0.len() || other_x >= map0[other_y].len() {
+ State::Open
+ } else {
+ map0[other_y][other_x]
+ }
+ }).collect::<ArrayVec<[State; 8]>>();
+
+ let adjacent_trees = adjacent.iter().filter(|&&x| x == State::Trees).count();
+ let adjacent_lumber = adjacent.iter().filter(|&&x| x == State::Lumber).count();
+
+ map[y][x] = match (map0[y][x], adjacent_trees, adjacent_lumber) {
+ (State::Open, trees, _) if trees >= 3 => State::Trees,
+ (State::Open, _, _) => State::Open,
+ (State::Trees, _, lumber) if lumber >= 3 => State::Lumber,
+ (State::Trees, _, _) => State::Trees,
+ (State::Lumber, trees, lumber) if trees >= 1 && lumber >= 1 => State::Lumber,
+ (State::Lumber, _, _) => State::Open
+ }
+ }
+ }
+
+ t += match previous_maps.get(&map) {
+ Some(previous_t) => {
+ let period = t + 1 - previous_t;
+ let whole_periods = (duration - t - 1) / period;
+ (period * whole_periods) + 1
+ },
+ None => 1
+ };
+ previous_maps.insert(map.clone(), t);
+ }
+
+ map
+}
+
+fn debug_print(map: &Vec<Vec<State>>) {
+ for row in map {
+ for c in row {
+ print!("{}", match c {
+ State::Open => '.',
+ State::Trees => '|',
+ State::Lumber => '#'
+ });
+ }
+ println!();
+ }
+ println!();
+ println!();
+}
diff --git a/2018/src/bin/day_19.rs b/2018/src/bin/day_19.rs
new file mode 100644
index 0000000..37ffef1
--- /dev/null
+++ b/2018/src/bin/day_19.rs
@@ -0,0 +1,139 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_19"
+
+#[derive(Debug)]
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, counter_register: usize, registers: &mut [i32; 6]) -> i32{
+ use Op::*;
+
+ registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize] + registers[self.b as usize],
+ Addi => registers[self.a as usize] + self.b,
+ Mulr => registers[self.a as usize] * registers[self.b as usize],
+ Muli => registers[self.a as usize] * self.b,
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 },
+ };
+
+ registers[counter_register]+1
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/19.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let mut input_iter = input.iter();
+ let counter_register: usize = input_iter.next()
+ .map(|line| line.split_whitespace().nth(1).unwrap().parse().unwrap())
+ .unwrap();
+
+ let instructions: Vec<Instruction> = input_iter
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace();
+ Instruction {
+ op: match instruction_iter.next().unwrap() {
+ "addr" => Op::Addr,
+ "addi" => Op::Addi,
+ "mulr" => Op::Mulr,
+ "muli" => Op::Muli,
+ "banr" => Op::Banr,
+ "bani" => Op::Bani,
+ "borr" => Op::Borr,
+ "bori" => Op::Bori,
+ "setr" => Op::Setr,
+ "seti" => Op::Seti,
+ "gtir" => Op::Gtir,
+ "gtri" => Op::Gtri,
+ "gtrr" => Op::Gtrr,
+ "eqir" => Op::Eqir,
+ "eqri" => Op::Eqri,
+ "eqrr" => Op::Eqrr,
+ _ => panic!("unknown instruction")
+ },
+ a: instruction_iter.next().unwrap().parse().unwrap(),
+ b: instruction_iter.next().unwrap().parse().unwrap(),
+ c: instruction_iter.next().unwrap().parse().unwrap(),
+ }
+ })
+ .collect();
+
+ debug!(counter_register);
+ debug!(instructions);
+
+ let part1_registers = execute_program(&instructions, counter_register, [0; 6]);
+ debug!(part1_registers);
+
+ //let part2_registers = execute_program(&instructions, counter_register, [1, 0, 0, 0, 0, 0]);
+ //debug!(part2_registers);
+ part2();
+
+ Ok(())
+}
+
+fn execute_program(instructions: &Vec<Instruction>, counter_register: usize, registers: [i32; 6]) -> [i32; 6] {
+ let mut counter_val: i32 = 0;
+ let mut registers = registers.clone();
+ while counter_val >= 0 && counter_val < instructions.len() as i32 {
+ registers[counter_register] = counter_val;
+ counter_val = instructions[counter_val as usize].execute(counter_register, &mut registers);
+ }
+
+ registers
+}
+
+
+
+fn part2() {
+ let r1 = ((27*28)+29)*30*14*32 + (11 * 19 * 2 * 2) + (3 * 22) + 9;
+ let mut r0 = 0;
+ for r5 in 1..r1+1 {
+ if r1 % r5 == 0 {
+ r0 += r1 / r5;
+ }
+ }
+ debug!(r0);
+}
diff --git a/2018/src/bin/day_2.rs b/2018/src/bin/day_2.rs
new file mode 100644
index 0000000..7700871
--- /dev/null
+++ b/2018/src/bin/day_2.rs
@@ -0,0 +1,53 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+extern crate im_rc;
+use im_rc::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_2"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/2.txt"))?;
+
+ println!("Input: {:?}", input);
+
+ let (twice, thrice) = input.iter().fold((0,0), |(twice, thrice), next| {
+ let occurances = next.chars().fold(HashMap::new(), |occurances, c| {
+ let counter = occurances.get(&c).cloned().unwrap_or(0);
+ occurances.update(c, counter + 1)
+ });
+ let has_twice = occurances.values().any(|count| *count == 2);
+ let has_thrice = occurances.values().any(|count| *count == 3);
+
+ (
+ twice + if has_twice { 1 } else { 0 },
+ thrice + if has_thrice { 1 } else { 0 },
+ )
+ });
+
+ println!("Twice: {}", twice);
+ println!("Thrice: {}", thrice);
+
+ let checksum = twice * thrice;
+ println!("Checksum: {}", checksum);
+
+ for i in &input {
+ for j in &input {
+ let diff = i.chars().zip(j.chars()).fold(0, |diff, (x, y)| {
+ if x != y {
+ diff + 1
+ } else {
+ diff
+ }
+ });
+ if diff == 1 {
+ println!("Diff of 1: {} + {}", i, j);
+ }
+ }
+ }
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_20.rs b/2018/src/bin/day_20.rs
new file mode 100644
index 0000000..6486d72
--- /dev/null
+++ b/2018/src/bin/day_20.rs
@@ -0,0 +1,137 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashSet, HashMap};
+
+// cargo watch -cs "cargo run --release --bin day_20"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+enum Dir {
+ N, S, E, W
+}
+
+#[derive(Debug)]
+struct Room {
+ doors: HashSet<Dir>
+}
+
+impl Room {
+ fn new() -> Room {
+ Room {
+ doors: HashSet::new()
+ }
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = &read_file(&PathBuf::from("inputs/20.txt"))?[0];
+
+ println!("Input: {:?}", input);
+
+ let rooms = populate_rooms(input);
+ let distances = distance_map(&rooms);
+
+ debug!(distance_to_furthest_room(&distances));
+ debug!(distances_more_than_1000(&distances));
+
+ Ok(())
+}
+
+fn populate_rooms(input: &str) -> HashMap<(i32, i32), Room> {
+ let mut rooms: HashMap<(i32, i32), Room> = HashMap::new();
+ rooms.insert((0,0), Room::new());
+
+ let mut coords = vec!((0, 0));
+
+ let mut coord_stack: Vec<(Vec<(i32, i32)>, Vec<(i32, i32)>)> = Vec::new();
+
+ for c in input.chars() {
+ match c {
+ '^' | '$' => {},
+ 'E' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::E);
+ coord.0 += 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'W' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::W);
+ coord.0 -= 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'N' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::N);
+ coord.1 -= 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ 'S' => {
+ for coord in &mut coords {
+ rooms.get_mut(coord).unwrap().doors.insert(Dir::S);
+ coord.1 += 1;
+ rooms.entry(*coord).or_insert(Room::new());
+ }
+ },
+ '(' => {
+ coord_stack.push((coords.clone(), Vec::new()));
+ },
+ '|' => {
+ coord_stack.last_mut().unwrap().1.append(&mut coords);
+ coords = coord_stack.last().unwrap().0.clone();
+ },
+ ')' => {
+ coord_stack.last_mut().unwrap().1.append(&mut coords);
+ coords = coord_stack.pop().unwrap().1;
+ coords.sort();
+ coords.dedup();
+ },
+ c => {
+ panic!("Unknown character {}", c);
+ }
+ }
+ }
+
+ debug!(rooms.len());
+
+ rooms
+}
+
+fn distance_map(rooms: &HashMap<(i32, i32), Room>) -> HashMap<(i32, i32), u32> {
+ let mut distances: HashMap<(i32, i32), u32> = HashMap::new();
+ distances.insert((0,0), 0);
+
+ while distances.len() < rooms.len() {
+ let current_max = *distances.values().max().unwrap();
+ let new_distances = distances.iter()
+ .filter(|(_, &d)| d == current_max)
+ .flat_map(|(&coord, _)| {
+ let room = rooms.get(&coord).unwrap();
+ room.doors.iter().map(|dir| match dir {
+ Dir::N => (coord.0, coord.1-1),
+ Dir::S => (coord.0, coord.1+1),
+ Dir::W => (coord.0-1, coord.1),
+ Dir::E => (coord.0+1, coord.1)
+ }).collect::<Vec<_>>()
+ })
+ .collect::<Vec<_>>();
+ for coord in new_distances {
+ distances.entry(coord).or_insert(current_max + 1);
+ }
+ }
+ distances
+}
+
+fn distance_to_furthest_room(distances: &HashMap<(i32, i32), u32>) -> u32 {
+ distances.values().max().unwrap().clone()
+}
+
+fn distances_more_than_1000(distances: &HashMap<(i32, i32), u32>) -> u32 {
+ distances.values().filter(|&&x| x >= 1000).count() as u32
+}
diff --git a/2018/src/bin/day_21.rs b/2018/src/bin/day_21.rs
new file mode 100644
index 0000000..0d9a97c
--- /dev/null
+++ b/2018/src/bin/day_21.rs
@@ -0,0 +1,137 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::u32;
+
+use std::collections::HashMap;
+// cargo watch -cs "cargo run --release --bin day_21"
+
+use std::i32;
+
+#[derive(Debug)]
+struct Instruction {
+ op: Op,
+ a: i32,
+ b: i32,
+ c: i32
+}
+
+impl Instruction {
+ fn execute(&self, counter_register: usize, registers: &mut [i32; 6]) -> i32{
+ use Op::*;
+
+ registers[self.c as usize] = match self.op {
+ Addr => registers[self.a as usize].wrapping_add(registers[self.b as usize]),
+ Addi => registers[self.a as usize].wrapping_add(self.b),
+ Mulr => registers[self.a as usize].wrapping_mul(registers[self.b as usize]),
+ Muli => registers[self.a as usize].wrapping_mul(self.b),
+ Banr => registers[self.a as usize] & registers[self.b as usize],
+ Bani => registers[self.a as usize] & self.b,
+ Borr => registers[self.a as usize] | registers[self.b as usize],
+ Bori => registers[self.a as usize] | self.b,
+ Setr => registers[self.a as usize],
+ Seti => self.a,
+ Gtir => if self.a > registers[self.b as usize] { 1 } else { 0 },
+ Gtri => if registers[self.a as usize] > self.b { 1 } else { 0 },
+ Gtrr => if registers[self.a as usize] > registers[self.b as usize] { 1 } else { 0 },
+ Eqir => if self.a == registers[self.b as usize] { 1 } else { 0 },
+ Eqri => if registers[self.a as usize] == self.b { 1 } else { 0 },
+ Eqrr => if registers[self.a as usize] == registers[self.b as usize] { 1 } else { 0 },
+ };
+
+ registers[counter_register]+1
+ }
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
+enum Op {
+ Addr,
+ Addi,
+ Mulr,
+ Muli,
+ Banr,
+ Bani,
+ Borr,
+ Bori,
+ Setr,
+ Seti,
+ Gtir,
+ Gtri,
+ Gtrr,
+ Eqir,
+ Eqri,
+ Eqrr
+}
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/21.txt"))?;
+
+ let mut input_iter = input.iter();
+ let counter_register: usize = input_iter.next()
+ .map(|line| line.split_whitespace().nth(1).unwrap().parse().unwrap())
+ .unwrap();
+
+ let instructions: Vec<Instruction> = input_iter
+ .map(|line| {
+ let mut instruction_iter = line.split_whitespace();
+ Instruction {
+ op: match instruction_iter.next().unwrap() {
+ "addr" => Op::Addr,
+ "addi" => Op::Addi,
+ "mulr" => Op::Mulr,
+ "muli" => Op::Muli,
+ "banr" => Op::Banr,
+ "bani" => Op::Bani,
+ "borr" => Op::Borr,
+ "bori" => Op::Bori,
+ "setr" => Op::Setr,
+ "seti" => Op::Seti,
+ "gtir" => Op::Gtir,
+ "gtri" => Op::Gtri,
+ "gtrr" => Op::Gtrr,
+ "eqir" => Op::Eqir,
+ "eqri" => Op::Eqri,
+ "eqrr" => Op::Eqrr,
+ _ => panic!("unknown instruction")
+ },
+ a: instruction_iter.next().unwrap().parse().unwrap(),
+ b: instruction_iter.next().unwrap().parse().unwrap(),
+ c: instruction_iter.next().unwrap().parse().unwrap(),
+ }
+ })
+ .collect();
+
+ execute_program(&instructions, counter_register, [0, 0, 0, 0, 0, 0]);
+
+ Ok(())
+}
+
+fn execute_program(instructions: &Vec<Instruction>, counter_register: usize, registers: [i32; 6]) {
+ let mut instructions_executed: u64 = 0;
+ let mut counter_val: i32 = 0;
+ let mut registers = registers.clone();
+ let mut halting_values = HashMap::new();
+
+ while counter_val >= 0 && counter_val < instructions.len() as i32 {
+ if counter_val == 28 {
+ if halting_values.contains_key(&registers[4]) {
+ break;
+ }
+ halting_values.entry(registers[4]).or_insert(instructions_executed+2);
+ }
+ registers[counter_register] = counter_val;
+ counter_val = instructions[counter_val as usize].execute(counter_register, &mut registers);
+ instructions_executed += 1;
+ }
+
+ let (min_halting, min_halting_time) = halting_values.iter().min_by_key(|&(_, v)| v).unwrap();
+ debug!(min_halting);
+ debug!(min_halting_time);
+ let (max_halting, max_halting_time) = halting_values.iter().max_by_key(|&(_, v)| v).unwrap();
+ debug!(max_halting);
+ debug!(max_halting_time);
+
+}
diff --git a/2018/src/bin/day_22.rs b/2018/src/bin/day_22.rs
new file mode 100644
index 0000000..f9013cf
--- /dev/null
+++ b/2018/src/bin/day_22.rs
@@ -0,0 +1,165 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::u32;
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_22"
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+struct Position {
+ x: u32,
+ y: u32,
+ equipment: u32 // 0 = nothing, 1 = torch, 2 = climbing
+}
+
+impl Position {
+ fn adjacent(&self, map: &Vec<Vec<u32>>) -> Vec<(Position, u32)> {
+ let all_adjacent = [
+ (Position {
+ x: self.x.saturating_sub(1),
+ ..*self
+ }, 1),
+ (Position {
+ y: self.y.saturating_sub(1),
+ ..*self
+ }, 1),
+ (Position {
+ x: self.x+1,
+ ..*self
+ }, 1),
+ (Position {
+ y: self.y+1,
+ ..*self
+ }, 1),
+ (Position {
+ equipment: (self.equipment+1)%3,
+ ..*self
+ }, 7),
+ (Position {
+ equipment: (self.equipment+2)%3,
+ ..*self
+ }, 7)
+ ];
+ all_adjacent.iter()
+ .filter(|(p, _)| {
+ let region = map[p.y as usize][p.x as usize];
+ let out_of_bounds = self == p;
+ let invalid_equipment = (region == 0 && p.equipment == 0) ||
+ (region == 1 && p.equipment == 1) ||
+ (region == 2 && p.equipment == 2);
+ !out_of_bounds && !invalid_equipment
+ })
+ .cloned()
+ .collect()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = &read_file(&PathBuf::from("inputs/22.txt"))?;
+
+ let depth: u32 = input[0].trim_matches(|c: char| !c.is_numeric()).parse().unwrap();
+ debug!(depth);
+ let mut input_target_iter = input[1]
+ .split(|c: char| !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse::<u32>().unwrap());
+
+ let target_x = input_target_iter.next().unwrap();
+ let target_y = input_target_iter.next().unwrap();
+
+ debug!((target_x, target_y));
+
+ let mut map_width = target_x;
+ let mut map_height = target_y;
+ let mut map = build_map(map_width, map_height, depth, target_x, target_y);
+
+ let risk: u32 = map.iter().take((target_y+1) as usize).map(|row| row.iter().take((target_x+1) as usize).sum::<u32>()).sum();
+ debug!(risk);
+
+
+ let mut distances = HashMap::new();
+ let mut unexplored = HashSet::new();
+ let initial = Position {
+ x: 0,
+ y: 0,
+ equipment: 1
+ };
+ let target = Position {
+ x: target_x,
+ y: target_y,
+ equipment: 1
+ };
+ distances.insert(initial, 0);
+ unexplored.insert(initial);
+
+ while !distances.contains_key(&target) || unexplored.contains(&target) {
+ let (current, current_distance) = unexplored.iter()
+ .map(|unexp| (unexp.clone(), distances.get(unexp).cloned().unwrap()))
+ .min_by_key(|(_, d)| *d)
+ .unwrap();
+
+ if current.y+1 >= map_height {
+ map_height *= 2;
+ map = build_map(map_width, map_height, depth, target_x, target_y);
+ debug!(map_height);
+ }
+ if current.x+1 >= map_width {
+ map_width *= 2;
+ map = build_map(map_width, map_height, depth, target_x, target_y);
+ debug!(map_width);
+ }
+
+ for (adjacent, further) in current.adjacent(&map) {
+ let distance = current_distance + further;
+ let best_previous_distance = distances.get(&adjacent).cloned().unwrap_or(u32::MAX);
+ if best_previous_distance > distance {
+ distances.insert(adjacent, distance);
+ unexplored.insert(adjacent);
+ }
+
+ }
+ unexplored.remove(&current);
+ }
+
+ debug!(distances.get(&target));
+
+ Ok(())
+}
+
+
+fn build_map(max_x: u32, max_y: u32, depth: u32, target_x: u32, target_y: u32) -> Vec<Vec<u32>> {
+ let mut geologic_index: Vec<Vec<u32>> = Vec::new();
+ let mut erosion_level: Vec<Vec<u32>> = Vec::new();
+ let mut region_type: Vec<Vec<u32>> = Vec::new();
+
+ for y in 0..max_y {
+ let mut geologic_row = Vec::new();
+ let mut erosion_row = Vec::new();
+ let mut type_row = Vec::new();
+
+ for x in 0..max_x {
+ let index = match (x, y) {
+ (0, 0) => 0,
+ (x, y) if x == target_x && y == target_y => 0,
+ (x, 0) => x*16807,
+ (0, y) => y*48271,
+ (x, y) => erosion_row[(x-1) as usize] * erosion_level[(y-1) as usize][x as usize]
+ };
+ let erosion = (index + depth) % 20183;
+ let block_type = erosion % 3;
+
+ geologic_row.push(index);
+ erosion_row.push(erosion);
+ type_row.push(block_type);
+ }
+
+ geologic_index.push(geologic_row);
+ erosion_level.push(erosion_row);
+ region_type.push(type_row);
+ }
+ region_type
+}
diff --git a/2018/src/bin/day_23.rs b/2018/src/bin/day_23.rs
new file mode 100644
index 0000000..463f3d3
--- /dev/null
+++ b/2018/src/bin/day_23.rs
@@ -0,0 +1,114 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::cmp;
+
+// cargo watch -cs "cargo run --release --bin day_23"
+
+#[derive(Debug, Clone)]
+struct Bot {
+ radius: i64,
+ position: Position
+}
+
+#[derive(Debug, Clone)]
+struct Position {
+ x: i64,
+ y: i64,
+ z: i64
+}
+
+impl Position {
+ fn distance(&self, other: &Position) -> i64 {
+ (other.z - self.z).abs() +
+ (other.y - self.y).abs() +
+ (other.x - self.x).abs()
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/23.txt"))?;
+
+ let mut bots: Vec<Bot> = input.iter().map(|line| {
+ let mut line_iter = line.split(|c: char| c != '-' && !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse::<i64>().unwrap());
+ Bot {
+ position: Position {
+ x: line_iter.next().unwrap(),
+ y: line_iter.next().unwrap(),
+ z: line_iter.next().unwrap()
+ },
+ radius: line_iter.next().unwrap()
+ }
+ }).collect();
+
+ let biggest_radius = bots.iter().max_by_key(|bot| bot.radius).unwrap();
+ let biggest_radius_in_range_count = bots.iter()
+ .filter(|bot| biggest_radius.position.distance(&bot.position) <= biggest_radius.radius)
+ .count();
+ debug!(biggest_radius);
+ debug!(biggest_radius_in_range_count);
+
+
+ let min_x = bots.iter().min_by_key(|bot| bot.position.x).unwrap().position.x;
+ let max_x = bots.iter().max_by_key(|bot| bot.position.x).unwrap().position.x;
+ debug!(min_x);
+ debug!(max_x);
+ let min_y = bots.iter().min_by_key(|bot| bot.position.y).unwrap().position.y;
+ let max_y = bots.iter().max_by_key(|bot| bot.position.y).unwrap().position.y;
+ debug!(min_y);
+ debug!(max_y);
+ let min_z = bots.iter().min_by_key(|bot| bot.position.z).unwrap().position.z;
+ let max_z = bots.iter().max_by_key(|bot| bot.position.z).unwrap().position.z;
+ debug!(min_z);
+ debug!(max_z);
+
+ let origin = Position { x: 0, y: 0, z: 0 };
+
+ let mut radius = cmp::max(max_x - min_x, cmp::max(max_y-min_y, max_z-min_z));
+ let mut center = origin.clone();
+
+ while radius > 0 {
+ let delta = 0.8;
+ let new_radius = if radius == 1 { 0 } else { (radius as f32 * delta) as i64 };
+ let deltas = [-1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0];
+ let subs: Vec<Position> = deltas.iter().flat_map(|&dx| {
+ deltas.iter().flat_map(|&dy| {
+ deltas.iter().map(|&dz| {
+ Position {
+ x: center.x + (radius as f32 * dx) as i64,
+ y: center.y + (radius as f32 * dy) as i64,
+ z: center.z + (radius as f32 * dz) as i64
+ }
+ }).collect::<Vec<_>>()
+ }).collect::<Vec<_>>()
+ }).collect();
+
+ center = subs.iter()
+ .map(|new_center| {
+ (new_center, bots.iter()
+ .filter(|bot| bot.position.distance(&new_center) <= bot.radius + new_radius)
+ .count())
+ })
+ .max_by(|(a_center, a_bots), (b_center, b_bots)| {
+ a_bots.cmp(&b_bots).then(b_center.distance(&origin).cmp(&a_center.distance(&origin)))
+ })
+ .map(|(center, _)| center)
+ .unwrap().clone();
+
+ radius = new_radius;
+ }
+
+ let connected_in_radius = bots.iter()
+ .filter(|bot| bot.position.distance(&center) <= bot.radius)
+ .count();
+ debug!(connected_in_radius);
+ debug!(center);
+ let distance_to_origin = center.distance(&origin);
+ debug!(distance_to_origin);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_24.rs b/2018/src/bin/day_24.rs
new file mode 100644
index 0000000..d52f7d0
--- /dev/null
+++ b/2018/src/bin/day_24.rs
@@ -0,0 +1,217 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::str::FromStr;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_24"
+
+#[derive(Debug, Clone)]
+struct Army {
+ units: u32,
+ hp: u32,
+ weaknesses: Vec<String>,
+ immunities: Vec<String>,
+ damage_type: String,
+ damage: u32,
+ initiative: u32
+}
+
+impl Army {
+ fn effective_power(&self) -> u32 {
+ self.units * self.damage
+ }
+
+ fn actual_damage(&self, other: &Army) -> u32 {
+ let modifier = if other.weaknesses.contains(&self.damage_type) {
+ 2
+ } else if other.immunities.contains(&self.damage_type) {
+ 0
+ } else {
+ 1
+ };
+ self.effective_power() * modifier
+ }
+}
+
+impl FromStr for Army {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ // 2991 units each with 8084 hit points (weak to fire) with an attack that does 19 radiation damage at initiative 11
+ let mut words = s.split_whitespace();
+ let units = words.next().unwrap().parse()?;
+ let hp = words.nth(3).unwrap().parse()?;
+ let _ = words.nth(1);
+
+ let mut weaknesses = Vec::new();
+ let mut immunities = Vec::new();
+
+ let mut bracket_handled = false;
+ while !bracket_handled {
+ let maybe_weak_or_immune = words.next().unwrap().trim_matches(|c: char| !c.is_alphabetic());
+ if maybe_weak_or_immune == "weak" {
+ let mut weakness = words.nth(1).unwrap();
+ weaknesses.push(weakness.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ while weakness.ends_with(',') {
+ weakness = words.next().unwrap();
+ weaknesses.push(weakness.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ }
+ }
+ else if maybe_weak_or_immune == "immune" {
+ let mut immunity = words.nth(1).unwrap();
+ immunities.push(immunity.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ while immunity.ends_with(',') {
+ immunity = words.next().unwrap();
+ immunities.push(immunity.trim_matches(|c: char| !c.is_alphabetic()).to_string());
+ }
+ }
+ else {
+ bracket_handled = true;
+ }
+ }
+ let damage = words.nth(4).unwrap().parse()?;
+ let damage_type = words.next().unwrap().to_string();
+ let initiative = words.nth(3).unwrap().parse()?;
+
+ Ok(Army {
+ units, hp, weaknesses, immunities, damage_type, damage, initiative
+ })
+ }
+}
+
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/24.txt"))?;
+
+ let mut input_iter = input.iter();
+ let _ = input_iter.next();
+ let immune_army: Vec<Army> = input_iter.by_ref()
+ .take_while(|&line| line != "Infection:")
+ .map(|line| line.parse().unwrap())
+ .collect();
+ let infection_army: Vec<Army> = input_iter
+ .map(|line| line.parse().unwrap())
+ .collect();
+
+ let (unboosted_immune_army_size, unboosted_infection_army_size) = simulate(&immune_army, &infection_army, 0);
+ debug!(unboosted_immune_army_size);
+ debug!(unboosted_infection_army_size);
+
+ for boost in 0.. {
+ debug!(boost);
+ let (immune_army_size, infection_army_size) = simulate(&immune_army, &infection_army, boost);
+ debug!(immune_army_size);
+ debug!(infection_army_size);
+ if immune_army_size > 0 {
+ break;
+ }
+ }
+
+ Ok(())
+}
+
+
+fn target_selection(targeting_army: &Vec<Army>, targeted_army: &Vec<Army>) -> HashMap<usize, usize> {
+ let mut targets = HashMap::new();
+ for (i, army) in targeting_army.iter().enumerate() {
+ let best_target = (0..targeted_army.len())
+ .filter(|potential_target| !targets.values().any(|targeted| targeted == potential_target))
+ .fold(None, |best_target, next| {
+ let next_actual_damage = army.actual_damage(&targeted_army[next]);
+ let last_best_actual_damage = best_target.map(|best_target| army.actual_damage(&targeted_army[best_target])).unwrap_or(0);
+ let next_effective_power = targeted_army[next].effective_power();
+ let last_best_effective_power = best_target.map(|best_target: usize| targeted_army[best_target].effective_power()).unwrap_or(0);
+ let next_initiative = targeted_army[next].initiative;
+ let last_best_initiative = best_target.map(|best_target| targeted_army[best_target].initiative).unwrap_or(0);
+ if next_actual_damage == 0 && last_best_actual_damage == 0 {
+ None
+ } else if next_actual_damage > last_best_actual_damage {
+ Some(next)
+ } else if next_actual_damage == last_best_actual_damage && next_effective_power > last_best_effective_power {
+ Some(next)
+ } else if next_actual_damage == last_best_actual_damage && next_effective_power == last_best_effective_power && next_initiative > last_best_initiative {
+ Some(next)
+ } else {
+ best_target
+ }
+ });
+
+ if let Some(best_target) = best_target {
+ targets.insert(i, best_target);
+ }
+ }
+
+ targets
+}
+
+fn attack(aggressor: &Army, target: &mut Army) {
+ let damage = aggressor.actual_damage(target);
+ let units_destroyed = damage / target.hp;
+ target.units = target.units.saturating_sub(units_destroyed);
+}
+
+
+fn simulate(immune_army: &[Army], infection_army: &[Army], boost: u32) -> (u32, u32) {
+ let mut infection_army = Vec::from(infection_army);
+
+ let mut immune_army: Vec<Army> = immune_army.iter().map(|army| Army {
+ damage: army.damage + boost,
+ ..army.clone()
+ }).collect();
+
+ let mut watchdog_sum = immune_army.iter().map(|a| a.units).sum::<u32>() + infection_army.iter().map(|a| a.units).sum::<u32>();
+ while immune_army.len() > 0 && infection_army.len() > 0 {
+ immune_army.sort_by(|a, b| b.effective_power().cmp(&a.effective_power()).then(b.initiative.cmp(&a.initiative)));
+ infection_army.sort_by(|a, b| b.effective_power().cmp(&a.effective_power()).then(b.initiative.cmp(&a.initiative)));
+
+ let mut immune_targets = target_selection(&immune_army, &infection_army);
+ let mut infection_targets = target_selection(&infection_army, &immune_army);
+
+ while immune_targets.len() > 0 || infection_targets.len() > 0 {
+ let next_immune = immune_targets.keys()
+ .map(|&k| (k, immune_army[k].initiative.clone()))
+ .max_by_key(|(_, initiative)| *initiative);
+ let next_infection = infection_targets.keys()
+ .map(|&k| (k, infection_army[k].initiative.clone()))
+ .max_by_key(|(_, initiative)| *initiative);
+ match (next_immune, next_infection) {
+ (None, None) => {
+ panic!("No targets left")
+ },
+ (Some((immune_key, immune_init)), Some((_infect_key, infect_init))) if immune_init > infect_init => {
+ attack(&immune_army[immune_key], &mut infection_army[*immune_targets.get(&immune_key).unwrap()]);
+ immune_targets.remove(&immune_key);
+ },
+ (Some((_immune_key, _immune_init)), Some((infect_key, _infect_init))) => {
+ attack(&infection_army[infect_key], &mut immune_army[*infection_targets.get(&infect_key).unwrap()]);
+ infection_targets.remove(&infect_key);
+ },
+ (Some((immune_key, _immune_init)), None) => {
+ attack(&immune_army[immune_key], &mut infection_army[*immune_targets.get(&immune_key).unwrap()]);
+ immune_targets.remove(&immune_key);
+ },
+ (None, Some((infect_key, _infect_init))) => {
+ attack(&infection_army[infect_key], &mut immune_army[*infection_targets.get(&infect_key).unwrap()]);
+ infection_targets.remove(&infect_key);
+ }
+ };
+ }
+
+ immune_army.retain(|a| a.units > 0);
+ infection_army.retain(|a| a.units > 0);
+
+ let new_watchdog_sum = immune_army.iter().map(|a| a.units).sum::<u32>() + infection_army.iter().map(|a| a.units).sum::<u32>();
+ if watchdog_sum == new_watchdog_sum {
+ // Stalemate! Everyone loses.
+ return (0, 0);
+ }
+ watchdog_sum = new_watchdog_sum;
+ }
+
+ (immune_army.iter().map(|a| a.units).sum(), infection_army.iter().map(|a| a.units).sum())
+}
diff --git a/2018/src/bin/day_25.rs b/2018/src/bin/day_25.rs
new file mode 100644
index 0000000..9e74f49
--- /dev/null
+++ b/2018/src/bin/day_25.rs
@@ -0,0 +1,47 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_25"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/25.txt"))?;
+
+ let mut constellations: Vec<Vec<Vec<i32>>> = input.iter()
+ .map(|line| line.split(',').map(|x| x.parse().unwrap()).collect::<Vec<_>>())
+ .map(|points| vec!(points))
+ .collect();
+
+ // debug!(constellations);
+
+ while join_constellations(&mut constellations) {
+ }
+
+ debug!(constellations.len());
+
+ Ok(())
+}
+
+fn distance(xs: &[i32], ys: &[i32]) -> i32 {
+ xs.iter().zip(ys.iter()).map(|(x,y)| (x - y).abs()).sum()
+}
+
+fn join_constellations(constellations: &mut Vec<Vec<Vec<i32>>>) -> bool {
+ for i in 0..constellations.len()-1 {
+ for j in i+1..constellations.len() {
+ let connected = constellations[i].iter().any(|ci| {
+ constellations[j].iter().any(|cj| {
+ distance(&ci, &cj) <= 3
+ })
+ });
+ if connected {
+ let mut to_join = constellations.remove(j);
+ constellations[i].append(&mut to_join);
+ return true;
+ }
+ }
+ }
+ false
+}
diff --git a/2018/src/bin/day_3.rs b/2018/src/bin/day_3.rs
new file mode 100644
index 0000000..685e288
--- /dev/null
+++ b/2018/src/bin/day_3.rs
@@ -0,0 +1,76 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_3"
+
+#[derive(Debug)]
+struct Claim {
+ id: u32,
+ x: u32,
+ y: u32,
+ w: u32,
+ h: u32
+}
+
+impl FromStr for Claim {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ //#123 @ 3,2: 5x4
+ let split = s
+ .split(|c: char| !c.is_numeric())
+ .filter(|s| !s.is_empty())
+ .map(|s| s.parse())
+ .collect::<Result<Vec<u32>, _>>()?;
+
+ Ok(Claim {
+ id: split[0],
+ x: split[1],
+ y: split[2],
+ w: split[3],
+ h: split[4]
+ })
+ }
+}
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/3.txt"))?;
+ let claims = input.iter().map(|line| line.parse::<Claim>()).collect::<Result<Vec<_>, _>>()?;
+
+ let mut claimed = HashMap::new();
+ for claim in &claims {
+ for x in claim.x..claim.x+claim.w {
+ for y in claim.y..claim.y+claim.h {
+ *claimed.entry((x,y)).or_insert(0) += 1;
+ }
+ }
+ }
+
+ let conflicts = claimed.values().filter(|&x| *x > 1).count();
+ println!("Conflicts: {}", conflicts);
+
+ let conflict_free = claims.iter().filter(|c| check_for_conflicts(c, &claimed)).collect::<Vec<_>>();
+
+ println!("Conflict free: {:?}", conflict_free);
+
+ Ok(())
+}
+
+
+fn check_for_conflicts(claim: &Claim, claimed: &HashMap<(u32, u32), u32>) -> bool {
+ for x in claim.x..claim.x+claim.w {
+ for y in claim.y..claim.y+claim.h {
+ if claimed.get(&(x,y)).map_or(false, |c| *c > 1) {
+ return false;
+ }
+ }
+ }
+ true
+}
diff --git a/2018/src/bin/day_4.rs b/2018/src/bin/day_4.rs
new file mode 100644
index 0000000..2010cf8
--- /dev/null
+++ b/2018/src/bin/day_4.rs
@@ -0,0 +1,116 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::str::FromStr;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::collections::HashMap;
+
+// cargo watch -cs "cargo run --release --bin day_4"
+
+#[derive(Debug, PartialOrd, Ord, PartialEq, Eq)]
+struct Event {
+ date: String,
+ hour: u32,
+ minute: u32,
+ what: EventType
+}
+
+#[derive(Debug, PartialOrd, Ord, PartialEq, Eq)]
+enum EventType {
+ BeginShift(u32),
+ Asleep,
+ Awake
+}
+
+impl FromStr for Event {
+ type Err = Box<Error>;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let date = s.split_whitespace().nth(0).unwrap().trim_matches('[').to_string();
+ let time = s.split_whitespace().nth(1).unwrap().trim_matches(']');
+ let hour = time.split(':').nth(0).unwrap().parse().unwrap();
+ let minute = time.split(':').nth(1).unwrap().parse().unwrap();
+ let guard = s.split_whitespace().nth(3).and_then(|x| x.trim_matches('#').parse().ok());
+
+ let what = match s.split_whitespace().nth(2).unwrap() {
+ "Guard" => EventType::BeginShift(guard.unwrap()),
+ "falls" => EventType::Asleep,
+ "wakes" => EventType::Awake,
+ _ => panic!("Unknown event")
+ };
+
+ Ok(Event {
+ date,
+ hour,
+ minute,
+ what
+ })
+ }
+}
+
+#[derive(Debug)]
+struct GuardSleepStats {
+ per_minute: HashMap<u32, u32>
+}
+
+impl GuardSleepStats {
+ fn new() -> GuardSleepStats {
+ GuardSleepStats {
+ per_minute: HashMap::new()
+ }
+ }
+ fn total(&self) -> u32 {
+ self.per_minute.values().sum()
+ }
+}
+
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/4.txt"))?;
+
+ //println!("Input: {:?}", input);
+
+ let mut events: Vec<Event> = input.iter().map(|line| line.parse().unwrap()).collect();
+ events.sort();
+ //println!("Events: {:?}", events);
+
+
+ let mut sleep = HashMap::new();
+ let mut current_guard = 0;
+ let mut last_asleep = 0;
+ for event in events {
+ match event.what {
+ EventType::BeginShift(guard) => current_guard = guard,
+ EventType::Asleep => last_asleep = event.minute,
+ EventType::Awake => {
+ for i in last_asleep..event.minute {
+ *sleep
+ .entry(current_guard)
+ .or_insert(GuardSleepStats::new())
+ .per_minute
+ .entry(i)
+ .or_insert(0) += 1
+ }
+ }
+ }
+ }
+
+ println!("Stats: {:?}", sleep);
+
+ let (sleepiest_guard, sleepiest_stats) = sleep.iter().max_by_key(|(_,v)| v.total()).unwrap().clone();
+ println!("Sleepiest guard: {:?}", sleepiest_guard);
+ let (sleepiest_minute, sleepiest_occurances) = sleepiest_stats.per_minute.iter().max_by_key(|(_,v)| *v).unwrap().clone();
+ println!("Sleepiest minute: {:?}", sleepiest_minute);
+ println!("Part 1 answer: {}", sleepiest_guard * sleepiest_minute);
+
+
+ let (specific_minute_offender, specific_minute_stats) = sleep.iter().max_by_key(|(_,v)| v.per_minute.values().max().unwrap()).unwrap().clone();
+ println!("Specific minute: {:?}", specific_minute_offender);
+ let (specific_minute_minute, specific_minute_occurances) = specific_minute_stats.per_minute.iter().max_by_key(|(_,v)| *v).unwrap().clone();
+ println!("Specific Minute minute: {:?}", specific_minute_minute);
+ println!("Part 2 answer: {}", specific_minute_offender * specific_minute_minute);
+
+ Ok(())
+}
diff --git a/2018/src/bin/day_5.rs b/2018/src/bin/day_5.rs
new file mode 100644
index 0000000..2b24d4c
--- /dev/null
+++ b/2018/src/bin/day_5.rs
@@ -0,0 +1,53 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+use std::cmp;
+
+// cargo watch -cs "cargo run --release --bin day_5"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/5.txt"))?;
+
+ //println!("Input: {:?}", input);
+ let polymer = {
+ let mut polymer: Vec<char> = input[0].chars().collect();
+ reduce(&mut polymer);
+ polymer
+ };
+
+ debug!(polymer.len());
+
+
+ let mut min_length = polymer.len();
+ for c in "abcdefghijklmnopqrstuvwxyz".chars() {
+ let mut polymer_without_char = polymer.clone();
+ polymer_without_char.retain(|x| x.to_ascii_lowercase() != c);
+ reduce(&mut polymer_without_char);
+ min_length = cmp::min(min_length, polymer_without_char.len());
+ }
+
+ debug!(min_length);
+
+ Ok(())
+}
+
+
+fn reduce(polymer: &mut Vec<char>) {
+ let mut had_reductions = true;
+ while had_reductions {
+ had_reductions = false;
+
+ for i in 0..polymer.len()-1 {
+ if polymer[i].to_ascii_lowercase() == polymer[i+1].to_ascii_lowercase() && polymer[i] != polymer[i+1] {
+ had_reductions = true;
+ polymer.remove(i+1);
+ polymer.remove(i);
+
+ // break isn't efficient, but does prevent indexing issues after removing
+ break;
+ }
+ }
+ }
+}
diff --git a/2018/src/bin/day_6.rs b/2018/src/bin/day_6.rs
new file mode 100644
index 0000000..16c8782
--- /dev/null
+++ b/2018/src/bin/day_6.rs
@@ -0,0 +1,103 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashSet, HashMap};
+
+// cargo watch -cs "cargo run --release --bin day_6"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/6.txt"))?;
+ let coordinates = input.iter().map(|line| {
+ let mut split = line.split(|c: char| !c.is_numeric());
+ let x: i32 = split.next().unwrap().parse().unwrap();
+ let _ = split.next();
+ let y: i32 = split.next().unwrap().parse().unwrap();
+ (x, y)
+ }).collect::<Vec<_>>();
+ debug!(coordinates);
+
+ let min_x = coordinates.iter().map(|(x, _)| x).min().unwrap().clone();
+ let max_x = coordinates.iter().map(|(x, _)| x).max().unwrap().clone();
+ let min_y = coordinates.iter().map(|(_, y)| y).min().unwrap().clone();
+ let max_y = coordinates.iter().map(|(_, y)| y).max().unwrap().clone();
+
+ debug!(min_x);
+ debug!(max_x);
+ debug!(min_y);
+ debug!(max_y);
+
+ let mut infinite = HashSet::new();
+ for x in min_x..max_x+1 {
+ for y in &[0, max_y] {
+ if let Some(coord) = find_closest(&coordinates, x, *y) {
+ infinite.insert(coord);
+ }
+ }
+ }
+ for y in min_y..max_y+1 {
+ for x in &[0, max_x] {
+ if let Some(coord) = find_closest(&coordinates, *x, y) {
+ infinite.insert(coord);
+ }
+ }
+ }
+
+ debug!(infinite);
+
+
+ let mut areas = HashMap::new();
+ for x in min_x..max_x+1 {
+ for y in min_y..max_y+1 {
+ if let Some(coord) = find_closest(&coordinates, x, y) {
+ *areas.entry(coord).or_insert(0) += 1;
+ }
+ }
+ }
+
+ debug!(areas);
+
+ let biggest_non_infinite = areas.iter()
+ .filter(|(k,_)| !infinite.contains(&k))
+ .max_by_key(|(_,v)| *v);
+ debug!(biggest_non_infinite);
+
+
+
+ let safe_distance = 10000;
+ let mut safe_size = 0;
+ for x in min_x..max_x+1 {
+ for y in min_y..max_y+1 {
+ let distance_sum: i32 = coordinates.iter()
+ .map(|(x1, y1)| manhattan_distance(*x1, *y1, x, y))
+ .sum();
+ if distance_sum < safe_distance {
+ safe_size += 1;
+ }
+ }
+ }
+ debug!(safe_size);
+
+ Ok(())
+}
+
+fn find_closest(coordinates: &Vec<(i32, i32)>, x: i32, y: i32) -> Option<usize> {
+ let mut distances = coordinates.iter()
+ .map(|(x1, y1)| manhattan_distance(*x1, *y1, x, y))
+ .enumerate()
+ .collect::<Vec<_>>();
+ distances.sort_by_key(|(_, d)| *d);
+
+ if distances[0] == distances[1] {
+ None
+ }
+ else {
+ distances.first().map(|(i, _)| *i)
+ }
+}
+
+fn manhattan_distance(x1: i32, y1: i32, x2: i32, y2: i32) -> i32 {
+ (x2-x1).abs() + (y2-y1).abs()
+}
diff --git a/2018/src/bin/day_7.rs b/2018/src/bin/day_7.rs
new file mode 100644
index 0000000..ec9d0be
--- /dev/null
+++ b/2018/src/bin/day_7.rs
@@ -0,0 +1,135 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::collections::{HashMap, HashSet};
+
+// cargo watch -cs "cargo run --release --bin day_7"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/7.txt"))?;
+
+ //println!("Input: {:?}", input);
+
+ let (all_steps, blockers) = parse(&input);
+
+
+ let mut serial_ordered = Vec::new();
+ let mut remaining_steps = all_steps.clone();
+ let mut remaining_blockers = blockers.clone();
+
+ while !remaining_steps.is_empty() {
+ let mut unblocked: Vec<char> = remaining_steps.iter()
+ .filter(|c| remaining_blockers.get(c).map(|blockers| blockers.is_empty()).unwrap_or(true))
+ .cloned()
+ .collect();
+ unblocked.sort();
+
+ let next_step = unblocked.first().unwrap().clone();
+
+ serial_ordered.push(next_step);
+ remaining_steps.remove(&next_step);
+ for (_k, mut v) in &mut remaining_blockers {
+ v.retain(|c| *c != next_step);
+ }
+ }
+
+ debug!(serial_ordered);
+ for c in serial_ordered {
+ print!("{}", c);
+ }
+ println!();
+
+
+ let workers = 5;
+ let mut worker_tasks: Vec<Task> = Vec::new();
+ let mut parallel_ordered = Vec::new();
+ let mut remaining_steps = all_steps.clone();
+ let mut remaining_blockers = blockers.clone();
+ let mut current_time = 0;
+
+ while !remaining_steps.is_empty() {
+ let mut unblocked: Vec<char> = remaining_steps.iter()
+ .filter(|c|
+ remaining_blockers.get(c).map(|blockers| blockers.is_empty()).unwrap_or(true)
+ && !worker_tasks.iter().any(|w| w.t == **c)
+ )
+ .cloned()
+ .collect();
+ unblocked.sort();
+
+ let next_unblocked = if worker_tasks.len() < workers {
+ unblocked.first().cloned()
+ } else {
+ None
+ };
+
+ if let Some(next_task) = next_unblocked {
+ worker_tasks.push(Task {
+ t: next_task,
+ completion: current_time + time(next_task)
+ });
+ }
+ else {
+ //Advance time
+ worker_tasks.sort_by_key(|w| w.completion);
+ let complete = worker_tasks.swap_remove(0);
+ current_time = complete.completion;
+ let next_step = complete.t;
+
+ parallel_ordered.push(next_step);
+ remaining_steps.remove(&next_step);
+ for (_k, mut v) in &mut remaining_blockers {
+ v.retain(|c| *c != next_step);
+ }
+ }
+
+
+ }
+
+ debug!(parallel_ordered);
+ for c in parallel_ordered {
+ print!("{}", c);
+ }
+ println!();
+ debug!(current_time);
+
+
+ Ok(())
+}
+
+#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+struct Task {
+ t: char,
+ completion: u32
+}
+
+
+fn parse(input: &Vec<String>) -> (HashSet<char>, HashMap<char, Vec<char>>) {
+ let mut blockers = HashMap::new();
+ let mut all_steps = HashSet::new();
+
+ for line in input {
+ //Step I must be finished before step C can begin.
+ let mut split = line.split_whitespace();
+ let blocker: char = split.nth(1).and_then(|x| x.chars().nth(0)).unwrap();
+ let blocked: char = split.nth(5).and_then(|x| x.chars().nth(0)).unwrap();
+
+ blockers.entry(blocked).or_insert(Vec::new()).push(blocker);
+ all_steps.insert(blocker);
+ all_steps.insert(blocked);
+ }
+
+ debug!(all_steps);
+ debug!(blockers);
+
+ (all_steps, blockers)
+}
+
+fn time(c: char) -> u32 {
+ let base_time = 60;
+ let char_time = c as u32 - 'A' as u32 + 1;
+ base_time + char_time
+}
diff --git a/2018/src/bin/day_8.rs b/2018/src/bin/day_8.rs
new file mode 100644
index 0000000..59813b0
--- /dev/null
+++ b/2018/src/bin/day_8.rs
@@ -0,0 +1,66 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+use std::slice::Iter;
+
+// cargo watch -cs "cargo run --release --bin day_8"
+
+fn main() -> Result<(), Box<Error>> {
+ let input: Vec<u32> = read_file(&PathBuf::from("inputs/8.txt"))
+ .map(|lines| lines[0]
+ .split_whitespace()
+ .map(|s| s.parse().unwrap())
+ .collect()
+ )?;
+
+ //println!("Input: {:?}", input);
+
+ let metadata_sum = sum_metadata(&mut input.iter());
+ debug!(metadata_sum);
+
+ let value = node_value(&mut input.iter());
+ debug!(value);
+
+ Ok(())
+}
+
+fn sum_metadata(iter: &mut Iter<'_, u32>) -> u32 {
+ let num_children = iter.next().unwrap().clone();
+ let num_metadata = iter.next().unwrap().clone();
+
+ let children_sum: u32 = (0..num_children)
+ .map(|_| sum_metadata(iter))
+ .sum();
+
+ let metadata_sum: u32 = (0..num_metadata)
+ .map(|_| iter.next().unwrap())
+ .sum();
+
+ children_sum + metadata_sum
+}
+
+
+fn node_value(iter: &mut Iter<'_, u32>) -> u32 {
+ let num_children = iter.next().unwrap().clone();
+ let num_metadata = iter.next().unwrap().clone();
+
+ let node_values: Vec<u32> = (0..num_children)
+ .map(|_| node_value(iter))
+ .collect();
+
+ let metadata: Vec<u32> = (0..num_metadata)
+ .map(|_| iter.next().unwrap().clone())
+ .collect();
+
+ if num_children == 0 {
+ metadata.iter().sum()
+ } else {
+ metadata.iter()
+ .filter(|m| **m > 0 && **m-1 < num_children)
+ .map(|m| node_values[*m as usize - 1])
+ .sum()
+ }
+}
diff --git a/2018/src/bin/day_9.rs b/2018/src/bin/day_9.rs
new file mode 100644
index 0000000..3f85620
--- /dev/null
+++ b/2018/src/bin/day_9.rs
@@ -0,0 +1,91 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+
+use std::collections::LinkedList;
+
+// cargo watch -cs "cargo run --release --bin day_9"
+
+fn main() -> Result<(), Box<Error>> {
+ debug!(get_winning_player_score(438, 71626));
+ debug!(get_winning_player_score(438, 71626*100));
+
+ Ok(())
+}
+
+
+fn get_winning_player_score(players: usize, last_marble_score: u32) -> u32 {
+ let mut marbles_head = LinkedList::new();
+ let mut marbles_tail = LinkedList::new();
+ marbles_head.push_back(0);
+
+ let mut current_player = 0;
+ let mut next_marble = 1;
+ let mut scores = vec!(0; players);
+
+ while next_marble <= last_marble_score {
+ if next_marble % 23 == 0 {
+ move_backwards(&mut marbles_head, &mut marbles_tail, 7);
+ let removed = marbles_head.pop_back().expect("Going backwards should have ended with pushing to head");
+ move_forward(&mut marbles_head, &mut marbles_tail, 1);
+
+ let score = next_marble + removed;
+ scores[current_player] += score;
+ } else {
+ move_forward(&mut marbles_head, &mut marbles_tail, 1);
+ marbles_head.push_back(next_marble);
+ }
+
+ next_marble += 1;
+ current_player = (current_player + 1) % players;
+ }
+
+ scores.iter().max().unwrap().clone()
+}
+
+// WARNING: These don't play well with empty lists
+fn move_forward(marbles_head: &mut LinkedList<u32>, marbles_tail: &mut LinkedList<u32>, i: usize) {
+ if i != 0 {
+ match marbles_tail.pop_front() {
+ Some(marble) => {
+ marbles_head.push_back(marble);
+ move_forward(marbles_head, marbles_tail, i-1);
+ },
+ None => {
+ marbles_tail.append(marbles_head);
+ move_forward(marbles_head, marbles_tail, i);
+ },
+ }
+ }
+}
+
+fn move_backwards(marbles_head: &mut LinkedList<u32>, marbles_tail: &mut LinkedList<u32>, i: usize) {
+ if i != 0 {
+ match marbles_head.pop_back() {
+ Some(marble) => {
+ marbles_tail.push_front(marble);
+ move_backwards(marbles_head, marbles_tail, i-1);
+ },
+ None => {
+ marbles_head.append(marbles_tail);
+ move_backwards(marbles_head, marbles_tail, i);
+ },
+ }
+ }
+}
+
+
+#[test]
+fn trivial() {
+ assert_eq!(get_winning_player_score(9, 32), 32);
+}
+
+#[test]
+fn examples() {
+ assert_eq!(get_winning_player_score(10, 1618), 8317);
+ assert_eq!(get_winning_player_score(13, 7999), 146373);
+ assert_eq!(get_winning_player_score(17, 1104), 2764);
+ assert_eq!(get_winning_player_score(21, 6111), 54718);
+ assert_eq!(get_winning_player_score(30, 5807), 37305);
+}
diff --git a/2018/src/lib.rs b/2018/src/lib.rs
new file mode 100644
index 0000000..72520fe
--- /dev/null
+++ b/2018/src/lib.rs
@@ -0,0 +1,31 @@
+use std::path::PathBuf;
+use std::io::BufReader;
+use std::io::prelude::*;
+use std::fs::File;
+
+/// Reads a specified file into a vector of strings, one line of the
+/// file per string. Fails if any part of reading the file fails.
+pub fn read_file(file: &PathBuf) -> Result<Vec<String>, std::io::Error> {
+ let file = File::open(file)?;
+ let file_reader = BufReader::new(file);
+ file_reader.lines()
+ .collect::<Result<Vec<_>, _>>()
+ .map(preprocess_file_lines)
+}
+
+/// Removes any empty lines and makes sure that lines don't have
+/// problematic whitespace.
+pub fn preprocess_file_lines(lines: Vec<String>) -> Vec<String> {
+ lines.iter()
+ .filter(|line| line.len() > 0)
+ .map(|line| line.trim_right().to_string())
+ .collect()
+}
+
+
+#[macro_export]
+macro_rules! debug {
+ ( $x:expr ) => {
+ println!("{} = {:?}", stringify!($x), $x);
+ };
+}