diff --git a/2018/d01/ex1/ex1.py b/2018/d01/ex1/ex1.py new file mode 100755 index 0000000..bcffca7 --- /dev/null +++ b/2018/d01/ex1/ex1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def parse(input: list[str]) -> list[int]: + return [int(n) for n in input] + + deltas = parse(input.splitlines()) + return sum(deltas) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d01/ex1/input b/2018/d01/ex1/input new file mode 100644 index 0000000..e9f0021 --- /dev/null +++ b/2018/d01/ex1/input @@ -0,0 +1,1033 @@ ++9 ++15 +-14 ++10 ++13 ++15 ++10 +-16 +-5 ++2 ++8 ++7 +-4 ++11 ++7 ++10 +-9 ++15 +-10 ++12 +-5 ++6 ++7 +-12 +-12 +-19 +-6 ++4 ++11 +-3 ++8 ++10 ++15 ++7 ++12 +-14 ++7 ++12 ++4 +-6 +-6 ++5 ++15 ++13 ++15 ++15 +-11 +-12 ++18 +-12 +-17 ++14 ++1 ++6 ++5 +-10 +-11 +-3 ++10 ++18 +-6 +-6 ++14 +-7 ++13 ++20 ++2 +-1 ++17 ++6 +-3 +-11 ++12 ++15 +-18 +-13 +-15 ++13 ++19 ++7 +-15 +-16 ++17 ++16 ++14 +-4 ++16 +-2 ++9 ++17 +-9 +-2 +-5 ++12 +-3 ++4 ++10 +-6 +-16 +-5 +-18 ++6 +-12 ++14 ++18 +-16 +-18 ++19 +-20 ++13 ++13 +-20 ++18 +-20 ++4 ++10 ++16 +-12 ++19 ++15 ++6 ++4 ++9 +-18 ++15 +-5 ++12 +-19 ++9 +-16 ++17 +-6 ++18 ++15 ++17 +-12 ++6 +-3 ++11 +-7 +-2 ++8 +-17 +-12 +-3 ++5 +-8 +-3 +-1 +-3 +-8 +-10 ++19 ++13 +-16 ++13 ++12 +-7 ++3 ++2 ++6 ++3 ++1 ++9 +-14 +-4 ++17 ++8 +-14 +-13 ++17 +-19 ++20 ++16 +-9 ++19 ++7 ++14 ++9 +-4 ++2 +-16 ++11 ++6 ++10 +-19 ++15 ++11 ++5 ++2 +-17 ++7 ++16 ++16 +-14 ++7 +-3 +-9 +-2 +-5 +-12 +-6 ++10 ++6 ++15 +-4 +-18 ++4 ++6 +-8 ++10 +-18 +-16 +-7 +-5 +-8 ++16 ++1 ++4 ++13 +-5 ++6 ++12 +-21 +-23 ++3 +-15 ++10 +-3 ++17 +-8 +-2 +-11 ++16 +-17 +-5 ++1 ++22 +-16 +-8 ++3 +-8 ++15 ++2 ++19 +-14 +-18 +-2 ++12 ++23 ++8 ++32 ++7 ++6 +-3 ++13 +-14 ++12 +-18 ++13 ++3 +-2 ++15 +-10 +-8 ++13 ++20 +-17 +-1 ++9 ++17 +-4 +-2 ++7 +-3 +-19 +-6 ++8 +-5 ++6 +-17 ++21 ++2 ++16 +-26 ++9 ++19 +-3 ++9 ++19 ++1 +-6 +-7 ++8 +-3 +-2 ++11 ++7 ++20 +-4 +-4 ++9 ++9 +-5 +-6 +-6 ++15 +-4 +-16 +-3 +-6 +-2 +-14 ++13 +-21 +-25 +-33 ++14 ++20 ++25 +-3 ++30 ++32 ++2 ++5 +-6 ++5 ++6 ++7 +-14 ++16 ++8 ++4 ++9 ++21 +-16 ++17 +-8 ++16 ++19 +-1 +-1 ++14 ++6 +-14 ++9 ++23 ++15 +-4 +-20 ++7 ++21 ++17 ++11 +-16 ++23 ++17 +-22 ++27 +-9 +-29 ++7 +-22 +-27 +-12 ++1 ++17 +-22 +-1 +-1 +-18 +-4 ++15 +-17 +-15 +-7 ++14 ++19 +-24 +-3 +-3 +-5 +-9 ++27 +-1 +-19 ++16 +-11 ++1 ++6 +-16 ++19 ++16 +-10 +-36 ++13 +-23 +-3 +-10 ++6 +-9 +-4 ++3 ++3 ++2 +-10 +-4 +-21 ++9 ++6 ++11 ++6 ++13 +-2 +-50 +-66 ++10 +-52 +-7 +-10 ++25 +-41 +-12 +-46 +-43 +-16 +-3 ++7 ++3 ++29 +-27 +-23 +-56 +-111 ++14 +-511 +-59243 ++6 +-3 +-11 +-6 +-15 +-10 +-13 ++8 ++17 +-4 ++19 +-8 ++4 ++17 ++8 +-5 ++4 ++14 ++4 +-6 ++15 ++4 ++21 +-17 ++12 +-31 +-70 +-10 ++6 +-11 ++13 ++11 +-5 ++2 +-15 +-19 +-20 ++14 +-11 ++5 +-12 +-3 +-17 ++4 +-8 ++5 +-10 +-14 +-13 +-2 +-9 ++10 +-11 +-21 ++12 ++1 ++11 +-21 +-15 ++4 +-6 +-14 +-13 +-5 +-7 ++6 ++10 ++14 ++6 ++14 ++2 ++8 ++18 +-15 ++18 +-13 +-19 +-20 +-19 +-16 +-18 +-7 +-1 +-12 ++14 ++15 ++14 +-4 +-16 ++19 +-9 ++16 +-12 ++3 ++6 +-15 +-10 +-10 +-15 ++11 ++20 +-23 +-19 ++1 +-12 ++3 ++17 ++4 ++3 ++17 +-9 ++1 +-2 +-19 +-11 +-5 +-14 +-1 ++11 ++3 +-6 +-1 ++14 +-11 +-5 ++18 ++9 ++2 +-9 +-16 +-12 +-13 +-1 +-7 ++12 ++4 ++11 +-22 ++14 ++23 ++6 ++11 +-9 +-9 +-4 ++17 +-8 +-10 +-16 +-10 +-4 ++7 +-9 +-14 +-14 ++12 ++10 ++13 +-16 +-13 +-18 ++19 ++10 ++10 ++20 +-5 ++8 +-27 ++16 ++7 +-5 +-8 +-20 ++8 +-19 +-7 ++16 +-22 ++9 +-19 +-19 ++15 ++16 ++18 ++7 ++10 +-16 +-6 +-18 +-2 +-7 ++8 +-7 +-20 +-2 +-2 +-19 ++18 +-4 +-18 ++8 +-19 +-16 ++3 ++17 +-12 +-10 ++3 +-17 +-15 ++19 ++4 ++3 ++16 +-1 ++13 ++6 +-15 ++14 ++19 +-3 ++16 ++1 ++5 ++3 ++1 ++8 ++12 ++7 +-18 +-16 ++23 ++6 ++3 ++6 ++13 +-15 +-22 +-13 +-16 ++19 +-9 +-7 +-13 ++2 ++25 +-19 +-16 +-4 +-27 ++19 +-21 +-7 +-23 +-19 ++17 +-8 +-3 +-10 ++1 ++16 +-6 ++15 +-8 ++17 +-16 +-14 ++11 +-10 +-10 +-16 +-6 ++2 ++1 +-17 +-19 ++17 ++12 +-11 ++7 +-13 ++15 ++15 ++10 +-9 ++3 +-1 +-1 +-20 +-1 +-9 +-13 +-13 +-10 +-15 ++17 ++4 +-9 ++16 +-4 ++17 +-14 +-11 ++17 ++20 +-11 +-2 ++19 +-20 +-21 +-4 +-8 +-7 +-6 +-16 ++15 +-12 +-13 +-4 ++16 ++4 +-14 ++9 +-18 +-12 +-19 +-12 +-19 ++9 +-15 ++8 +-12 ++8 ++8 ++16 ++6 ++10 +-5 ++2 +-17 +-13 ++24 ++26 +-11 +-17 ++37 +-3 ++14 +-5 ++4 ++16 ++3 ++12 ++4 +-25 +-18 ++7 ++16 +-11 +-22 ++11 +-19 +-11 ++23 +-21 +-14 ++26 ++17 ++19 +-29 ++33 ++45 ++14 ++9 +-22 ++10 ++7 ++13 ++9 ++12 ++9 +-20 ++3 +-9 +-19 +-18 +-23 +-7 ++34 ++11 ++46 +-16 ++21 +-8 ++18 ++10 ++7 +-15 +-7 ++1 +-16 ++28 ++16 ++2 +-8 +-3 +-3 ++39 ++15 +-10 +-3 ++6 ++17 +-27 +-19 +-10 +-43 +-42 ++133 ++19 ++19 ++27 ++59 +-14 +-18 ++5 +-10 +-7 +-21 ++108 +-41 ++53 +-309 +-42 ++123 +-1005 +-59069 +-4 ++3 +-7 ++5 +-14 ++7 +-4 +-2 +-5 ++9 +-13 +-7 ++1 +-13 ++3 +-21 ++9 +-12 ++18 ++10 ++8 +-19 ++13 ++12 +-19 +-1 ++16 +-11 +-7 +-5 ++11 +-15 +-4 +-3 ++6 +-18 ++5 +-1 +-10 +-16 ++13 ++12 +-18 +-16 +-4 +-13 +-9 ++7 +-1 +-18 +-18 ++6 +-11 +-16 +-17 +-7 +-3 +-3 ++15 +-11 ++6 +-14 +-12 ++13 +-9 ++7 ++13 ++6 ++18 +-10 ++19 +-12 +-3 ++5 ++6 ++2 ++9 ++1 ++1 ++12 ++6 +-3 ++6 ++7 +-17 ++6 ++15 ++17 ++3 +-16 +-16 ++19 +-10 +-7 +-18 ++6 +-17 ++10 +-17 +-1 ++5 +-15 ++2 +-6 +-19 +-8 ++15 +-4 ++7 +-13 +-18 +-7 ++8 ++8 ++3 ++24 +-16 +-15 ++6 +-20 +-8 +-18 ++3 +-7 ++14 ++5 ++18 +-11 +-6 +-9 +-14 +-9 ++15 ++18 ++6 ++8 ++10 +-2 +-18 ++9 ++13 +-16 ++7 +-9 ++4 +-18 +-7 ++8 +-20 +-17 +-16 +-3 +-15 ++9 ++16 ++14 ++8 ++17 ++120917 diff --git a/2018/d01/ex2/ex2.py b/2018/d01/ex2/ex2.py new file mode 100755 index 0000000..60e74b2 --- /dev/null +++ b/2018/d01/ex2/ex2.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import itertools +import sys + + +def solve(input: str) -> int: + def parse(input: list[str]) -> list[int]: + return [int(n) for n in input] + + def find_duplicate(deltas: list[int]) -> int: + start = 0 + seen = {start} + for delta in itertools.cycle(deltas): + start += delta + if start in seen: + return start + seen.add(start) + assert False # Sanity check + + deltas = parse(input.splitlines()) + return find_duplicate(deltas) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d01/ex2/input b/2018/d01/ex2/input new file mode 100644 index 0000000..e9f0021 --- /dev/null +++ b/2018/d01/ex2/input @@ -0,0 +1,1033 @@ ++9 ++15 +-14 ++10 ++13 ++15 ++10 +-16 +-5 ++2 ++8 ++7 +-4 ++11 ++7 ++10 +-9 ++15 +-10 ++12 +-5 ++6 ++7 +-12 +-12 +-19 +-6 ++4 ++11 +-3 ++8 ++10 ++15 ++7 ++12 +-14 ++7 ++12 ++4 +-6 +-6 ++5 ++15 ++13 ++15 ++15 +-11 +-12 ++18 +-12 +-17 ++14 ++1 ++6 ++5 +-10 +-11 +-3 ++10 ++18 +-6 +-6 ++14 +-7 ++13 ++20 ++2 +-1 ++17 ++6 +-3 +-11 ++12 ++15 +-18 +-13 +-15 ++13 ++19 ++7 +-15 +-16 ++17 ++16 ++14 +-4 ++16 +-2 ++9 ++17 +-9 +-2 +-5 ++12 +-3 ++4 ++10 +-6 +-16 +-5 +-18 ++6 +-12 ++14 ++18 +-16 +-18 ++19 +-20 ++13 ++13 +-20 ++18 +-20 ++4 ++10 ++16 +-12 ++19 ++15 ++6 ++4 ++9 +-18 ++15 +-5 ++12 +-19 ++9 +-16 ++17 +-6 ++18 ++15 ++17 +-12 ++6 +-3 ++11 +-7 +-2 ++8 +-17 +-12 +-3 ++5 +-8 +-3 +-1 +-3 +-8 +-10 ++19 ++13 +-16 ++13 ++12 +-7 ++3 ++2 ++6 ++3 ++1 ++9 +-14 +-4 ++17 ++8 +-14 +-13 ++17 +-19 ++20 ++16 +-9 ++19 ++7 ++14 ++9 +-4 ++2 +-16 ++11 ++6 ++10 +-19 ++15 ++11 ++5 ++2 +-17 ++7 ++16 ++16 +-14 ++7 +-3 +-9 +-2 +-5 +-12 +-6 ++10 ++6 ++15 +-4 +-18 ++4 ++6 +-8 ++10 +-18 +-16 +-7 +-5 +-8 ++16 ++1 ++4 ++13 +-5 ++6 ++12 +-21 +-23 ++3 +-15 ++10 +-3 ++17 +-8 +-2 +-11 ++16 +-17 +-5 ++1 ++22 +-16 +-8 ++3 +-8 ++15 ++2 ++19 +-14 +-18 +-2 ++12 ++23 ++8 ++32 ++7 ++6 +-3 ++13 +-14 ++12 +-18 ++13 ++3 +-2 ++15 +-10 +-8 ++13 ++20 +-17 +-1 ++9 ++17 +-4 +-2 ++7 +-3 +-19 +-6 ++8 +-5 ++6 +-17 ++21 ++2 ++16 +-26 ++9 ++19 +-3 ++9 ++19 ++1 +-6 +-7 ++8 +-3 +-2 ++11 ++7 ++20 +-4 +-4 ++9 ++9 +-5 +-6 +-6 ++15 +-4 +-16 +-3 +-6 +-2 +-14 ++13 +-21 +-25 +-33 ++14 ++20 ++25 +-3 ++30 ++32 ++2 ++5 +-6 ++5 ++6 ++7 +-14 ++16 ++8 ++4 ++9 ++21 +-16 ++17 +-8 ++16 ++19 +-1 +-1 ++14 ++6 +-14 ++9 ++23 ++15 +-4 +-20 ++7 ++21 ++17 ++11 +-16 ++23 ++17 +-22 ++27 +-9 +-29 ++7 +-22 +-27 +-12 ++1 ++17 +-22 +-1 +-1 +-18 +-4 ++15 +-17 +-15 +-7 ++14 ++19 +-24 +-3 +-3 +-5 +-9 ++27 +-1 +-19 ++16 +-11 ++1 ++6 +-16 ++19 ++16 +-10 +-36 ++13 +-23 +-3 +-10 ++6 +-9 +-4 ++3 ++3 ++2 +-10 +-4 +-21 ++9 ++6 ++11 ++6 ++13 +-2 +-50 +-66 ++10 +-52 +-7 +-10 ++25 +-41 +-12 +-46 +-43 +-16 +-3 ++7 ++3 ++29 +-27 +-23 +-56 +-111 ++14 +-511 +-59243 ++6 +-3 +-11 +-6 +-15 +-10 +-13 ++8 ++17 +-4 ++19 +-8 ++4 ++17 ++8 +-5 ++4 ++14 ++4 +-6 ++15 ++4 ++21 +-17 ++12 +-31 +-70 +-10 ++6 +-11 ++13 ++11 +-5 ++2 +-15 +-19 +-20 ++14 +-11 ++5 +-12 +-3 +-17 ++4 +-8 ++5 +-10 +-14 +-13 +-2 +-9 ++10 +-11 +-21 ++12 ++1 ++11 +-21 +-15 ++4 +-6 +-14 +-13 +-5 +-7 ++6 ++10 ++14 ++6 ++14 ++2 ++8 ++18 +-15 ++18 +-13 +-19 +-20 +-19 +-16 +-18 +-7 +-1 +-12 ++14 ++15 ++14 +-4 +-16 ++19 +-9 ++16 +-12 ++3 ++6 +-15 +-10 +-10 +-15 ++11 ++20 +-23 +-19 ++1 +-12 ++3 ++17 ++4 ++3 ++17 +-9 ++1 +-2 +-19 +-11 +-5 +-14 +-1 ++11 ++3 +-6 +-1 ++14 +-11 +-5 ++18 ++9 ++2 +-9 +-16 +-12 +-13 +-1 +-7 ++12 ++4 ++11 +-22 ++14 ++23 ++6 ++11 +-9 +-9 +-4 ++17 +-8 +-10 +-16 +-10 +-4 ++7 +-9 +-14 +-14 ++12 ++10 ++13 +-16 +-13 +-18 ++19 ++10 ++10 ++20 +-5 ++8 +-27 ++16 ++7 +-5 +-8 +-20 ++8 +-19 +-7 ++16 +-22 ++9 +-19 +-19 ++15 ++16 ++18 ++7 ++10 +-16 +-6 +-18 +-2 +-7 ++8 +-7 +-20 +-2 +-2 +-19 ++18 +-4 +-18 ++8 +-19 +-16 ++3 ++17 +-12 +-10 ++3 +-17 +-15 ++19 ++4 ++3 ++16 +-1 ++13 ++6 +-15 ++14 ++19 +-3 ++16 ++1 ++5 ++3 ++1 ++8 ++12 ++7 +-18 +-16 ++23 ++6 ++3 ++6 ++13 +-15 +-22 +-13 +-16 ++19 +-9 +-7 +-13 ++2 ++25 +-19 +-16 +-4 +-27 ++19 +-21 +-7 +-23 +-19 ++17 +-8 +-3 +-10 ++1 ++16 +-6 ++15 +-8 ++17 +-16 +-14 ++11 +-10 +-10 +-16 +-6 ++2 ++1 +-17 +-19 ++17 ++12 +-11 ++7 +-13 ++15 ++15 ++10 +-9 ++3 +-1 +-1 +-20 +-1 +-9 +-13 +-13 +-10 +-15 ++17 ++4 +-9 ++16 +-4 ++17 +-14 +-11 ++17 ++20 +-11 +-2 ++19 +-20 +-21 +-4 +-8 +-7 +-6 +-16 ++15 +-12 +-13 +-4 ++16 ++4 +-14 ++9 +-18 +-12 +-19 +-12 +-19 ++9 +-15 ++8 +-12 ++8 ++8 ++16 ++6 ++10 +-5 ++2 +-17 +-13 ++24 ++26 +-11 +-17 ++37 +-3 ++14 +-5 ++4 ++16 ++3 ++12 ++4 +-25 +-18 ++7 ++16 +-11 +-22 ++11 +-19 +-11 ++23 +-21 +-14 ++26 ++17 ++19 +-29 ++33 ++45 ++14 ++9 +-22 ++10 ++7 ++13 ++9 ++12 ++9 +-20 ++3 +-9 +-19 +-18 +-23 +-7 ++34 ++11 ++46 +-16 ++21 +-8 ++18 ++10 ++7 +-15 +-7 ++1 +-16 ++28 ++16 ++2 +-8 +-3 +-3 ++39 ++15 +-10 +-3 ++6 ++17 +-27 +-19 +-10 +-43 +-42 ++133 ++19 ++19 ++27 ++59 +-14 +-18 ++5 +-10 +-7 +-21 ++108 +-41 ++53 +-309 +-42 ++123 +-1005 +-59069 +-4 ++3 +-7 ++5 +-14 ++7 +-4 +-2 +-5 ++9 +-13 +-7 ++1 +-13 ++3 +-21 ++9 +-12 ++18 ++10 ++8 +-19 ++13 ++12 +-19 +-1 ++16 +-11 +-7 +-5 ++11 +-15 +-4 +-3 ++6 +-18 ++5 +-1 +-10 +-16 ++13 ++12 +-18 +-16 +-4 +-13 +-9 ++7 +-1 +-18 +-18 ++6 +-11 +-16 +-17 +-7 +-3 +-3 ++15 +-11 ++6 +-14 +-12 ++13 +-9 ++7 ++13 ++6 ++18 +-10 ++19 +-12 +-3 ++5 ++6 ++2 ++9 ++1 ++1 ++12 ++6 +-3 ++6 ++7 +-17 ++6 ++15 ++17 ++3 +-16 +-16 ++19 +-10 +-7 +-18 ++6 +-17 ++10 +-17 +-1 ++5 +-15 ++2 +-6 +-19 +-8 ++15 +-4 ++7 +-13 +-18 +-7 ++8 ++8 ++3 ++24 +-16 +-15 ++6 +-20 +-8 +-18 ++3 +-7 ++14 ++5 ++18 +-11 +-6 +-9 +-14 +-9 ++15 ++18 ++6 ++8 ++10 +-2 +-18 ++9 ++13 +-16 ++7 +-9 ++4 +-18 +-7 ++8 +-20 +-17 +-16 +-3 +-15 ++9 ++16 ++14 ++8 ++17 ++120917 diff --git a/2018/d02/ex1/ex1.py b/2018/d02/ex1/ex1.py new file mode 100755 index 0000000..db848be --- /dev/null +++ b/2018/d02/ex1/ex1.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import sys +from collections import Counter + + +def solve(input: str) -> int: + def any_letter(boxes: list[str], count: int) -> int: + return sum(count in Counter(box).values() for box in boxes) + + def checksum(boxes: list[str]) -> int: + return any_letter(boxes, 2) * any_letter(boxes, 3) + + boxes = input.splitlines() + return checksum(boxes) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d02/ex1/input b/2018/d02/ex1/input new file mode 100644 index 0000000..d8d36fe --- /dev/null +++ b/2018/d02/ex1/input @@ -0,0 +1,250 @@ +nkucgflathzwwijtrevymbdplq +nkucgflathzwsidxrlvymbdpiq +nkucgjlathqwsijxrevymbypoq +nkucgflarrzwsmjxrevymbdpoq +nkucgflzthtwsijxrevymbdpjq +nkucgflahhzwskjxrevymbgpoq +bkycgflathzwsijxrsvymbdpoq +nkucgflathzwsijxdevymbdmog +nkucgflaehzwsmjxrevymbdpow +nkucgflathzwsijxrevwmbdnbq +nkucgflathzssijxrevynbdqoq +ngucgflathzwsijxsevymndpoq +nfucgflathzvsijxrevymbspoq +nkucgflwthzwsijxreeymbdpkq +nkucgflpthzwsijxrevdmbdpoe +nkungflatuzwsijurevymbdpoq +nkucgflathzwsiqxrevyybdpom +nkucgflathzwsicxrevtmbtpoq +nkucgfladhzwsijxreuymbdboq +nkumgflathznsijxzevymbdpoq +nkuagflethzwsijxrqvymbdpoq +nkucgflatozwhijxrevymbdpkq +nkuggflathzwsijxrejymbdpob +nkucgflathzwlijxrqvambdpoq +hkucnflathzasijxrevymbdpoq +nkuigflathzwsirxrevymbdooq +nkucgflatezwsijxwetymbdpoq +nkucmflavhbwsijxrevymbdpoq +nkucgflathzwssjxrevytbmpoq +nkucgflmthzwsvjxrevymbdpgq +nkucgtlathzwsijcrevymbjpoq +nkucgflathfwsfjxrevymbdpsq +nkucgflathjwsijxrwvymbdpok +nkucgeldthzwsijxrevymqdpoq +nkutgcpathzwsijxrevymbdpoq +nkucgflaehzmsijxrevymydpoq +mkucdflathzwsvjxrevymbdpoq +nkucgflathzwsijxtevymidpfq +nkucgfllthzwsijirevlmbdpoq +nkucgfuathzwsijxrevymbqpou +nkufgflathzwsijxrgvymbdpor +nkuygflatrzwsijxrevymbdpoo +nkunoflathzwsijxrevyabdpoq +nksogflathzwsijxrevymbdpeq +nkucgflathzwciexrevymbdhoq +nkucgfnathzwsijxdevyobdpoq +nkudgflazhzwsijxrevymbmpoq +nkucgylathzwscjxrevymbdaoq +nkucgflqthzisijxrerymbdpoq +nkucgxlathzwsijxgebymbdpoq +nkucgflathzssijxrwvymadpoq +nkucgflathzwsijxrvvymbdloi +nkucaflathzwskjxzevymbdpoq +wkuchflathzwsijxrevymbdioq +nkucgilathzwsijxrgvympdpoq +nkubgflaohzwsijxrevymbnpoq +nkucgwoathzwnijxrevymbdpoq +nkprgflathzwsijxrevywbdpoq +nkucgflatlzwsijxievymzdpoq +nkucgflathzwsijxrevymbmdow +nkucgzlathzwsitlrevymbdpoq +nkubgfladhzwsijxrevymbdpsq +nkucgflathzwsijxrzvyibdroq +wkucgflathznsijqrevymbdpoq +nkupgilathzwsijxrnvymbdpoq +nkucgflathzwwijnrevymgdpoq +nkucgflathjwsijxrewymbopoq +mkwcdflathzwsvjxrevymbdpoq +nkucgflathzwsujxoevymbdboq +nkucvflathzwsojxrevymzdpoq +nkocgflabhzwsijxrevyebdpoq +skuciflpthzwsijxrevymbdpoq +nkuxgflathzrsijxrevymbupoq +nkucgblathzwsezxrevymbdpoq +nkucgflathzwsijxrevymbvtop +nkucdflathzwsiaxrefymbdpoq +nkucgflathzwsijxzevkmbdpmq +nkucgflarhzwsijroevymbdpoq +nkuccflathzwsinxrevymsdpoq +nkucgflathzwsijxregymidsoq +nkucgflathnwsijxrvvumbdpoq +nkucgfaathzwssjxrevymbdwoq +nkucgflothzwsijxrevymbdloz +naucgulathzwsijxremymbdpoq +nkucgflaqhzwsijxrevymbdnqq +wkucgflatrzwsijxrevymbdpof +nvucgflaehzwyijxrevymbdpoq +nkusaflaahzwsijxrevymbdpoq +nkucgfkathzwsijxrevymbdbfq +nkucgfkathzwsijrrevymodpoq +nkuegflathzwsijxrrvbmbdpoq +ykucgflathzwsijfrlvymbdpoq +nkucgflathzrsujxrevymbdkoq +nkuclflatsowsijxrevymbdpoq +nkucgflathzwsgjxrqvymbdpor +ekucgflathzwsijorevlmbdpoq +nkucgflathizsijgrevymbdpoq +nkucgfoathzksijbrevymbdpoq +nkucgflachzwsijxrevymbupoa +nkuhgflathzwsijxravylbdpoq +nkncgflithzwsijnrevymbdpoq +nvucgjlathzjsijxrevymbdpoq +nhucgflathzwsijxrtvymbtpoq +akucgflathzwhijxrevymbdpor +nkucgflatozisijxrvvymbdpoq +nkucgzlatgzwsijxrevymbepoq +nkjcgflqthmwsijxrevymbdpoq +nkucgflaohzosijxrhvymbdpoq +ntucgflatrzwsijxrevymbdpol +nkucgflathzwsijkriqymbdpoq +nkuggflathzwsijmrevymbdpvq +nkucgflpmhzwsmjxrevymbdpoq +okucgflathzwsijxrevgmbdsoq +nkucgflaehzwkijxrevymwdpoq +zkucgfllthzwsijxrevymbdpod +nkicgflathzasijxfevymbdpoq +kkucgfhathzwsijxaevymbdpoq +nkucqflsthzwsijxrevyjbdpoq +nkucgflaghzwsijxoevykbdpoq +nkucgflaohzwsljxryvymbdpoq +bkucfflathzwsijxrexymbdpoq +nkucnflathzwsbjxrpvymbdpoq +nkucjflatlzwsijxrevymqdpoq +nkucgflathzwsijsyevyxbdpoq +nkwcgflathzosijxqevymbdpoq +nkucgslathzesijxievymbdpoq +nkuciflauhzwsiaxrevymbdpoq +nkucgflathzwsiwxreeymbdwoq +nkucgblatwzwsijxkevymbdpoq +njucgfkathzwsijxrevymbvpoq +nkucgfladhzwsijfrevyibdpoq +nkukgflathzwsijprenymbdpoq +nkucgflathzwsijxrchymbupoq +nkucgfeathzwsitxaevymbdpoq +nkufjflathzwsijxresymbdpoq +nkuggflatlzwsijxrevymbdpoa +nkucgflsthnwsijxrevumbdpoq +nkuceflathzwsnjxrevymbmpoq +nkucgflabhzwsijxrevymblplq +nkucgfmathzwsijxrevdybdpoq +niuvgflathzwsijxrcvymbdpoq +nkscgflathzwsijxrevyzbdooq +nkucgflatszwsbjxrevymbgpoq +nkucgflazhzwsijxcevymzdpoq +nkucgflathzwsfjqrevymbdpxq +nkucgflathcwsijxrrvymbdroq +nkurgflathzwsijxrepymzdpoq +nlucgflathzwrijxrevdmbdpoq +kkucgflkthzwswjxrevymbdpoq +nktcgflathzwgijxrevbmbdpoq +nbucgfiathzwsijxreyymbdpoq +lkucgflathswsijxrevymbdpxq +ntucgflathzwswrxrevymbdpoq +nkscgflathzwssjxravymbdpoq +nuocgflathzwsijxrevyebdpoq +nbucgllathzwsijxregymbdpoq +ckucbflathzwsijxrelymbdpoq +nkucgflathzwsijxremymbqpor +nkgcgfljthzwsijkrevymbdpoq +nkdcgflashzwsijxrjvymbdpoq +nkecgflathzwsijxuevumbdpoq +njucgflatpfwsijxrevymbdpoq +nkucgwlathzjsijxrevymbzpoq +nkucgfxathzqsijxrenymbdpoq +dkfcgflathzwsijxrevymbdtoq +nkupgfhathzwsijxrevymbjpoq +nkucgflathzwsjjxrevymldooq +pkucgfbathhwsijxrevymbdpoq +nkuciflayhzwsijxrevymbdpfq +nkucpfdathzwsajxrevymbdpoq +ykucgflathdwsijzrevymbdpoq +nkucgwlstnzwsijxrevymbdpoq +nkucwfzazhzwsijxrevymbdpoq +nkucgflatczwssjxretymbdpoq +nkucgflathzwsijpreaymxdpoq +ntucgflathzwsijxrepymvdpoq +nkucgqlathzdsijxrevymbopoq +nkucgflathzusijxfevymbdptq +nkocgflathzwdijxrevymbipoq +nklcgflatgzwsijxrevymbdsoq +nkucgflathzwsgjxgevymbopoq +nkucgflathzwuijxreaymbdyoq +nkucgwlathzwsvjxrevymbdpos +nkucrflathzwliqxrevymbdpoq +nkucgflathzxsijxievysbdpoq +nkufgolhthzwsijxrevymbdpoq +niucgflathzwsiixrevyabdpoq +nkucgflathzhsijxrevymbdyuq +nkucgqlathzwsijxreaymbdpob +nzucgflathzesijxrevymwdpoq +nkucgflatlzwsirxrevymmdpoq +nkucgfxavhzwsijxrevymbwpoq +nkucgflathswsijxrevvmbdpoe +nkucgfgethzwsrjxrevymbdpoq +nkucgzlayhzwsinxrevymbdpoq +nkucgflwthzwsiyxrevymbdpdq +nkucgflpthzwsijxrezombdpoq +nkurgflathdwsijxuevymbdpoq +nkjcgflathzwsijxrevkmbdpoc +nkucmflatuzwsijxrevmmbdpoq +nkucgfldthzwsijxrevevbdpoq +nkucgflatrzgsijxrevambdpoq +nkicgflathzwsijxrevymhdhoq +nkbcgflathzwsijxrevymxdpos +nkucgflatfzwsijxrevymwdqoq +hkucgflaqwzwsijxrevymbdpoq +nkjcgflathzvsijxrevyjbdpoq +niucgflathzwsijxrezymbdpob +ynucgflathzwsijxremymbdpoq +nkubgflathzwsijxrhvymldpoq +nkucqflrthzesijxrevymbdpoq +nkucgulathzwsijxrevyubdioq +nkuczflathzwsijxaebymbdpoq +nkucgfldthzwsibxrevymrdpoq +nkucgflatwzdsijxrevymsdpoq +nkncgffathzwsijxrejymbdpoq +nkucgflathzqsijxrevxmodpoq +nkucgflathwwsijqrevymbipoq +nkucgflathzwhajxrebymbdpoq +gkucgflathzwsijxreirmbdpoq +nkucgflathzesijzravymbdpoq +nkucgflaghzwsijxrerymbdplq +wkucgflathxwgijxrevymbdpoq +nkucgfljthfwsijxrevymbdpfq +nkucgflathwwsimxrevymbdpjq +nkucgdlachzwsijxrevymmdpoq +njucgclathzwsiixrevymbdpoq +nkucgflatdzwsijxrevymzrpoq +nkuckflatvzcsijxrevymbdpoq +nkucgflathzhsijxrevqmbkpoq +nkucqflathzjsijvrevymbdpoq +nkucgftathzwsijxrevympdpoi +nvucgflatmzwsijxrevymbdpsq +nkocgflathznsijxrevymbdphq +mkgcgflathzwsijxrevymbdpvq +nkucnflathzwsijbrevymbdcoq +nkucgflathzwsijsrevymsdgoq +nkuckflatxzwsiwxrevymbdpoq +nkucyflathzwsijxrehcmbdpoq +nkurgflajhzwsijxrevkmbdpoq +wkucgflathzwsijxrfvymbapoq +nkucgflathzwsijxaekymbdpon +nkucgfkathywsijxrevymbdpsq +nkucgflathzwsijxaexcmbdpoq +nkucgflathzwsijxrevymddhox +nkucgflathzwgijxrevymydooq +nkycqflathzwsijxrezymbdpoq +nkucgflathwwsijxrevymbspsq +nkucgflatpzwssjfrevymbdpoq +nkwcgflhthzwsijxrevcmbdpoq diff --git a/2018/d02/ex2/ex2.py b/2018/d02/ex2/ex2.py new file mode 100755 index 0000000..fb60f27 --- /dev/null +++ b/2018/d02/ex2/ex2.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +import itertools +import sys + + +def solve(input: str) -> str: + def find_box_ids(boxes: list[str]) -> str: + for lhs, rhs in itertools.combinations(boxes, 2): + assert len(lhs) == len(rhs) # Sanity check + for i in range(len(lhs)): + if lhs[:i] == rhs[:i] and lhs[i + 1 :] == rhs[i + 1 :]: + return lhs[:i] + lhs[i + 1 :] + assert False # Sanity check + + boxes = input.splitlines() + return find_box_ids(boxes) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d02/ex2/input b/2018/d02/ex2/input new file mode 100644 index 0000000..d8d36fe --- /dev/null +++ b/2018/d02/ex2/input @@ -0,0 +1,250 @@ +nkucgflathzwwijtrevymbdplq +nkucgflathzwsidxrlvymbdpiq +nkucgjlathqwsijxrevymbypoq +nkucgflarrzwsmjxrevymbdpoq +nkucgflzthtwsijxrevymbdpjq +nkucgflahhzwskjxrevymbgpoq +bkycgflathzwsijxrsvymbdpoq +nkucgflathzwsijxdevymbdmog +nkucgflaehzwsmjxrevymbdpow +nkucgflathzwsijxrevwmbdnbq +nkucgflathzssijxrevynbdqoq +ngucgflathzwsijxsevymndpoq +nfucgflathzvsijxrevymbspoq +nkucgflwthzwsijxreeymbdpkq +nkucgflpthzwsijxrevdmbdpoe +nkungflatuzwsijurevymbdpoq +nkucgflathzwsiqxrevyybdpom +nkucgflathzwsicxrevtmbtpoq +nkucgfladhzwsijxreuymbdboq +nkumgflathznsijxzevymbdpoq +nkuagflethzwsijxrqvymbdpoq +nkucgflatozwhijxrevymbdpkq +nkuggflathzwsijxrejymbdpob +nkucgflathzwlijxrqvambdpoq +hkucnflathzasijxrevymbdpoq +nkuigflathzwsirxrevymbdooq +nkucgflatezwsijxwetymbdpoq +nkucmflavhbwsijxrevymbdpoq +nkucgflathzwssjxrevytbmpoq +nkucgflmthzwsvjxrevymbdpgq +nkucgtlathzwsijcrevymbjpoq +nkucgflathfwsfjxrevymbdpsq +nkucgflathjwsijxrwvymbdpok +nkucgeldthzwsijxrevymqdpoq +nkutgcpathzwsijxrevymbdpoq +nkucgflaehzmsijxrevymydpoq +mkucdflathzwsvjxrevymbdpoq +nkucgflathzwsijxtevymidpfq +nkucgfllthzwsijirevlmbdpoq +nkucgfuathzwsijxrevymbqpou +nkufgflathzwsijxrgvymbdpor +nkuygflatrzwsijxrevymbdpoo +nkunoflathzwsijxrevyabdpoq +nksogflathzwsijxrevymbdpeq +nkucgflathzwciexrevymbdhoq +nkucgfnathzwsijxdevyobdpoq +nkudgflazhzwsijxrevymbmpoq +nkucgylathzwscjxrevymbdaoq +nkucgflqthzisijxrerymbdpoq +nkucgxlathzwsijxgebymbdpoq +nkucgflathzssijxrwvymadpoq +nkucgflathzwsijxrvvymbdloi +nkucaflathzwskjxzevymbdpoq +wkuchflathzwsijxrevymbdioq +nkucgilathzwsijxrgvympdpoq +nkubgflaohzwsijxrevymbnpoq +nkucgwoathzwnijxrevymbdpoq +nkprgflathzwsijxrevywbdpoq +nkucgflatlzwsijxievymzdpoq +nkucgflathzwsijxrevymbmdow +nkucgzlathzwsitlrevymbdpoq +nkubgfladhzwsijxrevymbdpsq +nkucgflathzwsijxrzvyibdroq +wkucgflathznsijqrevymbdpoq +nkupgilathzwsijxrnvymbdpoq +nkucgflathzwwijnrevymgdpoq +nkucgflathjwsijxrewymbopoq +mkwcdflathzwsvjxrevymbdpoq +nkucgflathzwsujxoevymbdboq +nkucvflathzwsojxrevymzdpoq +nkocgflabhzwsijxrevyebdpoq +skuciflpthzwsijxrevymbdpoq +nkuxgflathzrsijxrevymbupoq +nkucgblathzwsezxrevymbdpoq +nkucgflathzwsijxrevymbvtop +nkucdflathzwsiaxrefymbdpoq +nkucgflathzwsijxzevkmbdpmq +nkucgflarhzwsijroevymbdpoq +nkuccflathzwsinxrevymsdpoq +nkucgflathzwsijxregymidsoq +nkucgflathnwsijxrvvumbdpoq +nkucgfaathzwssjxrevymbdwoq +nkucgflothzwsijxrevymbdloz +naucgulathzwsijxremymbdpoq +nkucgflaqhzwsijxrevymbdnqq +wkucgflatrzwsijxrevymbdpof +nvucgflaehzwyijxrevymbdpoq +nkusaflaahzwsijxrevymbdpoq +nkucgfkathzwsijxrevymbdbfq +nkucgfkathzwsijrrevymodpoq +nkuegflathzwsijxrrvbmbdpoq +ykucgflathzwsijfrlvymbdpoq +nkucgflathzrsujxrevymbdkoq +nkuclflatsowsijxrevymbdpoq +nkucgflathzwsgjxrqvymbdpor +ekucgflathzwsijorevlmbdpoq +nkucgflathizsijgrevymbdpoq +nkucgfoathzksijbrevymbdpoq +nkucgflachzwsijxrevymbupoa +nkuhgflathzwsijxravylbdpoq +nkncgflithzwsijnrevymbdpoq +nvucgjlathzjsijxrevymbdpoq +nhucgflathzwsijxrtvymbtpoq +akucgflathzwhijxrevymbdpor +nkucgflatozisijxrvvymbdpoq +nkucgzlatgzwsijxrevymbepoq +nkjcgflqthmwsijxrevymbdpoq +nkucgflaohzosijxrhvymbdpoq +ntucgflatrzwsijxrevymbdpol +nkucgflathzwsijkriqymbdpoq +nkuggflathzwsijmrevymbdpvq +nkucgflpmhzwsmjxrevymbdpoq +okucgflathzwsijxrevgmbdsoq +nkucgflaehzwkijxrevymwdpoq +zkucgfllthzwsijxrevymbdpod +nkicgflathzasijxfevymbdpoq +kkucgfhathzwsijxaevymbdpoq +nkucqflsthzwsijxrevyjbdpoq +nkucgflaghzwsijxoevykbdpoq +nkucgflaohzwsljxryvymbdpoq +bkucfflathzwsijxrexymbdpoq +nkucnflathzwsbjxrpvymbdpoq +nkucjflatlzwsijxrevymqdpoq +nkucgflathzwsijsyevyxbdpoq +nkwcgflathzosijxqevymbdpoq +nkucgslathzesijxievymbdpoq +nkuciflauhzwsiaxrevymbdpoq +nkucgflathzwsiwxreeymbdwoq +nkucgblatwzwsijxkevymbdpoq +njucgfkathzwsijxrevymbvpoq +nkucgfladhzwsijfrevyibdpoq +nkukgflathzwsijprenymbdpoq +nkucgflathzwsijxrchymbupoq +nkucgfeathzwsitxaevymbdpoq +nkufjflathzwsijxresymbdpoq +nkuggflatlzwsijxrevymbdpoa +nkucgflsthnwsijxrevumbdpoq +nkuceflathzwsnjxrevymbmpoq +nkucgflabhzwsijxrevymblplq +nkucgfmathzwsijxrevdybdpoq +niuvgflathzwsijxrcvymbdpoq +nkscgflathzwsijxrevyzbdooq +nkucgflatszwsbjxrevymbgpoq +nkucgflazhzwsijxcevymzdpoq +nkucgflathzwsfjqrevymbdpxq +nkucgflathcwsijxrrvymbdroq +nkurgflathzwsijxrepymzdpoq +nlucgflathzwrijxrevdmbdpoq +kkucgflkthzwswjxrevymbdpoq +nktcgflathzwgijxrevbmbdpoq +nbucgfiathzwsijxreyymbdpoq +lkucgflathswsijxrevymbdpxq +ntucgflathzwswrxrevymbdpoq +nkscgflathzwssjxravymbdpoq +nuocgflathzwsijxrevyebdpoq +nbucgllathzwsijxregymbdpoq +ckucbflathzwsijxrelymbdpoq +nkucgflathzwsijxremymbqpor +nkgcgfljthzwsijkrevymbdpoq +nkdcgflashzwsijxrjvymbdpoq +nkecgflathzwsijxuevumbdpoq +njucgflatpfwsijxrevymbdpoq +nkucgwlathzjsijxrevymbzpoq +nkucgfxathzqsijxrenymbdpoq +dkfcgflathzwsijxrevymbdtoq +nkupgfhathzwsijxrevymbjpoq +nkucgflathzwsjjxrevymldooq +pkucgfbathhwsijxrevymbdpoq +nkuciflayhzwsijxrevymbdpfq +nkucpfdathzwsajxrevymbdpoq +ykucgflathdwsijzrevymbdpoq +nkucgwlstnzwsijxrevymbdpoq +nkucwfzazhzwsijxrevymbdpoq +nkucgflatczwssjxretymbdpoq +nkucgflathzwsijpreaymxdpoq +ntucgflathzwsijxrepymvdpoq +nkucgqlathzdsijxrevymbopoq +nkucgflathzusijxfevymbdptq +nkocgflathzwdijxrevymbipoq +nklcgflatgzwsijxrevymbdsoq +nkucgflathzwsgjxgevymbopoq +nkucgflathzwuijxreaymbdyoq +nkucgwlathzwsvjxrevymbdpos +nkucrflathzwliqxrevymbdpoq +nkucgflathzxsijxievysbdpoq +nkufgolhthzwsijxrevymbdpoq +niucgflathzwsiixrevyabdpoq +nkucgflathzhsijxrevymbdyuq +nkucgqlathzwsijxreaymbdpob +nzucgflathzesijxrevymwdpoq +nkucgflatlzwsirxrevymmdpoq +nkucgfxavhzwsijxrevymbwpoq +nkucgflathswsijxrevvmbdpoe +nkucgfgethzwsrjxrevymbdpoq +nkucgzlayhzwsinxrevymbdpoq +nkucgflwthzwsiyxrevymbdpdq +nkucgflpthzwsijxrezombdpoq +nkurgflathdwsijxuevymbdpoq +nkjcgflathzwsijxrevkmbdpoc +nkucmflatuzwsijxrevmmbdpoq +nkucgfldthzwsijxrevevbdpoq +nkucgflatrzgsijxrevambdpoq +nkicgflathzwsijxrevymhdhoq +nkbcgflathzwsijxrevymxdpos +nkucgflatfzwsijxrevymwdqoq +hkucgflaqwzwsijxrevymbdpoq +nkjcgflathzvsijxrevyjbdpoq +niucgflathzwsijxrezymbdpob +ynucgflathzwsijxremymbdpoq +nkubgflathzwsijxrhvymldpoq +nkucqflrthzesijxrevymbdpoq +nkucgulathzwsijxrevyubdioq +nkuczflathzwsijxaebymbdpoq +nkucgfldthzwsibxrevymrdpoq +nkucgflatwzdsijxrevymsdpoq +nkncgffathzwsijxrejymbdpoq +nkucgflathzqsijxrevxmodpoq +nkucgflathwwsijqrevymbipoq +nkucgflathzwhajxrebymbdpoq +gkucgflathzwsijxreirmbdpoq +nkucgflathzesijzravymbdpoq +nkucgflaghzwsijxrerymbdplq +wkucgflathxwgijxrevymbdpoq +nkucgfljthfwsijxrevymbdpfq +nkucgflathwwsimxrevymbdpjq +nkucgdlachzwsijxrevymmdpoq +njucgclathzwsiixrevymbdpoq +nkucgflatdzwsijxrevymzrpoq +nkuckflatvzcsijxrevymbdpoq +nkucgflathzhsijxrevqmbkpoq +nkucqflathzjsijvrevymbdpoq +nkucgftathzwsijxrevympdpoi +nvucgflatmzwsijxrevymbdpsq +nkocgflathznsijxrevymbdphq +mkgcgflathzwsijxrevymbdpvq +nkucnflathzwsijbrevymbdcoq +nkucgflathzwsijsrevymsdgoq +nkuckflatxzwsiwxrevymbdpoq +nkucyflathzwsijxrehcmbdpoq +nkurgflajhzwsijxrevkmbdpoq +wkucgflathzwsijxrfvymbapoq +nkucgflathzwsijxaekymbdpon +nkucgfkathywsijxrevymbdpsq +nkucgflathzwsijxaexcmbdpoq +nkucgflathzwsijxrevymddhox +nkucgflathzwgijxrevymydooq +nkycqflathzwsijxrezymbdpoq +nkucgflathwwsijxrevymbspsq +nkucgflatpzwssjfrevymbdpoq +nkwcgflhthzwsijxrevcmbdpoq diff --git a/2018/d03/ex1/ex1.py b/2018/d03/ex1/ex1.py new file mode 100755 index 0000000..b5feb37 --- /dev/null +++ b/2018/d03/ex1/ex1.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Claim(NamedTuple): + top_left: Point + size: Point + + def points(self) -> Iterator[Point]: + for dx, dy in map( + Point._make, itertools.product(range(self.size.x), range(self.size.y)) + ): + yield Point(self.top_left.x + dx, self.top_left.y + dy) + + +def solve(input: str) -> int: + def parse_claim(input: str) -> Claim: + offset, size = input.split("@")[1].strip().split(": ") + return Claim( + Point(*map(int, offset.split(","))), + Point(*map(int, size.split("x"))), + ) + + def parse(input: list[str]) -> list[Claim]: + return [parse_claim(line) for line in input] + + def claim_per_point(claims: list[Claim]) -> dict[Point, int]: + points = itertools.chain.from_iterable(map(Claim.points, claims)) + return Counter(points) + + claims = parse(input.splitlines()) + return sum(count > 1 for count in claim_per_point(claims).values()) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d03/ex1/input b/2018/d03/ex1/input new file mode 100644 index 0000000..cc0bfba --- /dev/null +++ b/2018/d03/ex1/input @@ -0,0 +1,1397 @@ +#1 @ 287,428: 27x20 +#2 @ 282,539: 20x10 +#3 @ 550,118: 20x23 +#4 @ 454,774: 20x19 +#5 @ 542,157: 11x24 +#6 @ 249,134: 15x20 +#7 @ 825,137: 12x22 +#8 @ 444,393: 12x10 +#9 @ 810,143: 27x20 +#10 @ 674,274: 25x13 +#11 @ 974,802: 13x15 +#12 @ 607,514: 22x24 +#13 @ 640,627: 24x25 +#14 @ 188,652: 5x17 +#15 @ 268,962: 16x12 +#16 @ 868,950: 26x22 +#17 @ 309,698: 27x29 +#18 @ 51,514: 26x17 +#19 @ 939,416: 25x25 +#20 @ 262,284: 12x17 +#21 @ 46,269: 13x29 +#22 @ 340,492: 26x26 +#23 @ 311,885: 13x21 +#24 @ 564,656: 21x16 +#25 @ 805,434: 17x16 +#26 @ 355,616: 5x18 +#27 @ 485,434: 29x18 +#28 @ 685,751: 18x26 +#29 @ 321,768: 14x12 +#30 @ 287,551: 8x10 +#31 @ 327,181: 28x25 +#32 @ 74,698: 10x28 +#33 @ 47,758: 21x17 +#34 @ 86,359: 27x25 +#35 @ 944,163: 17x18 +#36 @ 338,306: 28x17 +#37 @ 415,344: 22x22 +#38 @ 702,845: 22x19 +#39 @ 320,718: 24x22 +#40 @ 955,914: 19x29 +#41 @ 551,434: 20x19 +#42 @ 275,198: 24x16 +#43 @ 219,290: 13x20 +#44 @ 712,749: 18x23 +#45 @ 759,839: 14x10 +#46 @ 792,885: 14x12 +#47 @ 109,75: 20x26 +#48 @ 957,801: 28x15 +#49 @ 433,538: 18x11 +#50 @ 245,365: 25x18 +#51 @ 520,978: 10x10 +#52 @ 355,59: 15x28 +#53 @ 422,420: 26x14 +#54 @ 890,543: 12x18 +#55 @ 41,813: 11x22 +#56 @ 941,452: 25x19 +#57 @ 155,485: 13x19 +#58 @ 652,260: 18x28 +#59 @ 527,935: 29x21 +#60 @ 402,292: 29x25 +#61 @ 175,586: 28x22 +#62 @ 239,403: 16x20 +#63 @ 609,209: 22x14 +#64 @ 464,798: 13x25 +#65 @ 275,972: 13x23 +#66 @ 260,940: 25x11 +#67 @ 43,358: 12x23 +#68 @ 359,278: 18x11 +#69 @ 184,634: 25x14 +#70 @ 57,763: 13x13 +#71 @ 838,384: 25x25 +#72 @ 22,256: 22x19 +#73 @ 707,921: 19x29 +#74 @ 504,229: 16x27 +#75 @ 658,555: 22x16 +#76 @ 825,642: 29x26 +#77 @ 622,572: 29x13 +#78 @ 187,174: 12x11 +#79 @ 236,469: 24x27 +#80 @ 977,77: 18x8 +#81 @ 734,779: 15x12 +#82 @ 859,826: 16x25 +#83 @ 386,215: 18x12 +#84 @ 840,671: 29x13 +#85 @ 862,119: 15x18 +#86 @ 603,203: 19x12 +#87 @ 559,435: 16x23 +#88 @ 657,470: 19x20 +#89 @ 704,184: 22x28 +#90 @ 597,490: 20x29 +#91 @ 936,217: 23x18 +#92 @ 513,231: 29x29 +#93 @ 83,504: 19x11 +#94 @ 868,66: 28x25 +#95 @ 834,840: 28x24 +#96 @ 39,768: 22x28 +#97 @ 937,35: 20x28 +#98 @ 371,896: 22x17 +#99 @ 469,969: 15x15 +#100 @ 476,845: 18x15 +#101 @ 526,632: 25x11 +#102 @ 588,911: 25x19 +#103 @ 419,609: 15x19 +#104 @ 908,900: 25x26 +#105 @ 445,881: 21x16 +#106 @ 283,821: 18x29 +#107 @ 231,213: 20x10 +#108 @ 699,974: 13x22 +#109 @ 314,969: 24x15 +#110 @ 393,594: 20x20 +#111 @ 708,859: 21x15 +#112 @ 540,557: 10x24 +#113 @ 104,977: 26x22 +#114 @ 213,212: 19x16 +#115 @ 935,628: 16x29 +#116 @ 21,353: 21x14 +#117 @ 904,303: 18x23 +#118 @ 83,295: 18x23 +#119 @ 192,183: 22x11 +#120 @ 672,500: 10x11 +#121 @ 253,58: 23x27 +#122 @ 554,664: 16x29 +#123 @ 365,668: 17x25 +#124 @ 294,870: 20x20 +#125 @ 352,534: 28x29 +#126 @ 104,712: 15x13 +#127 @ 486,221: 14x27 +#128 @ 148,772: 21x27 +#129 @ 376,67: 24x19 +#130 @ 396,581: 25x14 +#131 @ 576,939: 10x17 +#132 @ 856,544: 26x16 +#133 @ 232,75: 20x22 +#134 @ 949,287: 20x27 +#135 @ 52,512: 10x13 +#136 @ 51,604: 16x17 +#137 @ 953,552: 26x17 +#138 @ 185,645: 13x28 +#139 @ 541,202: 27x26 +#140 @ 594,509: 19x28 +#141 @ 214,104: 23x18 +#142 @ 540,294: 15x13 +#143 @ 7,286: 21x24 +#144 @ 404,202: 26x26 +#145 @ 775,677: 21x23 +#146 @ 349,282: 13x18 +#147 @ 214,913: 28x18 +#148 @ 722,931: 12x19 +#149 @ 582,688: 14x17 +#150 @ 90,952: 15x18 +#151 @ 888,653: 22x28 +#152 @ 224,195: 17x28 +#153 @ 664,300: 28x14 +#154 @ 271,564: 13x22 +#155 @ 696,943: 18x29 +#156 @ 445,278: 16x19 +#157 @ 748,783: 15x25 +#158 @ 460,722: 16x19 +#159 @ 207,107: 24x19 +#160 @ 900,964: 21x12 +#161 @ 471,791: 21x15 +#162 @ 555,258: 20x10 +#163 @ 341,36: 17x26 +#164 @ 458,222: 29x14 +#165 @ 900,15: 16x17 +#166 @ 305,964: 11x10 +#167 @ 213,798: 26x10 +#168 @ 188,887: 20x23 +#169 @ 162,31: 13x29 +#170 @ 609,627: 22x29 +#171 @ 506,739: 25x16 +#172 @ 735,413: 16x18 +#173 @ 140,232: 14x10 +#174 @ 365,624: 22x25 +#175 @ 127,190: 12x21 +#176 @ 389,453: 28x12 +#177 @ 224,205: 16x21 +#178 @ 518,108: 20x21 +#179 @ 570,927: 22x13 +#180 @ 891,313: 20x29 +#181 @ 893,599: 18x11 +#182 @ 749,814: 25x19 +#183 @ 847,377: 11x11 +#184 @ 155,22: 15x22 +#185 @ 508,534: 13x10 +#186 @ 626,247: 13x27 +#187 @ 374,388: 18x11 +#188 @ 907,475: 29x14 +#189 @ 871,813: 27x25 +#190 @ 540,324: 12x12 +#191 @ 259,546: 22x24 +#192 @ 249,751: 18x25 +#193 @ 247,497: 11x10 +#194 @ 41,326: 22x19 +#195 @ 157,481: 26x25 +#196 @ 291,211: 13x13 +#197 @ 265,78: 27x12 +#198 @ 273,77: 12x19 +#199 @ 756,94: 10x19 +#200 @ 462,973: 14x15 +#201 @ 821,303: 13x21 +#202 @ 454,948: 20x26 +#203 @ 902,275: 24x24 +#204 @ 444,158: 28x16 +#205 @ 675,524: 21x10 +#206 @ 780,941: 23x27 +#207 @ 459,149: 16x25 +#208 @ 943,826: 23x15 +#209 @ 694,424: 16x18 +#210 @ 204,592: 18x4 +#211 @ 972,415: 19x18 +#212 @ 679,190: 12x22 +#213 @ 906,834: 10x25 +#214 @ 480,783: 12x27 +#215 @ 633,699: 18x25 +#216 @ 1,170: 26x29 +#217 @ 886,781: 18x12 +#218 @ 738,937: 25x24 +#219 @ 109,728: 28x26 +#220 @ 723,860: 21x11 +#221 @ 81,230: 17x28 +#222 @ 164,93: 17x22 +#223 @ 439,940: 24x23 +#224 @ 341,614: 13x25 +#225 @ 282,680: 12x28 +#226 @ 551,470: 27x19 +#227 @ 897,547: 11x17 +#228 @ 866,130: 26x18 +#229 @ 555,592: 18x21 +#230 @ 889,672: 20x19 +#231 @ 565,596: 21x18 +#232 @ 789,146: 15x13 +#233 @ 536,60: 10x23 +#234 @ 673,481: 13x20 +#235 @ 947,240: 18x27 +#236 @ 325,737: 21x12 +#237 @ 773,608: 16x17 +#238 @ 444,577: 13x27 +#239 @ 295,751: 14x12 +#240 @ 651,181: 29x16 +#241 @ 218,653: 18x12 +#242 @ 607,651: 14x13 +#243 @ 538,916: 29x13 +#244 @ 266,540: 20x28 +#245 @ 139,507: 29x20 +#246 @ 873,700: 28x28 +#247 @ 691,182: 23x26 +#248 @ 399,438: 20x13 +#249 @ 497,865: 29x19 +#250 @ 977,932: 16x26 +#251 @ 181,689: 12x27 +#252 @ 234,397: 12x14 +#253 @ 461,560: 20x11 +#254 @ 650,868: 15x24 +#255 @ 861,293: 17x19 +#256 @ 731,49: 17x13 +#257 @ 885,594: 11x13 +#258 @ 937,542: 10x16 +#259 @ 841,292: 26x28 +#260 @ 298,642: 24x18 +#261 @ 842,667: 13x14 +#262 @ 281,548: 18x19 +#263 @ 562,218: 18x19 +#264 @ 319,674: 29x16 +#265 @ 403,60: 21x21 +#266 @ 847,62: 28x17 +#267 @ 557,202: 15x29 +#268 @ 155,768: 11x22 +#269 @ 67,294: 24x24 +#270 @ 731,391: 28x26 +#271 @ 542,562: 3x14 +#272 @ 691,661: 20x17 +#273 @ 447,91: 23x15 +#274 @ 914,753: 20x26 +#275 @ 266,770: 20x16 +#276 @ 657,878: 14x26 +#277 @ 362,642: 13x21 +#278 @ 535,609: 29x28 +#279 @ 307,435: 29x29 +#280 @ 779,729: 13x22 +#281 @ 906,938: 23x27 +#282 @ 688,683: 19x19 +#283 @ 297,748: 12x10 +#284 @ 801,875: 21x10 +#285 @ 858,142: 17x11 +#286 @ 810,821: 23x18 +#287 @ 792,105: 21x11 +#288 @ 549,148: 17x10 +#289 @ 491,562: 18x11 +#290 @ 706,862: 14x13 +#291 @ 812,290: 29x21 +#292 @ 367,597: 23x19 +#293 @ 971,555: 24x18 +#294 @ 661,474: 19x12 +#295 @ 167,345: 10x24 +#296 @ 825,886: 20x17 +#297 @ 782,396: 27x20 +#298 @ 53,181: 23x29 +#299 @ 95,219: 17x25 +#300 @ 933,53: 26x22 +#301 @ 511,156: 17x13 +#302 @ 926,618: 20x21 +#303 @ 449,605: 12x19 +#304 @ 192,755: 25x13 +#305 @ 950,310: 13x29 +#306 @ 282,40: 23x27 +#307 @ 253,123: 28x23 +#308 @ 739,495: 19x14 +#309 @ 857,954: 15x13 +#310 @ 566,380: 26x20 +#311 @ 121,709: 15x10 +#312 @ 209,802: 19x29 +#313 @ 245,307: 10x26 +#314 @ 870,57: 10x13 +#315 @ 402,883: 13x12 +#316 @ 741,222: 16x15 +#317 @ 882,13: 21x24 +#318 @ 775,654: 15x16 +#319 @ 308,199: 27x28 +#320 @ 153,381: 24x16 +#321 @ 636,43: 26x17 +#322 @ 100,334: 12x27 +#323 @ 970,649: 23x11 +#324 @ 332,953: 23x28 +#325 @ 460,39: 19x29 +#326 @ 826,152: 24x21 +#327 @ 488,880: 29x12 +#328 @ 907,15: 18x14 +#329 @ 640,701: 14x21 +#330 @ 251,290: 12x24 +#331 @ 213,772: 10x24 +#332 @ 20,813: 8x3 +#333 @ 265,963: 12x27 +#334 @ 390,444: 16x13 +#335 @ 610,287: 25x12 +#336 @ 739,722: 26x15 +#337 @ 510,52: 18x13 +#338 @ 250,253: 23x11 +#339 @ 600,605: 11x28 +#340 @ 566,230: 25x27 +#341 @ 322,723: 16x21 +#342 @ 306,372: 20x10 +#343 @ 188,631: 28x10 +#344 @ 772,302: 12x13 +#345 @ 686,390: 18x21 +#346 @ 927,628: 10x24 +#347 @ 691,22: 23x21 +#348 @ 159,961: 19x22 +#349 @ 35,125: 4x7 +#350 @ 346,80: 11x18 +#351 @ 221,241: 22x26 +#352 @ 699,678: 18x24 +#353 @ 421,592: 14x20 +#354 @ 752,101: 11x14 +#355 @ 202,157: 28x23 +#356 @ 202,466: 28x25 +#357 @ 381,75: 28x12 +#358 @ 933,666: 26x24 +#359 @ 315,787: 18x19 +#360 @ 312,377: 20x21 +#361 @ 555,612: 24x18 +#362 @ 245,357: 27x25 +#363 @ 39,562: 13x11 +#364 @ 500,619: 26x13 +#365 @ 645,513: 3x4 +#366 @ 789,652: 11x27 +#367 @ 632,534: 11x26 +#368 @ 220,820: 27x15 +#369 @ 952,732: 23x22 +#370 @ 581,541: 20x17 +#371 @ 214,531: 13x16 +#372 @ 183,189: 27x14 +#373 @ 420,938: 25x19 +#374 @ 237,674: 22x20 +#375 @ 253,655: 16x28 +#376 @ 720,966: 10x18 +#377 @ 203,487: 18x12 +#378 @ 4,437: 12x10 +#379 @ 58,859: 15x20 +#380 @ 140,705: 28x18 +#381 @ 196,656: 25x20 +#382 @ 604,959: 28x28 +#383 @ 703,671: 27x18 +#384 @ 60,379: 16x11 +#385 @ 126,201: 25x11 +#386 @ 255,850: 23x21 +#387 @ 608,524: 14x22 +#388 @ 490,880: 24x19 +#389 @ 817,545: 23x13 +#390 @ 471,979: 20x12 +#391 @ 576,910: 27x19 +#392 @ 190,263: 17x15 +#393 @ 240,480: 19x28 +#394 @ 54,271: 10x13 +#395 @ 286,559: 14x20 +#396 @ 359,280: 12x29 +#397 @ 798,822: 10x20 +#398 @ 898,452: 27x20 +#399 @ 960,608: 12x14 +#400 @ 980,326: 19x17 +#401 @ 43,58: 28x23 +#402 @ 219,225: 10x20 +#403 @ 73,699: 14x28 +#404 @ 773,865: 17x21 +#405 @ 341,507: 25x20 +#406 @ 212,949: 15x23 +#407 @ 377,520: 20x25 +#408 @ 808,374: 28x22 +#409 @ 280,923: 28x18 +#410 @ 527,67: 27x25 +#411 @ 971,379: 20x10 +#412 @ 838,617: 14x23 +#413 @ 468,87: 14x12 +#414 @ 264,133: 23x25 +#415 @ 824,913: 22x14 +#416 @ 845,139: 23x20 +#417 @ 95,846: 14x17 +#418 @ 0,437: 19x28 +#419 @ 45,368: 12x17 +#420 @ 167,604: 24x27 +#421 @ 485,925: 24x29 +#422 @ 340,589: 17x12 +#423 @ 276,66: 21x15 +#424 @ 483,441: 24x23 +#425 @ 252,461: 15x14 +#426 @ 454,60: 16x29 +#427 @ 406,885: 11x23 +#428 @ 760,743: 13x20 +#429 @ 346,573: 21x11 +#430 @ 60,299: 28x10 +#431 @ 709,303: 12x12 +#432 @ 731,930: 7x3 +#433 @ 204,410: 13x21 +#434 @ 588,850: 23x19 +#435 @ 419,599: 16x18 +#436 @ 648,705: 12x14 +#437 @ 232,909: 26x20 +#438 @ 931,175: 17x16 +#439 @ 959,742: 27x22 +#440 @ 423,624: 26x17 +#441 @ 107,715: 25x12 +#442 @ 655,651: 11x21 +#443 @ 840,610: 20x23 +#444 @ 205,191: 11x13 +#445 @ 74,26: 24x28 +#446 @ 879,460: 29x21 +#447 @ 355,740: 11x15 +#448 @ 341,913: 20x10 +#449 @ 310,245: 18x10 +#450 @ 194,180: 11x22 +#451 @ 129,786: 26x25 +#452 @ 438,895: 25x19 +#453 @ 12,454: 25x25 +#454 @ 62,683: 25x23 +#455 @ 44,178: 10x14 +#456 @ 571,651: 16x25 +#457 @ 320,262: 13x13 +#458 @ 360,155: 25x16 +#459 @ 98,188: 20x20 +#460 @ 319,753: 10x10 +#461 @ 709,874: 29x10 +#462 @ 321,681: 12x12 +#463 @ 136,794: 20x15 +#464 @ 878,871: 12x19 +#465 @ 286,107: 24x11 +#466 @ 585,37: 22x21 +#467 @ 450,164: 24x17 +#468 @ 312,23: 12x24 +#469 @ 543,113: 29x18 +#470 @ 782,12: 14x16 +#471 @ 854,145: 27x18 +#472 @ 650,517: 24x22 +#473 @ 176,567: 18x17 +#474 @ 699,427: 15x16 +#475 @ 634,448: 11x24 +#476 @ 662,899: 24x18 +#477 @ 49,342: 10x19 +#478 @ 768,27: 21x20 +#479 @ 191,740: 19x10 +#480 @ 82,282: 22x17 +#481 @ 736,935: 14x21 +#482 @ 856,359: 26x11 +#483 @ 109,329: 23x19 +#484 @ 344,749: 27x17 +#485 @ 109,799: 26x11 +#486 @ 631,506: 11x23 +#487 @ 847,117: 29x22 +#488 @ 518,82: 20x13 +#489 @ 372,606: 22x15 +#490 @ 159,392: 20x16 +#491 @ 577,842: 17x26 +#492 @ 199,304: 23x16 +#493 @ 857,947: 18x20 +#494 @ 566,384: 29x22 +#495 @ 460,557: 12x12 +#496 @ 39,98: 20x26 +#497 @ 780,20: 24x11 +#498 @ 19,217: 14x18 +#499 @ 360,771: 29x15 +#500 @ 343,718: 17x23 +#501 @ 703,741: 28x11 +#502 @ 703,749: 25x13 +#503 @ 104,280: 29x21 +#504 @ 302,832: 24x29 +#505 @ 656,906: 28x21 +#506 @ 833,35: 13x17 +#507 @ 70,155: 18x26 +#508 @ 483,434: 13x26 +#509 @ 676,766: 16x17 +#510 @ 380,970: 10x11 +#511 @ 212,12: 25x16 +#512 @ 927,613: 22x24 +#513 @ 579,70: 10x18 +#514 @ 907,265: 19x22 +#515 @ 212,942: 26x16 +#516 @ 451,561: 28x20 +#517 @ 689,958: 23x28 +#518 @ 534,938: 28x10 +#519 @ 382,145: 18x21 +#520 @ 623,342: 23x24 +#521 @ 361,678: 18x18 +#522 @ 541,385: 25x26 +#523 @ 102,836: 26x22 +#524 @ 800,532: 22x11 +#525 @ 763,292: 21x16 +#526 @ 370,269: 17x18 +#527 @ 271,229: 21x18 +#528 @ 723,804: 19x22 +#529 @ 348,360: 18x22 +#530 @ 98,853: 25x11 +#531 @ 489,21: 13x19 +#532 @ 93,968: 15x11 +#533 @ 418,719: 26x27 +#534 @ 204,490: 23x16 +#535 @ 289,969: 29x10 +#536 @ 564,350: 28x21 +#537 @ 426,404: 22x23 +#538 @ 856,132: 13x15 +#539 @ 795,630: 22x29 +#540 @ 219,868: 22x11 +#541 @ 152,566: 23x14 +#542 @ 689,891: 21x12 +#543 @ 776,853: 10x22 +#544 @ 908,764: 15x17 +#545 @ 946,938: 18x18 +#546 @ 658,786: 25x19 +#547 @ 307,781: 26x22 +#548 @ 200,961: 19x29 +#549 @ 975,851: 17x28 +#550 @ 229,24: 18x25 +#551 @ 67,367: 18x16 +#552 @ 370,965: 15x25 +#553 @ 616,283: 23x13 +#554 @ 67,894: 24x29 +#555 @ 681,743: 12x18 +#556 @ 241,550: 23x27 +#557 @ 729,54: 25x26 +#558 @ 546,320: 21x16 +#559 @ 388,755: 20x19 +#560 @ 217,797: 16x11 +#561 @ 154,921: 13x16 +#562 @ 900,671: 27x20 +#563 @ 692,678: 27x12 +#564 @ 391,372: 11x14 +#565 @ 63,899: 13x15 +#566 @ 872,50: 24x26 +#567 @ 652,802: 11x27 +#568 @ 763,570: 11x22 +#569 @ 314,258: 20x11 +#570 @ 909,607: 23x26 +#571 @ 238,414: 23x19 +#572 @ 184,15: 12x29 +#573 @ 178,433: 16x11 +#574 @ 397,847: 21x24 +#575 @ 448,168: 21x26 +#576 @ 443,410: 14x22 +#577 @ 863,408: 12x25 +#578 @ 332,421: 23x17 +#579 @ 55,363: 21x28 +#580 @ 587,680: 13x29 +#581 @ 366,781: 27x22 +#582 @ 483,642: 26x15 +#583 @ 732,617: 27x15 +#584 @ 386,578: 29x17 +#585 @ 584,636: 18x22 +#586 @ 738,361: 21x24 +#587 @ 404,280: 25x20 +#588 @ 204,949: 24x19 +#589 @ 308,973: 13x27 +#590 @ 976,947: 23x14 +#591 @ 959,184: 14x18 +#592 @ 935,409: 23x14 +#593 @ 402,903: 16x19 +#594 @ 493,699: 10x16 +#595 @ 943,199: 23x10 +#596 @ 20,198: 26x19 +#597 @ 968,609: 11x17 +#598 @ 75,916: 24x14 +#599 @ 91,486: 14x24 +#600 @ 720,761: 11x24 +#601 @ 424,125: 21x26 +#602 @ 496,885: 20x22 +#603 @ 48,168: 29x12 +#604 @ 49,633: 15x18 +#605 @ 335,588: 12x21 +#606 @ 863,960: 24x25 +#607 @ 542,607: 25x22 +#608 @ 592,239: 22x20 +#609 @ 246,671: 28x10 +#610 @ 101,506: 21x27 +#611 @ 516,488: 16x16 +#612 @ 193,205: 15x16 +#613 @ 488,645: 24x24 +#614 @ 694,704: 22x26 +#615 @ 529,842: 27x25 +#616 @ 798,655: 27x12 +#617 @ 225,871: 16x24 +#618 @ 875,873: 27x20 +#619 @ 210,464: 17x28 +#620 @ 558,612: 12x16 +#621 @ 467,789: 14x28 +#622 @ 79,950: 17x16 +#623 @ 35,749: 10x28 +#624 @ 403,301: 16x13 +#625 @ 401,222: 26x27 +#626 @ 291,830: 28x22 +#627 @ 64,945: 25x24 +#628 @ 908,812: 11x26 +#629 @ 42,810: 29x20 +#630 @ 645,273: 24x16 +#631 @ 786,124: 15x25 +#632 @ 21,840: 19x17 +#633 @ 296,684: 24x11 +#634 @ 731,188: 20x12 +#635 @ 544,615: 28x20 +#636 @ 17,410: 19x10 +#637 @ 881,853: 23x26 +#638 @ 730,918: 16x24 +#639 @ 768,691: 16x11 +#640 @ 381,397: 24x12 +#641 @ 160,97: 18x28 +#642 @ 164,660: 26x17 +#643 @ 100,267: 19x19 +#644 @ 713,725: 21x24 +#645 @ 270,944: 23x18 +#646 @ 88,806: 22x22 +#647 @ 453,556: 21x18 +#648 @ 914,671: 11x20 +#649 @ 494,884: 19x4 +#650 @ 959,394: 19x13 +#651 @ 628,608: 20x15 +#652 @ 353,375: 28x26 +#653 @ 10,174: 20x13 +#654 @ 465,855: 22x17 +#655 @ 176,878: 17x27 +#656 @ 701,868: 12x11 +#657 @ 100,7: 15x19 +#658 @ 29,784: 27x14 +#659 @ 96,138: 10x13 +#660 @ 707,43: 15x26 +#661 @ 945,523: 29x23 +#662 @ 336,917: 12x10 +#663 @ 512,795: 14x27 +#664 @ 11,359: 3x11 +#665 @ 106,844: 18x13 +#666 @ 970,246: 11x23 +#667 @ 479,957: 23x15 +#668 @ 808,502: 12x14 +#669 @ 375,743: 20x18 +#670 @ 881,271: 27x11 +#671 @ 329,373: 28x25 +#672 @ 103,730: 26x14 +#673 @ 432,510: 18x29 +#674 @ 798,487: 17x20 +#675 @ 539,873: 22x17 +#676 @ 297,540: 21x27 +#677 @ 50,242: 20x13 +#678 @ 362,647: 27x13 +#679 @ 405,597: 23x28 +#680 @ 639,447: 20x10 +#681 @ 198,430: 19x20 +#682 @ 414,460: 22x13 +#683 @ 164,608: 18x14 +#684 @ 898,259: 19x14 +#685 @ 152,934: 13x11 +#686 @ 598,285: 24x28 +#687 @ 858,905: 20x25 +#688 @ 14,613: 14x29 +#689 @ 238,769: 18x26 +#690 @ 715,862: 5x8 +#691 @ 617,47: 29x28 +#692 @ 669,824: 11x27 +#693 @ 948,649: 18x13 +#694 @ 128,901: 29x18 +#695 @ 256,72: 14x25 +#696 @ 361,712: 18x23 +#697 @ 75,482: 22x23 +#698 @ 914,654: 15x25 +#699 @ 482,119: 19x28 +#700 @ 58,842: 18x15 +#701 @ 563,970: 10x17 +#702 @ 417,555: 19x12 +#703 @ 427,142: 26x24 +#704 @ 715,541: 13x27 +#705 @ 356,284: 12x11 +#706 @ 335,633: 15x23 +#707 @ 313,980: 14x16 +#708 @ 427,418: 19x17 +#709 @ 53,892: 12x28 +#710 @ 772,27: 17x20 +#711 @ 546,947: 28x19 +#712 @ 889,492: 18x29 +#713 @ 320,943: 20x27 +#714 @ 192,613: 11x19 +#715 @ 413,600: 22x25 +#716 @ 923,413: 18x27 +#717 @ 216,961: 14x13 +#718 @ 89,972: 18x10 +#719 @ 893,606: 29x21 +#720 @ 360,467: 18x24 +#721 @ 949,617: 24x10 +#722 @ 490,702: 18x12 +#723 @ 285,955: 25x19 +#724 @ 217,928: 13x23 +#725 @ 906,488: 15x25 +#726 @ 846,782: 20x10 +#727 @ 475,473: 16x15 +#728 @ 328,613: 13x9 +#729 @ 410,563: 27x17 +#730 @ 221,890: 15x17 +#731 @ 77,465: 28x19 +#732 @ 500,764: 27x27 +#733 @ 391,900: 18x15 +#734 @ 65,718: 13x13 +#735 @ 745,170: 23x23 +#736 @ 10,416: 14x19 +#737 @ 201,608: 23x14 +#738 @ 798,824: 15x24 +#739 @ 475,103: 20x17 +#740 @ 863,781: 13x21 +#741 @ 778,643: 24x19 +#742 @ 946,967: 26x23 +#743 @ 515,974: 24x20 +#744 @ 339,422: 12x19 +#745 @ 882,304: 29x18 +#746 @ 981,124: 15x13 +#747 @ 913,744: 10x28 +#748 @ 885,482: 25x22 +#749 @ 64,176: 12x15 +#750 @ 303,639: 22x24 +#751 @ 648,689: 11x29 +#752 @ 13,762: 27x23 +#753 @ 838,585: 17x28 +#754 @ 224,69: 14x20 +#755 @ 111,666: 29x29 +#756 @ 911,139: 10x24 +#757 @ 169,640: 11x11 +#758 @ 535,834: 15x14 +#759 @ 98,425: 26x21 +#760 @ 32,119: 28x28 +#761 @ 56,481: 17x10 +#762 @ 281,117: 16x26 +#763 @ 533,599: 22x16 +#764 @ 443,808: 19x13 +#765 @ 381,277: 20x14 +#766 @ 491,481: 14x17 +#767 @ 517,808: 13x29 +#768 @ 620,558: 24x17 +#769 @ 347,364: 25x29 +#770 @ 933,91: 6x22 +#771 @ 813,612: 28x21 +#772 @ 491,254: 14x11 +#773 @ 504,773: 13x28 +#774 @ 347,93: 10x17 +#775 @ 138,30: 25x14 +#776 @ 529,459: 11x20 +#777 @ 518,73: 21x19 +#778 @ 721,630: 20x18 +#779 @ 265,141: 9x7 +#780 @ 958,659: 10x22 +#781 @ 912,147: 25x15 +#782 @ 709,765: 26x20 +#783 @ 18,210: 26x14 +#784 @ 96,968: 14x13 +#785 @ 891,465: 14x26 +#786 @ 247,261: 28x12 +#787 @ 237,122: 19x26 +#788 @ 430,945: 17x13 +#789 @ 756,202: 12x29 +#790 @ 78,702: 15x19 +#791 @ 955,834: 26x22 +#792 @ 716,694: 18x13 +#793 @ 306,303: 24x25 +#794 @ 317,227: 14x20 +#795 @ 415,2: 16x13 +#796 @ 116,851: 26x21 +#797 @ 844,670: 28x19 +#798 @ 220,888: 23x26 +#799 @ 265,882: 29x25 +#800 @ 535,635: 25x21 +#801 @ 582,630: 25x25 +#802 @ 252,382: 11x26 +#803 @ 184,739: 14x10 +#804 @ 408,622: 12x17 +#805 @ 754,620: 14x13 +#806 @ 448,161: 13x16 +#807 @ 741,51: 29x27 +#808 @ 759,446: 14x24 +#809 @ 877,58: 16x23 +#810 @ 550,387: 10x18 +#811 @ 960,129: 22x26 +#812 @ 784,890: 11x21 +#813 @ 1,328: 28x10 +#814 @ 166,427: 17x11 +#815 @ 105,5: 17x11 +#816 @ 779,662: 27x17 +#817 @ 537,473: 21x20 +#818 @ 860,665: 17x15 +#819 @ 434,131: 21x26 +#820 @ 754,350: 20x13 +#821 @ 746,275: 11x26 +#822 @ 653,556: 20x13 +#823 @ 386,757: 14x13 +#824 @ 259,832: 5x5 +#825 @ 345,635: 29x26 +#826 @ 61,368: 10x18 +#827 @ 418,316: 27x24 +#828 @ 192,183: 20x10 +#829 @ 550,785: 16x10 +#830 @ 966,104: 15x18 +#831 @ 892,3: 19x16 +#832 @ 87,733: 25x12 +#833 @ 525,616: 25x27 +#834 @ 248,282: 27x21 +#835 @ 281,664: 23x17 +#836 @ 313,563: 15x20 +#837 @ 554,587: 21x14 +#838 @ 858,956: 22x17 +#839 @ 342,762: 22x16 +#840 @ 974,395: 17x13 +#841 @ 855,765: 15x25 +#842 @ 5,551: 14x14 +#843 @ 548,389: 12x16 +#844 @ 976,806: 8x7 +#845 @ 943,130: 28x27 +#846 @ 563,368: 15x17 +#847 @ 594,252: 19x26 +#848 @ 858,927: 26x18 +#849 @ 678,900: 27x21 +#850 @ 554,373: 18x15 +#851 @ 625,656: 10x23 +#852 @ 500,310: 26x12 +#853 @ 96,969: 27x27 +#854 @ 211,737: 18x21 +#855 @ 329,150: 18x10 +#856 @ 595,39: 20x16 +#857 @ 259,208: 23x29 +#858 @ 196,477: 4x22 +#859 @ 109,622: 29x17 +#860 @ 29,539: 11x25 +#861 @ 454,193: 16x16 +#862 @ 381,221: 11x22 +#863 @ 342,435: 13x18 +#864 @ 40,544: 24x24 +#865 @ 366,702: 27x13 +#866 @ 299,531: 15x13 +#867 @ 440,30: 11x18 +#868 @ 675,281: 18x10 +#869 @ 7,310: 22x29 +#870 @ 880,467: 25x20 +#871 @ 172,4: 19x29 +#872 @ 816,193: 19x29 +#873 @ 466,10: 15x21 +#874 @ 564,411: 19x28 +#875 @ 902,313: 16x17 +#876 @ 410,448: 11x13 +#877 @ 351,153: 20x25 +#878 @ 446,41: 23x14 +#879 @ 535,786: 27x26 +#880 @ 512,849: 28x12 +#881 @ 933,447: 24x21 +#882 @ 241,555: 29x18 +#883 @ 489,539: 26x29 +#884 @ 449,843: 21x24 +#885 @ 90,663: 27x12 +#886 @ 533,627: 13x18 +#887 @ 405,189: 24x24 +#888 @ 245,114: 24x17 +#889 @ 487,863: 20x25 +#890 @ 223,595: 16x16 +#891 @ 697,100: 11x12 +#892 @ 107,282: 22x9 +#893 @ 963,904: 20x25 +#894 @ 851,622: 13x26 +#895 @ 841,221: 29x12 +#896 @ 405,459: 18x13 +#897 @ 56,59: 23x10 +#898 @ 9,445: 27x12 +#899 @ 440,319: 14x11 +#900 @ 756,823: 12x25 +#901 @ 940,681: 27x26 +#902 @ 906,306: 13x13 +#903 @ 290,655: 17x15 +#904 @ 276,968: 14x22 +#905 @ 23,792: 27x13 +#906 @ 7,847: 17x12 +#907 @ 315,199: 14x29 +#908 @ 280,103: 27x13 +#909 @ 744,636: 16x20 +#910 @ 202,729: 15x21 +#911 @ 663,404: 15x27 +#912 @ 89,125: 13x16 +#913 @ 829,851: 18x25 +#914 @ 713,964: 24x22 +#915 @ 645,597: 23x22 +#916 @ 681,887: 17x12 +#917 @ 83,317: 25x23 +#918 @ 22,452: 27x26 +#919 @ 21,303: 11x27 +#920 @ 899,950: 18x14 +#921 @ 446,380: 22x16 +#922 @ 499,57: 22x19 +#923 @ 21,208: 15x18 +#924 @ 522,591: 23x16 +#925 @ 671,834: 4x4 +#926 @ 487,6: 17x18 +#927 @ 784,742: 15x20 +#928 @ 355,753: 29x24 +#929 @ 743,204: 10x23 +#930 @ 529,920: 20x25 +#931 @ 237,215: 10x5 +#932 @ 92,19: 28x29 +#933 @ 739,57: 27x25 +#934 @ 93,448: 23x25 +#935 @ 838,202: 21x23 +#936 @ 440,59: 26x24 +#937 @ 171,854: 11x10 +#938 @ 322,229: 5x6 +#939 @ 284,24: 19x24 +#940 @ 172,615: 22x19 +#941 @ 156,665: 24x29 +#942 @ 907,468: 24x22 +#943 @ 423,294: 15x14 +#944 @ 388,693: 29x13 +#945 @ 688,149: 25x18 +#946 @ 384,381: 11x11 +#947 @ 1,137: 19x17 +#948 @ 217,888: 11x12 +#949 @ 518,273: 18x15 +#950 @ 528,284: 27x29 +#951 @ 663,547: 16x18 +#952 @ 937,719: 11x23 +#953 @ 806,98: 13x18 +#954 @ 237,328: 26x10 +#955 @ 543,601: 14x14 +#956 @ 314,29: 3x8 +#957 @ 266,491: 12x19 +#958 @ 625,500: 25x21 +#959 @ 892,766: 20x10 +#960 @ 12,263: 14x27 +#961 @ 731,183: 26x23 +#962 @ 469,950: 25x10 +#963 @ 14,134: 25x23 +#964 @ 673,479: 12x29 +#965 @ 160,574: 29x13 +#966 @ 920,765: 21x22 +#967 @ 970,616: 23x16 +#968 @ 963,605: 13x28 +#969 @ 322,611: 23x15 +#970 @ 954,547: 14x16 +#971 @ 959,221: 20x27 +#972 @ 612,47: 13x11 +#973 @ 606,26: 13x24 +#974 @ 751,918: 14x29 +#975 @ 30,450: 18x27 +#976 @ 386,76: 21x22 +#977 @ 519,840: 17x12 +#978 @ 486,541: 18x24 +#979 @ 156,29: 26x23 +#980 @ 671,319: 24x15 +#981 @ 70,272: 14x26 +#982 @ 517,259: 16x29 +#983 @ 949,444: 19x26 +#984 @ 666,299: 10x12 +#985 @ 559,660: 14x18 +#986 @ 740,181: 12x23 +#987 @ 442,793: 22x22 +#988 @ 728,82: 29x27 +#989 @ 717,529: 12x25 +#990 @ 79,352: 21x12 +#991 @ 197,966: 20x22 +#992 @ 761,518: 28x15 +#993 @ 694,93: 24x28 +#994 @ 134,699: 19x11 +#995 @ 897,958: 24x28 +#996 @ 931,89: 16x27 +#997 @ 939,739: 11x27 +#998 @ 235,912: 14x21 +#999 @ 48,616: 14x17 +#1000 @ 558,689: 27x15 +#1001 @ 425,942: 26x28 +#1002 @ 451,543: 13x20 +#1003 @ 711,72: 25x11 +#1004 @ 515,837: 16x24 +#1005 @ 491,868: 29x22 +#1006 @ 150,404: 24x24 +#1007 @ 544,670: 22x14 +#1008 @ 758,822: 16x22 +#1009 @ 245,914: 20x18 +#1010 @ 216,802: 16x21 +#1011 @ 581,829: 14x19 +#1012 @ 704,42: 17x20 +#1013 @ 223,892: 11x26 +#1014 @ 777,622: 26x10 +#1015 @ 869,633: 29x23 +#1016 @ 28,612: 27x13 +#1017 @ 761,455: 4x6 +#1018 @ 217,775: 24x17 +#1019 @ 415,87: 29x21 +#1020 @ 122,630: 11x14 +#1021 @ 296,567: 12x11 +#1022 @ 832,893: 11x27 +#1023 @ 989,649: 10x29 +#1024 @ 719,629: 21x15 +#1025 @ 865,548: 29x26 +#1026 @ 967,245: 14x29 +#1027 @ 642,549: 26x11 +#1028 @ 542,304: 17x21 +#1029 @ 182,684: 21x20 +#1030 @ 691,405: 19x28 +#1031 @ 822,299: 21x14 +#1032 @ 258,507: 21x28 +#1033 @ 869,751: 25x23 +#1034 @ 326,662: 10x27 +#1035 @ 967,595: 18x19 +#1036 @ 613,236: 24x28 +#1037 @ 859,963: 10x21 +#1038 @ 892,965: 16x19 +#1039 @ 890,53: 25x27 +#1040 @ 472,817: 20x21 +#1041 @ 94,778: 23x13 +#1042 @ 364,67: 21x28 +#1043 @ 652,412: 28x11 +#1044 @ 892,463: 14x27 +#1045 @ 650,321: 20x19 +#1046 @ 333,950: 14x16 +#1047 @ 175,581: 26x25 +#1048 @ 331,213: 12x14 +#1049 @ 8,593: 19x12 +#1050 @ 356,57: 11x12 +#1051 @ 498,451: 25x22 +#1052 @ 368,705: 14x15 +#1053 @ 680,126: 28x24 +#1054 @ 728,173: 27x14 +#1055 @ 417,449: 27x23 +#1056 @ 364,396: 24x27 +#1057 @ 889,751: 26x25 +#1058 @ 360,47: 19x24 +#1059 @ 353,612: 14x26 +#1060 @ 697,382: 21x17 +#1061 @ 209,175: 29x19 +#1062 @ 159,916: 18x23 +#1063 @ 108,713: 23x20 +#1064 @ 678,410: 17x16 +#1065 @ 604,871: 24x23 +#1066 @ 584,926: 26x13 +#1067 @ 760,747: 23x26 +#1068 @ 210,929: 26x22 +#1069 @ 891,508: 27x19 +#1070 @ 441,94: 27x29 +#1071 @ 319,679: 25x18 +#1072 @ 589,516: 11x15 +#1073 @ 238,355: 23x10 +#1074 @ 376,368: 15x21 +#1075 @ 972,893: 13x17 +#1076 @ 944,538: 11x20 +#1077 @ 675,897: 11x13 +#1078 @ 867,88: 16x23 +#1079 @ 861,116: 16x14 +#1080 @ 433,578: 29x17 +#1081 @ 729,926: 12x15 +#1082 @ 104,196: 15x14 +#1083 @ 129,258: 14x11 +#1084 @ 573,46: 24x29 +#1085 @ 761,22: 24x10 +#1086 @ 278,949: 29x26 +#1087 @ 866,337: 13x29 +#1088 @ 28,312: 28x17 +#1089 @ 467,821: 19x23 +#1090 @ 323,896: 28x26 +#1091 @ 414,908: 26x11 +#1092 @ 328,171: 19x20 +#1093 @ 604,297: 28x10 +#1094 @ 842,667: 17x23 +#1095 @ 508,300: 21x19 +#1096 @ 866,397: 19x16 +#1097 @ 625,496: 12x23 +#1098 @ 450,763: 12x12 +#1099 @ 1,546: 22x29 +#1100 @ 912,730: 25x15 +#1101 @ 960,520: 13x19 +#1102 @ 369,367: 17x24 +#1103 @ 657,333: 27x15 +#1104 @ 193,475: 15x28 +#1105 @ 266,735: 11x21 +#1106 @ 39,156: 20x21 +#1107 @ 878,38: 15x20 +#1108 @ 720,759: 13x13 +#1109 @ 314,829: 15x10 +#1110 @ 145,521: 16x19 +#1111 @ 44,919: 26x27 +#1112 @ 504,890: 25x10 +#1113 @ 457,23: 27x20 +#1114 @ 364,342: 21x24 +#1115 @ 64,475: 21x24 +#1116 @ 315,250: 18x14 +#1117 @ 113,772: 28x28 +#1118 @ 513,734: 23x15 +#1119 @ 155,355: 15x16 +#1120 @ 499,914: 22x24 +#1121 @ 739,525: 23x19 +#1122 @ 171,645: 12x23 +#1123 @ 506,366: 29x29 +#1124 @ 226,258: 21x19 +#1125 @ 259,139: 21x12 +#1126 @ 172,955: 20x15 +#1127 @ 562,420: 17x21 +#1128 @ 15,856: 29x22 +#1129 @ 674,321: 17x7 +#1130 @ 445,563: 29x21 +#1131 @ 414,713: 10x24 +#1132 @ 304,303: 19x16 +#1133 @ 692,423: 27x15 +#1134 @ 943,840: 19x10 +#1135 @ 296,811: 12x20 +#1136 @ 477,810: 18x10 +#1137 @ 785,877: 27x27 +#1138 @ 946,424: 23x29 +#1139 @ 99,9: 26x23 +#1140 @ 551,607: 22x10 +#1141 @ 47,249: 26x13 +#1142 @ 807,394: 24x22 +#1143 @ 702,422: 29x16 +#1144 @ 549,270: 21x21 +#1145 @ 753,731: 10x29 +#1146 @ 457,54: 17x23 +#1147 @ 582,874: 27x18 +#1148 @ 693,518: 12x20 +#1149 @ 286,837: 16x24 +#1150 @ 384,757: 10x29 +#1151 @ 748,792: 16x10 +#1152 @ 332,521: 13x14 +#1153 @ 497,233: 21x24 +#1154 @ 769,589: 18x26 +#1155 @ 710,947: 18x23 +#1156 @ 359,350: 27x21 +#1157 @ 964,249: 10x12 +#1158 @ 423,344: 21x24 +#1159 @ 404,209: 22x14 +#1160 @ 716,718: 25x21 +#1161 @ 669,763: 13x22 +#1162 @ 106,417: 25x23 +#1163 @ 320,771: 28x12 +#1164 @ 217,17: 24x12 +#1165 @ 503,489: 27x14 +#1166 @ 51,52: 27x16 +#1167 @ 785,648: 20x14 +#1168 @ 501,606: 25x24 +#1169 @ 343,938: 14x22 +#1170 @ 186,630: 14x12 +#1171 @ 493,958: 20x22 +#1172 @ 315,350: 18x24 +#1173 @ 839,541: 26x26 +#1174 @ 343,155: 16x18 +#1175 @ 548,343: 13x20 +#1176 @ 50,876: 21x13 +#1177 @ 340,693: 18x16 +#1178 @ 283,633: 23x28 +#1179 @ 946,208: 13x15 +#1180 @ 246,560: 21x21 +#1181 @ 914,601: 16x23 +#1182 @ 983,126: 10x7 +#1183 @ 778,741: 19x12 +#1184 @ 650,474: 26x27 +#1185 @ 350,739: 27x26 +#1186 @ 13,853: 10x12 +#1187 @ 306,635: 25x26 +#1188 @ 583,720: 23x17 +#1189 @ 972,791: 21x21 +#1190 @ 361,229: 24x20 +#1191 @ 699,865: 17x12 +#1192 @ 856,863: 22x20 +#1193 @ 498,116: 27x26 +#1194 @ 670,511: 17x28 +#1195 @ 128,80: 21x15 +#1196 @ 393,75: 19x15 +#1197 @ 958,43: 20x20 +#1198 @ 318,742: 29x27 +#1199 @ 586,920: 14x14 +#1200 @ 615,333: 12x18 +#1201 @ 559,168: 23x21 +#1202 @ 384,728: 19x21 +#1203 @ 486,321: 18x18 +#1204 @ 963,412: 17x15 +#1205 @ 269,655: 26x25 +#1206 @ 103,333: 21x25 +#1207 @ 746,504: 19x20 +#1208 @ 603,847: 19x18 +#1209 @ 914,279: 7x16 +#1210 @ 319,251: 13x20 +#1211 @ 419,583: 29x12 +#1212 @ 542,354: 13x22 +#1213 @ 120,241: 14x24 +#1214 @ 864,64: 12x12 +#1215 @ 92,843: 28x26 +#1216 @ 271,778: 9x4 +#1217 @ 690,287: 20x20 +#1218 @ 114,901: 15x12 +#1219 @ 905,90: 15x28 +#1220 @ 823,49: 18x12 +#1221 @ 685,667: 18x25 +#1222 @ 221,597: 26x13 +#1223 @ 251,824: 22x19 +#1224 @ 353,473: 12x20 +#1225 @ 952,110: 16x25 +#1226 @ 523,92: 17x25 +#1227 @ 518,482: 23x12 +#1228 @ 609,40: 11x12 +#1229 @ 393,435: 13x25 +#1230 @ 292,629: 13x18 +#1231 @ 414,892: 20x20 +#1232 @ 29,776: 14x18 +#1233 @ 609,951: 17x18 +#1234 @ 478,444: 22x28 +#1235 @ 562,712: 22x16 +#1236 @ 225,36: 23x14 +#1237 @ 700,704: 21x22 +#1238 @ 540,253: 22x12 +#1239 @ 893,307: 15x25 +#1240 @ 610,238: 26x13 +#1241 @ 436,197: 22x28 +#1242 @ 808,382: 13x21 +#1243 @ 85,716: 26x20 +#1244 @ 983,313: 13x24 +#1245 @ 131,797: 29x13 +#1246 @ 16,554: 18x21 +#1247 @ 918,115: 22x13 +#1248 @ 425,113: 28x18 +#1249 @ 144,226: 27x24 +#1250 @ 8,623: 18x16 +#1251 @ 373,483: 10x12 +#1252 @ 223,761: 16x12 +#1253 @ 178,554: 26x17 +#1254 @ 181,270: 21x26 +#1255 @ 411,902: 11x16 +#1256 @ 365,845: 22x10 +#1257 @ 827,292: 10x23 +#1258 @ 642,509: 16x24 +#1259 @ 166,220: 29x27 +#1260 @ 653,35: 16x14 +#1261 @ 333,559: 16x20 +#1262 @ 488,937: 15x29 +#1263 @ 111,803: 21x11 +#1264 @ 486,164: 28x14 +#1265 @ 738,288: 13x26 +#1266 @ 796,813: 12x16 +#1267 @ 325,222: 29x24 +#1268 @ 503,433: 10x17 +#1269 @ 384,390: 13x14 +#1270 @ 388,800: 16x11 +#1271 @ 799,443: 17x28 +#1272 @ 28,353: 16x10 +#1273 @ 168,368: 10x25 +#1274 @ 60,636: 29x18 +#1275 @ 176,846: 25x21 +#1276 @ 396,31: 24x28 +#1277 @ 839,926: 10x26 +#1278 @ 517,823: 18x10 +#1279 @ 533,164: 27x11 +#1280 @ 740,651: 11x22 +#1281 @ 620,647: 10x26 +#1282 @ 425,613: 13x21 +#1283 @ 262,285: 27x18 +#1284 @ 925,390: 23x29 +#1285 @ 825,596: 11x20 +#1286 @ 975,379: 11x25 +#1287 @ 18,802: 13x18 +#1288 @ 827,822: 20x12 +#1289 @ 57,596: 27x24 +#1290 @ 619,556: 29x26 +#1291 @ 781,508: 27x29 +#1292 @ 892,44: 12x10 +#1293 @ 334,889: 10x17 +#1294 @ 418,1: 27x23 +#1295 @ 376,147: 26x27 +#1296 @ 936,737: 29x12 +#1297 @ 213,937: 17x12 +#1298 @ 931,608: 27x10 +#1299 @ 307,712: 18x18 +#1300 @ 350,311: 19x25 +#1301 @ 57,703: 26x12 +#1302 @ 574,486: 10x11 +#1303 @ 447,292: 29x26 +#1304 @ 479,803: 25x22 +#1305 @ 318,835: 3x22 +#1306 @ 831,375: 15x27 +#1307 @ 817,388: 10x10 +#1308 @ 413,624: 3x11 +#1309 @ 9,356: 13x22 +#1310 @ 445,100: 27x17 +#1311 @ 782,464: 24x24 +#1312 @ 279,883: 19x29 +#1313 @ 963,562: 28x14 +#1314 @ 490,351: 28x20 +#1315 @ 75,935: 16x24 +#1316 @ 395,710: 18x21 +#1317 @ 166,498: 25x10 +#1318 @ 899,886: 13x17 +#1319 @ 926,595: 12x27 +#1320 @ 699,695: 21x23 +#1321 @ 446,892: 13x15 +#1322 @ 384,898: 10x10 +#1323 @ 137,526: 12x16 +#1324 @ 564,912: 16x28 +#1325 @ 577,522: 14x27 +#1326 @ 37,853: 25x27 +#1327 @ 373,49: 27x21 +#1328 @ 546,847: 26x20 +#1329 @ 753,13: 23x16 +#1330 @ 454,787: 27x23 +#1331 @ 588,938: 17x10 +#1332 @ 201,590: 28x10 +#1333 @ 689,8: 11x15 +#1334 @ 14,447: 28x22 +#1335 @ 893,268: 20x26 +#1336 @ 631,243: 23x16 +#1337 @ 950,56: 11x11 +#1338 @ 861,157: 22x27 +#1339 @ 229,404: 19x11 +#1340 @ 20,470: 26x22 +#1341 @ 262,67: 23x13 +#1342 @ 529,879: 23x14 +#1343 @ 186,763: 21x14 +#1344 @ 408,590: 26x20 +#1345 @ 781,950: 11x23 +#1346 @ 831,195: 11x23 +#1347 @ 592,649: 13x27 +#1348 @ 321,264: 28x27 +#1349 @ 913,961: 20x16 +#1350 @ 975,74: 23x16 +#1351 @ 852,722: 25x29 +#1352 @ 972,257: 24x15 +#1353 @ 339,418: 11x17 +#1354 @ 534,125: 25x28 +#1355 @ 13,216: 15x12 +#1356 @ 216,536: 8x3 +#1357 @ 10,856: 10x13 +#1358 @ 455,838: 19x10 +#1359 @ 963,940: 21x10 +#1360 @ 461,801: 22x19 +#1361 @ 903,615: 23x21 +#1362 @ 16,577: 20x29 +#1363 @ 30,211: 10x10 +#1364 @ 304,819: 20x11 +#1365 @ 475,733: 12x20 +#1366 @ 413,191: 24x23 +#1367 @ 436,586: 15x27 +#1368 @ 561,949: 15x23 +#1369 @ 738,810: 13x12 +#1370 @ 546,276: 24x17 +#1371 @ 959,968: 22x28 +#1372 @ 542,919: 12x5 +#1373 @ 800,803: 27x28 +#1374 @ 157,621: 13x13 +#1375 @ 968,190: 16x23 +#1376 @ 793,653: 19x23 +#1377 @ 275,709: 27x28 +#1378 @ 29,122: 14x22 +#1379 @ 930,208: 28x11 +#1380 @ 290,693: 25x25 +#1381 @ 252,661: 20x17 +#1382 @ 891,468: 22x27 +#1383 @ 260,649: 17x21 +#1384 @ 789,450: 10x21 +#1385 @ 153,561: 15x11 +#1386 @ 5,333: 15x15 +#1387 @ 17,839: 12x27 +#1388 @ 962,907: 17x16 +#1389 @ 210,792: 14x24 +#1390 @ 380,851: 14x15 +#1391 @ 270,831: 17x25 +#1392 @ 476,766: 25x12 +#1393 @ 212,973: 21x23 +#1394 @ 155,918: 23x12 +#1395 @ 478,475: 9x9 +#1396 @ 305,333: 18x27 +#1397 @ 888,761: 25x24 diff --git a/2018/d03/ex2/ex2.py b/2018/d03/ex2/ex2.py new file mode 100755 index 0000000..45aca97 --- /dev/null +++ b/2018/d03/ex2/ex2.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Claim(NamedTuple): + top_left: Point + size: Point + + def points(self) -> Iterator[Point]: + for dx, dy in map( + Point._make, itertools.product(range(self.size.x), range(self.size.y)) + ): + yield Point(self.top_left.x + dx, self.top_left.y + dy) + + +def solve(input: str) -> int: + def parse_claim(input: str) -> Claim: + offset, size = input.split("@")[1].strip().split(": ") + return Claim( + Point(*map(int, offset.split(","))), + Point(*map(int, size.split("x"))), + ) + + def parse(input: list[str]) -> list[Claim]: + return [parse_claim(line) for line in input] + + def claims_overlap(claim: Claim, other: Claim) -> bool: + min_x1, min_y1 = claim.top_left + max_x1, max_y1 = map(sum, zip(claim.top_left, claim.size)) + min_x2, min_y2 = other.top_left + max_x2, max_y2 = map(sum, zip(other.top_left, other.size)) + + return ( + True + and (min_x2 < max_x1 and min_x1 < max_x2) + and (min_y2 < max_y1 and min_y1 < max_y2) + ) + + def find_non_overlapping(claims: list[Claim]) -> int: + for i, claim in enumerate(claims): + overlaps = any( + claims_overlap(claim, other) for j, other in enumerate(claims) if i != j + ) + if not overlaps: + return i + 1 # They use 1-based indexing + assert False # Sanity check + + claims = parse(input.splitlines()) + return find_non_overlapping(claims) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d03/ex2/input b/2018/d03/ex2/input new file mode 100644 index 0000000..cc0bfba --- /dev/null +++ b/2018/d03/ex2/input @@ -0,0 +1,1397 @@ +#1 @ 287,428: 27x20 +#2 @ 282,539: 20x10 +#3 @ 550,118: 20x23 +#4 @ 454,774: 20x19 +#5 @ 542,157: 11x24 +#6 @ 249,134: 15x20 +#7 @ 825,137: 12x22 +#8 @ 444,393: 12x10 +#9 @ 810,143: 27x20 +#10 @ 674,274: 25x13 +#11 @ 974,802: 13x15 +#12 @ 607,514: 22x24 +#13 @ 640,627: 24x25 +#14 @ 188,652: 5x17 +#15 @ 268,962: 16x12 +#16 @ 868,950: 26x22 +#17 @ 309,698: 27x29 +#18 @ 51,514: 26x17 +#19 @ 939,416: 25x25 +#20 @ 262,284: 12x17 +#21 @ 46,269: 13x29 +#22 @ 340,492: 26x26 +#23 @ 311,885: 13x21 +#24 @ 564,656: 21x16 +#25 @ 805,434: 17x16 +#26 @ 355,616: 5x18 +#27 @ 485,434: 29x18 +#28 @ 685,751: 18x26 +#29 @ 321,768: 14x12 +#30 @ 287,551: 8x10 +#31 @ 327,181: 28x25 +#32 @ 74,698: 10x28 +#33 @ 47,758: 21x17 +#34 @ 86,359: 27x25 +#35 @ 944,163: 17x18 +#36 @ 338,306: 28x17 +#37 @ 415,344: 22x22 +#38 @ 702,845: 22x19 +#39 @ 320,718: 24x22 +#40 @ 955,914: 19x29 +#41 @ 551,434: 20x19 +#42 @ 275,198: 24x16 +#43 @ 219,290: 13x20 +#44 @ 712,749: 18x23 +#45 @ 759,839: 14x10 +#46 @ 792,885: 14x12 +#47 @ 109,75: 20x26 +#48 @ 957,801: 28x15 +#49 @ 433,538: 18x11 +#50 @ 245,365: 25x18 +#51 @ 520,978: 10x10 +#52 @ 355,59: 15x28 +#53 @ 422,420: 26x14 +#54 @ 890,543: 12x18 +#55 @ 41,813: 11x22 +#56 @ 941,452: 25x19 +#57 @ 155,485: 13x19 +#58 @ 652,260: 18x28 +#59 @ 527,935: 29x21 +#60 @ 402,292: 29x25 +#61 @ 175,586: 28x22 +#62 @ 239,403: 16x20 +#63 @ 609,209: 22x14 +#64 @ 464,798: 13x25 +#65 @ 275,972: 13x23 +#66 @ 260,940: 25x11 +#67 @ 43,358: 12x23 +#68 @ 359,278: 18x11 +#69 @ 184,634: 25x14 +#70 @ 57,763: 13x13 +#71 @ 838,384: 25x25 +#72 @ 22,256: 22x19 +#73 @ 707,921: 19x29 +#74 @ 504,229: 16x27 +#75 @ 658,555: 22x16 +#76 @ 825,642: 29x26 +#77 @ 622,572: 29x13 +#78 @ 187,174: 12x11 +#79 @ 236,469: 24x27 +#80 @ 977,77: 18x8 +#81 @ 734,779: 15x12 +#82 @ 859,826: 16x25 +#83 @ 386,215: 18x12 +#84 @ 840,671: 29x13 +#85 @ 862,119: 15x18 +#86 @ 603,203: 19x12 +#87 @ 559,435: 16x23 +#88 @ 657,470: 19x20 +#89 @ 704,184: 22x28 +#90 @ 597,490: 20x29 +#91 @ 936,217: 23x18 +#92 @ 513,231: 29x29 +#93 @ 83,504: 19x11 +#94 @ 868,66: 28x25 +#95 @ 834,840: 28x24 +#96 @ 39,768: 22x28 +#97 @ 937,35: 20x28 +#98 @ 371,896: 22x17 +#99 @ 469,969: 15x15 +#100 @ 476,845: 18x15 +#101 @ 526,632: 25x11 +#102 @ 588,911: 25x19 +#103 @ 419,609: 15x19 +#104 @ 908,900: 25x26 +#105 @ 445,881: 21x16 +#106 @ 283,821: 18x29 +#107 @ 231,213: 20x10 +#108 @ 699,974: 13x22 +#109 @ 314,969: 24x15 +#110 @ 393,594: 20x20 +#111 @ 708,859: 21x15 +#112 @ 540,557: 10x24 +#113 @ 104,977: 26x22 +#114 @ 213,212: 19x16 +#115 @ 935,628: 16x29 +#116 @ 21,353: 21x14 +#117 @ 904,303: 18x23 +#118 @ 83,295: 18x23 +#119 @ 192,183: 22x11 +#120 @ 672,500: 10x11 +#121 @ 253,58: 23x27 +#122 @ 554,664: 16x29 +#123 @ 365,668: 17x25 +#124 @ 294,870: 20x20 +#125 @ 352,534: 28x29 +#126 @ 104,712: 15x13 +#127 @ 486,221: 14x27 +#128 @ 148,772: 21x27 +#129 @ 376,67: 24x19 +#130 @ 396,581: 25x14 +#131 @ 576,939: 10x17 +#132 @ 856,544: 26x16 +#133 @ 232,75: 20x22 +#134 @ 949,287: 20x27 +#135 @ 52,512: 10x13 +#136 @ 51,604: 16x17 +#137 @ 953,552: 26x17 +#138 @ 185,645: 13x28 +#139 @ 541,202: 27x26 +#140 @ 594,509: 19x28 +#141 @ 214,104: 23x18 +#142 @ 540,294: 15x13 +#143 @ 7,286: 21x24 +#144 @ 404,202: 26x26 +#145 @ 775,677: 21x23 +#146 @ 349,282: 13x18 +#147 @ 214,913: 28x18 +#148 @ 722,931: 12x19 +#149 @ 582,688: 14x17 +#150 @ 90,952: 15x18 +#151 @ 888,653: 22x28 +#152 @ 224,195: 17x28 +#153 @ 664,300: 28x14 +#154 @ 271,564: 13x22 +#155 @ 696,943: 18x29 +#156 @ 445,278: 16x19 +#157 @ 748,783: 15x25 +#158 @ 460,722: 16x19 +#159 @ 207,107: 24x19 +#160 @ 900,964: 21x12 +#161 @ 471,791: 21x15 +#162 @ 555,258: 20x10 +#163 @ 341,36: 17x26 +#164 @ 458,222: 29x14 +#165 @ 900,15: 16x17 +#166 @ 305,964: 11x10 +#167 @ 213,798: 26x10 +#168 @ 188,887: 20x23 +#169 @ 162,31: 13x29 +#170 @ 609,627: 22x29 +#171 @ 506,739: 25x16 +#172 @ 735,413: 16x18 +#173 @ 140,232: 14x10 +#174 @ 365,624: 22x25 +#175 @ 127,190: 12x21 +#176 @ 389,453: 28x12 +#177 @ 224,205: 16x21 +#178 @ 518,108: 20x21 +#179 @ 570,927: 22x13 +#180 @ 891,313: 20x29 +#181 @ 893,599: 18x11 +#182 @ 749,814: 25x19 +#183 @ 847,377: 11x11 +#184 @ 155,22: 15x22 +#185 @ 508,534: 13x10 +#186 @ 626,247: 13x27 +#187 @ 374,388: 18x11 +#188 @ 907,475: 29x14 +#189 @ 871,813: 27x25 +#190 @ 540,324: 12x12 +#191 @ 259,546: 22x24 +#192 @ 249,751: 18x25 +#193 @ 247,497: 11x10 +#194 @ 41,326: 22x19 +#195 @ 157,481: 26x25 +#196 @ 291,211: 13x13 +#197 @ 265,78: 27x12 +#198 @ 273,77: 12x19 +#199 @ 756,94: 10x19 +#200 @ 462,973: 14x15 +#201 @ 821,303: 13x21 +#202 @ 454,948: 20x26 +#203 @ 902,275: 24x24 +#204 @ 444,158: 28x16 +#205 @ 675,524: 21x10 +#206 @ 780,941: 23x27 +#207 @ 459,149: 16x25 +#208 @ 943,826: 23x15 +#209 @ 694,424: 16x18 +#210 @ 204,592: 18x4 +#211 @ 972,415: 19x18 +#212 @ 679,190: 12x22 +#213 @ 906,834: 10x25 +#214 @ 480,783: 12x27 +#215 @ 633,699: 18x25 +#216 @ 1,170: 26x29 +#217 @ 886,781: 18x12 +#218 @ 738,937: 25x24 +#219 @ 109,728: 28x26 +#220 @ 723,860: 21x11 +#221 @ 81,230: 17x28 +#222 @ 164,93: 17x22 +#223 @ 439,940: 24x23 +#224 @ 341,614: 13x25 +#225 @ 282,680: 12x28 +#226 @ 551,470: 27x19 +#227 @ 897,547: 11x17 +#228 @ 866,130: 26x18 +#229 @ 555,592: 18x21 +#230 @ 889,672: 20x19 +#231 @ 565,596: 21x18 +#232 @ 789,146: 15x13 +#233 @ 536,60: 10x23 +#234 @ 673,481: 13x20 +#235 @ 947,240: 18x27 +#236 @ 325,737: 21x12 +#237 @ 773,608: 16x17 +#238 @ 444,577: 13x27 +#239 @ 295,751: 14x12 +#240 @ 651,181: 29x16 +#241 @ 218,653: 18x12 +#242 @ 607,651: 14x13 +#243 @ 538,916: 29x13 +#244 @ 266,540: 20x28 +#245 @ 139,507: 29x20 +#246 @ 873,700: 28x28 +#247 @ 691,182: 23x26 +#248 @ 399,438: 20x13 +#249 @ 497,865: 29x19 +#250 @ 977,932: 16x26 +#251 @ 181,689: 12x27 +#252 @ 234,397: 12x14 +#253 @ 461,560: 20x11 +#254 @ 650,868: 15x24 +#255 @ 861,293: 17x19 +#256 @ 731,49: 17x13 +#257 @ 885,594: 11x13 +#258 @ 937,542: 10x16 +#259 @ 841,292: 26x28 +#260 @ 298,642: 24x18 +#261 @ 842,667: 13x14 +#262 @ 281,548: 18x19 +#263 @ 562,218: 18x19 +#264 @ 319,674: 29x16 +#265 @ 403,60: 21x21 +#266 @ 847,62: 28x17 +#267 @ 557,202: 15x29 +#268 @ 155,768: 11x22 +#269 @ 67,294: 24x24 +#270 @ 731,391: 28x26 +#271 @ 542,562: 3x14 +#272 @ 691,661: 20x17 +#273 @ 447,91: 23x15 +#274 @ 914,753: 20x26 +#275 @ 266,770: 20x16 +#276 @ 657,878: 14x26 +#277 @ 362,642: 13x21 +#278 @ 535,609: 29x28 +#279 @ 307,435: 29x29 +#280 @ 779,729: 13x22 +#281 @ 906,938: 23x27 +#282 @ 688,683: 19x19 +#283 @ 297,748: 12x10 +#284 @ 801,875: 21x10 +#285 @ 858,142: 17x11 +#286 @ 810,821: 23x18 +#287 @ 792,105: 21x11 +#288 @ 549,148: 17x10 +#289 @ 491,562: 18x11 +#290 @ 706,862: 14x13 +#291 @ 812,290: 29x21 +#292 @ 367,597: 23x19 +#293 @ 971,555: 24x18 +#294 @ 661,474: 19x12 +#295 @ 167,345: 10x24 +#296 @ 825,886: 20x17 +#297 @ 782,396: 27x20 +#298 @ 53,181: 23x29 +#299 @ 95,219: 17x25 +#300 @ 933,53: 26x22 +#301 @ 511,156: 17x13 +#302 @ 926,618: 20x21 +#303 @ 449,605: 12x19 +#304 @ 192,755: 25x13 +#305 @ 950,310: 13x29 +#306 @ 282,40: 23x27 +#307 @ 253,123: 28x23 +#308 @ 739,495: 19x14 +#309 @ 857,954: 15x13 +#310 @ 566,380: 26x20 +#311 @ 121,709: 15x10 +#312 @ 209,802: 19x29 +#313 @ 245,307: 10x26 +#314 @ 870,57: 10x13 +#315 @ 402,883: 13x12 +#316 @ 741,222: 16x15 +#317 @ 882,13: 21x24 +#318 @ 775,654: 15x16 +#319 @ 308,199: 27x28 +#320 @ 153,381: 24x16 +#321 @ 636,43: 26x17 +#322 @ 100,334: 12x27 +#323 @ 970,649: 23x11 +#324 @ 332,953: 23x28 +#325 @ 460,39: 19x29 +#326 @ 826,152: 24x21 +#327 @ 488,880: 29x12 +#328 @ 907,15: 18x14 +#329 @ 640,701: 14x21 +#330 @ 251,290: 12x24 +#331 @ 213,772: 10x24 +#332 @ 20,813: 8x3 +#333 @ 265,963: 12x27 +#334 @ 390,444: 16x13 +#335 @ 610,287: 25x12 +#336 @ 739,722: 26x15 +#337 @ 510,52: 18x13 +#338 @ 250,253: 23x11 +#339 @ 600,605: 11x28 +#340 @ 566,230: 25x27 +#341 @ 322,723: 16x21 +#342 @ 306,372: 20x10 +#343 @ 188,631: 28x10 +#344 @ 772,302: 12x13 +#345 @ 686,390: 18x21 +#346 @ 927,628: 10x24 +#347 @ 691,22: 23x21 +#348 @ 159,961: 19x22 +#349 @ 35,125: 4x7 +#350 @ 346,80: 11x18 +#351 @ 221,241: 22x26 +#352 @ 699,678: 18x24 +#353 @ 421,592: 14x20 +#354 @ 752,101: 11x14 +#355 @ 202,157: 28x23 +#356 @ 202,466: 28x25 +#357 @ 381,75: 28x12 +#358 @ 933,666: 26x24 +#359 @ 315,787: 18x19 +#360 @ 312,377: 20x21 +#361 @ 555,612: 24x18 +#362 @ 245,357: 27x25 +#363 @ 39,562: 13x11 +#364 @ 500,619: 26x13 +#365 @ 645,513: 3x4 +#366 @ 789,652: 11x27 +#367 @ 632,534: 11x26 +#368 @ 220,820: 27x15 +#369 @ 952,732: 23x22 +#370 @ 581,541: 20x17 +#371 @ 214,531: 13x16 +#372 @ 183,189: 27x14 +#373 @ 420,938: 25x19 +#374 @ 237,674: 22x20 +#375 @ 253,655: 16x28 +#376 @ 720,966: 10x18 +#377 @ 203,487: 18x12 +#378 @ 4,437: 12x10 +#379 @ 58,859: 15x20 +#380 @ 140,705: 28x18 +#381 @ 196,656: 25x20 +#382 @ 604,959: 28x28 +#383 @ 703,671: 27x18 +#384 @ 60,379: 16x11 +#385 @ 126,201: 25x11 +#386 @ 255,850: 23x21 +#387 @ 608,524: 14x22 +#388 @ 490,880: 24x19 +#389 @ 817,545: 23x13 +#390 @ 471,979: 20x12 +#391 @ 576,910: 27x19 +#392 @ 190,263: 17x15 +#393 @ 240,480: 19x28 +#394 @ 54,271: 10x13 +#395 @ 286,559: 14x20 +#396 @ 359,280: 12x29 +#397 @ 798,822: 10x20 +#398 @ 898,452: 27x20 +#399 @ 960,608: 12x14 +#400 @ 980,326: 19x17 +#401 @ 43,58: 28x23 +#402 @ 219,225: 10x20 +#403 @ 73,699: 14x28 +#404 @ 773,865: 17x21 +#405 @ 341,507: 25x20 +#406 @ 212,949: 15x23 +#407 @ 377,520: 20x25 +#408 @ 808,374: 28x22 +#409 @ 280,923: 28x18 +#410 @ 527,67: 27x25 +#411 @ 971,379: 20x10 +#412 @ 838,617: 14x23 +#413 @ 468,87: 14x12 +#414 @ 264,133: 23x25 +#415 @ 824,913: 22x14 +#416 @ 845,139: 23x20 +#417 @ 95,846: 14x17 +#418 @ 0,437: 19x28 +#419 @ 45,368: 12x17 +#420 @ 167,604: 24x27 +#421 @ 485,925: 24x29 +#422 @ 340,589: 17x12 +#423 @ 276,66: 21x15 +#424 @ 483,441: 24x23 +#425 @ 252,461: 15x14 +#426 @ 454,60: 16x29 +#427 @ 406,885: 11x23 +#428 @ 760,743: 13x20 +#429 @ 346,573: 21x11 +#430 @ 60,299: 28x10 +#431 @ 709,303: 12x12 +#432 @ 731,930: 7x3 +#433 @ 204,410: 13x21 +#434 @ 588,850: 23x19 +#435 @ 419,599: 16x18 +#436 @ 648,705: 12x14 +#437 @ 232,909: 26x20 +#438 @ 931,175: 17x16 +#439 @ 959,742: 27x22 +#440 @ 423,624: 26x17 +#441 @ 107,715: 25x12 +#442 @ 655,651: 11x21 +#443 @ 840,610: 20x23 +#444 @ 205,191: 11x13 +#445 @ 74,26: 24x28 +#446 @ 879,460: 29x21 +#447 @ 355,740: 11x15 +#448 @ 341,913: 20x10 +#449 @ 310,245: 18x10 +#450 @ 194,180: 11x22 +#451 @ 129,786: 26x25 +#452 @ 438,895: 25x19 +#453 @ 12,454: 25x25 +#454 @ 62,683: 25x23 +#455 @ 44,178: 10x14 +#456 @ 571,651: 16x25 +#457 @ 320,262: 13x13 +#458 @ 360,155: 25x16 +#459 @ 98,188: 20x20 +#460 @ 319,753: 10x10 +#461 @ 709,874: 29x10 +#462 @ 321,681: 12x12 +#463 @ 136,794: 20x15 +#464 @ 878,871: 12x19 +#465 @ 286,107: 24x11 +#466 @ 585,37: 22x21 +#467 @ 450,164: 24x17 +#468 @ 312,23: 12x24 +#469 @ 543,113: 29x18 +#470 @ 782,12: 14x16 +#471 @ 854,145: 27x18 +#472 @ 650,517: 24x22 +#473 @ 176,567: 18x17 +#474 @ 699,427: 15x16 +#475 @ 634,448: 11x24 +#476 @ 662,899: 24x18 +#477 @ 49,342: 10x19 +#478 @ 768,27: 21x20 +#479 @ 191,740: 19x10 +#480 @ 82,282: 22x17 +#481 @ 736,935: 14x21 +#482 @ 856,359: 26x11 +#483 @ 109,329: 23x19 +#484 @ 344,749: 27x17 +#485 @ 109,799: 26x11 +#486 @ 631,506: 11x23 +#487 @ 847,117: 29x22 +#488 @ 518,82: 20x13 +#489 @ 372,606: 22x15 +#490 @ 159,392: 20x16 +#491 @ 577,842: 17x26 +#492 @ 199,304: 23x16 +#493 @ 857,947: 18x20 +#494 @ 566,384: 29x22 +#495 @ 460,557: 12x12 +#496 @ 39,98: 20x26 +#497 @ 780,20: 24x11 +#498 @ 19,217: 14x18 +#499 @ 360,771: 29x15 +#500 @ 343,718: 17x23 +#501 @ 703,741: 28x11 +#502 @ 703,749: 25x13 +#503 @ 104,280: 29x21 +#504 @ 302,832: 24x29 +#505 @ 656,906: 28x21 +#506 @ 833,35: 13x17 +#507 @ 70,155: 18x26 +#508 @ 483,434: 13x26 +#509 @ 676,766: 16x17 +#510 @ 380,970: 10x11 +#511 @ 212,12: 25x16 +#512 @ 927,613: 22x24 +#513 @ 579,70: 10x18 +#514 @ 907,265: 19x22 +#515 @ 212,942: 26x16 +#516 @ 451,561: 28x20 +#517 @ 689,958: 23x28 +#518 @ 534,938: 28x10 +#519 @ 382,145: 18x21 +#520 @ 623,342: 23x24 +#521 @ 361,678: 18x18 +#522 @ 541,385: 25x26 +#523 @ 102,836: 26x22 +#524 @ 800,532: 22x11 +#525 @ 763,292: 21x16 +#526 @ 370,269: 17x18 +#527 @ 271,229: 21x18 +#528 @ 723,804: 19x22 +#529 @ 348,360: 18x22 +#530 @ 98,853: 25x11 +#531 @ 489,21: 13x19 +#532 @ 93,968: 15x11 +#533 @ 418,719: 26x27 +#534 @ 204,490: 23x16 +#535 @ 289,969: 29x10 +#536 @ 564,350: 28x21 +#537 @ 426,404: 22x23 +#538 @ 856,132: 13x15 +#539 @ 795,630: 22x29 +#540 @ 219,868: 22x11 +#541 @ 152,566: 23x14 +#542 @ 689,891: 21x12 +#543 @ 776,853: 10x22 +#544 @ 908,764: 15x17 +#545 @ 946,938: 18x18 +#546 @ 658,786: 25x19 +#547 @ 307,781: 26x22 +#548 @ 200,961: 19x29 +#549 @ 975,851: 17x28 +#550 @ 229,24: 18x25 +#551 @ 67,367: 18x16 +#552 @ 370,965: 15x25 +#553 @ 616,283: 23x13 +#554 @ 67,894: 24x29 +#555 @ 681,743: 12x18 +#556 @ 241,550: 23x27 +#557 @ 729,54: 25x26 +#558 @ 546,320: 21x16 +#559 @ 388,755: 20x19 +#560 @ 217,797: 16x11 +#561 @ 154,921: 13x16 +#562 @ 900,671: 27x20 +#563 @ 692,678: 27x12 +#564 @ 391,372: 11x14 +#565 @ 63,899: 13x15 +#566 @ 872,50: 24x26 +#567 @ 652,802: 11x27 +#568 @ 763,570: 11x22 +#569 @ 314,258: 20x11 +#570 @ 909,607: 23x26 +#571 @ 238,414: 23x19 +#572 @ 184,15: 12x29 +#573 @ 178,433: 16x11 +#574 @ 397,847: 21x24 +#575 @ 448,168: 21x26 +#576 @ 443,410: 14x22 +#577 @ 863,408: 12x25 +#578 @ 332,421: 23x17 +#579 @ 55,363: 21x28 +#580 @ 587,680: 13x29 +#581 @ 366,781: 27x22 +#582 @ 483,642: 26x15 +#583 @ 732,617: 27x15 +#584 @ 386,578: 29x17 +#585 @ 584,636: 18x22 +#586 @ 738,361: 21x24 +#587 @ 404,280: 25x20 +#588 @ 204,949: 24x19 +#589 @ 308,973: 13x27 +#590 @ 976,947: 23x14 +#591 @ 959,184: 14x18 +#592 @ 935,409: 23x14 +#593 @ 402,903: 16x19 +#594 @ 493,699: 10x16 +#595 @ 943,199: 23x10 +#596 @ 20,198: 26x19 +#597 @ 968,609: 11x17 +#598 @ 75,916: 24x14 +#599 @ 91,486: 14x24 +#600 @ 720,761: 11x24 +#601 @ 424,125: 21x26 +#602 @ 496,885: 20x22 +#603 @ 48,168: 29x12 +#604 @ 49,633: 15x18 +#605 @ 335,588: 12x21 +#606 @ 863,960: 24x25 +#607 @ 542,607: 25x22 +#608 @ 592,239: 22x20 +#609 @ 246,671: 28x10 +#610 @ 101,506: 21x27 +#611 @ 516,488: 16x16 +#612 @ 193,205: 15x16 +#613 @ 488,645: 24x24 +#614 @ 694,704: 22x26 +#615 @ 529,842: 27x25 +#616 @ 798,655: 27x12 +#617 @ 225,871: 16x24 +#618 @ 875,873: 27x20 +#619 @ 210,464: 17x28 +#620 @ 558,612: 12x16 +#621 @ 467,789: 14x28 +#622 @ 79,950: 17x16 +#623 @ 35,749: 10x28 +#624 @ 403,301: 16x13 +#625 @ 401,222: 26x27 +#626 @ 291,830: 28x22 +#627 @ 64,945: 25x24 +#628 @ 908,812: 11x26 +#629 @ 42,810: 29x20 +#630 @ 645,273: 24x16 +#631 @ 786,124: 15x25 +#632 @ 21,840: 19x17 +#633 @ 296,684: 24x11 +#634 @ 731,188: 20x12 +#635 @ 544,615: 28x20 +#636 @ 17,410: 19x10 +#637 @ 881,853: 23x26 +#638 @ 730,918: 16x24 +#639 @ 768,691: 16x11 +#640 @ 381,397: 24x12 +#641 @ 160,97: 18x28 +#642 @ 164,660: 26x17 +#643 @ 100,267: 19x19 +#644 @ 713,725: 21x24 +#645 @ 270,944: 23x18 +#646 @ 88,806: 22x22 +#647 @ 453,556: 21x18 +#648 @ 914,671: 11x20 +#649 @ 494,884: 19x4 +#650 @ 959,394: 19x13 +#651 @ 628,608: 20x15 +#652 @ 353,375: 28x26 +#653 @ 10,174: 20x13 +#654 @ 465,855: 22x17 +#655 @ 176,878: 17x27 +#656 @ 701,868: 12x11 +#657 @ 100,7: 15x19 +#658 @ 29,784: 27x14 +#659 @ 96,138: 10x13 +#660 @ 707,43: 15x26 +#661 @ 945,523: 29x23 +#662 @ 336,917: 12x10 +#663 @ 512,795: 14x27 +#664 @ 11,359: 3x11 +#665 @ 106,844: 18x13 +#666 @ 970,246: 11x23 +#667 @ 479,957: 23x15 +#668 @ 808,502: 12x14 +#669 @ 375,743: 20x18 +#670 @ 881,271: 27x11 +#671 @ 329,373: 28x25 +#672 @ 103,730: 26x14 +#673 @ 432,510: 18x29 +#674 @ 798,487: 17x20 +#675 @ 539,873: 22x17 +#676 @ 297,540: 21x27 +#677 @ 50,242: 20x13 +#678 @ 362,647: 27x13 +#679 @ 405,597: 23x28 +#680 @ 639,447: 20x10 +#681 @ 198,430: 19x20 +#682 @ 414,460: 22x13 +#683 @ 164,608: 18x14 +#684 @ 898,259: 19x14 +#685 @ 152,934: 13x11 +#686 @ 598,285: 24x28 +#687 @ 858,905: 20x25 +#688 @ 14,613: 14x29 +#689 @ 238,769: 18x26 +#690 @ 715,862: 5x8 +#691 @ 617,47: 29x28 +#692 @ 669,824: 11x27 +#693 @ 948,649: 18x13 +#694 @ 128,901: 29x18 +#695 @ 256,72: 14x25 +#696 @ 361,712: 18x23 +#697 @ 75,482: 22x23 +#698 @ 914,654: 15x25 +#699 @ 482,119: 19x28 +#700 @ 58,842: 18x15 +#701 @ 563,970: 10x17 +#702 @ 417,555: 19x12 +#703 @ 427,142: 26x24 +#704 @ 715,541: 13x27 +#705 @ 356,284: 12x11 +#706 @ 335,633: 15x23 +#707 @ 313,980: 14x16 +#708 @ 427,418: 19x17 +#709 @ 53,892: 12x28 +#710 @ 772,27: 17x20 +#711 @ 546,947: 28x19 +#712 @ 889,492: 18x29 +#713 @ 320,943: 20x27 +#714 @ 192,613: 11x19 +#715 @ 413,600: 22x25 +#716 @ 923,413: 18x27 +#717 @ 216,961: 14x13 +#718 @ 89,972: 18x10 +#719 @ 893,606: 29x21 +#720 @ 360,467: 18x24 +#721 @ 949,617: 24x10 +#722 @ 490,702: 18x12 +#723 @ 285,955: 25x19 +#724 @ 217,928: 13x23 +#725 @ 906,488: 15x25 +#726 @ 846,782: 20x10 +#727 @ 475,473: 16x15 +#728 @ 328,613: 13x9 +#729 @ 410,563: 27x17 +#730 @ 221,890: 15x17 +#731 @ 77,465: 28x19 +#732 @ 500,764: 27x27 +#733 @ 391,900: 18x15 +#734 @ 65,718: 13x13 +#735 @ 745,170: 23x23 +#736 @ 10,416: 14x19 +#737 @ 201,608: 23x14 +#738 @ 798,824: 15x24 +#739 @ 475,103: 20x17 +#740 @ 863,781: 13x21 +#741 @ 778,643: 24x19 +#742 @ 946,967: 26x23 +#743 @ 515,974: 24x20 +#744 @ 339,422: 12x19 +#745 @ 882,304: 29x18 +#746 @ 981,124: 15x13 +#747 @ 913,744: 10x28 +#748 @ 885,482: 25x22 +#749 @ 64,176: 12x15 +#750 @ 303,639: 22x24 +#751 @ 648,689: 11x29 +#752 @ 13,762: 27x23 +#753 @ 838,585: 17x28 +#754 @ 224,69: 14x20 +#755 @ 111,666: 29x29 +#756 @ 911,139: 10x24 +#757 @ 169,640: 11x11 +#758 @ 535,834: 15x14 +#759 @ 98,425: 26x21 +#760 @ 32,119: 28x28 +#761 @ 56,481: 17x10 +#762 @ 281,117: 16x26 +#763 @ 533,599: 22x16 +#764 @ 443,808: 19x13 +#765 @ 381,277: 20x14 +#766 @ 491,481: 14x17 +#767 @ 517,808: 13x29 +#768 @ 620,558: 24x17 +#769 @ 347,364: 25x29 +#770 @ 933,91: 6x22 +#771 @ 813,612: 28x21 +#772 @ 491,254: 14x11 +#773 @ 504,773: 13x28 +#774 @ 347,93: 10x17 +#775 @ 138,30: 25x14 +#776 @ 529,459: 11x20 +#777 @ 518,73: 21x19 +#778 @ 721,630: 20x18 +#779 @ 265,141: 9x7 +#780 @ 958,659: 10x22 +#781 @ 912,147: 25x15 +#782 @ 709,765: 26x20 +#783 @ 18,210: 26x14 +#784 @ 96,968: 14x13 +#785 @ 891,465: 14x26 +#786 @ 247,261: 28x12 +#787 @ 237,122: 19x26 +#788 @ 430,945: 17x13 +#789 @ 756,202: 12x29 +#790 @ 78,702: 15x19 +#791 @ 955,834: 26x22 +#792 @ 716,694: 18x13 +#793 @ 306,303: 24x25 +#794 @ 317,227: 14x20 +#795 @ 415,2: 16x13 +#796 @ 116,851: 26x21 +#797 @ 844,670: 28x19 +#798 @ 220,888: 23x26 +#799 @ 265,882: 29x25 +#800 @ 535,635: 25x21 +#801 @ 582,630: 25x25 +#802 @ 252,382: 11x26 +#803 @ 184,739: 14x10 +#804 @ 408,622: 12x17 +#805 @ 754,620: 14x13 +#806 @ 448,161: 13x16 +#807 @ 741,51: 29x27 +#808 @ 759,446: 14x24 +#809 @ 877,58: 16x23 +#810 @ 550,387: 10x18 +#811 @ 960,129: 22x26 +#812 @ 784,890: 11x21 +#813 @ 1,328: 28x10 +#814 @ 166,427: 17x11 +#815 @ 105,5: 17x11 +#816 @ 779,662: 27x17 +#817 @ 537,473: 21x20 +#818 @ 860,665: 17x15 +#819 @ 434,131: 21x26 +#820 @ 754,350: 20x13 +#821 @ 746,275: 11x26 +#822 @ 653,556: 20x13 +#823 @ 386,757: 14x13 +#824 @ 259,832: 5x5 +#825 @ 345,635: 29x26 +#826 @ 61,368: 10x18 +#827 @ 418,316: 27x24 +#828 @ 192,183: 20x10 +#829 @ 550,785: 16x10 +#830 @ 966,104: 15x18 +#831 @ 892,3: 19x16 +#832 @ 87,733: 25x12 +#833 @ 525,616: 25x27 +#834 @ 248,282: 27x21 +#835 @ 281,664: 23x17 +#836 @ 313,563: 15x20 +#837 @ 554,587: 21x14 +#838 @ 858,956: 22x17 +#839 @ 342,762: 22x16 +#840 @ 974,395: 17x13 +#841 @ 855,765: 15x25 +#842 @ 5,551: 14x14 +#843 @ 548,389: 12x16 +#844 @ 976,806: 8x7 +#845 @ 943,130: 28x27 +#846 @ 563,368: 15x17 +#847 @ 594,252: 19x26 +#848 @ 858,927: 26x18 +#849 @ 678,900: 27x21 +#850 @ 554,373: 18x15 +#851 @ 625,656: 10x23 +#852 @ 500,310: 26x12 +#853 @ 96,969: 27x27 +#854 @ 211,737: 18x21 +#855 @ 329,150: 18x10 +#856 @ 595,39: 20x16 +#857 @ 259,208: 23x29 +#858 @ 196,477: 4x22 +#859 @ 109,622: 29x17 +#860 @ 29,539: 11x25 +#861 @ 454,193: 16x16 +#862 @ 381,221: 11x22 +#863 @ 342,435: 13x18 +#864 @ 40,544: 24x24 +#865 @ 366,702: 27x13 +#866 @ 299,531: 15x13 +#867 @ 440,30: 11x18 +#868 @ 675,281: 18x10 +#869 @ 7,310: 22x29 +#870 @ 880,467: 25x20 +#871 @ 172,4: 19x29 +#872 @ 816,193: 19x29 +#873 @ 466,10: 15x21 +#874 @ 564,411: 19x28 +#875 @ 902,313: 16x17 +#876 @ 410,448: 11x13 +#877 @ 351,153: 20x25 +#878 @ 446,41: 23x14 +#879 @ 535,786: 27x26 +#880 @ 512,849: 28x12 +#881 @ 933,447: 24x21 +#882 @ 241,555: 29x18 +#883 @ 489,539: 26x29 +#884 @ 449,843: 21x24 +#885 @ 90,663: 27x12 +#886 @ 533,627: 13x18 +#887 @ 405,189: 24x24 +#888 @ 245,114: 24x17 +#889 @ 487,863: 20x25 +#890 @ 223,595: 16x16 +#891 @ 697,100: 11x12 +#892 @ 107,282: 22x9 +#893 @ 963,904: 20x25 +#894 @ 851,622: 13x26 +#895 @ 841,221: 29x12 +#896 @ 405,459: 18x13 +#897 @ 56,59: 23x10 +#898 @ 9,445: 27x12 +#899 @ 440,319: 14x11 +#900 @ 756,823: 12x25 +#901 @ 940,681: 27x26 +#902 @ 906,306: 13x13 +#903 @ 290,655: 17x15 +#904 @ 276,968: 14x22 +#905 @ 23,792: 27x13 +#906 @ 7,847: 17x12 +#907 @ 315,199: 14x29 +#908 @ 280,103: 27x13 +#909 @ 744,636: 16x20 +#910 @ 202,729: 15x21 +#911 @ 663,404: 15x27 +#912 @ 89,125: 13x16 +#913 @ 829,851: 18x25 +#914 @ 713,964: 24x22 +#915 @ 645,597: 23x22 +#916 @ 681,887: 17x12 +#917 @ 83,317: 25x23 +#918 @ 22,452: 27x26 +#919 @ 21,303: 11x27 +#920 @ 899,950: 18x14 +#921 @ 446,380: 22x16 +#922 @ 499,57: 22x19 +#923 @ 21,208: 15x18 +#924 @ 522,591: 23x16 +#925 @ 671,834: 4x4 +#926 @ 487,6: 17x18 +#927 @ 784,742: 15x20 +#928 @ 355,753: 29x24 +#929 @ 743,204: 10x23 +#930 @ 529,920: 20x25 +#931 @ 237,215: 10x5 +#932 @ 92,19: 28x29 +#933 @ 739,57: 27x25 +#934 @ 93,448: 23x25 +#935 @ 838,202: 21x23 +#936 @ 440,59: 26x24 +#937 @ 171,854: 11x10 +#938 @ 322,229: 5x6 +#939 @ 284,24: 19x24 +#940 @ 172,615: 22x19 +#941 @ 156,665: 24x29 +#942 @ 907,468: 24x22 +#943 @ 423,294: 15x14 +#944 @ 388,693: 29x13 +#945 @ 688,149: 25x18 +#946 @ 384,381: 11x11 +#947 @ 1,137: 19x17 +#948 @ 217,888: 11x12 +#949 @ 518,273: 18x15 +#950 @ 528,284: 27x29 +#951 @ 663,547: 16x18 +#952 @ 937,719: 11x23 +#953 @ 806,98: 13x18 +#954 @ 237,328: 26x10 +#955 @ 543,601: 14x14 +#956 @ 314,29: 3x8 +#957 @ 266,491: 12x19 +#958 @ 625,500: 25x21 +#959 @ 892,766: 20x10 +#960 @ 12,263: 14x27 +#961 @ 731,183: 26x23 +#962 @ 469,950: 25x10 +#963 @ 14,134: 25x23 +#964 @ 673,479: 12x29 +#965 @ 160,574: 29x13 +#966 @ 920,765: 21x22 +#967 @ 970,616: 23x16 +#968 @ 963,605: 13x28 +#969 @ 322,611: 23x15 +#970 @ 954,547: 14x16 +#971 @ 959,221: 20x27 +#972 @ 612,47: 13x11 +#973 @ 606,26: 13x24 +#974 @ 751,918: 14x29 +#975 @ 30,450: 18x27 +#976 @ 386,76: 21x22 +#977 @ 519,840: 17x12 +#978 @ 486,541: 18x24 +#979 @ 156,29: 26x23 +#980 @ 671,319: 24x15 +#981 @ 70,272: 14x26 +#982 @ 517,259: 16x29 +#983 @ 949,444: 19x26 +#984 @ 666,299: 10x12 +#985 @ 559,660: 14x18 +#986 @ 740,181: 12x23 +#987 @ 442,793: 22x22 +#988 @ 728,82: 29x27 +#989 @ 717,529: 12x25 +#990 @ 79,352: 21x12 +#991 @ 197,966: 20x22 +#992 @ 761,518: 28x15 +#993 @ 694,93: 24x28 +#994 @ 134,699: 19x11 +#995 @ 897,958: 24x28 +#996 @ 931,89: 16x27 +#997 @ 939,739: 11x27 +#998 @ 235,912: 14x21 +#999 @ 48,616: 14x17 +#1000 @ 558,689: 27x15 +#1001 @ 425,942: 26x28 +#1002 @ 451,543: 13x20 +#1003 @ 711,72: 25x11 +#1004 @ 515,837: 16x24 +#1005 @ 491,868: 29x22 +#1006 @ 150,404: 24x24 +#1007 @ 544,670: 22x14 +#1008 @ 758,822: 16x22 +#1009 @ 245,914: 20x18 +#1010 @ 216,802: 16x21 +#1011 @ 581,829: 14x19 +#1012 @ 704,42: 17x20 +#1013 @ 223,892: 11x26 +#1014 @ 777,622: 26x10 +#1015 @ 869,633: 29x23 +#1016 @ 28,612: 27x13 +#1017 @ 761,455: 4x6 +#1018 @ 217,775: 24x17 +#1019 @ 415,87: 29x21 +#1020 @ 122,630: 11x14 +#1021 @ 296,567: 12x11 +#1022 @ 832,893: 11x27 +#1023 @ 989,649: 10x29 +#1024 @ 719,629: 21x15 +#1025 @ 865,548: 29x26 +#1026 @ 967,245: 14x29 +#1027 @ 642,549: 26x11 +#1028 @ 542,304: 17x21 +#1029 @ 182,684: 21x20 +#1030 @ 691,405: 19x28 +#1031 @ 822,299: 21x14 +#1032 @ 258,507: 21x28 +#1033 @ 869,751: 25x23 +#1034 @ 326,662: 10x27 +#1035 @ 967,595: 18x19 +#1036 @ 613,236: 24x28 +#1037 @ 859,963: 10x21 +#1038 @ 892,965: 16x19 +#1039 @ 890,53: 25x27 +#1040 @ 472,817: 20x21 +#1041 @ 94,778: 23x13 +#1042 @ 364,67: 21x28 +#1043 @ 652,412: 28x11 +#1044 @ 892,463: 14x27 +#1045 @ 650,321: 20x19 +#1046 @ 333,950: 14x16 +#1047 @ 175,581: 26x25 +#1048 @ 331,213: 12x14 +#1049 @ 8,593: 19x12 +#1050 @ 356,57: 11x12 +#1051 @ 498,451: 25x22 +#1052 @ 368,705: 14x15 +#1053 @ 680,126: 28x24 +#1054 @ 728,173: 27x14 +#1055 @ 417,449: 27x23 +#1056 @ 364,396: 24x27 +#1057 @ 889,751: 26x25 +#1058 @ 360,47: 19x24 +#1059 @ 353,612: 14x26 +#1060 @ 697,382: 21x17 +#1061 @ 209,175: 29x19 +#1062 @ 159,916: 18x23 +#1063 @ 108,713: 23x20 +#1064 @ 678,410: 17x16 +#1065 @ 604,871: 24x23 +#1066 @ 584,926: 26x13 +#1067 @ 760,747: 23x26 +#1068 @ 210,929: 26x22 +#1069 @ 891,508: 27x19 +#1070 @ 441,94: 27x29 +#1071 @ 319,679: 25x18 +#1072 @ 589,516: 11x15 +#1073 @ 238,355: 23x10 +#1074 @ 376,368: 15x21 +#1075 @ 972,893: 13x17 +#1076 @ 944,538: 11x20 +#1077 @ 675,897: 11x13 +#1078 @ 867,88: 16x23 +#1079 @ 861,116: 16x14 +#1080 @ 433,578: 29x17 +#1081 @ 729,926: 12x15 +#1082 @ 104,196: 15x14 +#1083 @ 129,258: 14x11 +#1084 @ 573,46: 24x29 +#1085 @ 761,22: 24x10 +#1086 @ 278,949: 29x26 +#1087 @ 866,337: 13x29 +#1088 @ 28,312: 28x17 +#1089 @ 467,821: 19x23 +#1090 @ 323,896: 28x26 +#1091 @ 414,908: 26x11 +#1092 @ 328,171: 19x20 +#1093 @ 604,297: 28x10 +#1094 @ 842,667: 17x23 +#1095 @ 508,300: 21x19 +#1096 @ 866,397: 19x16 +#1097 @ 625,496: 12x23 +#1098 @ 450,763: 12x12 +#1099 @ 1,546: 22x29 +#1100 @ 912,730: 25x15 +#1101 @ 960,520: 13x19 +#1102 @ 369,367: 17x24 +#1103 @ 657,333: 27x15 +#1104 @ 193,475: 15x28 +#1105 @ 266,735: 11x21 +#1106 @ 39,156: 20x21 +#1107 @ 878,38: 15x20 +#1108 @ 720,759: 13x13 +#1109 @ 314,829: 15x10 +#1110 @ 145,521: 16x19 +#1111 @ 44,919: 26x27 +#1112 @ 504,890: 25x10 +#1113 @ 457,23: 27x20 +#1114 @ 364,342: 21x24 +#1115 @ 64,475: 21x24 +#1116 @ 315,250: 18x14 +#1117 @ 113,772: 28x28 +#1118 @ 513,734: 23x15 +#1119 @ 155,355: 15x16 +#1120 @ 499,914: 22x24 +#1121 @ 739,525: 23x19 +#1122 @ 171,645: 12x23 +#1123 @ 506,366: 29x29 +#1124 @ 226,258: 21x19 +#1125 @ 259,139: 21x12 +#1126 @ 172,955: 20x15 +#1127 @ 562,420: 17x21 +#1128 @ 15,856: 29x22 +#1129 @ 674,321: 17x7 +#1130 @ 445,563: 29x21 +#1131 @ 414,713: 10x24 +#1132 @ 304,303: 19x16 +#1133 @ 692,423: 27x15 +#1134 @ 943,840: 19x10 +#1135 @ 296,811: 12x20 +#1136 @ 477,810: 18x10 +#1137 @ 785,877: 27x27 +#1138 @ 946,424: 23x29 +#1139 @ 99,9: 26x23 +#1140 @ 551,607: 22x10 +#1141 @ 47,249: 26x13 +#1142 @ 807,394: 24x22 +#1143 @ 702,422: 29x16 +#1144 @ 549,270: 21x21 +#1145 @ 753,731: 10x29 +#1146 @ 457,54: 17x23 +#1147 @ 582,874: 27x18 +#1148 @ 693,518: 12x20 +#1149 @ 286,837: 16x24 +#1150 @ 384,757: 10x29 +#1151 @ 748,792: 16x10 +#1152 @ 332,521: 13x14 +#1153 @ 497,233: 21x24 +#1154 @ 769,589: 18x26 +#1155 @ 710,947: 18x23 +#1156 @ 359,350: 27x21 +#1157 @ 964,249: 10x12 +#1158 @ 423,344: 21x24 +#1159 @ 404,209: 22x14 +#1160 @ 716,718: 25x21 +#1161 @ 669,763: 13x22 +#1162 @ 106,417: 25x23 +#1163 @ 320,771: 28x12 +#1164 @ 217,17: 24x12 +#1165 @ 503,489: 27x14 +#1166 @ 51,52: 27x16 +#1167 @ 785,648: 20x14 +#1168 @ 501,606: 25x24 +#1169 @ 343,938: 14x22 +#1170 @ 186,630: 14x12 +#1171 @ 493,958: 20x22 +#1172 @ 315,350: 18x24 +#1173 @ 839,541: 26x26 +#1174 @ 343,155: 16x18 +#1175 @ 548,343: 13x20 +#1176 @ 50,876: 21x13 +#1177 @ 340,693: 18x16 +#1178 @ 283,633: 23x28 +#1179 @ 946,208: 13x15 +#1180 @ 246,560: 21x21 +#1181 @ 914,601: 16x23 +#1182 @ 983,126: 10x7 +#1183 @ 778,741: 19x12 +#1184 @ 650,474: 26x27 +#1185 @ 350,739: 27x26 +#1186 @ 13,853: 10x12 +#1187 @ 306,635: 25x26 +#1188 @ 583,720: 23x17 +#1189 @ 972,791: 21x21 +#1190 @ 361,229: 24x20 +#1191 @ 699,865: 17x12 +#1192 @ 856,863: 22x20 +#1193 @ 498,116: 27x26 +#1194 @ 670,511: 17x28 +#1195 @ 128,80: 21x15 +#1196 @ 393,75: 19x15 +#1197 @ 958,43: 20x20 +#1198 @ 318,742: 29x27 +#1199 @ 586,920: 14x14 +#1200 @ 615,333: 12x18 +#1201 @ 559,168: 23x21 +#1202 @ 384,728: 19x21 +#1203 @ 486,321: 18x18 +#1204 @ 963,412: 17x15 +#1205 @ 269,655: 26x25 +#1206 @ 103,333: 21x25 +#1207 @ 746,504: 19x20 +#1208 @ 603,847: 19x18 +#1209 @ 914,279: 7x16 +#1210 @ 319,251: 13x20 +#1211 @ 419,583: 29x12 +#1212 @ 542,354: 13x22 +#1213 @ 120,241: 14x24 +#1214 @ 864,64: 12x12 +#1215 @ 92,843: 28x26 +#1216 @ 271,778: 9x4 +#1217 @ 690,287: 20x20 +#1218 @ 114,901: 15x12 +#1219 @ 905,90: 15x28 +#1220 @ 823,49: 18x12 +#1221 @ 685,667: 18x25 +#1222 @ 221,597: 26x13 +#1223 @ 251,824: 22x19 +#1224 @ 353,473: 12x20 +#1225 @ 952,110: 16x25 +#1226 @ 523,92: 17x25 +#1227 @ 518,482: 23x12 +#1228 @ 609,40: 11x12 +#1229 @ 393,435: 13x25 +#1230 @ 292,629: 13x18 +#1231 @ 414,892: 20x20 +#1232 @ 29,776: 14x18 +#1233 @ 609,951: 17x18 +#1234 @ 478,444: 22x28 +#1235 @ 562,712: 22x16 +#1236 @ 225,36: 23x14 +#1237 @ 700,704: 21x22 +#1238 @ 540,253: 22x12 +#1239 @ 893,307: 15x25 +#1240 @ 610,238: 26x13 +#1241 @ 436,197: 22x28 +#1242 @ 808,382: 13x21 +#1243 @ 85,716: 26x20 +#1244 @ 983,313: 13x24 +#1245 @ 131,797: 29x13 +#1246 @ 16,554: 18x21 +#1247 @ 918,115: 22x13 +#1248 @ 425,113: 28x18 +#1249 @ 144,226: 27x24 +#1250 @ 8,623: 18x16 +#1251 @ 373,483: 10x12 +#1252 @ 223,761: 16x12 +#1253 @ 178,554: 26x17 +#1254 @ 181,270: 21x26 +#1255 @ 411,902: 11x16 +#1256 @ 365,845: 22x10 +#1257 @ 827,292: 10x23 +#1258 @ 642,509: 16x24 +#1259 @ 166,220: 29x27 +#1260 @ 653,35: 16x14 +#1261 @ 333,559: 16x20 +#1262 @ 488,937: 15x29 +#1263 @ 111,803: 21x11 +#1264 @ 486,164: 28x14 +#1265 @ 738,288: 13x26 +#1266 @ 796,813: 12x16 +#1267 @ 325,222: 29x24 +#1268 @ 503,433: 10x17 +#1269 @ 384,390: 13x14 +#1270 @ 388,800: 16x11 +#1271 @ 799,443: 17x28 +#1272 @ 28,353: 16x10 +#1273 @ 168,368: 10x25 +#1274 @ 60,636: 29x18 +#1275 @ 176,846: 25x21 +#1276 @ 396,31: 24x28 +#1277 @ 839,926: 10x26 +#1278 @ 517,823: 18x10 +#1279 @ 533,164: 27x11 +#1280 @ 740,651: 11x22 +#1281 @ 620,647: 10x26 +#1282 @ 425,613: 13x21 +#1283 @ 262,285: 27x18 +#1284 @ 925,390: 23x29 +#1285 @ 825,596: 11x20 +#1286 @ 975,379: 11x25 +#1287 @ 18,802: 13x18 +#1288 @ 827,822: 20x12 +#1289 @ 57,596: 27x24 +#1290 @ 619,556: 29x26 +#1291 @ 781,508: 27x29 +#1292 @ 892,44: 12x10 +#1293 @ 334,889: 10x17 +#1294 @ 418,1: 27x23 +#1295 @ 376,147: 26x27 +#1296 @ 936,737: 29x12 +#1297 @ 213,937: 17x12 +#1298 @ 931,608: 27x10 +#1299 @ 307,712: 18x18 +#1300 @ 350,311: 19x25 +#1301 @ 57,703: 26x12 +#1302 @ 574,486: 10x11 +#1303 @ 447,292: 29x26 +#1304 @ 479,803: 25x22 +#1305 @ 318,835: 3x22 +#1306 @ 831,375: 15x27 +#1307 @ 817,388: 10x10 +#1308 @ 413,624: 3x11 +#1309 @ 9,356: 13x22 +#1310 @ 445,100: 27x17 +#1311 @ 782,464: 24x24 +#1312 @ 279,883: 19x29 +#1313 @ 963,562: 28x14 +#1314 @ 490,351: 28x20 +#1315 @ 75,935: 16x24 +#1316 @ 395,710: 18x21 +#1317 @ 166,498: 25x10 +#1318 @ 899,886: 13x17 +#1319 @ 926,595: 12x27 +#1320 @ 699,695: 21x23 +#1321 @ 446,892: 13x15 +#1322 @ 384,898: 10x10 +#1323 @ 137,526: 12x16 +#1324 @ 564,912: 16x28 +#1325 @ 577,522: 14x27 +#1326 @ 37,853: 25x27 +#1327 @ 373,49: 27x21 +#1328 @ 546,847: 26x20 +#1329 @ 753,13: 23x16 +#1330 @ 454,787: 27x23 +#1331 @ 588,938: 17x10 +#1332 @ 201,590: 28x10 +#1333 @ 689,8: 11x15 +#1334 @ 14,447: 28x22 +#1335 @ 893,268: 20x26 +#1336 @ 631,243: 23x16 +#1337 @ 950,56: 11x11 +#1338 @ 861,157: 22x27 +#1339 @ 229,404: 19x11 +#1340 @ 20,470: 26x22 +#1341 @ 262,67: 23x13 +#1342 @ 529,879: 23x14 +#1343 @ 186,763: 21x14 +#1344 @ 408,590: 26x20 +#1345 @ 781,950: 11x23 +#1346 @ 831,195: 11x23 +#1347 @ 592,649: 13x27 +#1348 @ 321,264: 28x27 +#1349 @ 913,961: 20x16 +#1350 @ 975,74: 23x16 +#1351 @ 852,722: 25x29 +#1352 @ 972,257: 24x15 +#1353 @ 339,418: 11x17 +#1354 @ 534,125: 25x28 +#1355 @ 13,216: 15x12 +#1356 @ 216,536: 8x3 +#1357 @ 10,856: 10x13 +#1358 @ 455,838: 19x10 +#1359 @ 963,940: 21x10 +#1360 @ 461,801: 22x19 +#1361 @ 903,615: 23x21 +#1362 @ 16,577: 20x29 +#1363 @ 30,211: 10x10 +#1364 @ 304,819: 20x11 +#1365 @ 475,733: 12x20 +#1366 @ 413,191: 24x23 +#1367 @ 436,586: 15x27 +#1368 @ 561,949: 15x23 +#1369 @ 738,810: 13x12 +#1370 @ 546,276: 24x17 +#1371 @ 959,968: 22x28 +#1372 @ 542,919: 12x5 +#1373 @ 800,803: 27x28 +#1374 @ 157,621: 13x13 +#1375 @ 968,190: 16x23 +#1376 @ 793,653: 19x23 +#1377 @ 275,709: 27x28 +#1378 @ 29,122: 14x22 +#1379 @ 930,208: 28x11 +#1380 @ 290,693: 25x25 +#1381 @ 252,661: 20x17 +#1382 @ 891,468: 22x27 +#1383 @ 260,649: 17x21 +#1384 @ 789,450: 10x21 +#1385 @ 153,561: 15x11 +#1386 @ 5,333: 15x15 +#1387 @ 17,839: 12x27 +#1388 @ 962,907: 17x16 +#1389 @ 210,792: 14x24 +#1390 @ 380,851: 14x15 +#1391 @ 270,831: 17x25 +#1392 @ 476,766: 25x12 +#1393 @ 212,973: 21x23 +#1394 @ 155,918: 23x12 +#1395 @ 478,475: 9x9 +#1396 @ 305,333: 18x27 +#1397 @ 888,761: 25x24 diff --git a/2018/d04/ex1/ex1.py b/2018/d04/ex1/ex1.py new file mode 100755 index 0000000..4c4b161 --- /dev/null +++ b/2018/d04/ex1/ex1.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +import sys +from collections import Counter, defaultdict +from typing import NamedTuple + + +class DateTime(NamedTuple): + year: int + month: int + day: int + hour: int + min: int + + +class Log(NamedTuple): + datetime: DateTime + event: str + + +def solve(input: str) -> int: + def parse_datetime(input: str) -> DateTime: + date, time = input.split() + year, month, day = map(int, date.split("-")) + hour, min = map(int, time.split(":")) + return DateTime(year, month, day, hour, min) + + def parse_log(input: str) -> Log: + date, event = input.split("] ") + return Log(parse_datetime(date.removeprefix("[")), event) + + def parse(input: list[str]) -> list[Log]: + return [parse_log(line) for line in input] + + def parse_guard_number(log: Log) -> int: + assert log.event.startswith("Guard #") # Sanity check + assert log.event.endswith(" begins shift") # Sanity check + return int(log.event.split()[1].removeprefix("#")) + + def guards_events(logs: list[Log]) -> dict[int, list[Log]]: + res: dict[int, list[Log]] = defaultdict(list) + current_guard = parse_guard_number(logs[0]) + for log in logs[1:]: + if log.event == "falls asleep" or log.event == "wakes up": + res[current_guard].append(log) + else: + current_guard = parse_guard_number(log) + return res + + def sleep_counts(logs: list[Log]) -> Counter[int]: + res: Counter[int] = Counter() + assert len(logs) % 2 == 0 # Sanity check + for i in range(0, len(logs), 2): + assert logs[i].event == "falls asleep" # Sanity check + assert logs[i + 1].event == "wakes up" # Sanity check + start, end = logs[i].datetime, logs[i + 1].datetime + res.update(range(start.min, end.min)) + return res + + def guard_sleep_counts( + guard_logs: dict[int, list[Log]], + ) -> dict[int, Counter[int]]: + return {guard: sleep_counts(logs) for guard, logs in guard_logs.items()} + + logs = sorted(parse(input.splitlines())) + guard_logs = guards_events(logs) + guard_sleeps = guard_sleep_counts(guard_logs) + most_asleep = max(guard_sleeps, key=lambda guard: sum(guard_sleeps[guard].values())) + return most_asleep * guard_sleeps[most_asleep].most_common()[0][0] + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d04/ex1/input b/2018/d04/ex1/input new file mode 100644 index 0000000..c30d741 --- /dev/null +++ b/2018/d04/ex1/input @@ -0,0 +1,1098 @@ +[1518-05-24 23:56] Guard #1721 begins shift +[1518-08-22 00:09] falls asleep +[1518-05-19 00:53] wakes up +[1518-04-19 23:48] Guard #773 begins shift +[1518-09-24 00:35] wakes up +[1518-07-15 00:56] wakes up +[1518-08-10 00:03] Guard #769 begins shift +[1518-07-10 00:50] wakes up +[1518-07-12 00:54] falls asleep +[1518-05-30 00:51] wakes up +[1518-09-15 00:56] wakes up +[1518-09-14 00:15] falls asleep +[1518-03-30 00:57] falls asleep +[1518-10-19 00:55] wakes up +[1518-09-18 00:58] wakes up +[1518-11-18 00:38] wakes up +[1518-11-07 00:23] falls asleep +[1518-10-18 00:56] wakes up +[1518-03-05 00:41] falls asleep +[1518-05-19 00:36] falls asleep +[1518-09-04 00:49] wakes up +[1518-06-08 00:56] falls asleep +[1518-06-11 23:56] Guard #2749 begins shift +[1518-09-27 00:54] wakes up +[1518-10-03 00:49] wakes up +[1518-09-16 00:45] wakes up +[1518-10-06 00:46] wakes up +[1518-07-20 00:07] falls asleep +[1518-05-09 00:55] wakes up +[1518-05-11 00:05] falls asleep +[1518-10-14 00:45] falls asleep +[1518-08-21 00:19] wakes up +[1518-11-01 00:43] wakes up +[1518-08-31 00:57] wakes up +[1518-03-28 00:58] wakes up +[1518-04-06 00:12] wakes up +[1518-02-28 00:03] Guard #191 begins shift +[1518-09-29 00:01] falls asleep +[1518-05-15 00:47] falls asleep +[1518-03-04 00:01] Guard #2879 begins shift +[1518-04-28 00:29] wakes up +[1518-05-10 00:40] falls asleep +[1518-03-12 00:03] Guard #191 begins shift +[1518-09-19 00:41] falls asleep +[1518-07-28 00:00] Guard #1381 begins shift +[1518-04-11 00:01] Guard #1907 begins shift +[1518-04-02 00:58] wakes up +[1518-03-04 00:51] wakes up +[1518-05-02 00:22] falls asleep +[1518-07-01 00:02] falls asleep +[1518-07-21 00:24] falls asleep +[1518-05-31 00:31] wakes up +[1518-08-02 00:00] Guard #2713 begins shift +[1518-08-25 00:48] falls asleep +[1518-05-02 00:26] wakes up +[1518-07-08 00:00] Guard #2711 begins shift +[1518-09-16 00:38] falls asleep +[1518-07-22 00:43] wakes up +[1518-11-04 00:13] falls asleep +[1518-09-03 23:50] Guard #97 begins shift +[1518-03-20 00:35] wakes up +[1518-05-17 00:41] wakes up +[1518-08-22 00:32] falls asleep +[1518-05-07 23:58] Guard #773 begins shift +[1518-08-28 00:12] wakes up +[1518-09-06 00:46] falls asleep +[1518-05-20 00:59] wakes up +[1518-03-19 00:59] wakes up +[1518-08-22 00:29] wakes up +[1518-07-06 00:00] Guard #2777 begins shift +[1518-06-15 00:37] falls asleep +[1518-03-15 00:27] falls asleep +[1518-09-10 00:43] wakes up +[1518-09-30 00:49] falls asleep +[1518-09-14 23:58] Guard #1493 begins shift +[1518-06-20 00:33] falls asleep +[1518-05-04 00:53] falls asleep +[1518-09-04 00:45] falls asleep +[1518-07-17 00:56] wakes up +[1518-06-18 00:58] wakes up +[1518-04-07 00:42] falls asleep +[1518-05-23 23:58] Guard #2777 begins shift +[1518-10-03 23:57] Guard #1721 begins shift +[1518-03-04 23:57] Guard #773 begins shift +[1518-05-31 00:20] wakes up +[1518-08-04 00:04] Guard #1213 begins shift +[1518-05-11 00:56] wakes up +[1518-03-02 00:32] wakes up +[1518-10-17 00:50] wakes up +[1518-11-08 00:39] falls asleep +[1518-09-03 00:20] falls asleep +[1518-10-28 00:40] falls asleep +[1518-08-20 00:51] falls asleep +[1518-08-15 00:36] wakes up +[1518-06-08 00:51] wakes up +[1518-08-20 00:58] wakes up +[1518-03-30 00:00] Guard #2711 begins shift +[1518-10-31 00:00] falls asleep +[1518-06-24 23:59] Guard #97 begins shift +[1518-02-21 00:00] Guard #2749 begins shift +[1518-06-04 00:02] Guard #1907 begins shift +[1518-06-28 23:51] Guard #1493 begins shift +[1518-02-18 23:59] Guard #2141 begins shift +[1518-04-17 00:17] wakes up +[1518-06-15 00:57] wakes up +[1518-04-02 00:27] falls asleep +[1518-06-08 00:10] falls asleep +[1518-10-05 00:41] wakes up +[1518-11-15 00:51] falls asleep +[1518-05-17 23:59] Guard #991 begins shift +[1518-11-22 00:53] wakes up +[1518-07-24 00:10] falls asleep +[1518-06-25 00:27] falls asleep +[1518-02-20 00:46] falls asleep +[1518-09-29 00:34] falls asleep +[1518-10-03 00:01] Guard #769 begins shift +[1518-06-22 00:05] falls asleep +[1518-02-26 00:49] falls asleep +[1518-03-13 00:24] falls asleep +[1518-05-03 00:38] wakes up +[1518-07-08 00:22] falls asleep +[1518-03-14 00:08] falls asleep +[1518-07-20 00:49] wakes up +[1518-03-13 00:58] wakes up +[1518-09-30 00:51] wakes up +[1518-10-10 00:39] falls asleep +[1518-09-05 00:02] Guard #1049 begins shift +[1518-10-26 00:49] falls asleep +[1518-07-22 00:33] falls asleep +[1518-09-27 00:13] falls asleep +[1518-11-09 00:48] falls asleep +[1518-11-16 00:11] falls asleep +[1518-05-04 00:50] wakes up +[1518-06-14 00:02] Guard #2879 begins shift +[1518-03-06 00:44] wakes up +[1518-07-23 00:47] wakes up +[1518-04-16 00:59] wakes up +[1518-09-23 00:05] falls asleep +[1518-09-12 00:27] wakes up +[1518-02-21 00:49] wakes up +[1518-07-05 00:58] wakes up +[1518-07-22 00:28] wakes up +[1518-07-14 00:03] Guard #2917 begins shift +[1518-05-14 00:02] Guard #1277 begins shift +[1518-04-06 00:53] wakes up +[1518-05-04 00:59] wakes up +[1518-09-07 00:50] wakes up +[1518-04-03 00:26] falls asleep +[1518-10-09 00:43] falls asleep +[1518-07-10 00:41] falls asleep +[1518-04-10 00:49] falls asleep +[1518-03-14 00:47] wakes up +[1518-05-03 00:54] wakes up +[1518-04-15 00:39] wakes up +[1518-07-31 00:40] wakes up +[1518-08-01 00:02] falls asleep +[1518-10-06 23:57] Guard #191 begins shift +[1518-11-04 00:23] wakes up +[1518-08-15 00:49] falls asleep +[1518-02-28 00:29] falls asleep +[1518-03-30 23:59] Guard #1907 begins shift +[1518-08-01 00:40] falls asleep +[1518-10-13 00:52] wakes up +[1518-10-14 00:01] Guard #2917 begins shift +[1518-08-26 00:00] Guard #2917 begins shift +[1518-07-24 00:02] Guard #2749 begins shift +[1518-04-21 00:25] falls asleep +[1518-03-05 00:43] wakes up +[1518-08-31 23:58] Guard #1721 begins shift +[1518-08-11 00:28] falls asleep +[1518-08-26 00:41] wakes up +[1518-05-18 00:20] falls asleep +[1518-08-09 00:03] Guard #683 begins shift +[1518-08-24 00:16] wakes up +[1518-03-26 00:27] wakes up +[1518-06-19 00:35] wakes up +[1518-09-24 00:56] wakes up +[1518-11-01 00:34] falls asleep +[1518-10-11 00:13] falls asleep +[1518-10-27 00:18] falls asleep +[1518-09-03 00:53] wakes up +[1518-04-10 00:33] wakes up +[1518-07-30 00:57] wakes up +[1518-06-10 00:12] falls asleep +[1518-03-31 00:31] falls asleep +[1518-11-21 23:57] Guard #2141 begins shift +[1518-03-21 00:31] falls asleep +[1518-03-26 00:37] falls asleep +[1518-08-24 00:12] falls asleep +[1518-08-07 00:49] wakes up +[1518-11-18 00:02] Guard #1049 begins shift +[1518-04-28 23:53] Guard #773 begins shift +[1518-05-17 00:00] Guard #773 begins shift +[1518-05-21 00:56] falls asleep +[1518-10-23 23:46] Guard #773 begins shift +[1518-08-24 00:03] Guard #1213 begins shift +[1518-04-10 00:14] falls asleep +[1518-10-27 00:28] falls asleep +[1518-06-04 00:55] falls asleep +[1518-04-02 00:29] wakes up +[1518-07-25 00:39] wakes up +[1518-09-21 23:59] Guard #97 begins shift +[1518-06-29 00:01] falls asleep +[1518-04-08 00:02] Guard #769 begins shift +[1518-11-20 00:38] falls asleep +[1518-03-25 00:42] falls asleep +[1518-08-03 00:55] wakes up +[1518-09-20 00:25] falls asleep +[1518-08-27 00:54] falls asleep +[1518-10-28 00:04] Guard #1187 begins shift +[1518-05-14 00:13] falls asleep +[1518-06-01 00:33] falls asleep +[1518-03-26 00:09] falls asleep +[1518-03-09 00:04] Guard #769 begins shift +[1518-10-16 00:40] wakes up +[1518-10-22 00:20] falls asleep +[1518-03-05 00:08] falls asleep +[1518-03-07 00:53] wakes up +[1518-05-14 00:27] falls asleep +[1518-08-13 23:59] Guard #97 begins shift +[1518-10-23 00:39] wakes up +[1518-10-22 00:02] Guard #2917 begins shift +[1518-09-26 00:53] falls asleep +[1518-10-29 00:55] wakes up +[1518-05-21 00:51] falls asleep +[1518-07-10 00:15] wakes up +[1518-08-04 23:57] Guard #1049 begins shift +[1518-04-21 00:52] wakes up +[1518-02-26 00:39] falls asleep +[1518-08-02 23:59] Guard #683 begins shift +[1518-04-10 00:53] wakes up +[1518-10-21 00:52] wakes up +[1518-08-25 00:55] falls asleep +[1518-06-29 00:57] wakes up +[1518-11-13 00:52] wakes up +[1518-05-27 00:37] falls asleep +[1518-10-24 00:02] wakes up +[1518-08-25 00:50] wakes up +[1518-05-13 00:57] falls asleep +[1518-03-25 00:00] falls asleep +[1518-10-07 23:57] Guard #2917 begins shift +[1518-05-25 00:40] wakes up +[1518-10-08 23:56] Guard #2749 begins shift +[1518-11-14 00:59] wakes up +[1518-05-17 00:53] falls asleep +[1518-05-21 00:00] Guard #1277 begins shift +[1518-04-29 00:56] wakes up +[1518-06-17 00:06] falls asleep +[1518-03-28 00:21] wakes up +[1518-03-28 00:52] wakes up +[1518-06-17 00:52] wakes up +[1518-08-21 00:40] falls asleep +[1518-08-29 00:41] falls asleep +[1518-10-29 23:52] Guard #191 begins shift +[1518-06-03 00:00] Guard #1381 begins shift +[1518-09-28 23:54] Guard #2917 begins shift +[1518-06-20 00:55] wakes up +[1518-05-17 00:58] wakes up +[1518-05-16 00:39] falls asleep +[1518-07-01 00:35] falls asleep +[1518-04-18 00:00] Guard #1049 begins shift +[1518-09-02 00:10] falls asleep +[1518-08-12 00:51] falls asleep +[1518-04-06 00:02] falls asleep +[1518-10-17 00:00] Guard #2879 begins shift +[1518-09-01 00:25] falls asleep +[1518-07-29 00:19] wakes up +[1518-02-26 00:54] wakes up +[1518-07-19 00:56] wakes up +[1518-06-02 00:56] wakes up +[1518-03-06 00:56] wakes up +[1518-04-25 00:35] falls asleep +[1518-05-09 00:00] Guard #1277 begins shift +[1518-10-04 00:57] wakes up +[1518-07-22 00:16] falls asleep +[1518-07-03 00:35] wakes up +[1518-07-22 00:46] falls asleep +[1518-08-02 00:07] falls asleep +[1518-07-17 00:44] falls asleep +[1518-06-07 00:36] wakes up +[1518-08-04 00:25] falls asleep +[1518-05-20 00:26] wakes up +[1518-07-30 23:58] Guard #1493 begins shift +[1518-03-25 00:36] wakes up +[1518-05-02 00:54] wakes up +[1518-03-09 00:19] falls asleep +[1518-03-09 00:51] wakes up +[1518-08-26 23:56] Guard #2141 begins shift +[1518-11-08 00:07] falls asleep +[1518-08-17 23:57] Guard #2917 begins shift +[1518-04-17 00:32] falls asleep +[1518-11-16 00:00] Guard #2879 begins shift +[1518-06-11 00:52] wakes up +[1518-11-10 00:55] wakes up +[1518-03-07 00:37] falls asleep +[1518-07-04 00:00] Guard #769 begins shift +[1518-03-28 00:00] Guard #2713 begins shift +[1518-04-18 00:10] falls asleep +[1518-09-24 00:48] wakes up +[1518-06-29 00:15] falls asleep +[1518-05-10 00:33] falls asleep +[1518-10-10 00:56] wakes up +[1518-03-23 00:48] falls asleep +[1518-06-05 00:55] wakes up +[1518-05-18 00:47] wakes up +[1518-10-12 23:58] Guard #2711 begins shift +[1518-07-30 00:40] falls asleep +[1518-06-24 00:02] Guard #2141 begins shift +[1518-03-03 00:48] wakes up +[1518-10-01 00:41] wakes up +[1518-06-10 00:03] Guard #1049 begins shift +[1518-02-23 00:48] wakes up +[1518-11-10 00:22] falls asleep +[1518-09-04 00:22] wakes up +[1518-05-03 00:22] falls asleep +[1518-08-05 00:32] falls asleep +[1518-04-20 00:31] wakes up +[1518-04-16 00:12] falls asleep +[1518-04-30 23:57] Guard #2711 begins shift +[1518-05-30 00:38] falls asleep +[1518-10-24 00:01] falls asleep +[1518-10-03 00:19] wakes up +[1518-05-03 23:57] Guard #2879 begins shift +[1518-11-06 00:46] falls asleep +[1518-02-27 00:37] falls asleep +[1518-11-09 23:56] Guard #2141 begins shift +[1518-08-31 00:00] Guard #1907 begins shift +[1518-03-22 00:06] falls asleep +[1518-03-30 00:59] wakes up +[1518-09-10 23:58] Guard #1493 begins shift +[1518-11-23 00:16] falls asleep +[1518-10-29 00:51] falls asleep +[1518-08-08 00:52] wakes up +[1518-04-25 00:07] falls asleep +[1518-06-29 23:46] Guard #769 begins shift +[1518-03-13 00:55] falls asleep +[1518-05-27 23:57] Guard #2113 begins shift +[1518-02-24 00:02] Guard #2879 begins shift +[1518-11-01 00:02] Guard #683 begins shift +[1518-11-06 00:55] wakes up +[1518-10-20 23:56] Guard #191 begins shift +[1518-06-14 23:58] Guard #1907 begins shift +[1518-05-23 00:04] Guard #1277 begins shift +[1518-08-01 00:11] wakes up +[1518-04-17 00:16] falls asleep +[1518-10-26 00:03] falls asleep +[1518-08-19 00:37] falls asleep +[1518-06-26 00:02] falls asleep +[1518-11-05 23:56] Guard #2879 begins shift +[1518-07-18 00:00] Guard #1049 begins shift +[1518-11-04 00:02] Guard #683 begins shift +[1518-05-01 23:59] Guard #2141 begins shift +[1518-09-23 23:47] Guard #1907 begins shift +[1518-10-06 00:45] falls asleep +[1518-02-28 23:56] Guard #2879 begins shift +[1518-06-15 23:57] Guard #769 begins shift +[1518-11-12 00:41] wakes up +[1518-05-11 23:47] Guard #1049 begins shift +[1518-11-02 00:00] Guard #683 begins shift +[1518-09-19 23:48] Guard #991 begins shift +[1518-05-24 00:45] falls asleep +[1518-11-13 00:47] falls asleep +[1518-09-20 00:05] wakes up +[1518-04-09 00:23] falls asleep +[1518-05-17 00:23] falls asleep +[1518-10-02 00:54] wakes up +[1518-09-19 00:01] Guard #769 begins shift +[1518-04-27 00:35] wakes up +[1518-11-12 00:00] Guard #2917 begins shift +[1518-04-04 00:57] wakes up +[1518-09-04 00:03] falls asleep +[1518-06-19 00:30] falls asleep +[1518-07-21 00:56] wakes up +[1518-07-16 00:17] falls asleep +[1518-10-14 00:55] wakes up +[1518-11-07 00:56] wakes up +[1518-09-17 00:00] Guard #2749 begins shift +[1518-09-16 00:27] wakes up +[1518-03-16 00:02] Guard #1907 begins shift +[1518-08-15 00:06] falls asleep +[1518-03-24 00:38] wakes up +[1518-09-18 00:00] Guard #2777 begins shift +[1518-11-20 23:56] Guard #2113 begins shift +[1518-11-23 00:02] Guard #769 begins shift +[1518-06-21 00:01] Guard #2711 begins shift +[1518-10-20 00:44] wakes up +[1518-08-15 00:32] wakes up +[1518-10-19 00:03] Guard #2711 begins shift +[1518-08-28 00:10] falls asleep +[1518-05-05 00:01] Guard #191 begins shift +[1518-11-06 00:22] wakes up +[1518-07-13 00:20] falls asleep +[1518-07-03 00:54] wakes up +[1518-03-13 23:59] Guard #1907 begins shift +[1518-04-07 00:35] wakes up +[1518-10-23 00:59] wakes up +[1518-09-15 00:16] falls asleep +[1518-09-23 00:16] falls asleep +[1518-10-23 00:00] Guard #1907 begins shift +[1518-09-28 00:13] falls asleep +[1518-08-09 00:06] falls asleep +[1518-09-19 00:54] wakes up +[1518-02-24 00:32] wakes up +[1518-09-05 00:14] falls asleep +[1518-10-26 23:59] Guard #2749 begins shift +[1518-04-05 23:53] Guard #1907 begins shift +[1518-08-09 00:46] falls asleep +[1518-04-24 00:02] Guard #1049 begins shift +[1518-03-14 00:55] wakes up +[1518-03-06 23:59] Guard #1213 begins shift +[1518-08-23 00:50] wakes up +[1518-10-12 00:41] wakes up +[1518-04-20 23:56] Guard #2777 begins shift +[1518-09-25 00:33] wakes up +[1518-10-01 00:44] falls asleep +[1518-10-02 00:53] falls asleep +[1518-04-28 00:02] Guard #769 begins shift +[1518-07-10 00:01] falls asleep +[1518-10-12 00:24] falls asleep +[1518-10-25 00:13] falls asleep +[1518-08-19 00:26] falls asleep +[1518-09-30 00:07] falls asleep +[1518-03-01 00:35] wakes up +[1518-08-16 23:57] Guard #2141 begins shift +[1518-08-18 00:14] wakes up +[1518-09-25 23:57] Guard #191 begins shift +[1518-11-14 00:42] falls asleep +[1518-07-28 23:57] Guard #1213 begins shift +[1518-10-24 00:57] wakes up +[1518-10-07 00:41] falls asleep +[1518-06-25 00:46] wakes up +[1518-06-22 00:41] wakes up +[1518-10-25 00:28] wakes up +[1518-04-05 00:30] wakes up +[1518-06-02 00:36] falls asleep +[1518-05-15 00:04] Guard #1187 begins shift +[1518-03-11 00:52] wakes up +[1518-04-27 00:03] Guard #1493 begins shift +[1518-02-24 00:22] falls asleep +[1518-06-29 00:07] wakes up +[1518-03-29 00:30] falls asleep +[1518-06-21 23:50] Guard #1049 begins shift +[1518-07-14 00:55] falls asleep +[1518-03-10 00:03] falls asleep +[1518-08-01 00:58] wakes up +[1518-06-06 00:59] wakes up +[1518-07-31 00:49] falls asleep +[1518-02-26 00:31] wakes up +[1518-08-16 00:54] wakes up +[1518-09-30 00:43] wakes up +[1518-04-09 00:59] wakes up +[1518-03-10 00:11] wakes up +[1518-11-05 00:45] falls asleep +[1518-07-02 00:03] Guard #769 begins shift +[1518-03-17 00:26] wakes up +[1518-08-13 00:02] Guard #2777 begins shift +[1518-10-25 00:03] Guard #769 begins shift +[1518-10-27 00:49] falls asleep +[1518-09-02 00:59] wakes up +[1518-07-25 00:18] falls asleep +[1518-11-12 00:21] falls asleep +[1518-06-07 00:43] wakes up +[1518-03-06 00:24] falls asleep +[1518-05-10 00:58] wakes up +[1518-08-06 23:59] Guard #1049 begins shift +[1518-09-16 00:59] wakes up +[1518-02-28 00:55] wakes up +[1518-06-23 00:34] wakes up +[1518-09-28 00:57] wakes up +[1518-05-16 00:34] wakes up +[1518-06-19 00:07] falls asleep +[1518-10-10 00:30] wakes up +[1518-10-20 00:33] falls asleep +[1518-05-12 00:00] falls asleep +[1518-04-25 00:37] wakes up +[1518-08-23 00:45] falls asleep +[1518-08-17 00:33] falls asleep +[1518-08-31 00:39] falls asleep +[1518-04-30 00:14] falls asleep +[1518-11-18 00:51] wakes up +[1518-03-16 00:07] falls asleep +[1518-09-20 00:01] falls asleep +[1518-11-09 00:39] falls asleep +[1518-05-26 00:00] Guard #769 begins shift +[1518-07-11 23:58] Guard #1213 begins shift +[1518-03-06 00:50] falls asleep +[1518-09-25 00:25] falls asleep +[1518-03-09 23:48] Guard #2141 begins shift +[1518-05-04 00:45] falls asleep +[1518-07-19 00:00] Guard #2713 begins shift +[1518-03-18 00:47] wakes up +[1518-07-08 00:42] wakes up +[1518-03-26 00:58] wakes up +[1518-08-04 00:56] wakes up +[1518-09-11 00:31] falls asleep +[1518-03-12 00:57] falls asleep +[1518-08-14 00:30] falls asleep +[1518-03-19 00:03] Guard #2879 begins shift +[1518-05-22 00:57] wakes up +[1518-05-23 00:59] wakes up +[1518-10-31 00:12] wakes up +[1518-07-03 00:47] falls asleep +[1518-09-22 23:47] Guard #991 begins shift +[1518-08-07 00:56] wakes up +[1518-11-10 23:58] Guard #1381 begins shift +[1518-08-17 00:54] wakes up +[1518-11-17 00:23] wakes up +[1518-03-01 00:16] falls asleep +[1518-06-06 23:50] Guard #1721 begins shift +[1518-06-19 00:19] wakes up +[1518-05-11 00:41] wakes up +[1518-09-12 00:58] wakes up +[1518-06-12 00:29] falls asleep +[1518-04-02 00:01] Guard #2879 begins shift +[1518-10-27 00:54] wakes up +[1518-05-14 00:14] wakes up +[1518-11-09 00:04] Guard #2917 begins shift +[1518-05-23 00:47] falls asleep +[1518-11-02 00:35] wakes up +[1518-06-30 00:51] wakes up +[1518-03-18 00:00] Guard #2749 begins shift +[1518-09-08 00:54] wakes up +[1518-05-01 00:43] falls asleep +[1518-04-11 00:54] wakes up +[1518-07-06 23:58] Guard #1213 begins shift +[1518-08-24 00:33] falls asleep +[1518-04-30 00:20] wakes up +[1518-04-28 00:14] falls asleep +[1518-02-25 23:50] Guard #2879 begins shift +[1518-09-24 00:46] falls asleep +[1518-08-12 00:55] wakes up +[1518-05-20 00:03] falls asleep +[1518-09-28 00:44] wakes up +[1518-10-11 00:35] wakes up +[1518-02-24 00:55] wakes up +[1518-05-02 23:58] Guard #2917 begins shift +[1518-09-06 00:02] Guard #191 begins shift +[1518-04-19 00:00] Guard #191 begins shift +[1518-08-21 00:11] falls asleep +[1518-07-31 23:49] Guard #683 begins shift +[1518-05-19 00:49] falls asleep +[1518-06-24 00:54] wakes up +[1518-06-29 00:53] falls asleep +[1518-11-15 00:03] Guard #2777 begins shift +[1518-08-06 00:39] falls asleep +[1518-10-16 00:21] falls asleep +[1518-04-18 00:58] wakes up +[1518-05-29 00:51] wakes up +[1518-05-06 00:36] wakes up +[1518-07-02 00:16] falls asleep +[1518-10-02 00:01] Guard #2879 begins shift +[1518-11-03 00:11] falls asleep +[1518-06-06 00:27] falls asleep +[1518-09-14 00:02] Guard #773 begins shift +[1518-04-22 00:48] wakes up +[1518-05-25 00:26] falls asleep +[1518-05-13 00:53] wakes up +[1518-07-03 00:25] falls asleep +[1518-06-27 00:57] wakes up +[1518-07-13 00:51] wakes up +[1518-11-09 00:52] wakes up +[1518-05-25 00:43] falls asleep +[1518-07-07 00:41] wakes up +[1518-05-19 23:51] Guard #2917 begins shift +[1518-10-01 00:39] falls asleep +[1518-04-15 00:37] falls asleep +[1518-08-03 00:07] falls asleep +[1518-07-14 00:57] wakes up +[1518-10-15 00:23] falls asleep +[1518-02-19 00:24] falls asleep +[1518-03-14 23:58] Guard #2879 begins shift +[1518-10-26 00:45] wakes up +[1518-07-29 00:25] wakes up +[1518-04-25 00:26] wakes up +[1518-10-20 00:25] wakes up +[1518-10-02 00:08] falls asleep +[1518-07-24 23:58] Guard #1493 begins shift +[1518-03-27 00:57] wakes up +[1518-02-23 00:52] falls asleep +[1518-08-11 00:59] wakes up +[1518-11-15 00:24] wakes up +[1518-06-18 23:57] Guard #191 begins shift +[1518-10-08 00:27] falls asleep +[1518-06-13 00:57] wakes up +[1518-04-02 00:46] falls asleep +[1518-10-24 00:52] falls asleep +[1518-05-22 00:38] wakes up +[1518-08-30 00:31] falls asleep +[1518-03-31 00:49] falls asleep +[1518-04-07 00:25] falls asleep +[1518-06-20 00:00] Guard #1721 begins shift +[1518-04-07 00:54] wakes up +[1518-10-29 00:44] wakes up +[1518-05-02 00:32] falls asleep +[1518-02-24 00:41] falls asleep +[1518-06-05 00:15] falls asleep +[1518-04-16 00:47] falls asleep +[1518-06-21 00:52] wakes up +[1518-08-29 00:59] wakes up +[1518-11-02 00:47] wakes up +[1518-11-07 00:01] Guard #1721 begins shift +[1518-10-03 00:47] falls asleep +[1518-06-04 23:58] Guard #1277 begins shift +[1518-05-09 00:13] falls asleep +[1518-07-20 00:55] falls asleep +[1518-10-30 23:53] Guard #2711 begins shift +[1518-03-22 00:00] Guard #1049 begins shift +[1518-04-08 00:14] falls asleep +[1518-03-05 00:21] wakes up +[1518-07-24 00:59] wakes up +[1518-09-12 00:18] wakes up +[1518-04-03 00:02] Guard #191 begins shift +[1518-08-14 00:58] wakes up +[1518-05-07 00:17] falls asleep +[1518-08-27 00:46] wakes up +[1518-03-17 00:04] falls asleep +[1518-10-03 00:55] wakes up +[1518-03-17 00:44] wakes up +[1518-05-10 00:34] wakes up +[1518-03-17 00:42] falls asleep +[1518-02-27 00:53] wakes up +[1518-03-14 00:53] falls asleep +[1518-02-19 00:58] wakes up +[1518-03-21 00:51] wakes up +[1518-11-04 00:59] wakes up +[1518-05-05 00:27] falls asleep +[1518-07-27 00:56] wakes up +[1518-07-26 00:17] falls asleep +[1518-05-05 00:57] wakes up +[1518-06-26 00:29] wakes up +[1518-04-08 00:50] wakes up +[1518-07-14 00:21] falls asleep +[1518-06-16 23:56] Guard #2711 begins shift +[1518-09-09 00:38] falls asleep +[1518-04-11 00:29] falls asleep +[1518-09-29 00:50] wakes up +[1518-08-30 00:41] wakes up +[1518-05-07 00:22] wakes up +[1518-07-22 00:02] Guard #1277 begins shift +[1518-03-24 00:01] Guard #1277 begins shift +[1518-07-12 00:48] wakes up +[1518-06-10 00:51] wakes up +[1518-11-05 00:52] wakes up +[1518-03-22 00:57] wakes up +[1518-08-19 00:32] wakes up +[1518-06-20 00:54] falls asleep +[1518-04-13 00:00] Guard #2113 begins shift +[1518-06-04 00:37] falls asleep +[1518-05-13 00:58] wakes up +[1518-11-05 00:51] falls asleep +[1518-06-16 00:57] wakes up +[1518-04-01 00:34] falls asleep +[1518-07-20 23:57] Guard #2713 begins shift +[1518-09-11 00:48] wakes up +[1518-09-25 00:51] falls asleep +[1518-07-29 00:24] falls asleep +[1518-06-29 00:25] wakes up +[1518-03-16 00:47] wakes up +[1518-08-06 00:59] wakes up +[1518-03-23 00:00] Guard #2879 begins shift +[1518-04-04 00:32] wakes up +[1518-10-17 00:12] falls asleep +[1518-05-06 00:11] falls asleep +[1518-11-22 00:42] falls asleep +[1518-10-18 00:28] falls asleep +[1518-02-22 00:48] falls asleep +[1518-11-15 00:11] falls asleep +[1518-04-05 00:03] Guard #1721 begins shift +[1518-05-27 00:04] Guard #2777 begins shift +[1518-06-08 00:04] Guard #1049 begins shift +[1518-08-18 00:45] wakes up +[1518-03-15 00:53] wakes up +[1518-04-26 00:03] Guard #2879 begins shift +[1518-03-29 00:54] wakes up +[1518-08-20 00:36] falls asleep +[1518-07-09 00:21] falls asleep +[1518-04-30 00:00] Guard #2711 begins shift +[1518-03-18 00:42] falls asleep +[1518-11-01 00:22] falls asleep +[1518-05-25 00:52] wakes up +[1518-03-13 00:01] Guard #769 begins shift +[1518-11-12 23:57] Guard #2879 begins shift +[1518-04-14 00:44] falls asleep +[1518-09-13 00:21] falls asleep +[1518-05-05 23:59] Guard #2917 begins shift +[1518-06-16 00:12] falls asleep +[1518-04-14 00:01] Guard #769 begins shift +[1518-07-15 23:57] Guard #2711 begins shift +[1518-08-05 00:53] wakes up +[1518-11-02 00:45] falls asleep +[1518-03-24 00:32] falls asleep +[1518-07-16 00:27] wakes up +[1518-07-09 00:53] wakes up +[1518-10-10 23:59] Guard #1277 begins shift +[1518-08-08 00:03] Guard #2879 begins shift +[1518-10-10 00:03] Guard #2917 begins shift +[1518-04-10 00:02] Guard #2711 begins shift +[1518-08-04 00:38] wakes up +[1518-05-30 00:00] Guard #2141 begins shift +[1518-06-07 00:48] falls asleep +[1518-10-05 00:21] falls asleep +[1518-02-20 00:20] wakes up +[1518-10-28 00:50] wakes up +[1518-08-19 00:03] Guard #2711 begins shift +[1518-09-18 00:26] falls asleep +[1518-05-24 00:53] wakes up +[1518-11-20 00:01] Guard #1213 begins shift +[1518-05-06 23:59] Guard #1049 begins shift +[1518-03-12 00:59] wakes up +[1518-03-01 23:58] Guard #683 begins shift +[1518-08-18 00:12] falls asleep +[1518-08-30 00:23] falls asleep +[1518-04-20 00:02] falls asleep +[1518-06-16 00:56] falls asleep +[1518-04-19 00:59] wakes up +[1518-03-30 00:52] falls asleep +[1518-10-04 00:41] falls asleep +[1518-08-13 00:57] wakes up +[1518-04-28 00:36] falls asleep +[1518-08-08 00:45] falls asleep +[1518-04-04 00:00] Guard #2711 begins shift +[1518-05-08 00:12] falls asleep +[1518-05-15 00:51] wakes up +[1518-04-29 00:40] falls asleep +[1518-09-12 00:01] falls asleep +[1518-03-05 23:57] Guard #2777 begins shift +[1518-10-09 00:47] wakes up +[1518-02-23 00:01] Guard #2749 begins shift +[1518-07-12 00:55] wakes up +[1518-11-20 00:44] wakes up +[1518-11-16 00:53] wakes up +[1518-06-26 00:37] falls asleep +[1518-07-31 00:58] wakes up +[1518-11-13 00:56] wakes up +[1518-11-14 00:33] wakes up +[1518-05-29 00:15] falls asleep +[1518-02-20 00:16] falls asleep +[1518-10-15 00:04] Guard #2917 begins shift +[1518-07-12 23:57] Guard #1277 begins shift +[1518-07-01 00:45] wakes up +[1518-06-14 00:31] falls asleep +[1518-04-23 00:43] wakes up +[1518-09-25 00:59] wakes up +[1518-07-26 00:00] Guard #1187 begins shift +[1518-06-26 00:58] wakes up +[1518-02-22 00:59] wakes up +[1518-02-21 23:58] Guard #2749 begins shift +[1518-08-30 00:28] wakes up +[1518-09-12 23:59] Guard #991 begins shift +[1518-11-01 00:26] wakes up +[1518-08-14 23:59] Guard #769 begins shift +[1518-08-24 23:50] Guard #1187 begins shift +[1518-07-15 00:38] falls asleep +[1518-11-04 00:27] falls asleep +[1518-09-21 00:19] falls asleep +[1518-11-07 23:56] Guard #1907 begins shift +[1518-06-09 00:55] wakes up +[1518-07-03 00:04] Guard #1277 begins shift +[1518-08-28 00:03] Guard #97 begins shift +[1518-07-12 00:23] falls asleep +[1518-02-24 23:57] Guard #2141 begins shift +[1518-06-18 00:01] Guard #2879 begins shift +[1518-03-01 00:48] falls asleep +[1518-09-21 00:04] Guard #2917 begins shift +[1518-06-13 00:39] falls asleep +[1518-09-22 00:14] falls asleep +[1518-06-21 00:27] falls asleep +[1518-07-19 23:59] Guard #2777 begins shift +[1518-04-09 00:02] Guard #2711 begins shift +[1518-09-16 00:16] falls asleep +[1518-10-03 00:53] falls asleep +[1518-10-27 00:23] wakes up +[1518-03-28 00:06] falls asleep +[1518-07-04 00:42] wakes up +[1518-09-08 00:00] Guard #2879 begins shift +[1518-11-15 00:56] wakes up +[1518-06-28 00:09] wakes up +[1518-09-06 00:50] wakes up +[1518-04-17 00:03] Guard #1721 begins shift +[1518-05-10 23:46] Guard #1213 begins shift +[1518-08-21 00:55] falls asleep +[1518-06-09 00:03] Guard #97 begins shift +[1518-11-14 00:11] falls asleep +[1518-06-07 00:05] falls asleep +[1518-06-11 00:01] Guard #1049 begins shift +[1518-04-22 00:18] falls asleep +[1518-03-27 00:25] falls asleep +[1518-09-08 23:47] Guard #2777 begins shift +[1518-05-31 00:13] falls asleep +[1518-07-27 00:52] falls asleep +[1518-03-20 23:56] Guard #1493 begins shift +[1518-10-22 00:54] wakes up +[1518-08-07 00:52] falls asleep +[1518-03-30 00:53] wakes up +[1518-10-25 23:54] Guard #2711 begins shift +[1518-08-19 23:50] Guard #683 begins shift +[1518-04-19 00:52] falls asleep +[1518-07-20 00:56] wakes up +[1518-04-27 00:40] falls asleep +[1518-11-14 00:02] Guard #1493 begins shift +[1518-07-19 00:51] falls asleep +[1518-04-27 00:13] falls asleep +[1518-08-18 00:35] falls asleep +[1518-05-26 00:37] wakes up +[1518-08-15 23:50] Guard #1277 begins shift +[1518-09-09 00:23] wakes up +[1518-07-06 00:38] wakes up +[1518-04-17 00:43] wakes up +[1518-03-03 00:00] Guard #1721 begins shift +[1518-09-17 00:48] wakes up +[1518-03-03 00:19] falls asleep +[1518-10-31 00:50] falls asleep +[1518-04-24 00:41] wakes up +[1518-02-26 00:04] falls asleep +[1518-05-15 23:56] Guard #2879 begins shift +[1518-08-25 00:05] falls asleep +[1518-08-23 00:01] Guard #1277 begins shift +[1518-04-12 00:38] wakes up +[1518-10-10 00:28] falls asleep +[1518-10-01 00:48] wakes up +[1518-11-19 00:42] falls asleep +[1518-09-10 00:00] Guard #769 begins shift +[1518-05-22 00:55] falls asleep +[1518-04-24 00:31] falls asleep +[1518-10-16 00:49] falls asleep +[1518-05-11 00:49] falls asleep +[1518-04-06 00:32] falls asleep +[1518-09-29 00:22] wakes up +[1518-06-24 00:42] falls asleep +[1518-06-30 23:53] Guard #2713 begins shift +[1518-08-22 00:01] Guard #1277 begins shift +[1518-11-06 00:16] falls asleep +[1518-11-02 23:56] Guard #2917 begins shift +[1518-08-29 00:03] Guard #1049 begins shift +[1518-03-11 00:10] falls asleep +[1518-10-16 00:00] Guard #191 begins shift +[1518-02-25 00:53] wakes up +[1518-02-25 00:42] falls asleep +[1518-05-12 00:56] wakes up +[1518-04-15 00:25] falls asleep +[1518-08-19 00:51] wakes up +[1518-11-18 23:57] Guard #2879 begins shift +[1518-07-22 23:56] Guard #2713 begins shift +[1518-04-11 23:56] Guard #191 begins shift +[1518-05-23 00:37] wakes up +[1518-09-30 00:08] wakes up +[1518-04-14 00:53] wakes up +[1518-04-28 00:53] wakes up +[1518-08-20 00:26] wakes up +[1518-08-02 00:55] wakes up +[1518-05-12 23:58] Guard #1493 begins shift +[1518-05-13 00:44] falls asleep +[1518-09-07 00:35] falls asleep +[1518-05-31 00:23] falls asleep +[1518-07-02 00:44] wakes up +[1518-03-31 00:55] wakes up +[1518-10-30 00:01] falls asleep +[1518-03-19 00:10] falls asleep +[1518-07-04 00:21] falls asleep +[1518-05-31 00:04] Guard #1213 begins shift +[1518-10-27 00:46] wakes up +[1518-08-20 23:56] Guard #2141 begins shift +[1518-11-15 00:55] falls asleep +[1518-06-08 00:58] wakes up +[1518-09-14 00:53] wakes up +[1518-06-07 00:41] falls asleep +[1518-07-26 00:40] wakes up +[1518-10-01 00:00] Guard #2749 begins shift +[1518-08-07 00:22] falls asleep +[1518-05-03 00:53] falls asleep +[1518-05-16 00:54] wakes up +[1518-08-05 23:59] Guard #2917 begins shift +[1518-03-26 00:00] Guard #2749 begins shift +[1518-04-14 00:41] wakes up +[1518-05-14 00:50] wakes up +[1518-08-26 00:13] falls asleep +[1518-04-19 00:36] falls asleep +[1518-09-24 23:57] Guard #191 begins shift +[1518-02-27 00:11] falls asleep +[1518-10-20 00:21] falls asleep +[1518-04-04 00:14] falls asleep +[1518-03-01 00:51] wakes up +[1518-07-18 00:54] wakes up +[1518-09-30 00:12] falls asleep +[1518-05-21 00:58] wakes up +[1518-06-01 00:11] wakes up +[1518-04-01 00:56] wakes up +[1518-08-20 00:04] falls asleep +[1518-10-08 00:58] wakes up +[1518-11-13 00:55] falls asleep +[1518-03-08 00:55] wakes up +[1518-08-21 00:45] wakes up +[1518-10-18 00:03] Guard #2879 begins shift +[1518-04-25 00:01] Guard #1493 begins shift +[1518-11-02 00:16] falls asleep +[1518-05-31 23:54] Guard #2879 begins shift +[1518-06-01 00:05] falls asleep +[1518-03-08 00:29] falls asleep +[1518-05-23 00:31] falls asleep +[1518-09-09 00:57] wakes up +[1518-05-01 00:51] wakes up +[1518-11-08 00:54] wakes up +[1518-07-15 00:01] Guard #1213 begins shift +[1518-06-09 00:54] falls asleep +[1518-03-13 00:50] wakes up +[1518-08-04 00:48] falls asleep +[1518-06-04 00:44] wakes up +[1518-05-27 00:19] wakes up +[1518-08-11 23:59] Guard #991 begins shift +[1518-04-06 00:47] falls asleep +[1518-06-13 00:02] Guard #1187 begins shift +[1518-06-16 00:48] wakes up +[1518-08-10 00:55] wakes up +[1518-04-18 00:35] falls asleep +[1518-08-28 00:18] falls asleep +[1518-06-12 00:53] wakes up +[1518-04-06 00:42] wakes up +[1518-07-10 23:58] Guard #1721 begins shift +[1518-09-03 00:01] Guard #2917 begins shift +[1518-04-29 00:03] falls asleep +[1518-07-09 00:00] Guard #191 begins shift +[1518-04-26 00:54] wakes up +[1518-08-13 00:23] falls asleep +[1518-06-01 23:56] Guard #1277 begins shift +[1518-10-12 00:01] Guard #1187 begins shift +[1518-07-17 00:38] falls asleep +[1518-04-01 00:01] Guard #1049 begins shift +[1518-03-31 00:34] wakes up +[1518-04-22 00:02] Guard #2917 begins shift +[1518-09-23 00:47] wakes up +[1518-06-22 23:59] Guard #2777 begins shift +[1518-02-20 00:01] Guard #2777 begins shift +[1518-06-06 00:02] Guard #769 begins shift +[1518-09-28 00:03] Guard #2777 begins shift +[1518-03-29 00:02] Guard #1277 begins shift +[1518-10-23 00:09] falls asleep +[1518-07-14 00:45] wakes up +[1518-04-27 00:53] wakes up +[1518-09-17 00:11] falls asleep +[1518-11-18 00:24] falls asleep +[1518-08-10 23:58] Guard #1213 begins shift +[1518-02-26 23:57] Guard #769 begins shift +[1518-10-06 00:00] Guard #2749 begins shift +[1518-02-26 00:41] wakes up +[1518-07-01 00:25] wakes up +[1518-08-22 00:45] wakes up +[1518-04-29 00:04] wakes up +[1518-03-04 00:46] falls asleep +[1518-05-09 00:37] wakes up +[1518-05-22 00:02] Guard #1907 begins shift +[1518-04-12 00:22] falls asleep +[1518-07-11 00:28] falls asleep +[1518-09-11 23:48] Guard #1721 begins shift +[1518-07-17 00:39] wakes up +[1518-08-27 00:24] falls asleep +[1518-10-15 00:39] wakes up +[1518-09-22 00:41] wakes up +[1518-08-28 00:34] wakes up +[1518-04-05 00:14] falls asleep +[1518-02-23 00:31] falls asleep +[1518-03-23 00:53] wakes up +[1518-09-09 00:05] falls asleep +[1518-09-13 00:36] wakes up +[1518-10-13 00:33] falls asleep +[1518-10-29 00:27] falls asleep +[1518-07-22 00:52] wakes up +[1518-03-16 23:49] Guard #97 begins shift +[1518-10-05 00:04] Guard #2917 begins shift +[1518-10-16 00:59] wakes up +[1518-11-08 00:22] wakes up +[1518-07-31 00:10] falls asleep +[1518-10-07 00:59] wakes up +[1518-09-23 00:06] wakes up +[1518-05-27 00:58] wakes up +[1518-04-15 00:00] Guard #1049 begins shift +[1518-02-23 00:53] wakes up +[1518-10-07 00:50] wakes up +[1518-08-24 00:41] wakes up +[1518-09-01 00:58] wakes up +[1518-09-08 00:49] falls asleep +[1518-08-25 00:06] wakes up +[1518-08-09 00:40] wakes up +[1518-09-10 00:34] falls asleep +[1518-04-15 00:30] wakes up +[1518-07-27 00:03] Guard #1907 begins shift +[1518-02-20 00:53] wakes up +[1518-06-04 00:56] wakes up +[1518-06-27 23:56] Guard #191 begins shift +[1518-03-24 23:47] Guard #991 begins shift +[1518-04-23 00:26] falls asleep +[1518-06-25 23:50] Guard #1049 begins shift +[1518-08-15 00:35] falls asleep +[1518-06-23 00:27] falls asleep +[1518-11-19 00:57] wakes up +[1518-06-14 00:56] wakes up +[1518-03-28 00:57] falls asleep +[1518-07-11 00:45] wakes up +[1518-11-16 23:50] Guard #1493 begins shift +[1518-05-27 00:17] falls asleep +[1518-02-27 00:13] wakes up +[1518-07-19 00:15] falls asleep +[1518-09-30 00:01] Guard #1049 begins shift +[1518-03-25 00:50] wakes up +[1518-03-26 23:59] Guard #2141 begins shift +[1518-05-09 23:58] Guard #1049 begins shift +[1518-10-19 23:56] Guard #1213 begins shift +[1518-10-26 00:59] wakes up +[1518-07-20 00:19] wakes up +[1518-05-09 00:48] falls asleep +[1518-03-28 00:50] falls asleep +[1518-09-26 00:56] wakes up +[1518-07-29 00:12] falls asleep +[1518-04-06 23:59] Guard #2749 begins shift +[1518-10-29 00:00] Guard #1187 begins shift +[1518-06-11 00:25] falls asleep +[1518-07-18 00:29] falls asleep +[1518-09-24 00:51] falls asleep +[1518-08-25 00:57] wakes up +[1518-05-26 00:06] falls asleep +[1518-07-17 00:01] Guard #1907 begins shift +[1518-06-26 23:59] Guard #1277 begins shift +[1518-05-19 00:46] wakes up +[1518-09-26 23:56] Guard #1187 begins shift +[1518-04-03 00:29] wakes up +[1518-04-23 00:00] Guard #1277 begins shift +[1518-07-06 00:25] falls asleep +[1518-11-15 00:52] wakes up +[1518-06-28 00:07] falls asleep +[1518-10-19 00:14] falls asleep +[1518-10-30 00:33] wakes up +[1518-09-21 00:51] wakes up +[1518-09-16 00:49] falls asleep +[1518-04-19 00:49] wakes up +[1518-09-12 00:23] falls asleep +[1518-07-19 00:33] wakes up +[1518-03-26 00:48] wakes up +[1518-04-16 00:02] Guard #2777 begins shift +[1518-10-31 00:52] wakes up +[1518-07-20 00:42] falls asleep +[1518-07-04 23:58] Guard #1213 begins shift +[1518-08-16 00:00] falls asleep +[1518-08-29 23:56] Guard #1213 begins shift +[1518-07-09 23:49] Guard #991 begins shift +[1518-11-05 00:00] Guard #2711 begins shift +[1518-11-03 00:43] wakes up +[1518-11-05 00:48] wakes up +[1518-09-16 00:00] Guard #97 begins shift +[1518-11-18 00:50] falls asleep +[1518-08-27 00:59] wakes up +[1518-11-17 00:01] falls asleep +[1518-05-16 00:08] falls asleep +[1518-06-27 00:20] falls asleep +[1518-08-09 00:59] wakes up +[1518-04-16 00:23] wakes up +[1518-06-20 00:45] wakes up +[1518-08-15 00:56] wakes up +[1518-09-01 23:59] Guard #1721 begins shift +[1518-04-14 00:35] falls asleep +[1518-02-21 00:09] falls asleep +[1518-11-09 00:41] wakes up +[1518-05-08 00:55] wakes up +[1518-05-22 00:31] falls asleep +[1518-10-23 00:52] falls asleep +[1518-09-24 00:02] falls asleep +[1518-08-21 00:57] wakes up +[1518-11-23 00:49] wakes up +[1518-06-01 00:55] wakes up +[1518-03-26 00:51] falls asleep +[1518-03-08 00:00] Guard #2749 begins shift +[1518-09-07 00:01] Guard #1493 begins shift +[1518-05-19 00:02] Guard #2749 begins shift +[1518-10-02 00:14] wakes up +[1518-03-02 00:11] falls asleep +[1518-09-12 00:56] falls asleep +[1518-07-23 00:23] falls asleep +[1518-06-07 00:51] wakes up +[1518-06-18 00:21] falls asleep +[1518-09-28 00:48] falls asleep +[1518-06-30 00:01] falls asleep +[1518-03-20 00:31] falls asleep +[1518-09-05 00:51] wakes up +[1518-05-29 00:00] Guard #2713 begins shift +[1518-10-21 00:40] falls asleep +[1518-08-10 00:33] falls asleep +[1518-07-05 00:53] falls asleep +[1518-10-03 00:09] falls asleep +[1518-03-20 00:00] Guard #2777 begins shift +[1518-04-18 00:21] wakes up +[1518-07-29 23:56] Guard #2141 begins shift +[1518-05-20 00:33] falls asleep +[1518-08-20 00:42] wakes up +[1518-05-21 00:52] wakes up +[1518-03-10 23:58] Guard #2777 begins shift +[1518-04-26 00:50] falls asleep +[1518-04-04 00:47] falls asleep +[1518-07-07 00:12] falls asleep +[1518-10-07 00:55] falls asleep +[1518-09-20 00:39] wakes up diff --git a/2018/d04/ex2/ex2.py b/2018/d04/ex2/ex2.py new file mode 100755 index 0000000..7a95a4b --- /dev/null +++ b/2018/d04/ex2/ex2.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import sys +from collections import Counter, defaultdict +from typing import NamedTuple + + +class DateTime(NamedTuple): + year: int + month: int + day: int + hour: int + min: int + + +class Log(NamedTuple): + datetime: DateTime + event: str + + +def solve(input: str) -> int: + def parse_datetime(input: str) -> DateTime: + date, time = input.split() + year, month, day = map(int, date.split("-")) + hour, min = map(int, time.split(":")) + return DateTime(year, month, day, hour, min) + + def parse_log(input: str) -> Log: + date, event = input.split("] ") + return Log(parse_datetime(date.removeprefix("[")), event) + + def parse(input: list[str]) -> list[Log]: + return [parse_log(line) for line in input] + + def parse_guard_number(log: Log) -> int: + assert log.event.startswith("Guard #") # Sanity check + assert log.event.endswith(" begins shift") # Sanity check + return int(log.event.split()[1].removeprefix("#")) + + def guards_events(logs: list[Log]) -> dict[int, list[Log]]: + res: dict[int, list[Log]] = defaultdict(list) + current_guard = parse_guard_number(logs[0]) + for log in logs[1:]: + if log.event == "falls asleep" or log.event == "wakes up": + res[current_guard].append(log) + else: + current_guard = parse_guard_number(log) + return res + + def sleep_counts(logs: list[Log]) -> Counter[int]: + res: Counter[int] = Counter() + assert len(logs) % 2 == 0 # Sanity check + for i in range(0, len(logs), 2): + assert logs[i].event == "falls asleep" # Sanity check + assert logs[i + 1].event == "wakes up" # Sanity check + start, end = logs[i].datetime, logs[i + 1].datetime + res.update(range(start.min, end.min)) + return res + + def guard_sleep_counts( + guard_logs: dict[int, list[Log]], + ) -> dict[int, Counter[int]]: + return {guard: sleep_counts(logs) for guard, logs in guard_logs.items()} + + logs = sorted(parse(input.splitlines())) + guard_logs = guards_events(logs) + guard_sleeps = guard_sleep_counts(guard_logs) + most_asleep = max( + guard_sleeps, key=lambda guard: guard_sleeps[guard].most_common()[0][1] + ) + return most_asleep * guard_sleeps[most_asleep].most_common()[0][0] + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d04/ex2/input b/2018/d04/ex2/input new file mode 100644 index 0000000..c30d741 --- /dev/null +++ b/2018/d04/ex2/input @@ -0,0 +1,1098 @@ +[1518-05-24 23:56] Guard #1721 begins shift +[1518-08-22 00:09] falls asleep +[1518-05-19 00:53] wakes up +[1518-04-19 23:48] Guard #773 begins shift +[1518-09-24 00:35] wakes up +[1518-07-15 00:56] wakes up +[1518-08-10 00:03] Guard #769 begins shift +[1518-07-10 00:50] wakes up +[1518-07-12 00:54] falls asleep +[1518-05-30 00:51] wakes up +[1518-09-15 00:56] wakes up +[1518-09-14 00:15] falls asleep +[1518-03-30 00:57] falls asleep +[1518-10-19 00:55] wakes up +[1518-09-18 00:58] wakes up +[1518-11-18 00:38] wakes up +[1518-11-07 00:23] falls asleep +[1518-10-18 00:56] wakes up +[1518-03-05 00:41] falls asleep +[1518-05-19 00:36] falls asleep +[1518-09-04 00:49] wakes up +[1518-06-08 00:56] falls asleep +[1518-06-11 23:56] Guard #2749 begins shift +[1518-09-27 00:54] wakes up +[1518-10-03 00:49] wakes up +[1518-09-16 00:45] wakes up +[1518-10-06 00:46] wakes up +[1518-07-20 00:07] falls asleep +[1518-05-09 00:55] wakes up +[1518-05-11 00:05] falls asleep +[1518-10-14 00:45] falls asleep +[1518-08-21 00:19] wakes up +[1518-11-01 00:43] wakes up +[1518-08-31 00:57] wakes up +[1518-03-28 00:58] wakes up +[1518-04-06 00:12] wakes up +[1518-02-28 00:03] Guard #191 begins shift +[1518-09-29 00:01] falls asleep +[1518-05-15 00:47] falls asleep +[1518-03-04 00:01] Guard #2879 begins shift +[1518-04-28 00:29] wakes up +[1518-05-10 00:40] falls asleep +[1518-03-12 00:03] Guard #191 begins shift +[1518-09-19 00:41] falls asleep +[1518-07-28 00:00] Guard #1381 begins shift +[1518-04-11 00:01] Guard #1907 begins shift +[1518-04-02 00:58] wakes up +[1518-03-04 00:51] wakes up +[1518-05-02 00:22] falls asleep +[1518-07-01 00:02] falls asleep +[1518-07-21 00:24] falls asleep +[1518-05-31 00:31] wakes up +[1518-08-02 00:00] Guard #2713 begins shift +[1518-08-25 00:48] falls asleep +[1518-05-02 00:26] wakes up +[1518-07-08 00:00] Guard #2711 begins shift +[1518-09-16 00:38] falls asleep +[1518-07-22 00:43] wakes up +[1518-11-04 00:13] falls asleep +[1518-09-03 23:50] Guard #97 begins shift +[1518-03-20 00:35] wakes up +[1518-05-17 00:41] wakes up +[1518-08-22 00:32] falls asleep +[1518-05-07 23:58] Guard #773 begins shift +[1518-08-28 00:12] wakes up +[1518-09-06 00:46] falls asleep +[1518-05-20 00:59] wakes up +[1518-03-19 00:59] wakes up +[1518-08-22 00:29] wakes up +[1518-07-06 00:00] Guard #2777 begins shift +[1518-06-15 00:37] falls asleep +[1518-03-15 00:27] falls asleep +[1518-09-10 00:43] wakes up +[1518-09-30 00:49] falls asleep +[1518-09-14 23:58] Guard #1493 begins shift +[1518-06-20 00:33] falls asleep +[1518-05-04 00:53] falls asleep +[1518-09-04 00:45] falls asleep +[1518-07-17 00:56] wakes up +[1518-06-18 00:58] wakes up +[1518-04-07 00:42] falls asleep +[1518-05-23 23:58] Guard #2777 begins shift +[1518-10-03 23:57] Guard #1721 begins shift +[1518-03-04 23:57] Guard #773 begins shift +[1518-05-31 00:20] wakes up +[1518-08-04 00:04] Guard #1213 begins shift +[1518-05-11 00:56] wakes up +[1518-03-02 00:32] wakes up +[1518-10-17 00:50] wakes up +[1518-11-08 00:39] falls asleep +[1518-09-03 00:20] falls asleep +[1518-10-28 00:40] falls asleep +[1518-08-20 00:51] falls asleep +[1518-08-15 00:36] wakes up +[1518-06-08 00:51] wakes up +[1518-08-20 00:58] wakes up +[1518-03-30 00:00] Guard #2711 begins shift +[1518-10-31 00:00] falls asleep +[1518-06-24 23:59] Guard #97 begins shift +[1518-02-21 00:00] Guard #2749 begins shift +[1518-06-04 00:02] Guard #1907 begins shift +[1518-06-28 23:51] Guard #1493 begins shift +[1518-02-18 23:59] Guard #2141 begins shift +[1518-04-17 00:17] wakes up +[1518-06-15 00:57] wakes up +[1518-04-02 00:27] falls asleep +[1518-06-08 00:10] falls asleep +[1518-10-05 00:41] wakes up +[1518-11-15 00:51] falls asleep +[1518-05-17 23:59] Guard #991 begins shift +[1518-11-22 00:53] wakes up +[1518-07-24 00:10] falls asleep +[1518-06-25 00:27] falls asleep +[1518-02-20 00:46] falls asleep +[1518-09-29 00:34] falls asleep +[1518-10-03 00:01] Guard #769 begins shift +[1518-06-22 00:05] falls asleep +[1518-02-26 00:49] falls asleep +[1518-03-13 00:24] falls asleep +[1518-05-03 00:38] wakes up +[1518-07-08 00:22] falls asleep +[1518-03-14 00:08] falls asleep +[1518-07-20 00:49] wakes up +[1518-03-13 00:58] wakes up +[1518-09-30 00:51] wakes up +[1518-10-10 00:39] falls asleep +[1518-09-05 00:02] Guard #1049 begins shift +[1518-10-26 00:49] falls asleep +[1518-07-22 00:33] falls asleep +[1518-09-27 00:13] falls asleep +[1518-11-09 00:48] falls asleep +[1518-11-16 00:11] falls asleep +[1518-05-04 00:50] wakes up +[1518-06-14 00:02] Guard #2879 begins shift +[1518-03-06 00:44] wakes up +[1518-07-23 00:47] wakes up +[1518-04-16 00:59] wakes up +[1518-09-23 00:05] falls asleep +[1518-09-12 00:27] wakes up +[1518-02-21 00:49] wakes up +[1518-07-05 00:58] wakes up +[1518-07-22 00:28] wakes up +[1518-07-14 00:03] Guard #2917 begins shift +[1518-05-14 00:02] Guard #1277 begins shift +[1518-04-06 00:53] wakes up +[1518-05-04 00:59] wakes up +[1518-09-07 00:50] wakes up +[1518-04-03 00:26] falls asleep +[1518-10-09 00:43] falls asleep +[1518-07-10 00:41] falls asleep +[1518-04-10 00:49] falls asleep +[1518-03-14 00:47] wakes up +[1518-05-03 00:54] wakes up +[1518-04-15 00:39] wakes up +[1518-07-31 00:40] wakes up +[1518-08-01 00:02] falls asleep +[1518-10-06 23:57] Guard #191 begins shift +[1518-11-04 00:23] wakes up +[1518-08-15 00:49] falls asleep +[1518-02-28 00:29] falls asleep +[1518-03-30 23:59] Guard #1907 begins shift +[1518-08-01 00:40] falls asleep +[1518-10-13 00:52] wakes up +[1518-10-14 00:01] Guard #2917 begins shift +[1518-08-26 00:00] Guard #2917 begins shift +[1518-07-24 00:02] Guard #2749 begins shift +[1518-04-21 00:25] falls asleep +[1518-03-05 00:43] wakes up +[1518-08-31 23:58] Guard #1721 begins shift +[1518-08-11 00:28] falls asleep +[1518-08-26 00:41] wakes up +[1518-05-18 00:20] falls asleep +[1518-08-09 00:03] Guard #683 begins shift +[1518-08-24 00:16] wakes up +[1518-03-26 00:27] wakes up +[1518-06-19 00:35] wakes up +[1518-09-24 00:56] wakes up +[1518-11-01 00:34] falls asleep +[1518-10-11 00:13] falls asleep +[1518-10-27 00:18] falls asleep +[1518-09-03 00:53] wakes up +[1518-04-10 00:33] wakes up +[1518-07-30 00:57] wakes up +[1518-06-10 00:12] falls asleep +[1518-03-31 00:31] falls asleep +[1518-11-21 23:57] Guard #2141 begins shift +[1518-03-21 00:31] falls asleep +[1518-03-26 00:37] falls asleep +[1518-08-24 00:12] falls asleep +[1518-08-07 00:49] wakes up +[1518-11-18 00:02] Guard #1049 begins shift +[1518-04-28 23:53] Guard #773 begins shift +[1518-05-17 00:00] Guard #773 begins shift +[1518-05-21 00:56] falls asleep +[1518-10-23 23:46] Guard #773 begins shift +[1518-08-24 00:03] Guard #1213 begins shift +[1518-04-10 00:14] falls asleep +[1518-10-27 00:28] falls asleep +[1518-06-04 00:55] falls asleep +[1518-04-02 00:29] wakes up +[1518-07-25 00:39] wakes up +[1518-09-21 23:59] Guard #97 begins shift +[1518-06-29 00:01] falls asleep +[1518-04-08 00:02] Guard #769 begins shift +[1518-11-20 00:38] falls asleep +[1518-03-25 00:42] falls asleep +[1518-08-03 00:55] wakes up +[1518-09-20 00:25] falls asleep +[1518-08-27 00:54] falls asleep +[1518-10-28 00:04] Guard #1187 begins shift +[1518-05-14 00:13] falls asleep +[1518-06-01 00:33] falls asleep +[1518-03-26 00:09] falls asleep +[1518-03-09 00:04] Guard #769 begins shift +[1518-10-16 00:40] wakes up +[1518-10-22 00:20] falls asleep +[1518-03-05 00:08] falls asleep +[1518-03-07 00:53] wakes up +[1518-05-14 00:27] falls asleep +[1518-08-13 23:59] Guard #97 begins shift +[1518-10-23 00:39] wakes up +[1518-10-22 00:02] Guard #2917 begins shift +[1518-09-26 00:53] falls asleep +[1518-10-29 00:55] wakes up +[1518-05-21 00:51] falls asleep +[1518-07-10 00:15] wakes up +[1518-08-04 23:57] Guard #1049 begins shift +[1518-04-21 00:52] wakes up +[1518-02-26 00:39] falls asleep +[1518-08-02 23:59] Guard #683 begins shift +[1518-04-10 00:53] wakes up +[1518-10-21 00:52] wakes up +[1518-08-25 00:55] falls asleep +[1518-06-29 00:57] wakes up +[1518-11-13 00:52] wakes up +[1518-05-27 00:37] falls asleep +[1518-10-24 00:02] wakes up +[1518-08-25 00:50] wakes up +[1518-05-13 00:57] falls asleep +[1518-03-25 00:00] falls asleep +[1518-10-07 23:57] Guard #2917 begins shift +[1518-05-25 00:40] wakes up +[1518-10-08 23:56] Guard #2749 begins shift +[1518-11-14 00:59] wakes up +[1518-05-17 00:53] falls asleep +[1518-05-21 00:00] Guard #1277 begins shift +[1518-04-29 00:56] wakes up +[1518-06-17 00:06] falls asleep +[1518-03-28 00:21] wakes up +[1518-03-28 00:52] wakes up +[1518-06-17 00:52] wakes up +[1518-08-21 00:40] falls asleep +[1518-08-29 00:41] falls asleep +[1518-10-29 23:52] Guard #191 begins shift +[1518-06-03 00:00] Guard #1381 begins shift +[1518-09-28 23:54] Guard #2917 begins shift +[1518-06-20 00:55] wakes up +[1518-05-17 00:58] wakes up +[1518-05-16 00:39] falls asleep +[1518-07-01 00:35] falls asleep +[1518-04-18 00:00] Guard #1049 begins shift +[1518-09-02 00:10] falls asleep +[1518-08-12 00:51] falls asleep +[1518-04-06 00:02] falls asleep +[1518-10-17 00:00] Guard #2879 begins shift +[1518-09-01 00:25] falls asleep +[1518-07-29 00:19] wakes up +[1518-02-26 00:54] wakes up +[1518-07-19 00:56] wakes up +[1518-06-02 00:56] wakes up +[1518-03-06 00:56] wakes up +[1518-04-25 00:35] falls asleep +[1518-05-09 00:00] Guard #1277 begins shift +[1518-10-04 00:57] wakes up +[1518-07-22 00:16] falls asleep +[1518-07-03 00:35] wakes up +[1518-07-22 00:46] falls asleep +[1518-08-02 00:07] falls asleep +[1518-07-17 00:44] falls asleep +[1518-06-07 00:36] wakes up +[1518-08-04 00:25] falls asleep +[1518-05-20 00:26] wakes up +[1518-07-30 23:58] Guard #1493 begins shift +[1518-03-25 00:36] wakes up +[1518-05-02 00:54] wakes up +[1518-03-09 00:19] falls asleep +[1518-03-09 00:51] wakes up +[1518-08-26 23:56] Guard #2141 begins shift +[1518-11-08 00:07] falls asleep +[1518-08-17 23:57] Guard #2917 begins shift +[1518-04-17 00:32] falls asleep +[1518-11-16 00:00] Guard #2879 begins shift +[1518-06-11 00:52] wakes up +[1518-11-10 00:55] wakes up +[1518-03-07 00:37] falls asleep +[1518-07-04 00:00] Guard #769 begins shift +[1518-03-28 00:00] Guard #2713 begins shift +[1518-04-18 00:10] falls asleep +[1518-09-24 00:48] wakes up +[1518-06-29 00:15] falls asleep +[1518-05-10 00:33] falls asleep +[1518-10-10 00:56] wakes up +[1518-03-23 00:48] falls asleep +[1518-06-05 00:55] wakes up +[1518-05-18 00:47] wakes up +[1518-10-12 23:58] Guard #2711 begins shift +[1518-07-30 00:40] falls asleep +[1518-06-24 00:02] Guard #2141 begins shift +[1518-03-03 00:48] wakes up +[1518-10-01 00:41] wakes up +[1518-06-10 00:03] Guard #1049 begins shift +[1518-02-23 00:48] wakes up +[1518-11-10 00:22] falls asleep +[1518-09-04 00:22] wakes up +[1518-05-03 00:22] falls asleep +[1518-08-05 00:32] falls asleep +[1518-04-20 00:31] wakes up +[1518-04-16 00:12] falls asleep +[1518-04-30 23:57] Guard #2711 begins shift +[1518-05-30 00:38] falls asleep +[1518-10-24 00:01] falls asleep +[1518-10-03 00:19] wakes up +[1518-05-03 23:57] Guard #2879 begins shift +[1518-11-06 00:46] falls asleep +[1518-02-27 00:37] falls asleep +[1518-11-09 23:56] Guard #2141 begins shift +[1518-08-31 00:00] Guard #1907 begins shift +[1518-03-22 00:06] falls asleep +[1518-03-30 00:59] wakes up +[1518-09-10 23:58] Guard #1493 begins shift +[1518-11-23 00:16] falls asleep +[1518-10-29 00:51] falls asleep +[1518-08-08 00:52] wakes up +[1518-04-25 00:07] falls asleep +[1518-06-29 23:46] Guard #769 begins shift +[1518-03-13 00:55] falls asleep +[1518-05-27 23:57] Guard #2113 begins shift +[1518-02-24 00:02] Guard #2879 begins shift +[1518-11-01 00:02] Guard #683 begins shift +[1518-11-06 00:55] wakes up +[1518-10-20 23:56] Guard #191 begins shift +[1518-06-14 23:58] Guard #1907 begins shift +[1518-05-23 00:04] Guard #1277 begins shift +[1518-08-01 00:11] wakes up +[1518-04-17 00:16] falls asleep +[1518-10-26 00:03] falls asleep +[1518-08-19 00:37] falls asleep +[1518-06-26 00:02] falls asleep +[1518-11-05 23:56] Guard #2879 begins shift +[1518-07-18 00:00] Guard #1049 begins shift +[1518-11-04 00:02] Guard #683 begins shift +[1518-05-01 23:59] Guard #2141 begins shift +[1518-09-23 23:47] Guard #1907 begins shift +[1518-10-06 00:45] falls asleep +[1518-02-28 23:56] Guard #2879 begins shift +[1518-06-15 23:57] Guard #769 begins shift +[1518-11-12 00:41] wakes up +[1518-05-11 23:47] Guard #1049 begins shift +[1518-11-02 00:00] Guard #683 begins shift +[1518-09-19 23:48] Guard #991 begins shift +[1518-05-24 00:45] falls asleep +[1518-11-13 00:47] falls asleep +[1518-09-20 00:05] wakes up +[1518-04-09 00:23] falls asleep +[1518-05-17 00:23] falls asleep +[1518-10-02 00:54] wakes up +[1518-09-19 00:01] Guard #769 begins shift +[1518-04-27 00:35] wakes up +[1518-11-12 00:00] Guard #2917 begins shift +[1518-04-04 00:57] wakes up +[1518-09-04 00:03] falls asleep +[1518-06-19 00:30] falls asleep +[1518-07-21 00:56] wakes up +[1518-07-16 00:17] falls asleep +[1518-10-14 00:55] wakes up +[1518-11-07 00:56] wakes up +[1518-09-17 00:00] Guard #2749 begins shift +[1518-09-16 00:27] wakes up +[1518-03-16 00:02] Guard #1907 begins shift +[1518-08-15 00:06] falls asleep +[1518-03-24 00:38] wakes up +[1518-09-18 00:00] Guard #2777 begins shift +[1518-11-20 23:56] Guard #2113 begins shift +[1518-11-23 00:02] Guard #769 begins shift +[1518-06-21 00:01] Guard #2711 begins shift +[1518-10-20 00:44] wakes up +[1518-08-15 00:32] wakes up +[1518-10-19 00:03] Guard #2711 begins shift +[1518-08-28 00:10] falls asleep +[1518-05-05 00:01] Guard #191 begins shift +[1518-11-06 00:22] wakes up +[1518-07-13 00:20] falls asleep +[1518-07-03 00:54] wakes up +[1518-03-13 23:59] Guard #1907 begins shift +[1518-04-07 00:35] wakes up +[1518-10-23 00:59] wakes up +[1518-09-15 00:16] falls asleep +[1518-09-23 00:16] falls asleep +[1518-10-23 00:00] Guard #1907 begins shift +[1518-09-28 00:13] falls asleep +[1518-08-09 00:06] falls asleep +[1518-09-19 00:54] wakes up +[1518-02-24 00:32] wakes up +[1518-09-05 00:14] falls asleep +[1518-10-26 23:59] Guard #2749 begins shift +[1518-04-05 23:53] Guard #1907 begins shift +[1518-08-09 00:46] falls asleep +[1518-04-24 00:02] Guard #1049 begins shift +[1518-03-14 00:55] wakes up +[1518-03-06 23:59] Guard #1213 begins shift +[1518-08-23 00:50] wakes up +[1518-10-12 00:41] wakes up +[1518-04-20 23:56] Guard #2777 begins shift +[1518-09-25 00:33] wakes up +[1518-10-01 00:44] falls asleep +[1518-10-02 00:53] falls asleep +[1518-04-28 00:02] Guard #769 begins shift +[1518-07-10 00:01] falls asleep +[1518-10-12 00:24] falls asleep +[1518-10-25 00:13] falls asleep +[1518-08-19 00:26] falls asleep +[1518-09-30 00:07] falls asleep +[1518-03-01 00:35] wakes up +[1518-08-16 23:57] Guard #2141 begins shift +[1518-08-18 00:14] wakes up +[1518-09-25 23:57] Guard #191 begins shift +[1518-11-14 00:42] falls asleep +[1518-07-28 23:57] Guard #1213 begins shift +[1518-10-24 00:57] wakes up +[1518-10-07 00:41] falls asleep +[1518-06-25 00:46] wakes up +[1518-06-22 00:41] wakes up +[1518-10-25 00:28] wakes up +[1518-04-05 00:30] wakes up +[1518-06-02 00:36] falls asleep +[1518-05-15 00:04] Guard #1187 begins shift +[1518-03-11 00:52] wakes up +[1518-04-27 00:03] Guard #1493 begins shift +[1518-02-24 00:22] falls asleep +[1518-06-29 00:07] wakes up +[1518-03-29 00:30] falls asleep +[1518-06-21 23:50] Guard #1049 begins shift +[1518-07-14 00:55] falls asleep +[1518-03-10 00:03] falls asleep +[1518-08-01 00:58] wakes up +[1518-06-06 00:59] wakes up +[1518-07-31 00:49] falls asleep +[1518-02-26 00:31] wakes up +[1518-08-16 00:54] wakes up +[1518-09-30 00:43] wakes up +[1518-04-09 00:59] wakes up +[1518-03-10 00:11] wakes up +[1518-11-05 00:45] falls asleep +[1518-07-02 00:03] Guard #769 begins shift +[1518-03-17 00:26] wakes up +[1518-08-13 00:02] Guard #2777 begins shift +[1518-10-25 00:03] Guard #769 begins shift +[1518-10-27 00:49] falls asleep +[1518-09-02 00:59] wakes up +[1518-07-25 00:18] falls asleep +[1518-11-12 00:21] falls asleep +[1518-06-07 00:43] wakes up +[1518-03-06 00:24] falls asleep +[1518-05-10 00:58] wakes up +[1518-08-06 23:59] Guard #1049 begins shift +[1518-09-16 00:59] wakes up +[1518-02-28 00:55] wakes up +[1518-06-23 00:34] wakes up +[1518-09-28 00:57] wakes up +[1518-05-16 00:34] wakes up +[1518-06-19 00:07] falls asleep +[1518-10-10 00:30] wakes up +[1518-10-20 00:33] falls asleep +[1518-05-12 00:00] falls asleep +[1518-04-25 00:37] wakes up +[1518-08-23 00:45] falls asleep +[1518-08-17 00:33] falls asleep +[1518-08-31 00:39] falls asleep +[1518-04-30 00:14] falls asleep +[1518-11-18 00:51] wakes up +[1518-03-16 00:07] falls asleep +[1518-09-20 00:01] falls asleep +[1518-11-09 00:39] falls asleep +[1518-05-26 00:00] Guard #769 begins shift +[1518-07-11 23:58] Guard #1213 begins shift +[1518-03-06 00:50] falls asleep +[1518-09-25 00:25] falls asleep +[1518-03-09 23:48] Guard #2141 begins shift +[1518-05-04 00:45] falls asleep +[1518-07-19 00:00] Guard #2713 begins shift +[1518-03-18 00:47] wakes up +[1518-07-08 00:42] wakes up +[1518-03-26 00:58] wakes up +[1518-08-04 00:56] wakes up +[1518-09-11 00:31] falls asleep +[1518-03-12 00:57] falls asleep +[1518-08-14 00:30] falls asleep +[1518-03-19 00:03] Guard #2879 begins shift +[1518-05-22 00:57] wakes up +[1518-05-23 00:59] wakes up +[1518-10-31 00:12] wakes up +[1518-07-03 00:47] falls asleep +[1518-09-22 23:47] Guard #991 begins shift +[1518-08-07 00:56] wakes up +[1518-11-10 23:58] Guard #1381 begins shift +[1518-08-17 00:54] wakes up +[1518-11-17 00:23] wakes up +[1518-03-01 00:16] falls asleep +[1518-06-06 23:50] Guard #1721 begins shift +[1518-06-19 00:19] wakes up +[1518-05-11 00:41] wakes up +[1518-09-12 00:58] wakes up +[1518-06-12 00:29] falls asleep +[1518-04-02 00:01] Guard #2879 begins shift +[1518-10-27 00:54] wakes up +[1518-05-14 00:14] wakes up +[1518-11-09 00:04] Guard #2917 begins shift +[1518-05-23 00:47] falls asleep +[1518-11-02 00:35] wakes up +[1518-06-30 00:51] wakes up +[1518-03-18 00:00] Guard #2749 begins shift +[1518-09-08 00:54] wakes up +[1518-05-01 00:43] falls asleep +[1518-04-11 00:54] wakes up +[1518-07-06 23:58] Guard #1213 begins shift +[1518-08-24 00:33] falls asleep +[1518-04-30 00:20] wakes up +[1518-04-28 00:14] falls asleep +[1518-02-25 23:50] Guard #2879 begins shift +[1518-09-24 00:46] falls asleep +[1518-08-12 00:55] wakes up +[1518-05-20 00:03] falls asleep +[1518-09-28 00:44] wakes up +[1518-10-11 00:35] wakes up +[1518-02-24 00:55] wakes up +[1518-05-02 23:58] Guard #2917 begins shift +[1518-09-06 00:02] Guard #191 begins shift +[1518-04-19 00:00] Guard #191 begins shift +[1518-08-21 00:11] falls asleep +[1518-07-31 23:49] Guard #683 begins shift +[1518-05-19 00:49] falls asleep +[1518-06-24 00:54] wakes up +[1518-06-29 00:53] falls asleep +[1518-11-15 00:03] Guard #2777 begins shift +[1518-08-06 00:39] falls asleep +[1518-10-16 00:21] falls asleep +[1518-04-18 00:58] wakes up +[1518-05-29 00:51] wakes up +[1518-05-06 00:36] wakes up +[1518-07-02 00:16] falls asleep +[1518-10-02 00:01] Guard #2879 begins shift +[1518-11-03 00:11] falls asleep +[1518-06-06 00:27] falls asleep +[1518-09-14 00:02] Guard #773 begins shift +[1518-04-22 00:48] wakes up +[1518-05-25 00:26] falls asleep +[1518-05-13 00:53] wakes up +[1518-07-03 00:25] falls asleep +[1518-06-27 00:57] wakes up +[1518-07-13 00:51] wakes up +[1518-11-09 00:52] wakes up +[1518-05-25 00:43] falls asleep +[1518-07-07 00:41] wakes up +[1518-05-19 23:51] Guard #2917 begins shift +[1518-10-01 00:39] falls asleep +[1518-04-15 00:37] falls asleep +[1518-08-03 00:07] falls asleep +[1518-07-14 00:57] wakes up +[1518-10-15 00:23] falls asleep +[1518-02-19 00:24] falls asleep +[1518-03-14 23:58] Guard #2879 begins shift +[1518-10-26 00:45] wakes up +[1518-07-29 00:25] wakes up +[1518-04-25 00:26] wakes up +[1518-10-20 00:25] wakes up +[1518-10-02 00:08] falls asleep +[1518-07-24 23:58] Guard #1493 begins shift +[1518-03-27 00:57] wakes up +[1518-02-23 00:52] falls asleep +[1518-08-11 00:59] wakes up +[1518-11-15 00:24] wakes up +[1518-06-18 23:57] Guard #191 begins shift +[1518-10-08 00:27] falls asleep +[1518-06-13 00:57] wakes up +[1518-04-02 00:46] falls asleep +[1518-10-24 00:52] falls asleep +[1518-05-22 00:38] wakes up +[1518-08-30 00:31] falls asleep +[1518-03-31 00:49] falls asleep +[1518-04-07 00:25] falls asleep +[1518-06-20 00:00] Guard #1721 begins shift +[1518-04-07 00:54] wakes up +[1518-10-29 00:44] wakes up +[1518-05-02 00:32] falls asleep +[1518-02-24 00:41] falls asleep +[1518-06-05 00:15] falls asleep +[1518-04-16 00:47] falls asleep +[1518-06-21 00:52] wakes up +[1518-08-29 00:59] wakes up +[1518-11-02 00:47] wakes up +[1518-11-07 00:01] Guard #1721 begins shift +[1518-10-03 00:47] falls asleep +[1518-06-04 23:58] Guard #1277 begins shift +[1518-05-09 00:13] falls asleep +[1518-07-20 00:55] falls asleep +[1518-10-30 23:53] Guard #2711 begins shift +[1518-03-22 00:00] Guard #1049 begins shift +[1518-04-08 00:14] falls asleep +[1518-03-05 00:21] wakes up +[1518-07-24 00:59] wakes up +[1518-09-12 00:18] wakes up +[1518-04-03 00:02] Guard #191 begins shift +[1518-08-14 00:58] wakes up +[1518-05-07 00:17] falls asleep +[1518-08-27 00:46] wakes up +[1518-03-17 00:04] falls asleep +[1518-10-03 00:55] wakes up +[1518-03-17 00:44] wakes up +[1518-05-10 00:34] wakes up +[1518-03-17 00:42] falls asleep +[1518-02-27 00:53] wakes up +[1518-03-14 00:53] falls asleep +[1518-02-19 00:58] wakes up +[1518-03-21 00:51] wakes up +[1518-11-04 00:59] wakes up +[1518-05-05 00:27] falls asleep +[1518-07-27 00:56] wakes up +[1518-07-26 00:17] falls asleep +[1518-05-05 00:57] wakes up +[1518-06-26 00:29] wakes up +[1518-04-08 00:50] wakes up +[1518-07-14 00:21] falls asleep +[1518-06-16 23:56] Guard #2711 begins shift +[1518-09-09 00:38] falls asleep +[1518-04-11 00:29] falls asleep +[1518-09-29 00:50] wakes up +[1518-08-30 00:41] wakes up +[1518-05-07 00:22] wakes up +[1518-07-22 00:02] Guard #1277 begins shift +[1518-03-24 00:01] Guard #1277 begins shift +[1518-07-12 00:48] wakes up +[1518-06-10 00:51] wakes up +[1518-11-05 00:52] wakes up +[1518-03-22 00:57] wakes up +[1518-08-19 00:32] wakes up +[1518-06-20 00:54] falls asleep +[1518-04-13 00:00] Guard #2113 begins shift +[1518-06-04 00:37] falls asleep +[1518-05-13 00:58] wakes up +[1518-11-05 00:51] falls asleep +[1518-06-16 00:57] wakes up +[1518-04-01 00:34] falls asleep +[1518-07-20 23:57] Guard #2713 begins shift +[1518-09-11 00:48] wakes up +[1518-09-25 00:51] falls asleep +[1518-07-29 00:24] falls asleep +[1518-06-29 00:25] wakes up +[1518-03-16 00:47] wakes up +[1518-08-06 00:59] wakes up +[1518-03-23 00:00] Guard #2879 begins shift +[1518-04-04 00:32] wakes up +[1518-10-17 00:12] falls asleep +[1518-05-06 00:11] falls asleep +[1518-11-22 00:42] falls asleep +[1518-10-18 00:28] falls asleep +[1518-02-22 00:48] falls asleep +[1518-11-15 00:11] falls asleep +[1518-04-05 00:03] Guard #1721 begins shift +[1518-05-27 00:04] Guard #2777 begins shift +[1518-06-08 00:04] Guard #1049 begins shift +[1518-08-18 00:45] wakes up +[1518-03-15 00:53] wakes up +[1518-04-26 00:03] Guard #2879 begins shift +[1518-03-29 00:54] wakes up +[1518-08-20 00:36] falls asleep +[1518-07-09 00:21] falls asleep +[1518-04-30 00:00] Guard #2711 begins shift +[1518-03-18 00:42] falls asleep +[1518-11-01 00:22] falls asleep +[1518-05-25 00:52] wakes up +[1518-03-13 00:01] Guard #769 begins shift +[1518-11-12 23:57] Guard #2879 begins shift +[1518-04-14 00:44] falls asleep +[1518-09-13 00:21] falls asleep +[1518-05-05 23:59] Guard #2917 begins shift +[1518-06-16 00:12] falls asleep +[1518-04-14 00:01] Guard #769 begins shift +[1518-07-15 23:57] Guard #2711 begins shift +[1518-08-05 00:53] wakes up +[1518-11-02 00:45] falls asleep +[1518-03-24 00:32] falls asleep +[1518-07-16 00:27] wakes up +[1518-07-09 00:53] wakes up +[1518-10-10 23:59] Guard #1277 begins shift +[1518-08-08 00:03] Guard #2879 begins shift +[1518-10-10 00:03] Guard #2917 begins shift +[1518-04-10 00:02] Guard #2711 begins shift +[1518-08-04 00:38] wakes up +[1518-05-30 00:00] Guard #2141 begins shift +[1518-06-07 00:48] falls asleep +[1518-10-05 00:21] falls asleep +[1518-02-20 00:20] wakes up +[1518-10-28 00:50] wakes up +[1518-08-19 00:03] Guard #2711 begins shift +[1518-09-18 00:26] falls asleep +[1518-05-24 00:53] wakes up +[1518-11-20 00:01] Guard #1213 begins shift +[1518-05-06 23:59] Guard #1049 begins shift +[1518-03-12 00:59] wakes up +[1518-03-01 23:58] Guard #683 begins shift +[1518-08-18 00:12] falls asleep +[1518-08-30 00:23] falls asleep +[1518-04-20 00:02] falls asleep +[1518-06-16 00:56] falls asleep +[1518-04-19 00:59] wakes up +[1518-03-30 00:52] falls asleep +[1518-10-04 00:41] falls asleep +[1518-08-13 00:57] wakes up +[1518-04-28 00:36] falls asleep +[1518-08-08 00:45] falls asleep +[1518-04-04 00:00] Guard #2711 begins shift +[1518-05-08 00:12] falls asleep +[1518-05-15 00:51] wakes up +[1518-04-29 00:40] falls asleep +[1518-09-12 00:01] falls asleep +[1518-03-05 23:57] Guard #2777 begins shift +[1518-10-09 00:47] wakes up +[1518-02-23 00:01] Guard #2749 begins shift +[1518-07-12 00:55] wakes up +[1518-11-20 00:44] wakes up +[1518-11-16 00:53] wakes up +[1518-06-26 00:37] falls asleep +[1518-07-31 00:58] wakes up +[1518-11-13 00:56] wakes up +[1518-11-14 00:33] wakes up +[1518-05-29 00:15] falls asleep +[1518-02-20 00:16] falls asleep +[1518-10-15 00:04] Guard #2917 begins shift +[1518-07-12 23:57] Guard #1277 begins shift +[1518-07-01 00:45] wakes up +[1518-06-14 00:31] falls asleep +[1518-04-23 00:43] wakes up +[1518-09-25 00:59] wakes up +[1518-07-26 00:00] Guard #1187 begins shift +[1518-06-26 00:58] wakes up +[1518-02-22 00:59] wakes up +[1518-02-21 23:58] Guard #2749 begins shift +[1518-08-30 00:28] wakes up +[1518-09-12 23:59] Guard #991 begins shift +[1518-11-01 00:26] wakes up +[1518-08-14 23:59] Guard #769 begins shift +[1518-08-24 23:50] Guard #1187 begins shift +[1518-07-15 00:38] falls asleep +[1518-11-04 00:27] falls asleep +[1518-09-21 00:19] falls asleep +[1518-11-07 23:56] Guard #1907 begins shift +[1518-06-09 00:55] wakes up +[1518-07-03 00:04] Guard #1277 begins shift +[1518-08-28 00:03] Guard #97 begins shift +[1518-07-12 00:23] falls asleep +[1518-02-24 23:57] Guard #2141 begins shift +[1518-06-18 00:01] Guard #2879 begins shift +[1518-03-01 00:48] falls asleep +[1518-09-21 00:04] Guard #2917 begins shift +[1518-06-13 00:39] falls asleep +[1518-09-22 00:14] falls asleep +[1518-06-21 00:27] falls asleep +[1518-07-19 23:59] Guard #2777 begins shift +[1518-04-09 00:02] Guard #2711 begins shift +[1518-09-16 00:16] falls asleep +[1518-10-03 00:53] falls asleep +[1518-10-27 00:23] wakes up +[1518-03-28 00:06] falls asleep +[1518-07-04 00:42] wakes up +[1518-09-08 00:00] Guard #2879 begins shift +[1518-11-15 00:56] wakes up +[1518-06-28 00:09] wakes up +[1518-09-06 00:50] wakes up +[1518-04-17 00:03] Guard #1721 begins shift +[1518-05-10 23:46] Guard #1213 begins shift +[1518-08-21 00:55] falls asleep +[1518-06-09 00:03] Guard #97 begins shift +[1518-11-14 00:11] falls asleep +[1518-06-07 00:05] falls asleep +[1518-06-11 00:01] Guard #1049 begins shift +[1518-04-22 00:18] falls asleep +[1518-03-27 00:25] falls asleep +[1518-09-08 23:47] Guard #2777 begins shift +[1518-05-31 00:13] falls asleep +[1518-07-27 00:52] falls asleep +[1518-03-20 23:56] Guard #1493 begins shift +[1518-10-22 00:54] wakes up +[1518-08-07 00:52] falls asleep +[1518-03-30 00:53] wakes up +[1518-10-25 23:54] Guard #2711 begins shift +[1518-08-19 23:50] Guard #683 begins shift +[1518-04-19 00:52] falls asleep +[1518-07-20 00:56] wakes up +[1518-04-27 00:40] falls asleep +[1518-11-14 00:02] Guard #1493 begins shift +[1518-07-19 00:51] falls asleep +[1518-04-27 00:13] falls asleep +[1518-08-18 00:35] falls asleep +[1518-05-26 00:37] wakes up +[1518-08-15 23:50] Guard #1277 begins shift +[1518-09-09 00:23] wakes up +[1518-07-06 00:38] wakes up +[1518-04-17 00:43] wakes up +[1518-03-03 00:00] Guard #1721 begins shift +[1518-09-17 00:48] wakes up +[1518-03-03 00:19] falls asleep +[1518-10-31 00:50] falls asleep +[1518-04-24 00:41] wakes up +[1518-02-26 00:04] falls asleep +[1518-05-15 23:56] Guard #2879 begins shift +[1518-08-25 00:05] falls asleep +[1518-08-23 00:01] Guard #1277 begins shift +[1518-04-12 00:38] wakes up +[1518-10-10 00:28] falls asleep +[1518-10-01 00:48] wakes up +[1518-11-19 00:42] falls asleep +[1518-09-10 00:00] Guard #769 begins shift +[1518-05-22 00:55] falls asleep +[1518-04-24 00:31] falls asleep +[1518-10-16 00:49] falls asleep +[1518-05-11 00:49] falls asleep +[1518-04-06 00:32] falls asleep +[1518-09-29 00:22] wakes up +[1518-06-24 00:42] falls asleep +[1518-06-30 23:53] Guard #2713 begins shift +[1518-08-22 00:01] Guard #1277 begins shift +[1518-11-06 00:16] falls asleep +[1518-11-02 23:56] Guard #2917 begins shift +[1518-08-29 00:03] Guard #1049 begins shift +[1518-03-11 00:10] falls asleep +[1518-10-16 00:00] Guard #191 begins shift +[1518-02-25 00:53] wakes up +[1518-02-25 00:42] falls asleep +[1518-05-12 00:56] wakes up +[1518-04-15 00:25] falls asleep +[1518-08-19 00:51] wakes up +[1518-11-18 23:57] Guard #2879 begins shift +[1518-07-22 23:56] Guard #2713 begins shift +[1518-04-11 23:56] Guard #191 begins shift +[1518-05-23 00:37] wakes up +[1518-09-30 00:08] wakes up +[1518-04-14 00:53] wakes up +[1518-04-28 00:53] wakes up +[1518-08-20 00:26] wakes up +[1518-08-02 00:55] wakes up +[1518-05-12 23:58] Guard #1493 begins shift +[1518-05-13 00:44] falls asleep +[1518-09-07 00:35] falls asleep +[1518-05-31 00:23] falls asleep +[1518-07-02 00:44] wakes up +[1518-03-31 00:55] wakes up +[1518-10-30 00:01] falls asleep +[1518-03-19 00:10] falls asleep +[1518-07-04 00:21] falls asleep +[1518-05-31 00:04] Guard #1213 begins shift +[1518-10-27 00:46] wakes up +[1518-08-20 23:56] Guard #2141 begins shift +[1518-11-15 00:55] falls asleep +[1518-06-08 00:58] wakes up +[1518-09-14 00:53] wakes up +[1518-06-07 00:41] falls asleep +[1518-07-26 00:40] wakes up +[1518-10-01 00:00] Guard #2749 begins shift +[1518-08-07 00:22] falls asleep +[1518-05-03 00:53] falls asleep +[1518-05-16 00:54] wakes up +[1518-08-05 23:59] Guard #2917 begins shift +[1518-03-26 00:00] Guard #2749 begins shift +[1518-04-14 00:41] wakes up +[1518-05-14 00:50] wakes up +[1518-08-26 00:13] falls asleep +[1518-04-19 00:36] falls asleep +[1518-09-24 23:57] Guard #191 begins shift +[1518-02-27 00:11] falls asleep +[1518-10-20 00:21] falls asleep +[1518-04-04 00:14] falls asleep +[1518-03-01 00:51] wakes up +[1518-07-18 00:54] wakes up +[1518-09-30 00:12] falls asleep +[1518-05-21 00:58] wakes up +[1518-06-01 00:11] wakes up +[1518-04-01 00:56] wakes up +[1518-08-20 00:04] falls asleep +[1518-10-08 00:58] wakes up +[1518-11-13 00:55] falls asleep +[1518-03-08 00:55] wakes up +[1518-08-21 00:45] wakes up +[1518-10-18 00:03] Guard #2879 begins shift +[1518-04-25 00:01] Guard #1493 begins shift +[1518-11-02 00:16] falls asleep +[1518-05-31 23:54] Guard #2879 begins shift +[1518-06-01 00:05] falls asleep +[1518-03-08 00:29] falls asleep +[1518-05-23 00:31] falls asleep +[1518-09-09 00:57] wakes up +[1518-05-01 00:51] wakes up +[1518-11-08 00:54] wakes up +[1518-07-15 00:01] Guard #1213 begins shift +[1518-06-09 00:54] falls asleep +[1518-03-13 00:50] wakes up +[1518-08-04 00:48] falls asleep +[1518-06-04 00:44] wakes up +[1518-05-27 00:19] wakes up +[1518-08-11 23:59] Guard #991 begins shift +[1518-04-06 00:47] falls asleep +[1518-06-13 00:02] Guard #1187 begins shift +[1518-06-16 00:48] wakes up +[1518-08-10 00:55] wakes up +[1518-04-18 00:35] falls asleep +[1518-08-28 00:18] falls asleep +[1518-06-12 00:53] wakes up +[1518-04-06 00:42] wakes up +[1518-07-10 23:58] Guard #1721 begins shift +[1518-09-03 00:01] Guard #2917 begins shift +[1518-04-29 00:03] falls asleep +[1518-07-09 00:00] Guard #191 begins shift +[1518-04-26 00:54] wakes up +[1518-08-13 00:23] falls asleep +[1518-06-01 23:56] Guard #1277 begins shift +[1518-10-12 00:01] Guard #1187 begins shift +[1518-07-17 00:38] falls asleep +[1518-04-01 00:01] Guard #1049 begins shift +[1518-03-31 00:34] wakes up +[1518-04-22 00:02] Guard #2917 begins shift +[1518-09-23 00:47] wakes up +[1518-06-22 23:59] Guard #2777 begins shift +[1518-02-20 00:01] Guard #2777 begins shift +[1518-06-06 00:02] Guard #769 begins shift +[1518-09-28 00:03] Guard #2777 begins shift +[1518-03-29 00:02] Guard #1277 begins shift +[1518-10-23 00:09] falls asleep +[1518-07-14 00:45] wakes up +[1518-04-27 00:53] wakes up +[1518-09-17 00:11] falls asleep +[1518-11-18 00:24] falls asleep +[1518-08-10 23:58] Guard #1213 begins shift +[1518-02-26 23:57] Guard #769 begins shift +[1518-10-06 00:00] Guard #2749 begins shift +[1518-02-26 00:41] wakes up +[1518-07-01 00:25] wakes up +[1518-08-22 00:45] wakes up +[1518-04-29 00:04] wakes up +[1518-03-04 00:46] falls asleep +[1518-05-09 00:37] wakes up +[1518-05-22 00:02] Guard #1907 begins shift +[1518-04-12 00:22] falls asleep +[1518-07-11 00:28] falls asleep +[1518-09-11 23:48] Guard #1721 begins shift +[1518-07-17 00:39] wakes up +[1518-08-27 00:24] falls asleep +[1518-10-15 00:39] wakes up +[1518-09-22 00:41] wakes up +[1518-08-28 00:34] wakes up +[1518-04-05 00:14] falls asleep +[1518-02-23 00:31] falls asleep +[1518-03-23 00:53] wakes up +[1518-09-09 00:05] falls asleep +[1518-09-13 00:36] wakes up +[1518-10-13 00:33] falls asleep +[1518-10-29 00:27] falls asleep +[1518-07-22 00:52] wakes up +[1518-03-16 23:49] Guard #97 begins shift +[1518-10-05 00:04] Guard #2917 begins shift +[1518-10-16 00:59] wakes up +[1518-11-08 00:22] wakes up +[1518-07-31 00:10] falls asleep +[1518-10-07 00:59] wakes up +[1518-09-23 00:06] wakes up +[1518-05-27 00:58] wakes up +[1518-04-15 00:00] Guard #1049 begins shift +[1518-02-23 00:53] wakes up +[1518-10-07 00:50] wakes up +[1518-08-24 00:41] wakes up +[1518-09-01 00:58] wakes up +[1518-09-08 00:49] falls asleep +[1518-08-25 00:06] wakes up +[1518-08-09 00:40] wakes up +[1518-09-10 00:34] falls asleep +[1518-04-15 00:30] wakes up +[1518-07-27 00:03] Guard #1907 begins shift +[1518-02-20 00:53] wakes up +[1518-06-04 00:56] wakes up +[1518-06-27 23:56] Guard #191 begins shift +[1518-03-24 23:47] Guard #991 begins shift +[1518-04-23 00:26] falls asleep +[1518-06-25 23:50] Guard #1049 begins shift +[1518-08-15 00:35] falls asleep +[1518-06-23 00:27] falls asleep +[1518-11-19 00:57] wakes up +[1518-06-14 00:56] wakes up +[1518-03-28 00:57] falls asleep +[1518-07-11 00:45] wakes up +[1518-11-16 23:50] Guard #1493 begins shift +[1518-05-27 00:17] falls asleep +[1518-02-27 00:13] wakes up +[1518-07-19 00:15] falls asleep +[1518-09-30 00:01] Guard #1049 begins shift +[1518-03-25 00:50] wakes up +[1518-03-26 23:59] Guard #2141 begins shift +[1518-05-09 23:58] Guard #1049 begins shift +[1518-10-19 23:56] Guard #1213 begins shift +[1518-10-26 00:59] wakes up +[1518-07-20 00:19] wakes up +[1518-05-09 00:48] falls asleep +[1518-03-28 00:50] falls asleep +[1518-09-26 00:56] wakes up +[1518-07-29 00:12] falls asleep +[1518-04-06 23:59] Guard #2749 begins shift +[1518-10-29 00:00] Guard #1187 begins shift +[1518-06-11 00:25] falls asleep +[1518-07-18 00:29] falls asleep +[1518-09-24 00:51] falls asleep +[1518-08-25 00:57] wakes up +[1518-05-26 00:06] falls asleep +[1518-07-17 00:01] Guard #1907 begins shift +[1518-06-26 23:59] Guard #1277 begins shift +[1518-05-19 00:46] wakes up +[1518-09-26 23:56] Guard #1187 begins shift +[1518-04-03 00:29] wakes up +[1518-04-23 00:00] Guard #1277 begins shift +[1518-07-06 00:25] falls asleep +[1518-11-15 00:52] wakes up +[1518-06-28 00:07] falls asleep +[1518-10-19 00:14] falls asleep +[1518-10-30 00:33] wakes up +[1518-09-21 00:51] wakes up +[1518-09-16 00:49] falls asleep +[1518-04-19 00:49] wakes up +[1518-09-12 00:23] falls asleep +[1518-07-19 00:33] wakes up +[1518-03-26 00:48] wakes up +[1518-04-16 00:02] Guard #2777 begins shift +[1518-10-31 00:52] wakes up +[1518-07-20 00:42] falls asleep +[1518-07-04 23:58] Guard #1213 begins shift +[1518-08-16 00:00] falls asleep +[1518-08-29 23:56] Guard #1213 begins shift +[1518-07-09 23:49] Guard #991 begins shift +[1518-11-05 00:00] Guard #2711 begins shift +[1518-11-03 00:43] wakes up +[1518-11-05 00:48] wakes up +[1518-09-16 00:00] Guard #97 begins shift +[1518-11-18 00:50] falls asleep +[1518-08-27 00:59] wakes up +[1518-11-17 00:01] falls asleep +[1518-05-16 00:08] falls asleep +[1518-06-27 00:20] falls asleep +[1518-08-09 00:59] wakes up +[1518-04-16 00:23] wakes up +[1518-06-20 00:45] wakes up +[1518-08-15 00:56] wakes up +[1518-09-01 23:59] Guard #1721 begins shift +[1518-04-14 00:35] falls asleep +[1518-02-21 00:09] falls asleep +[1518-11-09 00:41] wakes up +[1518-05-08 00:55] wakes up +[1518-05-22 00:31] falls asleep +[1518-10-23 00:52] falls asleep +[1518-09-24 00:02] falls asleep +[1518-08-21 00:57] wakes up +[1518-11-23 00:49] wakes up +[1518-06-01 00:55] wakes up +[1518-03-26 00:51] falls asleep +[1518-03-08 00:00] Guard #2749 begins shift +[1518-09-07 00:01] Guard #1493 begins shift +[1518-05-19 00:02] Guard #2749 begins shift +[1518-10-02 00:14] wakes up +[1518-03-02 00:11] falls asleep +[1518-09-12 00:56] falls asleep +[1518-07-23 00:23] falls asleep +[1518-06-07 00:51] wakes up +[1518-06-18 00:21] falls asleep +[1518-09-28 00:48] falls asleep +[1518-06-30 00:01] falls asleep +[1518-03-20 00:31] falls asleep +[1518-09-05 00:51] wakes up +[1518-05-29 00:00] Guard #2713 begins shift +[1518-10-21 00:40] falls asleep +[1518-08-10 00:33] falls asleep +[1518-07-05 00:53] falls asleep +[1518-10-03 00:09] falls asleep +[1518-03-20 00:00] Guard #2777 begins shift +[1518-04-18 00:21] wakes up +[1518-07-29 23:56] Guard #2141 begins shift +[1518-05-20 00:33] falls asleep +[1518-08-20 00:42] wakes up +[1518-05-21 00:52] wakes up +[1518-03-10 23:58] Guard #2777 begins shift +[1518-04-26 00:50] falls asleep +[1518-04-04 00:47] falls asleep +[1518-07-07 00:12] falls asleep +[1518-10-07 00:55] falls asleep +[1518-09-20 00:39] wakes up diff --git a/2018/d05/ex1/ex1.py b/2018/d05/ex1/ex1.py new file mode 100755 index 0000000..b93dfcb --- /dev/null +++ b/2018/d05/ex1/ex1.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def reduce_polymer(polymer: str) -> str: + for i in range(26): + lower, upper = chr(ord("a") + i), chr(ord("A") + i) + polymer = polymer.replace(lower + upper, "") + polymer = polymer.replace(upper + lower, "") + return polymer + + polymer = input.strip() + while True: + reduced = reduce_polymer(polymer) + if reduced == polymer: + return len(polymer) + polymer = reduced + assert False # Sanity check + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d05/ex1/input b/2018/d05/ex1/input new file mode 100644 index 0000000..6b1769d --- /dev/null +++ b/2018/d05/ex1/input @@ -0,0 +1 @@ +cgGfFBbCHhxxXBEebrnNRuUMYMmyyYqTtoOQyYmDbBeYdDDdykKENnVvIidztTxXZmcCOoKkSsMxhHqQqMmQlLVNnvvGgVGgCcCkKcXkQCJjccCXxMmWdDwUupPyYjJgGSsCcMmqKnNQqqtTQSsmMtToNKkKCcknpvpPVPVgGjZzfFCcQqCcTtAaIiJvWwPpHhdDYkKygeEMrRmGlCYyEeZCczcLqXxHhoOQDhXxIzZioEeOHdvVRrtTEJjXxDdeyYkKLliIOOotFfKGgKzZkVSsvCBJjbnNchHOorRbBoOGgRCcEeLlWLlfhHFwpPJKkjroOBfFbkcCUzZUuuUuoOEeIizLlAayYlZzLprRPZvGgVGgbwHhWrSsRAaUKkTtrRtTuUuhHBZCcpPzZtTcCPpQlLqdjJFfDaAkWwKEXxFfPAapMmGgeDdmMETRrteAaqQkKzBbDXzZxdnlxXpPLwkwWKoOMMmOAaoZzlLXvVsSJjxoNpPnOveSsEeEJVvjKcCXxmMLwWBIibrRHCYychEeoZQqzXxwWsSxYyLuUexaAZYyzXCxXcElQqVvSQNnqKtTkuUsIiVvbBjJQkBbKEefFTMmtYyZzzcoOcCCZBsShabpPBKkAMmHrRsgGSbSsvmMhHVAiyYIaFKkAEeuaAUvVKkDQqNmtTMnFNnfdLlfUuFEOyYosEeyYSrFfBqQbuiIUsPpSlLOAxXaHhfjJHhFoNnVvyAhHQfFcCqaYRhHrwPdDaXxApRrWReGEegaAauUFlLfJeEjNpPHhndXTtVvxXxDfCcCwWcQqTtKkjvVJROoRrrRrHsUuzZSTtSsGghMXxuEeZzCWwcIilLKkkKbBtTfFUCcyzQRrdSsDqZzZxhHXpPRrYdDTXxtbBFfaADOodDdFRrcVsZRBbrzSzZcCvnNCzZEWwUnKyYkNnNuCcepPZEezvVWFLXxCmMLgBbGwWljJLSnNsWwcCbBQqlfEMmeFOWwCcoDqQfFAaoOzZPpBPpQOoqnYyNbrRwRWwrmMAayYmMjzxXZpPFgGRrQqNnJjBbXxoOIZwWEeIiziiIIivVwuUWYyFfGggjJLlHhbBOJjIiGlLgovVrRhWQqwHpNnPLvVlLXxDKkNndHBOobRrhlGUuQqoNnOfFpOoAaTwbBWtcxXCPwWSevViIIiWoOwFYwWRryFDdffELmMlkSsHhKixXIiTTttIcCoOBbQPpGgEeqBeNnUuEhHbDdsnSsYyJjgaAGMvVmrRrUutTRrRgGWwQSsSztTlOtTaAoLjaAeEJSLlsRKkrRrZsEeLlqNSLlsoOMbBmAGgYpPqQoMyYAamGQBbqgvVOvSsVnaeEAXDdtTxzZNHhnNyKUuktTkKYyYsSRrfFDdcvVNnhHCyEPpeqQmMfFFEfFeBbfoOWwbBtTpGpYyPRxXrlLgcCPvNnAaPpVOoEkgfFGKzbBJjVvNnYylLuUoOxqQJjXJsRKkrSjJjsSxvVXsSmMKkZfFZjJQqKsSkhIiHzkVvTSSsstkKrRzZQrYymMRRrqsSlRrLQqKGgWLFfEeGglgGwwWhHtdgGJjDTdDewWEegGTnNIcCitrRSXdDxszZmtTMrbBZzRafSsZuIOoipYyflLHhftTFFNQqrRNncCnPdDrQwWqCcRrqQeEDdTtnNwRMQqmnoOFPpfNdDcCgGrkttTEetTtTTVvPMmUgGTtBbzZuOVvDdopJDGgbBfFdhHZrRAaCsSNnHxXPiIpxIYyibBPyYpGgXmMHhhNneEIXxiVSMmpDuUdhHPeELlsvcCmdDCcMeExXLlQAYiIIiyarRYMZzmaAnNJbBjeeEEAmMaQHhqyUrRrRjJwWAaaARrlsSFffFLJfwWFdDfFdDUujPpupPqIicKkHTaAtFCEAaeHhXxvVFfctTAZzXxYhHbxXBnNyyZCcPpzVXuMEeqQauUAdDmUsSlVvLxCSsctTvVzrRZhzvdDAarRoOkKVcCUuuUBPpkBbeEUuAAAKkAEeaCcTtQqEEezZHcCiIhyYFfneEgmMGNLlJGgSqQsjewWRrvDdVXikKIGgmMCfFcCdnSsNhHeEDcNnUSTtsuSZzVxDdXvcqQZmMzOoCtwWTedDZzbhsdDYEfFeTtybBSpPFfdkKNYySsntTtTLHhEesSpPzyYnFfZzNaAkKcCdDXhTtHbVvBxoOZgGMmSsKkEerREeMRqQrqQlLoOmsSsSPpDdQfFqQqmWwYyAaNgWwGKkYypPhHyYdDaATPptstTSnxXeEUuOoNUrRunYyvEMmeYAavVLXWwdDxzZloOysMmSVsYySsSVPVvnNpCcUuvoOvVyYgGDCcdNnOiIfFWwpPndDNAaNnoMmlLVvIiZzscCqQSVvbBhHVvRrGggCcjJUrRreWLdDlwRtTrPpEYyQqQqRgGUumMTjJqTtQvVBqQLoOYTtylMHhmqQbxvgGVroORNnERreXMmsSCZiIziIVvJjcSsmEeVveEAabtTMmMmxMmZzNnXCtCcTLMOomlcBDdtiITbjJxXNnKbBXcCSiIsuUoOxFJjNuUnZETttxXTezCctToJxHhXbvVBjcIiWCcdDRrjJYiQqIurQqRxXUPpBErmMReuhHUNniIxWwEtTeXGgHhbIiRFfrbBCQqIiVEevSgGaAWwfUuhHlLFCsSloqQOLeEcCBbgLlGaAnNFfvVEOoAlLlLtTNnatTeAaiITtPoOpfFYyeEHyYhSlLaAsUvfiBXxSGgDdCcOosaWwPpAcCVvMBNnbAmMaJjhYuCTtcdDUOobmzZyYrRMPpfFvKkhmMOoHVhTtVvxXeEHhHaAqoOJjzZfmMaAFkgGNuUnQqvVPvzZVAagGpGJLlBjJduUzZzZBbDLMmlSCcKcCGNuUoOPpeEHjJhXxFfYRsSkiIlcCobBBHhoOuUWwbNnsSgGbVvBcCDdrRBQMmjJqGnNgbPdxSsXGkKhHgCWjMmqQKkyYQqAavAzZgGALlDZzdaaHhVQqlLEiIecCQqtMmNnXxTtbBYyiIwWWPBbmibBIMpmIibBnNMsSmpPcCHhiIMBQqbDdwgGqNnzKkVtQqmMCcTomMOMmzZOSsvpPVMUumEeoBbJjXnNxxDdXhyjmMzOoZZNnDdzpUuPrRlLJvOGgoRrudDSsrRhHsSrtTRFfEeUAyMmYYyYdDbBVvGgysUuSwWaKEecgGCkTtzZDhHLuUlUuVvdaPpASXxGgwVvhHUCcuWHhsSwoCcQqmyYMFfOTBbjJrVvRQJjqlJjLxKkXaAVvzZtMgkKGmiIWUmMeEustGlLbBCcgCcYUuJjaATUuGghRUBJjwOIioWkKnTtsSNlCcLLTtlhHqQDdTnNtkKGghGgTtODdoaRtTrAoFfYmMyfgGlLFIiWwQqOZzdDmUuMFBeEbJjrEeaWwABbRNnfebBGgEfFgGwSGgEHhnNTAatrsSBPpEwWcCcCebnfFyRrYvVBBbyhHRqQnNlLrvVYgGgGoOcCeKkEXyYqQOoBbpPAaxRrbcrJxXjqFfQMCcCfFcHhQqQqoKkOQqnWcCwNoMvVmOuqQUuLlDTCccCtdbBimjJhHAkKEeaAaMmOoYytTyHhmMpPaAYKpPrRkzmMyYZWwYyafOoFfIirQqXDdxqkKQsDdOoGcCGgPCcoOpgQmMquUSflBWwbNnyYJJjfFOojaqQABxVvjJXbBkjDdJKkZzjJwWxXEIietTKBbkNnzZDupPDBifFIWwBbhHbdBLllLCkKaAcxXdGgLlgGDIibYyCeEkNYyFfndDfrRfjJpPQnTtTldDLrRtNwTtWmuRhHrFfUMZzqFCVvcRrgQqGyYtTcCDmMdQqDdazZAEekRPprmMnGgAFfaJjaVvzuUZAAaCcgGbbBsSGguxXUFfBhHsScuUZzCKoOfFAakaayQqbbXhHDdxQRSsUuoOQqVvXksSDdSsSbBsjJMofFOejJELBblhHmKkgRrGwwzMmFfVVvvpPVuUoOFHhmMPpfliILbEeBkiIOohmMVvAasSZzaAuxCcIadDSVvbBBbrRWwiIsCRrxXcDFfnNpbYRnNKlLcCDXxrRdyYkJjrCWwjJIidQqXxDdeEIiFfqDdcBnMSJFLlfjTLlCcuUmMEetUusgwWEXxeGmfZzFTyYtzptRrAaLjJluUJjAaTZzlLlLsvVSPpzZxoOLiILliRRrMzZmeMkvRrjrRJzZEePpNjzZWwXxJLlnxcGgCXVTtZzGvVJjgMVvmSoOsBbjtTyYfuOaALlaAKQVvaPcCpGTQqzFfeEyYwWlLJOolzZLsSNOJjZaAzPGdDgSsJjgiIGiIiIlOolLtTLZzmMEPrdlcfrEeRyLlYGgCLlcwWFkKCcTTCchHBbNnpDdMGgmPsSunNUzpgrRuUGPZiDdqaAQEeiIlXmlqQLyYyYmMbXxXxtTBffFtTkKcCfFYyHhMnFgGfNnxeEXNFfSskKmjoObBJLlFwNmMnWVvMSdDCcdnZzZzPpNDuPpcMuUiIdDmzCGgydDaAXoOFNjJnlLhMmtTgEemBbTtkcCpKkZzPjEVveJiIiqQgYypBbJzZjesSaUuAHhEPaArRzZgRrzypPYaAhHEsSZzeBSVvsbZEewLlcChHWnNjbLlNQNnrRZzrQqYyrRRhZkKqhBbIiIaAFcfFCXxfiXxhRtTQjJqczZcCufXGgxFIiKkyYUgfWwVvGgHhFeEBbZWJjMmxiIXXxwptQtTqTOIiMfbBaAvVAafFlwWHBbhRrbPpVWAawvAaNnICcilnNLPpyYizLlHKkhdpGgPDKIiRriYyTLluUtILlQJjqnNYygiILnuUoOZzNSszTthHyYuAanNUWwBbMNnmmMQqGaADdMnNCcmWwEegCcIGgLjJlisSuUlLJaAiewWlLEpPPLlsFfjgYyTtGBbJcCvEeunNLlhHSkKsOoUgGkKdVmMQqdqQOoNnDgGvkhHnNKVuUXxlQqZzLeTtOoLliIiIECcvyYKvVkDItdGJfFjFfxJQgueEvVJjuqdDyDdYQldDzZLDdQqNgwUMmPpuWAIiaEejJIxXGznwWNOJjoliIjJKkkfFPpYHhyNvVvVnKPAaeEymMQDdmrYyLYylfFRMHhTtDdKsoOapPRbBrASRMmkKDNnemMEdQjJtnNwyYWDfFEedtTWGgxckKGjJgKkRVJODdUukKEeoHhUuTlCIQqCcicEeRrnNudDbpvVPBXxzHNncCOjJoVvhPakKAwWppPfIiFgeEGGMsSmxOZzoXpPuUSwWGFgGULluBUubgcCFfDdmMHhgGmMuzyYZCDdcStBUubCXxcTlQWwRRrBbrUuyYqxXILllpPWYyiNnIpPJjTJhUuHFfKNnMmkgGSKksOoAajEYyeNntwdZzfFTtSTGgtpPsOPpqQopPrRJjrkKRFqQbBfJjkBbBgGbKMmogGaAalLAzZXxdDvVAaVrRpdDmMawWaesSEAEAKkaeOoWxXvVGnNIoOnEejuNnUJYypPIikMYyVvxXmNnsSkKhQqfFIIiakAaROoRrrrRjJPYypBbbXXxpPxEenqQOXxcDdQoUulLOvZVvJjzcCVMmOoyYGXGggGkKMmQqvVGgMcaANnJjCiIPKtlLmMcCWHhwzZlLnNqQDdehLfOoGYuCCccUyNngqQwnNWloOLsSWwyPdoaAsSkKSsMMmPKklQqzHhdDZokKOlLqQLDtTdprgGIDdCcFfjJRrKkhNnHcnlLRqCcYyQreERfSsavVcdZzDCxXnNDsSdAZdDzGKOohHYAayheEPZzlLNnznIiTtQqzZTtNZnGNnYygfFBzZbNWNDdUunAaFZzuUfcCAfFMqQwWmcCiInWwkBbKdDaARrLKklzZHpOoXsSzhdDyEYNnySsTtbgbBGxXmRrLnZzNuUCNnSsQqMFwVaGgdKUuLlgnEelaAIhHSsCciyYiIcEeCGgFfzcTtCkmMKmMOoolLBfFyYXlLZzHIieEexSvVsXMmaqQVvFfAsuUSxNnlUNjJnGgcCeoBbOAayOohFfHdeZzETIitDtWLlxRXCcxrLlYykKXbPpCcFfBcfFOoxCMmcXaPpoOAwRrGgYygGzZVMmcjdqQDyYMrRVvmJUugGZzPaApxiFfIvZCcHPowWFaAaAfUuUuOBbYDqQXxDdjJdRSsrLFjJflNnJjJjtTXHUqQZPpaAzqkKQhHkVvOqQoevPpTtkKVJjENnNLlneDLtTlsxXaANnSVCcvoOyjSsJKvVkHotTLaAlOzXxZhHwWXWZzknCcyYzZIicSsCoJQwWxoOXwWqjgGAAacNnClaAkKoHpPzZxXUJjrREoOeeEOomMyJjfFJjrUCcuRkKDDJjKAoGjJgOimMNndEeFfpPmMwWVvzZubtTBeEWwuUZznJDdNAaoOhnNHzZQqnrRiNnIfFMLljJCcmjKkhDwWwWdqihKkcCqQHMwWwKkPpFfWIeEPJjgjJGyWUuwoOdcCefFKBbkEkKPTiIrRCctpfFfFVvjJevVmyYMGMmhHjPBbpriPpIRBbwkpPpPnixXIikwWKSeEiIsaAIlXnNxUdDuKNnoRrdsSDiIOkLPkKRrppSscCOhCcHTIJEeVbekKEnNQqbhHBiISsNEnNvVeHhRJjreiMpPNnmgGqQHPphaZzXxAHPpMbxXBRrOGglvRBLlRrZzkBYkKAaybgGfFhHLlPpcCyYKUufQRrcBAabCfFBwWbPKkpiItkUuKswWSfFTLlDdhHDtxXcCTeEVhoVvODdAakkKQqKWmMmfFMcCHIihwqQSsWAMxXerlLdJMmjjMmJpPeBzZbEDpPuUHhsSolzJjZoOLhHdDNZznbBFfOFepHfFiIhPmMPvVHhKkpqQmaAMxXYcCyBbPNimHhfFKAIhHwWnSsRxXTMmcCkKcvrRLOEeGgozZljsgUuGzJjiMmXxfzZXqkKJjQDdDeddDmEeMaAqwsvVSmMWcCQjJqbBzZqQQKQqktTFpqQEewWNSsnbBdDDqcCwWQZtTzxXOoKQqkpojHkKhJWAnNawwWdDOoOUuMdMmfFDIeEiJjZDQwLlvVzHhBZzkKbTtPkKbBbKkWqUVrRaAgOoGrRnwWKIGgiOkKfWwFokgGKQKDNndkmFfMcCAUuabggGGeKkEBfFaAgYgGQaAqcCyGieBbEfZzFOxXtEUueTxRrlLotTOUihHhHIwWrIizZRuqaAGrRgAkfgjJGVNPpWdZIizDmtTgGGvaAVgMwyYmMQqmMyYsgGLlSnPFLlfvOoVxXejJEpVvMJILliuUkKCcnVXxdDzWwoguUXxzlLUusSjJZujJuUKkOoFfpPHhlLUPjJQqaaGgAHVvsnNPpFfeeXxpetTNnhHgGEdjJDlhHUuLueCwCcWRJjDWcCwFqQwBbWfdmMUpvKIYyikVPGFuvVUfgrRlMYAHhayHuPDOodpkKHIihVBbQqAMmoOavFkKfOoJjUubaAEejmMkKJfVvqDdQFJQqjHcElLeNReEBdDRvAaXYyMwGgWUumaAxXjJvUuVhQVvquUJEIikKrcPpRUuSsYyrAaCRWwDRQqrGgGDlLGgdGgUoOuLlqQuUdDTYygGcCQbjJBLOouUsSmLXxlMPplzKhHrOiIsSoVWwvcoHhOgwsSTtWwwYyKAaPpuUfjQqgGsIRriiLlZzHhZbcpPnyYNCMoaiDdHheETtcVSsvTtCHEwWehNXxNnXUAaHhfFfqQFBbdDuYxBLKaAdDgGuiIUmMkzZZzXxtYdDyOqQoUuZaABbzjJcCUuuUcXxbBsEeSyYydcCQqbBDdhHErRAEeyYGJjeEgAPpDdOoaXLlxamQqIiDdMDdegGxXuzZGplLPuUQdDzZLlwWtTqQqQqJjIivSmMsXCcXoOhHxFGguhHUgTtuNcwajJdHhDUuAazZUsSuLCiNnUuIQqAaIZKkAaGqQgzZqQGSssAaSDdxpfDMiImcZDdubBUVMTtmfQqBbBUuXbBWwYIVvoLlkKIlLiUIAahiIyYSXxDdtBoOrxXdDBHuuUGgiIKMmkcCCCccYydkfFZVvzNnkKYydDvVKEenNUuAaUAadiZzRuUrYygQqGacCFfgGsNFfGxXaACcSUusaAgVvmglxXHhLNnGRrXrRDdxMTSeEslLnAeEIibBbkFfLlKzSsaKkVvWKQqSsJBbqHhjDdCcUGguwGdXxDpwRrWQjgdDRrgGGJzZqDbSsBiIaAXxdkKLlMmPGccHhhfRwSsUlLwfFWIiIizZSsKkKrRFfdDxHjJhcCWDdNhHnnNLvVsSyQqtLlTcCpPpPpvDIGgioOPDUujJeESbBsiIjJaAHhKmMXxGlLpPestTzZhimkCcKanNMmxFfmfFqQeEnwWDdjtykKYKIFfikVQiIqwWpeEpdOoRrDPMmwzgGWwYyYuUhSsHHhZzybBddDZRwqXxXOoGgPyYpvVdDUuvVlEWxXwWweWwLtQqTxXFfxjJxXyYNsSkmMKdAhHrIWwMZzlVvLmiGQsSqGMmgnNSoRrYOWwZzJjoypPgeEGgGCoOxNNnaPpeEAnAaNnnpPNogSFfDjZzJdzedDwWAatTPlkKANjqQDGgWwDdXxVuqQnPpCEecNUFfCccCbBJNaASspPnjoOaAoEeCcSscCAhTZnNpKkDzdDZHDtTUuDkKhYyHiIZVPpEevHhpPrRABbsJRrXHCchXVOoSTtJeFDnfdDFNaTJjlrRHylLRQlzqdDQZJjJjHhvetdQqPplmMwrRGgjhHcbBlLLljJKkSAasQmMizZIqcCbBeuPTttTdDpUixXIKkFfieVaAvEBbhmnVvNMSbBnNsStTsJjfFeCLlcZeEzomMnNSJjWwsgajZFTtfJjAawLiIyYlTNnSsauUACUVYyjJgCnXxjJNczXEeUKkuVvxtTYRbOZzWAaAJXxnNjjgAPVvpOgGFqlLpZzJCZzRhHoOrJeJjFfuUbBRQYanKkcCNnNAyKkqWwKOoEeEekrSsqzUbBdDqQLnNlCPIMmdCrmMRcbAaohWwHOGEALGglWdLlQLclLCxXdPPpNnpIiQqjJANkKMMmPBbaACcdcCDTtBVOohjJCLlcHcaGcCWDdPpSXfrRFxfFNLlnPiSsIpwVvWwWNnlbBkCcKfDdCSsvkKdWnNweEMaAwPpWQyCcCcwWuUGPpgZVhHNneEVvYeXxgGeyYECfgTNfpPdSsDJjFfbBFnaAfFmjoOJjbBOmMiIoOoryYwaAWdDRtTIigrRWwGodNnKYPaWgLlslLJIijqQvYyTqaALjJmMWMmBbLlxvVQFflLQqaBJjxXbAvHkjJGgKhVbPbBpBbTiIwLlUEhHevVuCRrcxUuqccCCbBaAycUZEIjJFBsSbvVRmBsSbizZJjeEMOokKzZKkAZzSsiJjWJnNsSjQMmqKbBOMYVBbPpySsvpeEbBnNKkjJyDtTpehHiIHOjJohKAmMqQvEeKkwWXJjZOozuUbBiIxBPpidLlDeVTrRtUvVIiuUuNnUrpPRHhJpiIlLwWrRrFfWwyYVvNngGZzUCRMTtVuUkKvEeEeolLCaTtEefFfrRFyJKkfTnNDdovEjJecPpBlLLvVqdanNADNHhnQBbWwZIBWZzwTlLtTMOolLOvzyYfFoOjBoOCcpPlomMdiICVvcDCPpKkBJjyXxrnNRpXxPVCcXAahHxkPpwQqWiXxeELleyYAIiaxaAnQoOnNiPpKkdDgGIHhwWqmMQiIqNXKkKXxRoYutTKkmMGgWwnNKGMmgldDkKCcLaAKkdveEVYyOQwWbBquOwzZYZBbzyfnROordDvWnNwvqQtTrKkXoOxRZzjJCcsYpPoOOXxPMmtTpAagGwWcIiDqZiIzPzrRZQqsSUEmZcCzxXzZyvVYtXxTgmKkMOusSbkKBUplLQjOoLpPTDZzfFFLlfdtyYRmMrsSpcCLHhFflSsYyNnTtPyYWGgbzHhZveUkKucCEesDgGdDdviIiIPphHhHVqQMsKkrDnDdkeETtdDQGLMZzRrwQwWwLtsSliIaALTSsjJAawWnNjJLZzFgGvVSsEjJhSrlZRhHreqQEQqujJULlHOvycAPpaDdbaABCjJRroGgjePpBbEJGgjJJErGgrRLlOvizxSswWpooOOFLgnBbFfwWlMOUuEeOlLooLlBbBbEyYefFfUYyuNpPUTnwWNaAvVmYaAlLsSDxXoJjKkOgGNqHhQnEeiIbXsfMYymYXxzOoToODNqQvnNVnuUtTtTTtnDdTRcmeBLlqVvTtQbBKahVvbBLfMWTzdaMhrRncCNTzkqQhHnNKZtGlLgXIHhixHmZgGeEdDHEePphFfzeEuaAUcCdDpzZrTtRQUuRrtTLuuUWwUiIBburRPpKmtuULlBgiAaaSsAOWwPpSkimMIaiFMmfyGgYQzZqCcYycCUuIKjIikKRmMrJlGggGsdijRrRPQLcClqQfFwhHEBbfFeWwWTkKtCcbPpPPpjJgXmMxoOGpUvhHMmFfwWoOwRrhHWqWgGPpEZzWrjLlJrSsRQqBLlbHhIicCXxXOofFCcfFsyYfMlLEAaKkEggGGczffFZzJICPpCcoOiIDsSdSszZDrRdFfHhcMmJjFfFfkgkrRGgNnrGgsFfcRrjkNnoOeeEEOoJRdDUEeFqjJhlLqQpPfFskKbBlLglqpPQyjRUuoOrJskOoKGgBfFBbxVvQqXMmFqQWwvtGTtBRrbvGNhEeHZzqQBpPbVvdDLlMPpQxaAKkXFjJfFfJDdjHyYhKkaNnZzslLiIjJlKsSkLheEvVnfiXxFkKdDkYCcyVrJAajtTQqpFfAlUpiaAwSsUKkAuUaZmMzlLXmMxuhHUNSBbsnbBcBbCzZEeJDvVzZkKDdfJjNgBbqQGvHyiSfVvFdMmQqIijJDDJKJAaWGlLMmcpPppJjWwCGzZgxGgXVwYdDySstOoyFfPwWryDkKbLujyXxTtRsSCcZyXxkvVzZYZweEnsTNYIiyRruXxUnQqFfyYRprRShfLllyvVYZUYmRvVrYmMyUumWAjJAaaBpPbwVCcVNnnkKkwWKmeEzZIiMJNnAavVAAaeEZFflyYLDdvwrAaRWUecQqGDDDdyeEcyzZzilWTZAqQOohHShtmpPMTYyOoKXEShHAaEePpZzVrhHRkKLlnDxoOXdLbBldAaRKHhgGkWwwavtxXhYyKgeBbUfOmUuGvgUtTmyWhAHhVXxzZkLlFfnNvVfkKbBLlrRndFfldDJoOjKarRGgGNFzZIiwWFfAalwvvzZwiohHFaAEeaAUurRZcmMjbBJrgmcThHwuUyvVYruPDdptcCTravVARHihHJjvcaAErRYAarJgdDGjRfvKVGnrZqQzgGbbZjJLKeEvVklFKkMmMmTGKtSPpuRKtkKfFNVtDdaHTtvVzZAuUaKkhbRroEebBOoFAaMmTLltfljJNGqbBQgfjJFoxFFffIiFTNntaXHbyrYbBbELEekKljOoPKkpUoOyTRrtDyYdfFdQvVHSshKdDyYpPOUuaAoyAamMZzYxhHXmMfFnTtFfKIBVvbWwigGbBFKkpAwWtTbBKksSdcFfUZTtLlxrRXSTtraAnSsqQGvVGPptTFbtTJjvZzVbJjBzRVvJtTjGMmgptTPmKkxXJjzosSOJjeEsLHRuwxdrRWwGNEQqDdGTtGoOgyYdDYvVSyIiYslpPoQAasSmPUprfdDrUKkgGacOxXcqQCogfFGwAlSsLHwXQqRrtTLVHjJeEFfAmkKmYakKOeoqgGQbjrYyXBbRjJIzAtUdWgdhHQqPpDhfFPpHIqmMVpRrSsPhbBHxXQhcCBQCckKYyDEedqgGvWwLlcTKkWwPpzZsmMmnNMQRnYySsWiTtSyYWWwwLlVJjrRUSstMPpNnAxWwUuXCllLLKkGgCcVDMkuUQqGgoMWwVQKkqeKkLyFftcCvVTHhOYlprRJjPFfZUOomHhMekgGTtkvVzZmvVMBTtQsxFfQqVfFFfldDdxXsHhMLlazgWPpejJRXXSNrRpPOlzZLJjryYtoTtdDWKkoOBbsgjZIiqQziIkbXxkJjBeEblLaxXlLAHiIhCFfcBWbBwHBkWwvFIiJUukKzZTrRtoOcBuDdUimZFfqQQqAaxXnpPNTsiIHPpoOhOoSfFjPpyYJjwEfMoObBDdHvqFfaAxXbcChxXAaFhHfjJhHfIioORrcQqZrHWJJlLBiIbqczZoBbOyYTQaXFavcKkCCZRrOoGHhgVvAxHhXaArnNCJmMwAaSsBDKBbEJaMmAnNLljXdXxTtGWwgbBxXhHwWAaMsSmAgBfFFkKfbYgGfFyGwAatZDSeESJNOoBbECcPpcCOovVcCOhHaALlzuUZNnkvVkKzZzZhSsHJfRJjEeUubfjJFsSsSBEaMMmtTrOoRDdGrsSppHhAakKUtebGgTaBMimrFfRYjCMHyBbHLLltcloGrRqQHhYrRIiiOTtiIpdohHOHqtTPpQyHYyhpCLGglRtTgGgOoXCcApPSHhAaxqQYpPyhUGgJjZwRgGEjJeQqRmMjOpFGgKkBlCcNneARJjMmrHhkoOqQLlwuUItTNtbBTNTtWBbdDjtVvYyOqMEeEPTFwZgGZzJQqjzHFfyrRONnUuLloGgYQqVPMrRXxHhhdDwnQqNzZTtbQqDdvVyrRPpYCltTZzCtTMmRAamPpZztbBGTSsmvsjIihCcBqVDdmrMQqmNEGVgbwWBmPpMgXrRRyYaArxMmzjAaWwlWwLJEmwNreEsWfdDewEeWCBjFfTtNnCcZzNnzPnhDbDdmMaAcPpCuUGgkYyGbuUByYAsSMhHEePpHhLlnGgNfvVfFFvVVZzvmHjwNcCKknTUxXiIuAawWtrwxNyXxYxXTrRfrKOAaoYJPRraSsxrRXAeEpbuxRrXVvUYJaAjrRykKebbzZBvMmaAXxUAagGueEVGCWwaASQqeizZITMmtYyQqQqiIwWCNNoOnVvCMmcRYyrPpMmqHfuMeEcCFnLhiIKgngWwGNGOokRrDiBNnbIdJjHIEkKDrRgIiXxTtDdGcQfuUyYMBpPuUbmdxXDrRzyYVvwJDYdDvAaVGOoUuRrgfFMJjrRRBQwlLGgWqLlXmMLeLZzuURWpPIiwPpggMmGGpqQmDdiIMUuxXroOMmGPpgOoOoVvZzlLsnyRcCBFPvaAcCmMsSBSsCUrRrEeyCKkAVVnNQMmjJeYyELWRruXxxkKCceEXOoOUUutTtTuxXijxzZSsuULWwXQquUxqQXIHhxZXxoWjAhiIcCHBbjfFZiyYiIpUuxhAuhKkHqQyyzZYoOQqYMFAafgawWAqClLUAmLlJJjjmMBwLPplWleFffZTMGNnKkFDdxXDdehiMbBpPRrmRNWwfFYazZAegGIaAitbBjwWJYyTtTVWwPWRrwfFYBQqVCcwZzzZdVxAaQWwkjJhHkVNcPpCpPeVQGgqAaFQqMmfyKkYfFKkkKqteRpfFlLHJhHjJeAaEeWeZzaAamIiRWnNwWSsiojJSsEeOMKkmrztTtcoKkzZSWwsTLUuVIOoGgMmPWlLwkKDqQKVveEgtTTEetKkGvVgVvWgezCcxHhXvuUvWwPjJWwpxXnNVYWjJHLlsGUdDueAAaaIilLrREgarAavVxXPoTuUtOPxXpRjJcjBbNuqpPnDLQqyYKkRnNlGtTHuUhCFfccCMmDGgmIPGBbZRPpGgOoLKnNzGsSIvKaAzrfzZOYBnLbVsUuCLuRmZznNMocCPbKQshdxXDHlyefCcFFrRSsxXttTseESTfGGgqQNIIiinFUNDdQOorRbwWdkKuPpfpPFUDJAajEciCbBlLcIxXENzZdDdNgrReEIiGMTkRrkKxbBdDofqQTtFOXIYgzupYywEUzuqVpPvtPpnNYyVvTqqMifNvRrXxzdDGEekfFbBKRyYrgqQZoOhqQWwHhlIgYEcCexxXjJJjakVlOoLvLGHhglXxKupPWKLNYynAamvVMNxXDRrozZIHhOCcoGzDxMmjOoOovyQqYVvVxuXfpkIpPiKmxXxBbXBbJjxnkUunHhCcaANnGgDdztTZtYVvJSjlLxXfFeCqPpvoOyYyqQYwSJBTtXxSDmbYyeEBmMSeVnJjlLmMcCjJbBPpnFfEeYyYFuaeEAahHIEtMmtTvtAbgGpAaaAgoOsQKRYMXxmmMgGtTgRrtnNsiXxaJjKDTouUZZbGPpCPLIQbpPDdWOiaApPIymMYnOoNMzSsmfkaApjkMlLiIjJQEcflLFtZCcAEHuNjJgXxSsfFlRVvuRrUcvTtVCmyxMmXYSsiIuqQdltTsSdDkKLDKkKLUuqZAazQcVvMmkkTpnoOfboxXKJIinNmOxXhHXUuxMMBmMYNnbaYywvVnNRrtTwgGWsCSfrRTtHnAartWGgsYySyYCJroOnNWUsweiIqOocqNnGgwWPpChbsFkKtBxyYKLlAeEzYpPtgnNDUuYaAyzZaRPprAAadrmTHhlTDdmkBbMDdmKMtxXlLkYrXLoOjGNEenpPgJruUQqRlBnNbmMjUuAaPFlidDIfFLNnTnNEtTeLltzRrBbAQPGEeWsSiIwOnNGgBwepixXsvVJjiIgWwRrPQnNqBbpajoOJJjAZzCpPcGhnjJNsSCgGfFjJDdMruMmrGgRUVvRWyHhJGjRrJJnNjwVNnWwXxDjNWSswnyxopPsNwWVLGoOVvgZHrRhyYGgzTLlgxIpPyyAaYuKKkRrWwUtTuXdDqEeVvxnNXfSsFmDDdzIiIzyYsuUShgGHVyFfpNpPSTtINjJKkXxhHbBLLwWVRrJQqYYyAaxUDxcaVPpvAIiAAaazRZztDcCcNKFfkbJKXKkqQgnNGCcyMmYyIMkKmegIiciIpPXEqNnzkgpecCzlLgPmaeKkZLlzCcQqEAFfDCsSATfcCRKHgGNnhQsSGNVvTqQAamMtBbIhWyvVYSwhCcgGmMHbAWVveETcDzZdlqyRrPtTTjJIittFfXyZlMmiITSrRiIhHleECcgGfFmLlvUQKkqzZhtTtTBbOfFzZKUukLloJjuXxXTtGbjjJOHhohHYQQqUqBbJxXytTYdCvVIUuWvxzZXsSJjfaAFjJSsLlLlVwXxkKvwWVXxdkaAHmMjJWwsSDXLjuUnNJGKkgJdOoWKVvkwFLlUlLKpPDdxPIipXxFfgcCPLltLlBbbaaAcMmsSnNPnNjJKkqtAwWzzZZGeGgpPUubBbBZRbFfBrzfbviIVBLWIiTtwxXoOGNBbfDgGYyqQIihqoOhHEyemMxOzZufEWuyqnNiIXJfFpZzzVvZzZayYJjbYIiMRBbAyScGgPDdxXbHcChhwWHBNQqgBbVlrxWxCRriIcxXZzuULluUYyXJYqYlLuNnmCcMxXLVvtTsGgzTybzZZCjJXwkRKkmMmMiIkUSwWvZzVYXFfxoOPSKduZzDdRghdDkKwJPqFfOBbBbsSCUcxXCRrgwWGklLBbGKaJZZqQViWXxlNnBbzhHZLiIlrrfFkKnGeEkpLlLfFVNLZzSsllLcpPVuKkWwEKTTOotFDddDQZawxXWjhyoOYHIDFfxuULfFUYNjmXRrEexluUOoNNBELaANQJLKkRaZnmMNzDdIcCfFArRrDdRpPezZEpPuYNnybBEeDhHdbyfdcLwWlEYAacEgbBxXKyYkMmVlLvmalCcLJIijxHvVdDfRLlraWwqcCJjQAFyFfcCAaYzZWNebaABjJnNqQxumGCFtLJFPCikKhMIYyicSJnNckKUuuSZAPEvtTQqRsxXEeSarRmryvVhHXxTtxXHhEcCWwacNnVzZjJjJlLvxdlXIitlfFcwvUeEujtTdhHxXKuUDIiInPpsSNUkKrdDmebIPrPpDWlvFfVrfyYXrMgGkKRrSscDrRhVgaZzwWAcWeNRrPpmMbMglLFTtVOUuvVoUVOoapEZEeGTtpluJjhASsiaAxXrRIkKHoUZzCcuRBPVNnzMYVeEXPpxvIiIizKMAWmMXxwKOvVYQqyKlihHczZLlkKExOYOrrliIOoKtToOkQoeEZHhZoBbxXOUHhqRTtokmMKZyKeEhlLHNRizZIZhHbghoOFfFXUlLGguIMupPOossuUPpAaviEeJyYbBTtsxXSmizZbBRFQqfPxXkcOZawJjqQWlNBbsJjpPrJjEekKkIhSsXxuUheEDfDKoOFyhHlWBWoauUAOwgiVWxvVXwYyrdDfFBeEcaAaOHhGUaxWisSZzpybBGFgGPpxXCfFrRfAaYjrRUzAahMqNnQqoOqaifFtTsneENCTioOjsShHyFfYCZcCMmaAcCEeEvVroOAayYRgGejHaAbBrREjFfgGBtCcTSvPpwWZzwWYyAOtgYYyhPIistoYeKkeeExnzZNejJFfTtuUMfFmCOCbXLVvFfQzZoZMgGqRmSsMzZrtPlLPpzhNrmgUuhAaLtFfxpPWDXYyhWkaFTtDdWryYBEeVCcOoQawWoOXRrvpGBbguUpTtPuvbCUjMNnmDdkKnNiTmXxIToXVMUfFNnPuvIikWwyYYifFfFINnVvoDRNMQqmFHhNnrPfYyaGvVaIiEeaFfjbsjcCuUuTgGOogjJGGgtfhHpPTAagJjybDdsCccFfHhRrzZAaAadDIRrwKuUkWivmJjbFXujiIJUzZiIQVvMvVVvsSmHhsboOpnNEXxaiPpVfRrFvdiDQqbBKXqQZzoQUuYrRImsJjSRZzwYyWhiXxeEPBbDdkYcfFCAdDmMrROsSKHMUumdDvVkKkSHGyyYYJPpZoKEYyIhHJYxxhbaALXpXZIihDdMmflOcwYZzyZRrSsiIzvVIiWeESqhuUlLoFfFUuBbfXxxxXHhtZuUzTVvxynsPZeRQyuHOoVTtEHheqBbQcQqwWTOpPwmxOJjZzTcAgFpHHhGfXxRCcbMGDGZUiTdLWbmcpTfFyYtpXbzZIiKkzUmTOwxWwXWGHUCcuwWVvfzyCsSVJXyYkfEQpdDfFZFfzGgmMSskIimXxFGKgJAaSVvsNzZjxaosSOetTcCKXkhHWwnZezZEsuNnjGgMTkTtsNSskYyXxCcOoogGzmMPbPDeubBgpPGEAaPpgGyUutLlIHhTtdtTIiZXxorfUuFjUIittiIiIfiHhNgGniIlvvVtTYEelEkKsSTtBbUukKmGiIowILliTsSiCcZzwkOkEeKoHhPIHhiXFXsatTEeMmhIhXtmFtTfJjMTooYyaYXoOfPpFUlLuxQqyiIdkKXKkCcxXCcXYyzZrsSRpeEvzfFDsHUbWFXLlLiAanQaAaCJjSssSRagGOyYdDtHMmhGLPrRtTxfbZGxUuNnrZzgWwGoOkKskdujNuFgGqQhqblpBbveixXHhsvVCJkPyaAklLKfRrCKVvkpKXMkbBKzCWwXBAaLStTsSQqJnzhOPpHhiISlJqQVwSoOsDhHdjIiFDGIwznNVJOREVvanjOlQqRuUrIUZzuZoIKcmMCkVAHDMTtnNcCQqALvMNTmMtLwtTXbBiIMzZgIiRNnCJzZjwOoaAAGBdWApPUIiKZzkuUudDlxXirRKkzZHQqhBFfbCsScwWyIAtTwMZzBmYEeDxXBwkLxQbExlLTtNnYyoDGgKHhkZhyYdDyYqktjElLDFfMsDiMmtQQoOsXcIibBYyYwWjVVtTpPvMcCjMkkKqwPpBbhinLWyGGrRqQLkKiCcsgBTMHzKkZbuURrcCrtTkkKKRoLlLISRSCJjeCcAhLwQsSqQmEBrRboOeqdhbBQISsipPRFddQUNnBbpMmoOaCcAyYfTtzZFzdDEBjJTtdRZzrjJlLpIiKWwkezZCcMmJlLdvVmMNnsMAYyxBijEEeCceWkOtToUzZjExnLEEiQzwKfLMWSiPGyYibDrReCLvWwVvirWTeHUusScPoLKhuCcuJucCJjsQgGcgJjXppVQwIiEBbUxXuveBraUutTFffKkEqAaydDfWwXiIxplgGRVliNuXVDdvUvuxXUOWwiIlLeEjxeCcdDVpYyiTlBrYGRrgylSzewWAakKckMmWTtwXMIimttTyWrXxCcRBbDdJjETsJjrRyiISrRevDdVpYClxjJzPpHrjRVvHqQEBlviIUuRIFPJjYyEPpmMxZznczWwuvVvBOobVxXUeZGUCEeCcjerTtRhRDDdBZzSmIEZzebBGgBbYZlLzKkLeErWwOhhHHqWwIWwiJjCDBACXFgEepwPpdDWIANPzaeEAZpnWylLYwOLaIaeEGRiIdBdPdCCcLrRleEcCWwfFbBeEBuoUUYyuIiBbqoOVvpXxtfkHhKIpPuUHiPpeJQqaAjErxDWwWeEbagYtAaHhTyGkKQJIxdDZtTiIATtLycCFxsrrRvDfzQbmMyIiwiDTSsVvSeAFTlLYEFVvSCkKcfwWPhHmyPpYJjsssIEWZxITnfPnMMSNfbqQbBpLlPBFYglOsXxKkSsIhcofFOTBbtUHwQtTSsusSUQOzxIilOPIhJGGgeJpPcDdTicdOxXgBbGQUuqRUuFwzkKwQqaJptTwWaZHYNnHSddtVesSdDAZzItbDdnxXNVkIPirpPVvRcxunGFhVvAaZtTFRZzSskKMCSbwtrGgRhVtTmZOuUUBDdzZoZpPEAEiIXKjkKREeFELtHeboOAeUvFoVvOQbBzdDddldMQoORSwIicodHCgGoOQUuqSZMuKkmMUcCmzKkgGMmbBslqAXfFxXqyrRYAMmqXmMUbBfhiqQAahTIMJjBbGMmeQqaANnSKgGkmWwMdDpVifwWFpNlLnCSsSJjhlSsVvLcChHTQtTqfRNWsSOrRgbnRFxEYxNDwWEDTtJjigGnfFzurRIiWxRDFfJEeSHhEOblBbLlBsMmQjNMCWEeXKHhyYjZSszAaKthHYcCycjZzBNnVZzLlZeqCcaHSnNsGFtTfijJdWlpPeELcrMXxMnbGgGDddDnNsgDPawFfBrRYpPieeEpPTtUuERnNPlbBPnXdQrCcRzhHZIiDqQdtxJuUrPpRSyYILlhNZzbQqCVxHhMmtuxpxXZoVvVyynCcCqTIwCvVjEeQEYoOyQEeKokuUmMgvoMoOMMAamjXxNnuUAoOPgNXhHemMaYitTRdmqJmMoBbwZWsSwmMkKhSTtQQNnJEeYiIuSObqQLwKkzKkKkNnZhHhSfFUqQHidfxXYiFkjJRrKtdUZsSXtmYuHhUuJRGgejlgzHKkUQqureERFFffJyvVYVbIigRvrIiRVrMiImwZUzZuzqQgGWrOrLldziSBbsaAQlLjSsEexOdHhDoHaAPHLiEeIyYazKkZRrvjmeExXRzNTtzZKoWsinNaAjJZsOoJoOlLSIikKVHdNMBcjNnrRlbwWBRrWkNnjzyYoOolYwrnUsXeRyQIdDuwpPvIQRrQoQsEOPbHPXJcamIjsSJoCWarRHibztYuIGTttfFXQYyqlLxDITtigGHhNUgGgxXFjVvDEyameoDdOpPDWwKDoxPXxOVsSFfXxvUuJyYTLltXxMmfPpRrCCjrRZBbQVFsPaAxFfXvFiJvaFTRPeEprjJIitVvSsKkFiRBSSssXlEEaAdDFzZqLKkjWwgXxJCeVpPviTcUuXEexpQZItKkyYTRriiIuSXxOosYPURrNqjJEeYykspVvPSaAKLKPpqQfFvYySsFoWwBXPgGEkhHKMGkIflxWqQEfFPRrpfHnFYydDwdFfSOvhIoOfPpcCeEFmAaYyIUutTIjJBmjJMbiUwWgwWDzxfFeEelhAnpPNtbFfgHlBsAHmWJpHhRrNIVueESZCUunNjbBvVuoGghHEegAQTjJLmMHoOhvcrlyYUPpTlGgQLbfOoEKPPpdDeEhXovYwHIisoZmrRmQVvhHcCeivVIWffFIlpXWVjLlJIiFVRriIveOoMGGzlLRilxXBbiGJDrRgrxRrfrxrecCtujXJDjJdjZZzzxhSiIsHJQqlbBGnNgvVNYVvrTtxqEwDlzaAFxXxIIOkKogJThWwHGqQgDdteSWnNwWwsPpysPpSuUDdmvqSsrtdrRSYTtAfFKkHvpOUorzZUjVvJStTzZsnhilcCuGgoOUbBeEvVeKkyYSsrRElwNtTPpRiUehLlzYyRwWrwTtuUpcMpFOoaAwWaAyGgrKjXvVnNxEdoODFIifKkezZtTOQkKICfnNiIhnRDOodgGrmMmMmMrRnNWyYTiIIiPVvdDpBTzZXhHoexRQqHsSFlFfXBbreERIGgixQTUUkNnIJjryYRZtOnTqYKyyeEfFnPprZaxKjJvVkrdRryMjqQgGrTThltyVuUbdkKZzaADfyYFSSsFBgOgHhAaHwWorROgGjaicPJnsZzSgJWwjOTcWGgrtTRxXnkKKXxQqFUufkdZzxYzyPpRczBJseBbEuAYyjdwWDJwjPkKwVEAIiaSKPaAZzpnFftSMmFhHgppcLrQUurrRRRrqeZzZgGmzZIQkicCbpZHCPtTpzZDQiAanGnNpLlBQqqueJwZPpzoUUyYuuxXLYygGytUPozZSlLUynNRduUDKkOoqmJjMFftfFTQtTkIcmMbBjJNnCorRkKWwOoSpPqgxXdeUudrYlrIhijbBzhqHqIiSuUrRqxXQWlhHkrRKpPuULgZkKkKFUiZTtzIuMMclNnPojGgtyMmgiIGYTZzSsnDddDoZQtTqBtZKpPEehHHhkzNjJzvBAOZmtmMTcCMErRJFGgCMmbuakHhawWEqQQSXVUVvPHygaVvqQJpBbRGzEDdeTtoQqQvZzVOBNLjxXVXmGxkuJOJqQjTANXxrQGYBblCcOofqQFSsmGMsRrSLlljJwFfWAKkaxXLGFeEtDvyYTvouUGewWEmMUMGhHlLtjJsFfSsSTwyYWDdOoDxAJiCagVvlFVXyvpPNnVvOCBbcfGEKkArxhdDkeBbOoZWESdxXxShHfGDTOotBrGgRKXTCAaIWgoUuVYJdfOMWwwCBSCBjlLJbcQUxsDdbBlDdkfFWEDvVGSwIIVvWwejJeTYdZzDJVvjyLltdDhYXJjZNkTBCcNrRAPkYyvkKUnEWqQEdWTtKnfPtIiSakKnJjBbbdDyYBNAsOHhypPsSDdLusSUfJApENRrTXKaAkHFYqQyMsLlioxXLlOmMCcJdFfDLlZglraJjAVhHvpPoOPNLlpPaAKVvkpPPpjJnBbcCzrWwYcSspPCtTcpxXmMITtzZiHhoODibLlGVmMvgHhVgGBPpEptpbSsfTXxGgtgVatlPpFfcCnzZNiUuILRcdDGgsXAueAOanMDOwWkKWwgZUOouHyYFsXQRrInNllFxrdFfLlxXDRQyYzOSsoTFAvzZycEmrfbIBbZlLinFpPNnMLqQdbbBrRqKLznPYytBlhIOoDsmMgdDGYHhjJyrRvhjGgSFhHqQKkfYygAafFUdxXDebBIduCcVvUIGqtTZSsyCbqQqQBsjJGcCjqGnNxFxsVTgHhvwhRrVfKkRjvKkkrOaAoqXxRrEkKWwDBbdqQcCCbEClWwPUjljJLnjOodXxDjCsHLlrRyYzZvEegdhhHvLrRlVsgBbiMNOonQGVtLTJgEeyUuYdxtMyYtTLlOymyYXtTrkmPGgGgpBbMilSLtmMkpGbBLeQqvauUFfLVsSvgjSsLOomMlJvGdYyEUUobbNtWwFFVYxXVvRrMmLNnfKSspSBXyXGuitTzjNngGYyJZDtPcCpTdKZrRQuQTEMXwWxXoAaDKkdBVXrfwhsMKlyYhHkKQaETRoPpPuWtGdDZzdDdnNDgggGoeEOUaAuRrRrkSsDpPHMmaAhdcCnSsNsSQyTtbiINjJflNEPOXAQDdOoNcKknNiIbHXxlLPYyIvViZzphBrRbBbopSSVWwQqWGgFYPMmFfSsEKrRUfkEeJjIkKBvkTEeapTuoOUtPIFSbtINzVzTsxMLQCZzZXxqWmMuUrhFbBEwmfFiIlzUzZEiDrjsNnfJjsShHDdEFkKnQcCqQqwWNfBIuUBbKRcWYywapvgGJPpzFfKkTvVVveHxXhSpPhpfwWjqYuUxSgGrhaBcuAaaEeeEyndDaAjggwNiwcdaADPpCdFfDWAarZzIJQJeRrzbBezZeCwnwbzHhZoAaqDVCbKkKDdYxbBHNFaFtTfUNLlqdDyaXVEjHOgzrRqvVQqfIiRhHYxXoHkjJIonHzZFIiPrEjNbpPJKkXtGgvVTvZugDnXaANnLGgUuTDdRrtqQGgqxXkKnnHUuEaRDTKkAcXxCnzZNWQqaCDOrRMzZbBbDkCYrjUlbaqQqdDtOIiPScxEqFqQGvZsSQqfgGGQwWFJjfFeEfRAaOvVHkkKKhtwKkdrRiiIgGDzZqfFQKhSfAEeaqZLlwEdJAHXfFxhUsSFbHYyaOoqPtVAacCBbfFIjJEehHlkOJjAEmMNnaJjJfjJOLAaleYRfRmmaaMmBbJjNnsmYwLNErtgfHTrRpPctTCunNNnbBMuUxvZzmRamCOoHKfFxXctTRdzgRQslsPGgZOoSYDdWTVjvVIjJctSWGgwsHhTCoOwWWDbvQoRGEekSTgGaEBScyyYAaSVvcXdtHXlWwBwWfcCFhHWaAYyaTttJBXgGkKQvKkVuvVbOBVKkaIdfaACQjgGJgGzeEFtRmMpyjrkQNnOzCcRvqQRxUFwsPpUFfcCscCfSgGsCfFJzZllLBbUuWaAybBIylTqQjCVvScTlyYXgfSKyycgeeEEtEIiMmZzMmmuVvYOoMFYzqaqQXcCxlyAbFllLLltGpYyAGgaxUuUfykxAtjkKWJMDdHiiqQIVvfFJbryHhuUKkrvVduvViIBVvQDIiUuuNsVeDwWdxbtSAjZQIVKkjJbByQqvVYSsgGVvzWlZMxWUuJEeMbBMIEeucTXgakjJoxynNYMmvVTZzIsSgvcCaALzDdSZpmMuUmMUXFJVGgmTtCcJqQKkTtjMSSsylJgFuEHkITmBCeUIiqkHvplLNGgkyYrlpATpImIinWoDdtKzZqQkumighsucGgXxCZYxruUwWRVwmAvtUMZQEeSsRrmgGtpILiZwEeoBaAEeTCLUulPkbBGgAZHYyPpBOfHhPEjxMmsVzZCXrRWjJBbQzuDJjLCkpHWtTNyYLdvazCpPvVqPuPVvgHhFOySqUuQwveCepftVvmMwogyCVUWgylqxjXxCzZWwPpSRTEEjLFfgGhOoaAtIGgsmzBDdAribaecCiXSsVzUucCiLwxqzgxXVvGelTtvVYylkqQKtsSmgNnLlfxMvDDePpEdmEetJqvDdoOYEnEzDScKkCKBbKSOFfXxoZznbsSBqQEViGgtTKwWmMYCmMcdGRHDdqGgQiJOnNmMnNCclLiRfZrEemExXeQjXHhJjCBbtSsTVvaUUIxRrCDkQqrhHsSwWeJCBcjJtTCHhbSsehGUoOuSMGDdrFfRVQCdDtUXPaAazZqwfNneECVvceUuEyUIleTHUuhbywqLlBhAaBBJKLlThExXFfebXwaAPyMmnqaApPQffFcZmILVtlXdzMmFcjiGxXZXxjvVWwbBeGznNxDHhdTFYgNNnKTtkdBSsjFVvjJSQRrzCjJdbBuIWfyOlLQqTYXciDdvVFMzRrdDPKKkcVendpbBZxhKkDAxRjWwJrXJjuxzaeEuUHhZstEECKzOoaWwQjmMPUuCtTtTHhcqrRzJjnfNTrjmMJDOodIrRidsvrRkKFPprKZNiEMImMimjIvKeEqQiIkfSCcuHhEqEvTLZJCFzZfAaeZzEfdtTjGgJYPpijdocDoeAFJHqAaQRVpPVfJrhOoSotyYTVFfkKEUuMmrWFfqQJuSlDJkcjLvHiIxqKkQVapCwkKJjsSWEecCKIiVPPBYBTtTYNBHTqQBbfUdDuFRkNjJuRrUaTtbCQfhZbbJHhBbBbjJvnlLWwzZuOruUCctATtRHzbQcsndDRJdVDKIeGmjUbofDbvMMMPJIOoijKcLqybkKiyuKkcwWBbzVMmSsOlTbBzrcsSLnpPYjJlEYJkIMoasltSRVnAaDdDCpgGyYLlezhgRrACcJcEOoLleNEearPgGErUurFDBEekKDbhJNnjoOtWYZsVpPomTRrtkOhxuQqdYyDUxMMmuORlxAbZJriIjJIMWYurwWRMmrRPpUyxGIyYzZovVoObBOvDyYWwXtzZhAsGudWwDbSsTagGjmlLTFwWftTtmMXBdpxCcHhZrWAaAMmTzDdkMgStTGFfeEnKttQqTvIisEeSqQJChghHqQYTteEOcXxYRrXtluUEqQSZzsHKuHGFfidVoBHFXPpxfgtTiIJjmUuMOokKCFnUuOKCwWclxoWeZDdzEYatHhYJwBfFSnAfdMmDFSdCkAaqJjNnmZzvlgjQzQeJoYTZbBzwKTdDCZzlczWwuISbhbBHBsNnmsSZzMTfqQFGeVFfVvVIQqSGuMaAmMDQqnSsMBbXxNnjLlVVPFEeucCUIVoVvAJTAjJZHhRXrEecyPpWYywGMaZzWwIibuMmQIaAVydtmMVvkJOojlMmwjpvpEenebAdOHanmrLMBHddJnExuHXGDdqONZAEzyYsivmpGjLlGeEzYNOcDzoQqaAkfaAFKOKkfrRblLyYZpzAiaALlAaELnayfFYAtYqnuXLHhXQtLlmUjBbjVrRujfuUKttqQruKkGummUIiZJxDnNQrRPmBqsSQFWfVnSsNqokKflFAdDaSBYyYOKkwYykUuanNHhEeiIxteFejJXxaYrZmwzZQqZNnKQqHdUzczkKoOwqQFfAIjERjvRZzSywivVFfQqDiSsGSandpPTtMmBbxhvdMmDdSZMSsmZcnNyYzOospPGJzZuULOFfoQquVfFhMuUvxxTtXSsxWolLUuOPpwWPpwZCcCFflLRkKeEOWShNgGitThyKkzfFGMfZzPokKCIiceDfozZiIFEMnRJBqQgwZuLWwEekKliLoOgueIiNxXrRrchHgPonAubhHUuDzzxNneVvWOqiyzYmMWTTtBbtcCwyZYBbIQNnowdDEXZoOvVCcZdiIVvBrnNRUaNOpGXxCqQRnvzZVEUGzZlIUzNnbBEeWGbjrNmeflLOvVLlFdEOpiIFBQqbgGmgZTUhHuhHtYHIgGnHswtTeERroraAcNnzxFfXXXVmHbBvUlsSGgjgSYyZnNCzzsSbBsDVHXzZDCjJsScNaAAMmsUugWwIliILQqdIiIWYsreEVgGBbJreJiahTtHTtinNIWzZZCZvVqQFfKxXkzqQxXZkKuDhkEZzKkezQqWMzRyAEfETXCcAKWoybsYQqyfYyLFOQvFwfbMpqRHyYhrdXjrRwWzuMMUmMgURTTkVvFJUvJJujrtTRJMTqxlxUjJNYyQyTNlekVvKIUuoOaZPzBFZdCoxXncCyZIieEgpPJgPMVISsSZeQqaznoQdDMmgxhUXeNjDDhbmbHhBlRMWwNAhoDaBENPZaAzVbEeBoUuSsOPJWLlLKLlTDYRrPpveFfEiqyYUBaAAqsSQxjJXmgvVYCRxrznNrRfOoFatzLlZjaOCcvifFfpvvJXIixmNdmUnNgszZivnRrNvEgtdDiUZCkKxUuXLUuctkWSsZztyEeOjEqZqJGbBLVJuUjMVZzeEvQGgKyYcDyYsaNsbUuWjsSyTAywOcCgGXLkobBNfNnciItTGNnhbiIaAIiOvDqQIgkKJjhZzUkeEWwheLTxllLLyCqQoyGHcPpjLlVTkNpPgsGmKZtaBbgGwRJjzXPDblLxPpMJAtBUgSQqgGcCaRLlrHTxdVDdepPIihHEigKkXwdDmiRQCcxXqlLjuUzXxBaXLroUmqQGgsSXbBuUXHeEoKMOpwWlLPvSzywwWbBTHBdHhbdfRRepRsIiSuUwWAnCjaxXxYyXGHnNZEpPzhHZMmsuUSxUuXPcgGGgvVdLJjlyYNPpvrsTLcuUCSAtTrROmiKjyeLVvIiuUyoONlCRZtLovZCCcUmMYIMmBYQZzlCkpOogGmmAamVEeBdFOBuJqQMgECciyYkddDvDjrNSCqQqBZhraTRowWUpPvquTtUgGQVNQqyYVjWwDdBGxXgBzHFqcBAnKrlLfHhFthbnytaAbOoybppYyvkUuXxXxFfcPHhASvLeEfFRaANnrlVsvXXxhVXxlJCKjddDLsUjwRenNqQvvVUuOsHRjqQFvMmfFvBbrxXNnhjfaEuUeEOdCHhODJIyLVvlDFcCSscjzltVeQmMeUsEeFViJeInqQAafFjQoOqJzkRfBbxXVXxStcrRCTDRJjlLtnFNiIZQzZSsrRfFpJqSsAZkceeTSzAGgZXYyUaVvdHXzGgPDSsNEvCkEkKeFfGgpdDZuUtTmfICxyFftoqQYFGgwiUDRrlLBeEHhbcZDdqwWXSsxsjJfJbMmDzZMyYmNnWwnGyftIiXZgElLJzlLgIJAaCfZWmMwDxNnLTvlBbkKKkiMzCfUuFFNYpyYWwWxBHtXbBrGgRxkjbbAaQqMmHgukkKKUGOooObTtQWYdDBtELbBNniuYFWQAHQMmqheEpxHhuTcqvgmsNndDgHfFEBbuUcNJqQjnjpPERKdcYVvyXiKkuuAfOoLlFtTcxJqMRzFTtrIojAaIHhhAargDyRrrSsRkIveNsnNkksdZeNeyPeEQqmPpMRrpVQqQjTMJjtTdVmbBIiXFQqGmMMTLuULEZQXWlIZvxsSpPqQIQqEiIABIRaPpZzbZMSiTHlJeetrskcCKctFfTpccgZzGCCPYyJXQLaoOAYoOGwXxuvcYGOWToeEOFPEDbBdcEVWsYFfoUuNnRrfGkOoKVvrHhsjJSRtTpUKkufFuUUtFfTpDRrdQcZAwWVDlyYnwyGgYhPKcloOJjCNncdUSsZqwxcPpvSXJepFobdDPphzaggGGKnVvNpctbOmMyYWzIliPTMYyqZzhHzmUuSsuYHhyTVaMWPpvXDdyzUSHGMmKkIMUTJqQNnjOwNMiPtdDxXiIkKaRrzZPWwLRKGgnPQqVhKQhHuEdDclLbvVMtiKJjrRheUfGjLcCyYYOosvjfWwxumMPzsZeEfFlVGitlLXOKACcOolLGxGgtpjJdDPCUwWHhVvinNgGmKkmVvjwXSssSmcCzuULpPYywcCZVqQvNrRnviqzJaqQiUhHuIBbsaATBXmMEgcCGvSDdnUnNdqbUDxXRmMYRyYBfYyVvFjqQIhmjwJTJjaXDdGUugKYTtLlFxXuXPgTZzLMmfBaPpvpCcPVYLAQZMmyfcCmAXxaPpAayPpVSsrRQqvUMpPEegGeTbBGJjCYYlLksFGxRrLtCpPscJtuULYiWwYwmMFfLltTLcCjoSsOcAoOaFSwWdDuSWfbBuXMmrVrdDCcZdDYzoOZyoqKRJYPrhXxHTfZqcUuFDiAvboLlBUqlLIiNtTRrnxbjTAoOhHwbFfLxPqQjJphpEmMePBbNnTDxCsYCsmMbTteAtJjhHsAaKPpgrOqSsVBdqKkQqcCQXeLlEWwxwoOsSSsioOJIivtwyskKzpSLSKkqrGZDrCVvkhWwaAcMArMkKVXxTtXmhHUthnNFGTnNdRrDCcRlLentvVTkKlWyMScCAAMUuMrFryEJDdjDdoFDdjAmMJTtjefkKFsSaoKWVVvvwLPpiHhTtBbvTpQAhtTBQqfuavVsDfnNFMmdSjDeWtThHzQFsHkQqdIDWToKZzkrIExXeiIiqgiIFzTtVgbBqQvVqQsSfhHQeXCsjmMJvVrROopoTQAXxBzgGZLuJRfFycKdBtTQqhAaIiHmhHBbouUdctjJTAxXGQqlLZtkKTzgVvwIxEeXiaQzZqtdrArRNzZnGgeSszZkMmKhNOoNQZzlxNZzdoOeEGUzVxOBboamMAjfFyLlYpPBnmZzMJCceRpflLheENOiKhOuUyrFQQqZGwWWwXxoTthJevxAYQGvVgnQquAoOcCfqQnoOhXJPEKkepjyHhDFfdkPpBbBNncvdQKkOEeBdDWDdNgGWcEECcCvVDdcZEQqQqqQcCjqjiODdoVvRInWGlLGJuUNGgYAUCbAHRsXyQVvJHhFTtPHsQqEglLXxGtIiZzZjFfVSsiIjJPACrkibQqeKpPYyCcCkJjFfFSJRdIexXuzZZLMWAagGeftTHRwQzrRzZcqlfZzQqFmXAaStZvZnhHiTBSssvVfiqQAtKVbiNIinKFukepyfwJkKjMmaAvssipPIuUPOBCnqaQqxCcogGpeGgnLxXFnSsBdDYqKmQqDdMGTwUpiIOrtuUeAqLkJjmSHyYWFRqQxvbOxmwWetqUqzkIsSXxUJjgMmxYxbsPkFpPlUuyvfvVfzZTnBBOuueDgVEeGlAaAVElgRdUuDrPFfKNnmMTSslsLdLlDIWwKRxMYoZzBbiXxImTIiXDQqHhGjuKLlkUtlTvTtgwnNWqTtaLlAmIFfoOGSnNvVHDrRGVhSbBztTZcJJNJupLcQqlLDdeBcCceQRKFfkKVJrFvHWVGSstuUvEeSXfXgQJvVgoLlOSfFUuEecYZzzQrRgiDiEuNnGsJHQqxwWxWwXXgmMGVXxSdbBiHLbZzvVHhTMmpNZbAaBlkxXQBTtDlmflLNbBImMsSzVvuUiBFRMeCUtTuzZHhYVafpPtDdZqGaAgsSXfLAaeEFRrfLiqxSaAfhzGoGgdaSsARrmNAoaEUjJaxSCrcCTAvGFBPTPeEwWtTSsebVvvLPplLlElLFfeBIdPJjCyRGgZpgHhcCGRLTtGzfYyzZIiFxXjISmfzyYDdGgZpwWPgGjJgGhvVvVKkxtnUuePajFlUuUuEeNnlLYyYobBLJjlQqTpFcCNkwDeKZzkweNujJVKNnpzZanMmbtqQhHKPpnzxyHEUhHutTEiiWYjJysgZzdePpwKLBbSXuqkKLlbBsbsScEeWmoFfFDjyOoTtvOGsSwilLvVcCctxkbdgFsHhXWwxXgGQqeEDsewzBbEKHXNnRaepPgYyFoVYWwCtTaAnNfFcxvfLOoGDdAcJMiImjIjbBaXdgmuCcgQqOVtVdTSsfgmhHgpPMLygqRneEatojpPUGgKQqXyYgMBlLIieSeEsEbxvJlnbLlxXaAoNnRrqhzZHOaAZgrPjqQyBbYAGYtThpubBvxsaAqDdegmMGANoOnKAegGDQqdEUBvVcfFfjeLlTtjJzoabVZnSsTbgGzKvKCckVVvfFCeEfFkmMKJjFfckUuONdPpDJHhOpvVLCmmfzIiyYGffsFcQqCjnNJfSSsFFlRrhHbBLBfFbtNhHVvnzZTDdwsQhQHZOoJIHiRLyRDtTEDGQsONniKrYuYyxXsOpUuuTYlOWjDdZzEbBbmMxXrRBMmBbUQsSbPOZzsSogNTtIKkqdFfchvaADdVzpPPwWBIyYbBKcCUoOoOuqioOMzBbEFfPpwWRlCPNnPGfqQsTNksfaAFevWnNphlLHJRGgeErFfWaUBbSezfFZEjbZMmCbBrEeYZyXwWDkKNgDdXxGwCXxtoGNjplLIiqQCUuxXIAJhGoDdGbfsBuUvYTLHtvVnNtRMmDdOoJmOOoDdmMoAaYDAaRkKKWOowkgGVvnJjNSseEZzSsXPpAzqmnNMQlLxXRSsjJNYYkmMyBbQtNoTzGlLgiYyKuubBtqLfhrXEOxyYSstDnoONdbPgHhGptoNnOwUuyYYyINniNHFciqGfFgoiItFfTeEQqJkRYXxIifPmRrClLWwPWZHSsErRuqQIrnWLLIOoHNSWNvVnpZzXxkKPkKcCwsuROuoPkKiIVhayDdsDTRQVMYZzEJjjGxXiiXUufZaAVvQqLFfdWeQXRVvGNngynJAaJjjVvLnNMmbBxXUTEfFRXRFXRGxXoZzOrRdjgnNGgILIihDdHIsjJJjSrKkZMmgUugHMgYyGmhmECzZcfvwxPLiAaFwEIhHfFiqMMkcCQMmqKzOShwWWkKyVOxHphBvVCcyYeEbHkeFrRlLBlqxXLtuLkKRCTtVYylJjjJHhtIiqaGWGgGgwOXkKJjxfFUJczhHrRsUvinPjyYwBbMhCcaSbeELhGByYoOjJTnNaHLWwUuEnNXZdMfNnFmmMGuBbSssSiMioGgOHVosaADWfNhFewXLFiKgmZzepxbOfdDmMtTVjJcCklKkCcQnuxXpyNnUnIaAiNzqnNdDdNnDPAahNnHOoCCctInNHyYhwWQqEcjGnNJvVbSdDPbFfBUuRrVvAapvVsBlQfBiIGgbaAxXeQqeLxpPdAawWDbrIuUfTtDgGGgFGgXxfdfAVjIohHOfVptrRTSzZfNneEFfvqYygGzJzZQTtqcNFfncFTzZtjoOJjJjopVvXOdknNdYqQyQqEMKkAYdDJjmMedJfGNnunXAWwatTxdNnDdTeEagGbBzZGgAdDuUgUuiUyFfhUuZzHTZBIeEhAHcSsChJSsVvMmjwcONniMNnACjxphBIipoeSqWwEeOYyqqibBVWUiqYrExSEdDejJdDuBbNRWypPLYyOZJKwNnLuUeEJaACSDdsbOomEBbenDhveEsjdDSPpLlzFfoOISwmMOknZiIaArcCVkKttTSZzsTvdSsDMyYJdcCKcCkDVAlhJjpwWhAaneENXJfFqwWIZDRMmmMofFRRrHhGBlLQqFzZfxSsXvFfrRjfFoOhacCVvATtCcZGLJErjGgTJjtiIUyXAaiIxMTxzuFfDTEefIyFDIBbhuUuUPgGpusHCcKkWLllQqBosUnNMAarRmiIoOcBbCyxNLlnXRrjqvVqsHBFfhHbzqQWDdOjNnbBQMDOopPrIvVyAExnTtGZzpfFzoPpOocCOZaJHhmAagGmGgOVxXGvVKOkqesSqJcpPWitQcCcRrNYYvOzPXyYmMUuUTVdTtDvXvcZzkKBnWwHisjYyMmXnJjNiITqDxNpLHhpgGrIybgGWApdGrRSgBNmmmRrMRGgCwDKkIglLhAsSQEzNnAavVvvVbJnNCyXxYTkUuCQyYqcJVgGvHhqQkxwjJcmnJqQqSbsSLJaAjaABIioSsNnesjUgiIGbBudrGgXwUjJZNsSIwWdekKlLhHpEePHhdnvVXSsOVvoyuUYyeuUXfrNMvVmBWwGnNhHownLlrFyOoqQyYYtkKcCLlPpqZzmMMmrRQHEkKeMmtTIisKUukcCOyYoxXcPlwWYyLIveEMmPJoOjsZzDdDWwPpdXxEgUuSsmitHGgCcIHLaAlOoUuFuxoOQEeaQCcxaXxQLchDOCBbWsroOhSsXxsSMmHSGeoOEgsqmDLDDdDZDdqfVCcGguEgzZGayYOkKoRrBaAEhrRTleuUfrJkxBbMmeaezMmTtObuPpozMvHFfTpPWBscmrfNnTdDtiIzHfgNUXCIQqpvViKJjuUvXxCcBTacCAoOiaELlvVWwQqvEenamFfMAPpNTDMmDshNnyhzBbNTjJtnAABbFfaZmMzPjAVpPvWbBZmzZMWfXxrSsuULloDCIeEtCjEgjHiIipoLpPXZoqJjAaqWhuPpDdCHiSFhHfAaoLGyTtxXnsoOMmmYymNpFpPNtGVvgltTdDLSsiXzgGwevVCcUXxhHRruDdiSSSbByYyhTtHYAaaoOHhAMmMEebGgUuzZBpFsoOwWeEfeytfaEipPZzIspPtdFfkWwmMKIWYBbBqYyZWwFdVRFftTSXfPpYlayYImMizXivIidDVkKjYTtyqABwdXxXRIhilLkKFQqTPQuQtTqOUeOokKIiEbFfcDpDSsCcbDrIigAiAVSuUsvloaiPGSsfxcabdcQoRlyiMskKbdrVtTvHEJUubBUJjuljfFJqQLcNnPuUBbpugNnzmTtMZOozEpPZCNXepfDdMmirVLbelLhrJRhvVwWZXGhKcCkUuHgLTtcyPEsSskBbCcKQqtTYSteOfFDdoWwZfFzFfTZUAauztwYbBLlVOovTxKfzZzZNnFLlClVvWwkKLEZsLRbAaLtIPvdsSDEKkXJooLlOVuxsdDSsNnSUnILvrbBLPFYQSseFHhtxXTSsARBbbEVcCeWqvHhPPxthHjJTpPttTLlTGCqyYSUjbBUTtXpPxlLUHGgAakxBbXlOpChEtwRCcIUuVleIiEckKEXxdBIoOpPJvVjEeGggdDSsaApIswmlFkaAWrrvVdDKkRYETkKtenotTONyRZqIeelNXeoOJuCcvVKwoOjJPpBbJIbMmXamSscolLOCeESBoObYydDDAazZjEPpbjJBPDKkBbbegGZPuqDDRrfrJjpPqHDQMqzZtTWiIEelMmwMmWcCHBbaEcsrsXxilOHhLlBhmzZtbGSmMIlgGggYwllLsSNInNHWTmMNntlLAaMmQKmJmRrvJyCxShHqqTIwXxWdSVvWwEemOfFAaodeJTKQXxZzCcHzdOaAXbBiiIIeBqXlKWbdyMbmWtTarRtTvVWwiYwWHhILPpUupcCPnNfjJFawDbYygakTtVvKwuUWWqKkiIQcrGmxWlnmVQqlamMmdHhhXxavKkwWlLcCiOzLliLocWwsSCJNDdAerojvIiLlZWiiIWwgdfJWtTvqRrQjLsoHZNdDjswWlSsbmMgGxWwcfFZmCRrcxkPcFfLxRrXSslFYpKkKjcSdDOoEeWwgGTtIEYyVPLBQHfjJUwUoOuWnJUjuUJDKaTtyYASrRRXgJjzBOoFXplTtgTzZosSeESsAUurHhcAqNIBblqQxFfrAiILlaPpRSsvVfwHhBZtTziIuhSdZVPxXrkUuLlKRxxQqDAOOxHHhiHRrAkKSxMmmqQMZzGgyYMmjRrJfxpKWIilPpQFfNnqLwWItWmbBSsMOhHWwiNoOdDnaAeEBbIgMaAeLyVLNrAaRnIFTTpPmMpPuJROzDisSTnNYxXaMmAeQqUEdLlpBaApcHVvYyhCZGggkKGAazZORrxXSsIiaAKPpnSKtmNnsvVSJQqBbdCcDUSYymMzNRrKxkEAXJnjGkgfMKqnNQPqdDeFnNpPKxWwdDjvcYZFUrRuhgohHtMeEuZStkKTsBcCxPVvuUPCMJjBlLHcChXxPpwSslMmDLltIBbTtuzaYykKARKkrQqPmMpgdgAamBuUrFghPMPpmfHhGahHxXCyUuYtPJNnjpomMXMWotrnNRRrCvpPhULVvlYqrEzpSNcCKxyYXkfFoOYXpPXOFfQqHQcCswYyWCoLFHzoOEeQqxPtuUTxlAaBgGYyHzZgGXXyNmMnjPuuUZzUsSpiekUMmuOjJzPpjQqXdDxfFNnghsKfFhkdDoayKpLlISsHpvVEePrMiQqHHhhMPpmyqOxkVvdjfFJIDImMkHhKWwAePBHhSVvMGgnNrRmqKkxfBxXMVKkXnNxlzZXsSxBaAbLCpuUPLlZzSBgBbCcGYjJGtZzSVJjvsaAFUlLJSBJpPAAiQqoiIQqOIiISQqpxXPsMmPpnNgAjJTtFpOocCRfnrdOyrRWwMgGmKVUpubBmvCGgyYcCnNcxOtSsiMgGtIaATfFQqZzBbtIiJbBucBgQqGVdDUPVQqxAqvaxXAOobRwfAKkKYywHxdGyYgHhwXxYUumMyXrwWRTlHGMRnuUHZpTQmzOMmdDAaqVvlxDdmzZMBcuUOooNnctvVTEtTHBbhXFfkKtYyTsSEEyOoOeEdmMDegGETSpHelLEyGlLToaVsnNbXxJpPehJhHGgQxXqzcCcJItcSIBbAQkQmHudlLDUZuXxaAJyFcfgYPjJKkLlBbPpIwXsSAugoACoOXXxGggGxbRvIGiIbXxwLYsSbBfAacSsCnNkXxdFdwWHSsPpiZbBzIHixXrRKAadDoORSgGwWnLAzoCKpruUNnIMVvXxFVvfxXpPyYrRjUuOoLRrEelEeIVSScFfCUEemisSxfHKkNnMmYyGMmBAazgGekKJjErwaAWnkOLloBbhHYaAzOPprQuzlpPLzsSHhSsOLCclkKqrRRpPSsrVvLjJRRocCVvkKyoXIieWPpwFfCfFILkVvkKrRxXokaKkmyYklfFLZyPpmZUuvpEekvVKFwtTWXWwxkKXxfImMSsibNYynrOhXxaoOHUGgLwWPoOgzeJjPzGJjgXxZAkpPLlKUuvufWwFTtvfCcGmEeBLTtlyYnEeEeEeQqEwCaAGOSsovHdgGCmdDFfRxFRcCsSEeOoeElLLwUuzwWZdRpiBEyYMRrkKRuLkKlXxidgGHhkDJZzVUuWCLTRrxLlLDXCfFcCAXxeYRINsSnCcVvyYieEwWMAaCcAEAaerKknNCcVepazHhsMmUQqcCCjAasnNqQWgGuUwnNCmHjJIFfgGpPcpfjWwlTfAJjkKaKaAJjUukcgJjyaVvAHhYMjCcJYyIiUXwWyYEnBbJjwhXWGgBbxEeXwJdDjZzmMuUAMOgGoMmGeDdCyoOeCMsFfSmDFYuUgGBUaiIiAaArlDdjqnleyYrRhHbnQqnLMJaAnyuXJjxlXcUuCdiToOvVtiIJAzqfzZtklLrdDRZzeUvJjCnvlPKgWwiINRNnRmMLyeEYciIEeCwIvTeWwEtzsBbSwKkTsyYStBbWzjJjAkkKEegtTAaKucoQRrpOOBbooODdotTjWOoHGrwWUpkKPDklTtEEeEeelLLrRspXxydOoDsuKmMrvVKWxczBDdYtGgZSCYycnNlUypoOPpIiyYVvPQyjwOomMXRLvGmMnpIiFMsLlSsSmCcnNfCsYdDLlaSsBbruSsUmyBkKAuURGgrPHhAajGgbBxNnXgGxQYMmUcCGgwewWdWwDvVFUwWoXEYWweQZzWrnoONRwJLljHdGpPFfgFfFDdnglFEgaTjJQpCUuABMmTiILlpGXPpkwWufDdDjlxHPpfFhdhKDgGiNnPpxXAacDjnUXxuNQuzZTtqyJFpPfbBBEeGggkKxBbUXPZzpiQqIPVYyvOopxTtXxHuuUoOVMLstwQqWLbBzYxdDTpYQLlLCuUtKkwHhahHBNnkPpvkKVzZKfFjJWswrrRBXxbafFyYAiIRHJjiLlnvVgqHhkrRKkrFtaeEcdMpZzGQqZEPGKZQexsSCOoYyGEXxiYhHDHhHvVZzhghmMOoHGdSsHlLhyYwpPWwFfiCcIWgNnpPGxkjBnXxEJjeWwqQSsCBAajLlJbTtBbdXxTrZuUeECGVvhHgXduXAayjvllcFAaUufHhCUZdDzukKnisMmnPrRYvZuUHhiZdUubqdDQVvBMgYlLyhHGQxkjJwWUYiXoOGXJgGcCjxtyXxYcblLBeEClBbvqQnkKLTtlSOXYJyYdvWglLjYxXwmDMmdTtcHeiIErRbBSIPYiIyUuKkEWDdboNuUngclLBbCBqQbpqasSJiIjZTpiIPjJtxXvLlVdDgUXxupPGqQIioOfLYyllLWHhwpmnNMVvzhHuUcCZJLldDxRbgRrsYySDdGByKLaAHhwJjgGJjWeEfQqFLlgGlyYLtrRcCMRGTtTyZeEnBbIiNakXSsbbBqQGaAgTfxXHhSHhdDBHciIQCkKwWAaQLlEQqNngGWSusSXxwJjRjFfcwTgzZGGcCgRNKkhjJFvVscSOoCcWJeEWwaAjABPUupIWwiyjTtJbmMmmuUhHoMjrouXxjJUORKOokkOBmoOMFNVvbBMmNnBbPtKKJPpOoDdjfFCuUOolCcCckUcCMRrCQqcyYHGghmuUMlLrLGnDdwWUheUoAaOqtTDdQMcCmvVuaiIzTCeqmsPpSKJPBbknNKKFMZmowbBBJjqqQilpuUcgBAazzZzOtQqLleElQqyYLVvdIikAIkKhGgHSyYTdDGaAyfFrkqWEewmMbDdBSFfGPBaTFfVTuUyYlGgLeiAsSUfFfyNdDDdNvEPcCpqQsMeEdsbjAasRrGBbgWKLlkJjTtguUGVQzZcnNEJgGszZMIimMmjVkKuUyYvyTMmzVqQvIiZNKNXwWdDMPFXxxUitTRrmMlkKeEqqQQLIXBFfLlbfFJXXxdZgiOdnVvlkwUARrXyGiTtLHlLHhWWwqQwVnFImQQQUZQqCpPcueWPUSsZGSsyiyYCFDdfcSwWsSsToPpOtKhHtlKkLoOoOIuUimnbBDnegGhHPFXxfbeEBdDpGcCgCeBrRaAsSWPpIiwLlqwWRrnKkqWwQueEqQXxfgJjpPdDDyYdEJhHYyjIiYiIDdlLLSWwZzoRDdrOpPqkwGKkSsgWBwWHaAEYRryQwWJVvjqNxoOXneQqhMLlmiIplLPJjpcCOrFdJwWFcCeEqQSsXxfeEmMjDfUYyCcVQqvlcSvFfBlwWNbyoFRZDdkVigvJjtTFfdDoOVGgZkEelzZrzgpiMsSyYBbHnNhdiIgAaLoOrldNQUalLAacXQoOqxBbCATtnJCNnlLrLlpRASpPaAhwyHAcCahvVVZbBEGsnNSHhwGgGkdkKpsSivHhmMltcCOCXxmhHMNnrRbHJeEjebBEPpqQhdDBTZRINnwDdrMAVvEwEjhmvVciIUuCMPoOMmrETQWwwWvEnvxXEjJeWwKdDZYtZZzzTfFFHhflLytTWwkKAgVvGazxXKCcqTtXiIoOvljJlLLsSDwWWvbzQqZyfUuFnoONcCeEuUpvncZaAzCNEwWynrIEekKHUyYaAuElEeLfgmtDdzFFfEJjLbMaumMHhcaEeCWXxwcAQZyBbYzGmUakbBKRrdDHjJcCXPRrDIiDAaddVvIvNnlYyLgGVzJKUaACPpcrRukaJwQyYqOBbKkzXixBbAlLqkKQaMmhxXQqHlMJUujmXIiFfJcCACcaIOoNnoUbBwRrlTkKtoOqQIiqLlgGvvacYAabbBIiBRucbVBbIipjJfbEUueXyYxEeKkrbBnNuUYDdNSRnNWwtbBiITPpPhHrlEjJlqpPQxZzbUurhHmGtTZzyYgsSydjAKHhqQkaWZGgfFyYAJjaFqCuUvVSyqEeQYRrssSdeoOicCuTtBbUbBlNfmVvUFhQvqQVZznMmcGgLlEscgvCcxXVjJBPpEBSsQqxXRNnrVzZvjAabByXXxxUuUukAaRQqFtWwnFfPpXjJWRgGWJhOoagRrKBbBdvVHNpWwEeZJECceVvqMmQbcEFwSJjwCcvKuUkVZzyYUugGOobBBbWtTRnEQqhnNZzqSQqsQWRrGgwnNHdDeDdWMPpDdeZzZGbMmBuUsSCXxiIcJjsSGvHhbBgXZzuUxyYevVfFnRMvQbHJBbGgSwWVNnMtgTjJtTxXMrlLcLcYFfyXxbBBWHBbHzZhmiIRrnNpvvVhjJWfgGtnEeNwWrRpemQoTJwnKkniWKmMCcaQBbqeEELqQbiIfPfFoJrrWzuHXsNCcFfrRwWnarRxGrcrRPYUuxXHhhDPoItTZIiOOoZzpKkPoqQBbzygOIBbiLCrRMmTlFfheEYhxXrRmcZzRrFCcfJDlTtLdyMImbAtBDdEegGExXqbBQTZzuPPRgMmvVmTtAMmoOeHhrFjMmyYKoenRNnqQEyYeKRhHnWwNoOrSvVsPpkrmMqQKkjskKHhXxbFfBpYynNPsdAvVYyZLljJzefFQqEnNEuUeXpPZDdzxbBrRqQavVaXxdbBDAznsSNTWaaaARroOjJAtTldDhHLCcDlnIiNLpPxPpekSstTdbZzDdlLzoOZxXsSBWwbPgGIuUZNnzipWgGjcRanNzFfcVAfyYxnNHhAaAMmkKCgGcWwqQqtCQtUuTwWjwWjDdvrRVwhRsSoUuZzOoOzCFHBtTpPAaQVhWwmsSjJFeWdDJtHhzyYJjMIbEeWgGwRrCOpPojnNfVKbByYbMwsbBSWbBmsSguUGhSXxsbHhkKoOaAXwWxUuKqQBKJGxXJjXxLlvVSHhwTtePpEOTRBCcpPbAaNnoKknsxiIxEeniINrEnNwGZAGGeiIWwSsEyYgoOhHgLlIimSDAWwaLAHhaFfvXvVEeSqbNnJjiIKKEsSuzWwLnuUfFNPpxXyoYVvlaAuUEIiVVQqvvNnGgvneRrENmOKoOFfmzZdvkKdeEDcaqQmTuMmvGgsIwNrcbBCqmSsfxgGXLxXlFtiIThTtHOocYyCMnNTAatStClLrRVbHyYqvSsQiGwDuaATaZirkKxRJmMNfFziIZIiJjNoOJjnnlLzZBFVvfOEoZzAyTtoXxdDfPsSpFRKkraqQLlHhWwNnAOGMHhmnNgMsSpLlJjPMaJjuUhSseEvckKCRrkKlxWEehxXvVfAaiIFDQqoOdKkAaaoOlENnOoeLWCAHaAhSsgKkSsrRGuRFKkRPdDuVvQqpxvVXMqObBLJjMTtmjJyfQqFgeLllTtLnEegSsDXWVMmvUHhcCpPrOohltTSlLGgZYGxXgyMrZexXIrRsSPpIiiErRHhBfggNnzZNRLlsyYzuClLuUFfDZzaPGgaAujlLJUAafFfyaAJrktTKRjYkNsSkcCqDuUYEePpEefFuNnJYyeWwjJoOrRSlLsBykKSsRYyIVvIiQqikmryYRFfMJjKUuYYyYyBFfPphTpwWPtxsSACcfXUuOkKpuUPTtZlLuUHhzaPxXpApPRrEenLCchHcbBCsnNSOBATtTIiVxXvkKtTqQGgvnKkTNnVvkOoDdcCrUQqEvVeGzZFfJjgwWfnNGgcCcCphHxXrRYyPFoiIOsTPbtTBQEeqwWHhpoOkPpgtTRrkyYKtjJiIvViGjJgIfLltaATaAzBBbBRwWNsSzLlZgFyMXiuUIdHhDxgGDdUuFfmYfcCFYVvRrFfyyeOoVIAasfwWpPlLrRKkcCFSfsSFZzhURkKmXxMSsWtLVvEQqeOolCMGhHRnNCzEefOIZzWwNxXneEEmaAMeKkvVWfFWxXaAwpuUPVfFFfOoVZziIuUVTtvWMmLfngAkqKkQwGgWsSLxlLXDNFWrRwKhHvjJaHSswYMuwWGVpPgjJMlLzZofFOoaAFuEGkKeEknfFNgzZGHTLlkKzZVAWrXznNZxDDdXrRxMmouUONvsNnexlLkXxRrWwHNnsxXaztyYhaVvAHTtwOoTXGgxKclLCkteELIfFZYaACCcYAmMTtaJjdUudgBbDdCEuVzBRrCcMmjJppPPGgsSbaXxjNkKnHhkBgGLlbKJeEjNLlvjJvFtTfMDPpdkKMyRrgGurVvRzLqQyYmMDdcROorCFLlHbPpBTtTfFAljJLMmatssSNnPGSsgKkrFfqQtEpaAPeSNzZWrRbBQqUXxuHhfFSRrszyKoOeEeEAOyYAaoaRrYzFfrcCfuUFyYYJFSlLsfUSfFwWslBAyRrYakKdZaCcAcCzZNnzxXwWYUuRrRpDdsSDBbhHdvVPDdCcciICbBpYFfTDKkdgwWqQGWUuOovyYcAAaUVvusSaPldDLPCfFgXMyYmxaAwjzlLZnmMCsScNLlcCkjdbUuBswWZzJjmMJxXjIYhyYVnFgbBAaGdmMjGgLlyvVYGaAxIiNnDdHiOoIKkhuUXuUJvVjgBburRIiImMKkiWIPpPQquLaPqQOoRvKTOotqQkKfRrEIieFfIFPpNHZoOzIIiaAiEeBbpPSkoCczZOKgeEGAqRrrRrLlRCcvbBVmIpyYmMEePsSiZBbFfLlzZzDnNVyYvdnttOoTilLRBbrmMppPPITgVgGgzZTVfGRrghVvHoRrNnORrbSiBbmMhNnUuHIYLlLlLGSHoYYyyOxXKGgkQfupPruUgGiIhDdHQuUqlLjKJCIiSJjIizZRkKKGKDWOoEPpewdqQkKlLmMiKksSRrLuUhhHHllfaAFLSiGgIsjjBiMmIbJFsSPpZvVtQqTCGgjJxvVXlOoLehGgHMmalLAriCcIRexXmWwYyFDhtTHyYdgOoGxXSCAaTtcWwxwWeEqQRLlweNneEWwzZsSzZwHhvVQdDaAEBbeQqVrRpPbBmGBbfzZFghHfFwWMeEgYVsOoqQMmSSsvyGuBqpjJrJWwIElgGLpPhHejJIiTngPpGNTZztUusoDLSJjoOsOzZoldOStSsDSLkXxWrRyYkKwAKsopPIGMmbesSEdRrDpPTlLHhsSMkDdUNnkKlqGgVEevPDdADVvuUwWZtxXwmHhFlGgxkKXHACcJjsXxwWSWwXxkbaIiAEMPpCZzQqrJHhKLlezBbkKZEYykvVjtMmcJjCawWQqANQiIqDdmnNdDVvBbMdPptZyZzFSxWwPKkpOoBRrjJdlLiIyMbBpPtGgunFmXxLNGlfRrUuKkPOoqQXrRMbwWBgnMmNGmIiZpqAaQPIVAIiaoRhHUaAHiIhuejOYMmzZeEJXXBbxxGuUgtTGgjVohzEeLvgGVRsYaAWwyMmHelLbBflLlVvXxTtlyYnNBbWqJjWUuqQMGkvVKIigGgWwQqmZzmlgqCczZMmKMaAmDdNdtTRYySKLXxlkKkvwWVBXxbmMmSElLcCQdZzDqUuSiIdDsEeVpPAaIidDBrRwTtlSsJqFaAbBfUumKkBbQqMtTPomMNeEeEnXgVvGxGKkMDdPpJxXjeupHhiAdDaUunNuTtUXxIvcCYyVQzVvZGgdCrtTtTRoyYyQbBqqQSVVEeNqQFhHWbBzsSZzgGBbQqhCcHZoUfkKFDdosSDaAkVvRrvZzMmfFVAkpPKuUaUxXyOgkKGhHhMmHrdDkEIKvVSOzZDdnNosAatTTlLqQtvUuZzpPYyYmMblLJjcxXOLbJjmMGgJKkzZtTZVdiIDoTtUucrRSsdDClLmtIZNnziGSsghHQqbKkiOozlblLCDdAaVnNOgGtuLFflUFBbfFGgjYMHhmAcOXxqVvQCcLlnNLlGzZgmrFwWfclLCccCuWwMmIiUurRRPQjJqjuPLaAlZtTdIiDzpwWLlvHhnNEIpPbjJVNkcdVvqyYQDCKRrnaknbrRBNEPdzZWwGgBZzzfFZbkKYPVYdDvaAIibByTXxtGgyYwWmokABbawIafFmIMrfvVNDdniwWeKkkKzpPMVvmuaACYoOQbBXwWPwWpWGgtByYRriIlWwLkKdDqXwlqQQtsSXxqQVyYhHeEuUSGfFwmJjZzMApgGcCJwPpgGWwWjCxXcyhdDHkLlDOJMtnNYyymMcChHYYKkUuNnVvyvVVvHGghGytTbCNncBYFgyiEeIYkKwYyQqHhLlWGBbcEsSypPAhHavQqcCbTtBnNcoOCxXzaAuPpqdDQcCvVUFnNDdfYqmDVMmpPclLQqDdPpbBmMrRgGFLjlLJswQqXbBhiIHxGggSsNnnNBbAKkvVyfFYKkrRCkKlLfVvFUuwWkKLlEevrRYyzZbBbQqbPpBpYeEdDyCcVvXxGgEemnkKaDlNnqDmpPyYMwQqaPpeUugBZzdRrDJjDipcuZjCcJFfQINnFfxXyPpJjYiOoEjcVvjZuUzPjJQoOfvVvVkKJjYyKkTtoaTpMhHmsSPtKkGJHhUuXxXxaAawXDdxoBQqryFfZGJjkKvuFfcTtCcbBtrRWWwbtTBXxPpSjmMJzZDdIisZzznhHNJArRUuVvGOMmhHdDvVoOkKEFfHgGtGgFfTAXxaOtToHhPpZzMmbLlBIpPuOoEzZeZzvVsSUjJlEZzewWLnKkMmNECAXxmMaJWLDRrPMZzBbEewWmpTEdKkBjJIiXxbDJjuUbBgGuUYyMmYyCYLlyPpFffFAaLlnwWNVwWvzKkZeEcSsbBBrRbVDsSxXxXdLJjNeEYyUuQqnqFfrYJjhlLLtAdtTfEaALlbKkBDdvVjHhsvBbFfxtTxjSaCTJjZzSstcgGzddhwWWwmWwMQqgZzGdOoPztjJHaORrYylLKHhIieqQEkpPVsSvvFpPfIqQidsSUuJnaLCcpEZsfFGOGgJBbjlPpDPpnNyYdnIUumTtMcwWCKkvVVvDdiNNnaAvVLUuXcwWVvHhUuogGqQxXOkKOsXiBXxCcbIwWxgCiIsBaAbScgGRaSsDeEnQWOoKkrFfpqbBQuUqYyQiIjJPyuUYzDdMNnoYyOmDrRJjCccCCcZgULQqyYluGWpsSPPJjvtTeERrKAauUDddDkTBvzBbZVbJaAzZXxCcXxNBbMHhqQvVyYtTobBnNOXAgaASsuURpPRrUurPpdDLlGOoMHhIHSEFfhHXxgGgkdpoOKkbBdoOXxVibfFBIPYnNoOZzFfpPNnrRlwTtXkyMmYHhuWCcofMmFIigGOpSLlsPrFHCCdePpEDnNggIkDdKigGWKJdDQjjJoOkwSsCPpgHhYXxyIgGGgiGcHhyUuYyYQqLlQqAiIkKHhMTtmcIiCZWwBKkaXxNtWwyYnIitTSAIGgDpPuiIWuUwDixSsXhHLlsSaAIXxRrDdCcUciICfFMmhQqbnNmOoMFftTXxRuUTIitJjbNnTJjrRuUsHiwjvVbKkBbBRrJuUyYUtTuaAWuRrMmCcOioNnEvVeOYyyxbIiWwZSszFvzCdFPXgFfjHhJzicldNnOLlNnoDarRAfAaFyYlRrLqQAajJsSYGgKkyfFAWjJPpCngIiGUBbkTtKnMtrRTgGmNGvVuUugGUfxSHhsxPpXZhHznNZzUuVgDdUmMDYYyCXEXxZkKzeHhxTvVlbXyxnIAOmYyBzYyGgUuIgGVvSFfJoOCcDdTtFkWMmWikKvVIFRhHrmFfMJLljfWwGonNOCaAucCLXlLOoRTIitrQnNqxiIwKkqOoUugGVvxXhHQWhHlwKkWURBbkCctThHBbBbghHJjAacCGZQqLuUyUsSusxEeTlLtSsUuXNnulLUDdeElLNnSYXPpxtTlqtoOwWbHhBIZzgGrREUueiiamMAlsSLIcCYygdeDdAamMEejaAaACcNntTHJjCcqQIixHhPpWPpwsrRSqjJQViIrrRHxXhpPoObOornChBuUPoOpcCUcChIimLXxaAurxXcUuEeEUPvVTRruUtpsSPqQpYyPnNEERrWJjRrwShAdDpgBMmbGGOZvNjdDmvYyKkNBbeEnjJCEecjJBqRrQbEesSFksSKkWwPBbpbBNnKtOoTKHhaQdDiIXDdDdwWNlLXxnmbBMoZzbBIRrJjZkKzqQkKZzEetTrRNnXxDmMdkKqOokcCBbNpPQqvuQkKxXwBpoOZCpPLIilYyMKkmcvVWBbqdzhnvVNIjJyYiHsSmMmWwEDdePOoEBbeIGKkgsxXSSZzsimMIwHhLBblWUuPpScCsiBbZzFfmXxRrMVecCEvPpduUaAxXeOoEPAafHhZzJjOocCDEdqQxTtgGMmekKEFIvVZoOSJYykKVCtrSsNvVFrRfHBYyzZbhvAaViZxXeEzalLkEbBFfelLMIGgnuUUupMmEaAARrGgabBVWwvpPaAfWwRENSsIicCiInmaTtwHvdoOiIqynYyNMmYFfnNqLlQcqQCbBJFfLljFbrVLKkHhmFlLfgGMomhHhIAaVsSvuUeEtZzTEnoOtgGTJgxXGLZznUuoONlUuGmNnMTtNngjDdMsaASmeUugGyYYyErReEBKkvjLliDNIiUundkZzKteXIiQvVxXqxUuEoPTCctNfFpPKWWwdTtpPDVTtvgGLlJgsSfFvkUuKVEDoOmMMKkdDmYpnNCRriIcimmzZKkwvmpZzPXxMVWXxLlMIQHhaAsSdDMmHJdDjhDdDuUVvEbBeLgGlToOtgXxGFfXxBbdHuUOoCcNiIRrZzhHUJjVvDIfFakxXAaeEpDdPyBbYWqQwdQxQqoOXQHRrhDTtXxMmdqCKkcOoMmqwWyYTtdYOolVvLQqsSuhuwWUOiILSsoOfoOFaGQqgONKwFqaAQYyGgxAaZzXhHAafpPxhYuIiURreETtYymiIMXxRrdEINnNncCinNwWqQNdDnQqSMmEesKjJwmQqMWhiIHtTacCAuBbrUuRhOvVoWHhFfwGjJCcgxyYypheEzvVViFfwMmWIXPIiVvpCBlbBLbdDNnIivpPBAzZawWTteEbWeEKkNnCYyYyVvtOAaDdZzkKkhHxXFVvmMfYyKuUouUBbMMmmiITwTYEgGuOlLSsVvoLXgGQqEhxxXbOPpZLBhHbqQVvmMnlLNiINGfmMFkGgDAvCcoOWfOogGmcleEMuUWwnNLltTBeYoOMmHeYyEZxPQqDXxduUQcCqhNVaAvawpHhHkgXjJqQGgxXsSxmvTtmPpMVMFmMzQqZfFraBbmyYMAuUFjhHJpPDdEefUVvhHwWuNLlCQyYqiCMmcaANnRmOABTtbaezZDdEXxDcCpYcxXuUCFlqQIoOEeKHhkiBYycCCcblLtTHWwDLlcCdETeEeDdEkeEpsSFCcBbcCfmmMLKEekqQSsgPpGlxgqCHhSwmMQqvTtVmMPpWsourRoOZzUNSSrRsCcsQqUuoWWwUuwPpOLliIQqaAGgwdDWmZvVNnzoOSsMBNnFfKOosSAWwUUuKvVkDduidaAcYyvVCqQqrRQDQqbCcBowWkKsSOvBbBbEeZzVpOiIoPCcEeyHhYHMmKcAaOoPpbBZzKkUvVuCNHhzRrCmMcrRvViIYyZpPpPigbBEepPoOIisSpPpPUuwtTjJOZzPpoAkKPJjjJFfqQwWEQAnQiIqNaqevKkxXOyYDoLlOBbXJjxMWwmLiKkLsUHsSFfhxXfFGfgsmMgbBoOBbZnNqQwWcCuUkKxNsSnFfXpPUutTULYuUdDygGtjvrjJQqCLlwWwWXwaSsATuUGgqDdrXNnxIiiIkVjJWsSwAaRrvqMBbvVUusSmExXeGgYhHVIjJivXxpEeLZgPpdVvDiOopuZbBmWwMzLHhlLlUDHhddDPGDdnHheETtUUGRGgrVvqwuUBbinNILMmlOoWutTfFUOJGgjFBbfyYrRjJhHojTsStfFXrRUurRgpPjJMmhQqrRHkoOeEKDuUaATijJmMdDdDHhgVPpZzPpmMvGTaAyYSSsszZtOmMAaoVZzjLeCcLlElwWLlLlUuiIQyYqnNfFJIiXUzXxZuVvxSvVjJTtgGpDdZzgYyGlLnNcCmoOrRMIWeENnuUQqPpwAaRroOjYFfyZlQqgGGhHOaACcoYysSNnpPOocDdCkzUuZZIyEeYmmeEMMeEjJZyYrRwWzFfFfmjXxJKkgCcGucCUMMUumiIBLpPuUbRrBTtxXaEeHhAFmoPqfFQzYrRyMmGwWKkZzCxXrHHQCczCcKksSHrWwkKEeRqSsUunNnkKwWnNBNtTneEJBDdbGgGGBbIKMGHVvgGfxYcZtTaACdDEerpPpPRgGUsojYyJOzZSvVsfFcCxpPLIPpTtuUkKlLtmsSkKFfMtCLOoDxmMXRpeiqQsSIUvVIiuSsqQFXxJjfjEeJsSfFwWFaYyAfJjpjJlqQLRrnAadDyDEejJdAaTtGgWwOowWZPpzYNLcClomXxJjvVpDdPhHAaMoOfvVdDFcCnjMtXxTWwmPpJjwWZtgGWwgAOoqWwKkTBbtbBZYbByzkSVsiISCcvHnNkKtTLlhsYyoUNoOQqnsSazZABbcCDdUuFJpPOyYoKmvVHhEoOxXrCcWwYylMiImLkIicCKQqZzaAphHqkKwWQPYyIqQmFfMlUuXCcdDBbFfgRHmMhxXEerlLGErRxXeXHhxzZZzfmMsSdDclBbLvVmMCFZzPmMoAacdDCOZIiqQNbCOowWpIirRHhJjfFPgGQLlxXNZzDdtTnVvemMEDoOPpzZDdbBxXciIyYyzPpkKolLOiIVvoOMpPHHhhmbBZBGgPKkTtrRyYAadkQqKLlSsgGovVOzZjJAffFLlFiaAGguUXcipPPpIGgbBqfFQzmMZCYNnypPUbBHLlKKkPpvkKEEefFLlRrRrLvVlemSsMZuwWfFUQFfqvVpDdPyYWDdDdVvWxXMtPpTLlfFhHsSnNiImKPpxIiDdWkIiKwrbPROorpBMexXNnEmqMyYcCJjmBXxtpPazZAZzTBfeEFVyYXxgGZzvYaAAKkJjwSZzsWgGANXxcCFfKiIQMVvLjHhJlMmrRmtlLxNnXlLTqPpPEeYLlypgGFrRCCcrXxRdDyYMmcOcCLloOnNYiIyoGgSsbBtfUuYHhyFwWiITKAaRrAacUZzdGVvgELlezlLNnZzZYWwpPyUbBuKfFKrhHRkbTtUubvVnNBdgGfFEAaEhHekKYyAawWKroORkaAfFAawWVTtkKuUvsWwuUSyAaoOYexLGmlLMGgglXghkKHZMKkpPIimzGbBAlLiIIimMEeRrYjLlkKDdJaOoAyAakBbKrRCpqQPBbqQkKQqZYyzcaXQqiBbIIbQqBgGfFiQqJjGZjJzgXCcsSxaAxDLWwOXxopPmpPMBbajJAzZlLraAoORxXFMhHpwWPTtDdmwWVmMvgGFfDdkcCKRSUusFvVIiRmMrTDdYshTtHSytWwpUutTPNnTtBbAiiIgGIMIUAaOoJTtjQqEemRgGaSstTACCoOckKNOyYojJbIiBagGYySsARjJdkKJjeEVvDesWITtghHGiNniISsTtznNZaVREerZzQlLqMBbmwekKEWxXHNAAaanhTlLfFlLaUuAOAaotmFfsSMvPpWwJjAOoXxHHJjhOoOjJcNnmMPpCojJUuQqbuapPJjArUuLlHtXYdEeDyhHpPCcaAxIiSbPpvVBUusREehNnHriHhybBYUucHhCrRDdsSemLlEsjJSWCcwdDelEeEeLMSsGgEtTwdDMqQmEeWdDfFgNuUwQqWsSYynGmMVvTtFfbBLlIXxBbyYUuHhBbtTHhuUnNycCOPpNnoTNSslLNnnsSeESsyYRrIiVYHLlEcCevmPXxvVprRMZsuUSQVrtTRmMgGvTtLknNrRKRrlCYyvaAVcBzyYZVvJjpPbDHBfFbhaSLlsAXiZzIxKkdDdTxXiIiIJosSOtUuhBbBbHNzZnpMmqQPTSaAswAyYJjacDpOLtKkVTtgSssSGgGMmvTKHhCJjGgcrpPcCyiIZzjgGJRvVrdDnZzRgpPOoGrLfFlGgiIgkCmOoMwDdihoODSsdHIBbWPgXxGpNuUeEncgGsStKkHfFhnNKkOomMGlLgIihLliIYyHhwWHWwFftTNnnNTscCbjaAKSskJjVDdvRrmMgRyYVvDdroORriIxnSsTtNXrRUNGgnuPpCiIcuSswWUjJmMiIzZDdTtjjJoOlSqQAasLJQqXxcxXCaAVvQqYOmMNnoyKkBbQhiQqIHsSsnjJNUuSMrRmBbwZRrNFfRrnJjzWZzyYnNBEeyJjsSHdDrpyYJjPRFfRJjrmwWFaAULltTHhufbACcaIZzmMFqQBbVCcSsDdoOoOgGulLgDdwxXWGcsRuUrOeEpPuUWwoBbDBbgCCccGPpkKdaAVEevCciILAayYlbBIiPpVDHQqPphcMmMmCjJuUuUFfdvPpDGgdbbpPBsyYjfFuUaAxXJQhHqZvVkqQHhKFfzFfKkiIqQSBLWwlYywWcSsyVvfExXmqGgQEeMebBFAtTaQqBbTtcCwWwWCpPQqzMmnVCcvNqGYyHhfMmtTFgvViIQWwPpPpDwWdJfnNFlLqQjSsPfFmMxXnHhNJjpqQiIZcmPJjoOpcCgHkKhFtXxTfGMUYWwIiyuwCqQlLLpPJWwjoORrjJoOlJGgjGgxXDiItTdZKBbkobBOqYKkBbynNQeEzzZNnEqQqQSsJjeeEjJSsOqOoQFuUDdLlBbfMmGgfhHtTSsIioOCXxcPpiIkvViSskKIBMijJIFfhJjysSYKpSsXMmxuUPqQfFfzZAAaaFssSSCckrvVuUoOwWiIUuQqARjJrsSraAAaRuUaEeQwWqRsSZzKkXsSLlxlLTtENoOnTemVvMBbEaAIrsSpPRiqxXCcQteyYtHWwFHhfhTYUuyaZzAUiTtIuHtjJuWocCOhHGgwGgekKVgGvpPECcoOGjJlLrRxXZzOmMEeosGgjJkKSMlPpDhHdFffFDHoOtTgwWGKkpkKPnNtTyYvQqHhiIXxVBEBbCcAaIMmiqQZhHzFRHhrxXGbaABFDoOhHdzZiImMAaaiIAYzZyfgfFYyEefkKkUxXugGKsrRHhQqbBxanfFfFNZvbBRrVzkKAbBafFOkKodDeEKkmMamMMmadDKbZgRdDgGrIsSiGgGHfQqjJFcCoOGgRrSsUmMuSaAVvAPVvpasSxFfXsJRrjoGgVvOiKfIiFkIPUuScVkKvCsGhEeHgodDOpyYvaUuSsASRrZaAzgGtoOPNnpdDFfxaAXBPCcuUlHhTtNnLCchlLZHhdDzaAHdDMmmhHMSVvBbQSbBUusXxuUqYysYJVvjTAatyNBbVvnrRjJBbASmMsacCeEhyYGgIimomMOMdDqSLlsQvVqQNlLbBLlnnyYNHzWwCcuUxXZdeEDpbTPpsYgGaOlkKLotTOCcfFBboBCMWwmcDdQqmMbsSnNQqOofhJjBqQnNNnrRZzENnebyYNnzmMHhIikKAaqQjMlLmbBpxXPCcHhCfFcHhVvTtKbBENVvAaovVTtOnPpgxXGCgoOGcwlLeEWSssSMFyYyYffFkKFfmpPekKKlLkCceEYyxXbsSSSssTkYyKeENnHqlLQAahtwwWfFhHOokKWZAaPcCprRmMzrRBpiIPHhCcCFfoOhHXrAvVGgaTtRbBloOLoZzOhHxcMmWWwzsSZsSVvdZzvVpPBTtboODgGXvkKVJjxurRUJjqRrghHfFGFuUfKkDkoOSsKvVYywkKKkrRzZorRUuOSokKOsSstUuTWdQtTkgiIfdDFxXwGgShrRHsWEyvVXxYeGOoZYoOPpnNyzaAjJEHhekPCcpcCKlLKHrRhUjJxXMmzrRZqQYSsyuJgLlGjCcEeROoHoOhRcCrMCcmlLUWwGnNgkKfFMmxaAXzUuDdQqAahHXRkKrRrNnxjmMGfFgJJWZzblLBsWwSrKkIYyklhHLKQOomMDmMdqPpcCisSRomMOLlAOodDNnHhGQqgxXaObBVvBGgbKkBZzWwCcgGbosSODdlwJjWjJIiLBbooOBKYykbiFfINnNnwWdbSwUuWsqtPpTdDZzXxcCyYHhdDfLfFlFFfGgSsQkKBuPpYmMyqZzQuUwWUyYBmMbaXxrRvVOojJxxXPpXCcGgQqRrLlvVAMmcHjJOoEepPhmMlfSUusTtnNXxnNwdXxDfVcCvHxdHLDdvOovVVlhUuDWwXkKAayYDosSkKkKOdoOMmHhSsXHwZAVhHvyYaKkzWhybBYxnNhNnsSoiIsSOmqTtCWwcRrPYywWlLpJjjJhHFfetTEyYSsXrAaRJjpHhPnNRrrLgGlRrbBNnRjhHJqQbBxYSsyXSsnNmUuTtMyYmdRiIrNnDEehGgGgHMDAadMxXaAmFlLhHNnQqvVNnfPpYYtTyyQKkJjgGqjYyHnfFVvNhJjAaVDdoOVvvmMXxvxxXXVJsSgGBbaAPCkKcVGgBbyyYoOmMsSYoONnhHxLlAadDjJcMmMmANnaZzCXxdDXKkvKklLpzGfFgiICckaAKyTtYbBZxXVRroOKkvoCchHjJfFfFOiIGgmxXoOQqXxuRrbBUSsumMUoOMhEekKHLuUlfFMBbTmhHMttTmyRrYfFdDVrOoRsgGQqpHhPhHSvdDEeOXxHhljJqpBbPrRFGDdgwWfvVJkxXKjKkVvHNnDdhQvdwWDKkOoMFQqfmVTtgXwWbBEenhHEefFGgNxRcCrAPpaYyOoeEFgGtTfIiAaGGgxXpPxfFDdXjlLJkDdVKkeEkLGglojJOhsfHhFSHKnNkKJcPpCjmIiXjJpPxwdDWOoPpAaDdbBeTtiIQqXxLBbljliILJmMlLBbbBgGYyKkEnHhKkNyYBbpkKPiBbrRIDeRrEaAnNLlGuUgcCUPpUuHhudpZxXVZzvzHhGfFQqgvVPOJGMcCXxgGmMZzNnWwmeEkhHKgIitTlwWgZzpPKkyaAYGHhaAxNnuUXhHLjNncCtTNnwWpPCcGgvVoGgIYpPxXyiWzTtZsSkYyecCgGNniIEKEeNfDdgGFLBbzZhHoAaNnoOAaCcrRVvOlQaATYytyYqqQdDDwmOoMRrWGKkgdyxXLlmMOoGgEemMYBbDwWVtTNnAOtToaFfvKkhHIZziMAamvKkVdTDddpPDNnQqmMXFfYjJy diff --git a/2018/d05/ex2/ex2.py b/2018/d05/ex2/ex2.py new file mode 100755 index 0000000..b8d0786 --- /dev/null +++ b/2018/d05/ex2/ex2.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def reduce_polymer(polymer: str) -> str: + for i in range(26): + lower, upper = chr(ord("a") + i), chr(ord("A") + i) + polymer = polymer.replace(lower + upper, "") + polymer = polymer.replace(upper + lower, "") + return polymer + + def fully_reduced(polymer: str) -> str: + while True: + reduced = reduce_polymer(polymer) + if reduced == polymer: + return polymer + polymer = reduced + assert False # Sanity check + + def remove_defective(polymer: str, unit: str) -> str: + return polymer.replace(unit.lower(), "").replace(unit.upper(), "") + + polymer = input.strip() + return min( + len(fully_reduced(remove_defective(polymer, chr(ord("a") + i)))) + for i in range(26) + ) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d05/ex2/input b/2018/d05/ex2/input new file mode 100644 index 0000000..6b1769d --- /dev/null +++ b/2018/d05/ex2/input @@ -0,0 +1 @@ +cgGfFBbCHhxxXBEebrnNRuUMYMmyyYqTtoOQyYmDbBeYdDDdykKENnVvIidztTxXZmcCOoKkSsMxhHqQqMmQlLVNnvvGgVGgCcCkKcXkQCJjccCXxMmWdDwUupPyYjJgGSsCcMmqKnNQqqtTQSsmMtToNKkKCcknpvpPVPVgGjZzfFCcQqCcTtAaIiJvWwPpHhdDYkKygeEMrRmGlCYyEeZCczcLqXxHhoOQDhXxIzZioEeOHdvVRrtTEJjXxDdeyYkKLliIOOotFfKGgKzZkVSsvCBJjbnNchHOorRbBoOGgRCcEeLlWLlfhHFwpPJKkjroOBfFbkcCUzZUuuUuoOEeIizLlAayYlZzLprRPZvGgVGgbwHhWrSsRAaUKkTtrRtTuUuhHBZCcpPzZtTcCPpQlLqdjJFfDaAkWwKEXxFfPAapMmGgeDdmMETRrteAaqQkKzBbDXzZxdnlxXpPLwkwWKoOMMmOAaoZzlLXvVsSJjxoNpPnOveSsEeEJVvjKcCXxmMLwWBIibrRHCYychEeoZQqzXxwWsSxYyLuUexaAZYyzXCxXcElQqVvSQNnqKtTkuUsIiVvbBjJQkBbKEefFTMmtYyZzzcoOcCCZBsShabpPBKkAMmHrRsgGSbSsvmMhHVAiyYIaFKkAEeuaAUvVKkDQqNmtTMnFNnfdLlfUuFEOyYosEeyYSrFfBqQbuiIUsPpSlLOAxXaHhfjJHhFoNnVvyAhHQfFcCqaYRhHrwPdDaXxApRrWReGEegaAauUFlLfJeEjNpPHhndXTtVvxXxDfCcCwWcQqTtKkjvVJROoRrrRrHsUuzZSTtSsGghMXxuEeZzCWwcIilLKkkKbBtTfFUCcyzQRrdSsDqZzZxhHXpPRrYdDTXxtbBFfaADOodDdFRrcVsZRBbrzSzZcCvnNCzZEWwUnKyYkNnNuCcepPZEezvVWFLXxCmMLgBbGwWljJLSnNsWwcCbBQqlfEMmeFOWwCcoDqQfFAaoOzZPpBPpQOoqnYyNbrRwRWwrmMAayYmMjzxXZpPFgGRrQqNnJjBbXxoOIZwWEeIiziiIIivVwuUWYyFfGggjJLlHhbBOJjIiGlLgovVrRhWQqwHpNnPLvVlLXxDKkNndHBOobRrhlGUuQqoNnOfFpOoAaTwbBWtcxXCPwWSevViIIiWoOwFYwWRryFDdffELmMlkSsHhKixXIiTTttIcCoOBbQPpGgEeqBeNnUuEhHbDdsnSsYyJjgaAGMvVmrRrUutTRrRgGWwQSsSztTlOtTaAoLjaAeEJSLlsRKkrRrZsEeLlqNSLlsoOMbBmAGgYpPqQoMyYAamGQBbqgvVOvSsVnaeEAXDdtTxzZNHhnNyKUuktTkKYyYsSRrfFDdcvVNnhHCyEPpeqQmMfFFEfFeBbfoOWwbBtTpGpYyPRxXrlLgcCPvNnAaPpVOoEkgfFGKzbBJjVvNnYylLuUoOxqQJjXJsRKkrSjJjsSxvVXsSmMKkZfFZjJQqKsSkhIiHzkVvTSSsstkKrRzZQrYymMRRrqsSlRrLQqKGgWLFfEeGglgGwwWhHtdgGJjDTdDewWEegGTnNIcCitrRSXdDxszZmtTMrbBZzRafSsZuIOoipYyflLHhftTFFNQqrRNncCnPdDrQwWqCcRrqQeEDdTtnNwRMQqmnoOFPpfNdDcCgGrkttTEetTtTTVvPMmUgGTtBbzZuOVvDdopJDGgbBfFdhHZrRAaCsSNnHxXPiIpxIYyibBPyYpGgXmMHhhNneEIXxiVSMmpDuUdhHPeELlsvcCmdDCcMeExXLlQAYiIIiyarRYMZzmaAnNJbBjeeEEAmMaQHhqyUrRrRjJwWAaaARrlsSFffFLJfwWFdDfFdDUujPpupPqIicKkHTaAtFCEAaeHhXxvVFfctTAZzXxYhHbxXBnNyyZCcPpzVXuMEeqQauUAdDmUsSlVvLxCSsctTvVzrRZhzvdDAarRoOkKVcCUuuUBPpkBbeEUuAAAKkAEeaCcTtQqEEezZHcCiIhyYFfneEgmMGNLlJGgSqQsjewWRrvDdVXikKIGgmMCfFcCdnSsNhHeEDcNnUSTtsuSZzVxDdXvcqQZmMzOoCtwWTedDZzbhsdDYEfFeTtybBSpPFfdkKNYySsntTtTLHhEesSpPzyYnFfZzNaAkKcCdDXhTtHbVvBxoOZgGMmSsKkEerREeMRqQrqQlLoOmsSsSPpDdQfFqQqmWwYyAaNgWwGKkYypPhHyYdDaATPptstTSnxXeEUuOoNUrRunYyvEMmeYAavVLXWwdDxzZloOysMmSVsYySsSVPVvnNpCcUuvoOvVyYgGDCcdNnOiIfFWwpPndDNAaNnoMmlLVvIiZzscCqQSVvbBhHVvRrGggCcjJUrRreWLdDlwRtTrPpEYyQqQqRgGUumMTjJqTtQvVBqQLoOYTtylMHhmqQbxvgGVroORNnERreXMmsSCZiIziIVvJjcSsmEeVveEAabtTMmMmxMmZzNnXCtCcTLMOomlcBDdtiITbjJxXNnKbBXcCSiIsuUoOxFJjNuUnZETttxXTezCctToJxHhXbvVBjcIiWCcdDRrjJYiQqIurQqRxXUPpBErmMReuhHUNniIxWwEtTeXGgHhbIiRFfrbBCQqIiVEevSgGaAWwfUuhHlLFCsSloqQOLeEcCBbgLlGaAnNFfvVEOoAlLlLtTNnatTeAaiITtPoOpfFYyeEHyYhSlLaAsUvfiBXxSGgDdCcOosaWwPpAcCVvMBNnbAmMaJjhYuCTtcdDUOobmzZyYrRMPpfFvKkhmMOoHVhTtVvxXeEHhHaAqoOJjzZfmMaAFkgGNuUnQqvVPvzZVAagGpGJLlBjJduUzZzZBbDLMmlSCcKcCGNuUoOPpeEHjJhXxFfYRsSkiIlcCobBBHhoOuUWwbNnsSgGbVvBcCDdrRBQMmjJqGnNgbPdxSsXGkKhHgCWjMmqQKkyYQqAavAzZgGALlDZzdaaHhVQqlLEiIecCQqtMmNnXxTtbBYyiIwWWPBbmibBIMpmIibBnNMsSmpPcCHhiIMBQqbDdwgGqNnzKkVtQqmMCcTomMOMmzZOSsvpPVMUumEeoBbJjXnNxxDdXhyjmMzOoZZNnDdzpUuPrRlLJvOGgoRrudDSsrRhHsSrtTRFfEeUAyMmYYyYdDbBVvGgysUuSwWaKEecgGCkTtzZDhHLuUlUuVvdaPpASXxGgwVvhHUCcuWHhsSwoCcQqmyYMFfOTBbjJrVvRQJjqlJjLxKkXaAVvzZtMgkKGmiIWUmMeEustGlLbBCcgCcYUuJjaATUuGghRUBJjwOIioWkKnTtsSNlCcLLTtlhHqQDdTnNtkKGghGgTtODdoaRtTrAoFfYmMyfgGlLFIiWwQqOZzdDmUuMFBeEbJjrEeaWwABbRNnfebBGgEfFgGwSGgEHhnNTAatrsSBPpEwWcCcCebnfFyRrYvVBBbyhHRqQnNlLrvVYgGgGoOcCeKkEXyYqQOoBbpPAaxRrbcrJxXjqFfQMCcCfFcHhQqQqoKkOQqnWcCwNoMvVmOuqQUuLlDTCccCtdbBimjJhHAkKEeaAaMmOoYytTyHhmMpPaAYKpPrRkzmMyYZWwYyafOoFfIirQqXDdxqkKQsDdOoGcCGgPCcoOpgQmMquUSflBWwbNnyYJJjfFOojaqQABxVvjJXbBkjDdJKkZzjJwWxXEIietTKBbkNnzZDupPDBifFIWwBbhHbdBLllLCkKaAcxXdGgLlgGDIibYyCeEkNYyFfndDfrRfjJpPQnTtTldDLrRtNwTtWmuRhHrFfUMZzqFCVvcRrgQqGyYtTcCDmMdQqDdazZAEekRPprmMnGgAFfaJjaVvzuUZAAaCcgGbbBsSGguxXUFfBhHsScuUZzCKoOfFAakaayQqbbXhHDdxQRSsUuoOQqVvXksSDdSsSbBsjJMofFOejJELBblhHmKkgRrGwwzMmFfVVvvpPVuUoOFHhmMPpfliILbEeBkiIOohmMVvAasSZzaAuxCcIadDSVvbBBbrRWwiIsCRrxXcDFfnNpbYRnNKlLcCDXxrRdyYkJjrCWwjJIidQqXxDdeEIiFfqDdcBnMSJFLlfjTLlCcuUmMEetUusgwWEXxeGmfZzFTyYtzptRrAaLjJluUJjAaTZzlLlLsvVSPpzZxoOLiILliRRrMzZmeMkvRrjrRJzZEePpNjzZWwXxJLlnxcGgCXVTtZzGvVJjgMVvmSoOsBbjtTyYfuOaALlaAKQVvaPcCpGTQqzFfeEyYwWlLJOolzZLsSNOJjZaAzPGdDgSsJjgiIGiIiIlOolLtTLZzmMEPrdlcfrEeRyLlYGgCLlcwWFkKCcTTCchHBbNnpDdMGgmPsSunNUzpgrRuUGPZiDdqaAQEeiIlXmlqQLyYyYmMbXxXxtTBffFtTkKcCfFYyHhMnFgGfNnxeEXNFfSskKmjoObBJLlFwNmMnWVvMSdDCcdnZzZzPpNDuPpcMuUiIdDmzCGgydDaAXoOFNjJnlLhMmtTgEemBbTtkcCpKkZzPjEVveJiIiqQgYypBbJzZjesSaUuAHhEPaArRzZgRrzypPYaAhHEsSZzeBSVvsbZEewLlcChHWnNjbLlNQNnrRZzrQqYyrRRhZkKqhBbIiIaAFcfFCXxfiXxhRtTQjJqczZcCufXGgxFIiKkyYUgfWwVvGgHhFeEBbZWJjMmxiIXXxwptQtTqTOIiMfbBaAvVAafFlwWHBbhRrbPpVWAawvAaNnICcilnNLPpyYizLlHKkhdpGgPDKIiRriYyTLluUtILlQJjqnNYygiILnuUoOZzNSszTthHyYuAanNUWwBbMNnmmMQqGaADdMnNCcmWwEegCcIGgLjJlisSuUlLJaAiewWlLEpPPLlsFfjgYyTtGBbJcCvEeunNLlhHSkKsOoUgGkKdVmMQqdqQOoNnDgGvkhHnNKVuUXxlQqZzLeTtOoLliIiIECcvyYKvVkDItdGJfFjFfxJQgueEvVJjuqdDyDdYQldDzZLDdQqNgwUMmPpuWAIiaEejJIxXGznwWNOJjoliIjJKkkfFPpYHhyNvVvVnKPAaeEymMQDdmrYyLYylfFRMHhTtDdKsoOapPRbBrASRMmkKDNnemMEdQjJtnNwyYWDfFEedtTWGgxckKGjJgKkRVJODdUukKEeoHhUuTlCIQqCcicEeRrnNudDbpvVPBXxzHNncCOjJoVvhPakKAwWppPfIiFgeEGGMsSmxOZzoXpPuUSwWGFgGULluBUubgcCFfDdmMHhgGmMuzyYZCDdcStBUubCXxcTlQWwRRrBbrUuyYqxXILllpPWYyiNnIpPJjTJhUuHFfKNnMmkgGSKksOoAajEYyeNntwdZzfFTtSTGgtpPsOPpqQopPrRJjrkKRFqQbBfJjkBbBgGbKMmogGaAalLAzZXxdDvVAaVrRpdDmMawWaesSEAEAKkaeOoWxXvVGnNIoOnEejuNnUJYypPIikMYyVvxXmNnsSkKhQqfFIIiakAaROoRrrrRjJPYypBbbXXxpPxEenqQOXxcDdQoUulLOvZVvJjzcCVMmOoyYGXGggGkKMmQqvVGgMcaANnJjCiIPKtlLmMcCWHhwzZlLnNqQDdehLfOoGYuCCccUyNngqQwnNWloOLsSWwyPdoaAsSkKSsMMmPKklQqzHhdDZokKOlLqQLDtTdprgGIDdCcFfjJRrKkhNnHcnlLRqCcYyQreERfSsavVcdZzDCxXnNDsSdAZdDzGKOohHYAayheEPZzlLNnznIiTtQqzZTtNZnGNnYygfFBzZbNWNDdUunAaFZzuUfcCAfFMqQwWmcCiInWwkBbKdDaARrLKklzZHpOoXsSzhdDyEYNnySsTtbgbBGxXmRrLnZzNuUCNnSsQqMFwVaGgdKUuLlgnEelaAIhHSsCciyYiIcEeCGgFfzcTtCkmMKmMOoolLBfFyYXlLZzHIieEexSvVsXMmaqQVvFfAsuUSxNnlUNjJnGgcCeoBbOAayOohFfHdeZzETIitDtWLlxRXCcxrLlYykKXbPpCcFfBcfFOoxCMmcXaPpoOAwRrGgYygGzZVMmcjdqQDyYMrRVvmJUugGZzPaApxiFfIvZCcHPowWFaAaAfUuUuOBbYDqQXxDdjJdRSsrLFjJflNnJjJjtTXHUqQZPpaAzqkKQhHkVvOqQoevPpTtkKVJjENnNLlneDLtTlsxXaANnSVCcvoOyjSsJKvVkHotTLaAlOzXxZhHwWXWZzknCcyYzZIicSsCoJQwWxoOXwWqjgGAAacNnClaAkKoHpPzZxXUJjrREoOeeEOomMyJjfFJjrUCcuRkKDDJjKAoGjJgOimMNndEeFfpPmMwWVvzZubtTBeEWwuUZznJDdNAaoOhnNHzZQqnrRiNnIfFMLljJCcmjKkhDwWwWdqihKkcCqQHMwWwKkPpFfWIeEPJjgjJGyWUuwoOdcCefFKBbkEkKPTiIrRCctpfFfFVvjJevVmyYMGMmhHjPBbpriPpIRBbwkpPpPnixXIikwWKSeEiIsaAIlXnNxUdDuKNnoRrdsSDiIOkLPkKRrppSscCOhCcHTIJEeVbekKEnNQqbhHBiISsNEnNvVeHhRJjreiMpPNnmgGqQHPphaZzXxAHPpMbxXBRrOGglvRBLlRrZzkBYkKAaybgGfFhHLlPpcCyYKUufQRrcBAabCfFBwWbPKkpiItkUuKswWSfFTLlDdhHDtxXcCTeEVhoVvODdAakkKQqKWmMmfFMcCHIihwqQSsWAMxXerlLdJMmjjMmJpPeBzZbEDpPuUHhsSolzJjZoOLhHdDNZznbBFfOFepHfFiIhPmMPvVHhKkpqQmaAMxXYcCyBbPNimHhfFKAIhHwWnSsRxXTMmcCkKcvrRLOEeGgozZljsgUuGzJjiMmXxfzZXqkKJjQDdDeddDmEeMaAqwsvVSmMWcCQjJqbBzZqQQKQqktTFpqQEewWNSsnbBdDDqcCwWQZtTzxXOoKQqkpojHkKhJWAnNawwWdDOoOUuMdMmfFDIeEiJjZDQwLlvVzHhBZzkKbTtPkKbBbKkWqUVrRaAgOoGrRnwWKIGgiOkKfWwFokgGKQKDNndkmFfMcCAUuabggGGeKkEBfFaAgYgGQaAqcCyGieBbEfZzFOxXtEUueTxRrlLotTOUihHhHIwWrIizZRuqaAGrRgAkfgjJGVNPpWdZIizDmtTgGGvaAVgMwyYmMQqmMyYsgGLlSnPFLlfvOoVxXejJEpVvMJILliuUkKCcnVXxdDzWwoguUXxzlLUusSjJZujJuUKkOoFfpPHhlLUPjJQqaaGgAHVvsnNPpFfeeXxpetTNnhHgGEdjJDlhHUuLueCwCcWRJjDWcCwFqQwBbWfdmMUpvKIYyikVPGFuvVUfgrRlMYAHhayHuPDOodpkKHIihVBbQqAMmoOavFkKfOoJjUubaAEejmMkKJfVvqDdQFJQqjHcElLeNReEBdDRvAaXYyMwGgWUumaAxXjJvUuVhQVvquUJEIikKrcPpRUuSsYyrAaCRWwDRQqrGgGDlLGgdGgUoOuLlqQuUdDTYygGcCQbjJBLOouUsSmLXxlMPplzKhHrOiIsSoVWwvcoHhOgwsSTtWwwYyKAaPpuUfjQqgGsIRriiLlZzHhZbcpPnyYNCMoaiDdHheETtcVSsvTtCHEwWehNXxNnXUAaHhfFfqQFBbdDuYxBLKaAdDgGuiIUmMkzZZzXxtYdDyOqQoUuZaABbzjJcCUuuUcXxbBsEeSyYydcCQqbBDdhHErRAEeyYGJjeEgAPpDdOoaXLlxamQqIiDdMDdegGxXuzZGplLPuUQdDzZLlwWtTqQqQqJjIivSmMsXCcXoOhHxFGguhHUgTtuNcwajJdHhDUuAazZUsSuLCiNnUuIQqAaIZKkAaGqQgzZqQGSssAaSDdxpfDMiImcZDdubBUVMTtmfQqBbBUuXbBWwYIVvoLlkKIlLiUIAahiIyYSXxDdtBoOrxXdDBHuuUGgiIKMmkcCCCccYydkfFZVvzNnkKYydDvVKEenNUuAaUAadiZzRuUrYygQqGacCFfgGsNFfGxXaACcSUusaAgVvmglxXHhLNnGRrXrRDdxMTSeEslLnAeEIibBbkFfLlKzSsaKkVvWKQqSsJBbqHhjDdCcUGguwGdXxDpwRrWQjgdDRrgGGJzZqDbSsBiIaAXxdkKLlMmPGccHhhfRwSsUlLwfFWIiIizZSsKkKrRFfdDxHjJhcCWDdNhHnnNLvVsSyQqtLlTcCpPpPpvDIGgioOPDUujJeESbBsiIjJaAHhKmMXxGlLpPestTzZhimkCcKanNMmxFfmfFqQeEnwWDdjtykKYKIFfikVQiIqwWpeEpdOoRrDPMmwzgGWwYyYuUhSsHHhZzybBddDZRwqXxXOoGgPyYpvVdDUuvVlEWxXwWweWwLtQqTxXFfxjJxXyYNsSkmMKdAhHrIWwMZzlVvLmiGQsSqGMmgnNSoRrYOWwZzJjoypPgeEGgGCoOxNNnaPpeEAnAaNnnpPNogSFfDjZzJdzedDwWAatTPlkKANjqQDGgWwDdXxVuqQnPpCEecNUFfCccCbBJNaASspPnjoOaAoEeCcSscCAhTZnNpKkDzdDZHDtTUuDkKhYyHiIZVPpEevHhpPrRABbsJRrXHCchXVOoSTtJeFDnfdDFNaTJjlrRHylLRQlzqdDQZJjJjHhvetdQqPplmMwrRGgjhHcbBlLLljJKkSAasQmMizZIqcCbBeuPTttTdDpUixXIKkFfieVaAvEBbhmnVvNMSbBnNsStTsJjfFeCLlcZeEzomMnNSJjWwsgajZFTtfJjAawLiIyYlTNnSsauUACUVYyjJgCnXxjJNczXEeUKkuVvxtTYRbOZzWAaAJXxnNjjgAPVvpOgGFqlLpZzJCZzRhHoOrJeJjFfuUbBRQYanKkcCNnNAyKkqWwKOoEeEekrSsqzUbBdDqQLnNlCPIMmdCrmMRcbAaohWwHOGEALGglWdLlQLclLCxXdPPpNnpIiQqjJANkKMMmPBbaACcdcCDTtBVOohjJCLlcHcaGcCWDdPpSXfrRFxfFNLlnPiSsIpwVvWwWNnlbBkCcKfDdCSsvkKdWnNweEMaAwPpWQyCcCcwWuUGPpgZVhHNneEVvYeXxgGeyYECfgTNfpPdSsDJjFfbBFnaAfFmjoOJjbBOmMiIoOoryYwaAWdDRtTIigrRWwGodNnKYPaWgLlslLJIijqQvYyTqaALjJmMWMmBbLlxvVQFflLQqaBJjxXbAvHkjJGgKhVbPbBpBbTiIwLlUEhHevVuCRrcxUuqccCCbBaAycUZEIjJFBsSbvVRmBsSbizZJjeEMOokKzZKkAZzSsiJjWJnNsSjQMmqKbBOMYVBbPpySsvpeEbBnNKkjJyDtTpehHiIHOjJohKAmMqQvEeKkwWXJjZOozuUbBiIxBPpidLlDeVTrRtUvVIiuUuNnUrpPRHhJpiIlLwWrRrFfWwyYVvNngGZzUCRMTtVuUkKvEeEeolLCaTtEefFfrRFyJKkfTnNDdovEjJecPpBlLLvVqdanNADNHhnQBbWwZIBWZzwTlLtTMOolLOvzyYfFoOjBoOCcpPlomMdiICVvcDCPpKkBJjyXxrnNRpXxPVCcXAahHxkPpwQqWiXxeELleyYAIiaxaAnQoOnNiPpKkdDgGIHhwWqmMQiIqNXKkKXxRoYutTKkmMGgWwnNKGMmgldDkKCcLaAKkdveEVYyOQwWbBquOwzZYZBbzyfnROordDvWnNwvqQtTrKkXoOxRZzjJCcsYpPoOOXxPMmtTpAagGwWcIiDqZiIzPzrRZQqsSUEmZcCzxXzZyvVYtXxTgmKkMOusSbkKBUplLQjOoLpPTDZzfFFLlfdtyYRmMrsSpcCLHhFflSsYyNnTtPyYWGgbzHhZveUkKucCEesDgGdDdviIiIPphHhHVqQMsKkrDnDdkeETtdDQGLMZzRrwQwWwLtsSliIaALTSsjJAawWnNjJLZzFgGvVSsEjJhSrlZRhHreqQEQqujJULlHOvycAPpaDdbaABCjJRroGgjePpBbEJGgjJJErGgrRLlOvizxSswWpooOOFLgnBbFfwWlMOUuEeOlLooLlBbBbEyYefFfUYyuNpPUTnwWNaAvVmYaAlLsSDxXoJjKkOgGNqHhQnEeiIbXsfMYymYXxzOoToODNqQvnNVnuUtTtTTtnDdTRcmeBLlqVvTtQbBKahVvbBLfMWTzdaMhrRncCNTzkqQhHnNKZtGlLgXIHhixHmZgGeEdDHEePphFfzeEuaAUcCdDpzZrTtRQUuRrtTLuuUWwUiIBburRPpKmtuULlBgiAaaSsAOWwPpSkimMIaiFMmfyGgYQzZqCcYycCUuIKjIikKRmMrJlGggGsdijRrRPQLcClqQfFwhHEBbfFeWwWTkKtCcbPpPPpjJgXmMxoOGpUvhHMmFfwWoOwRrhHWqWgGPpEZzWrjLlJrSsRQqBLlbHhIicCXxXOofFCcfFsyYfMlLEAaKkEggGGczffFZzJICPpCcoOiIDsSdSszZDrRdFfHhcMmJjFfFfkgkrRGgNnrGgsFfcRrjkNnoOeeEEOoJRdDUEeFqjJhlLqQpPfFskKbBlLglqpPQyjRUuoOrJskOoKGgBfFBbxVvQqXMmFqQWwvtGTtBRrbvGNhEeHZzqQBpPbVvdDLlMPpQxaAKkXFjJfFfJDdjHyYhKkaNnZzslLiIjJlKsSkLheEvVnfiXxFkKdDkYCcyVrJAajtTQqpFfAlUpiaAwSsUKkAuUaZmMzlLXmMxuhHUNSBbsnbBcBbCzZEeJDvVzZkKDdfJjNgBbqQGvHyiSfVvFdMmQqIijJDDJKJAaWGlLMmcpPppJjWwCGzZgxGgXVwYdDySstOoyFfPwWryDkKbLujyXxTtRsSCcZyXxkvVzZYZweEnsTNYIiyRruXxUnQqFfyYRprRShfLllyvVYZUYmRvVrYmMyUumWAjJAaaBpPbwVCcVNnnkKkwWKmeEzZIiMJNnAavVAAaeEZFflyYLDdvwrAaRWUecQqGDDDdyeEcyzZzilWTZAqQOohHShtmpPMTYyOoKXEShHAaEePpZzVrhHRkKLlnDxoOXdLbBldAaRKHhgGkWwwavtxXhYyKgeBbUfOmUuGvgUtTmyWhAHhVXxzZkLlFfnNvVfkKbBLlrRndFfldDJoOjKarRGgGNFzZIiwWFfAalwvvzZwiohHFaAEeaAUurRZcmMjbBJrgmcThHwuUyvVYruPDdptcCTravVARHihHJjvcaAErRYAarJgdDGjRfvKVGnrZqQzgGbbZjJLKeEvVklFKkMmMmTGKtSPpuRKtkKfFNVtDdaHTtvVzZAuUaKkhbRroEebBOoFAaMmTLltfljJNGqbBQgfjJFoxFFffIiFTNntaXHbyrYbBbELEekKljOoPKkpUoOyTRrtDyYdfFdQvVHSshKdDyYpPOUuaAoyAamMZzYxhHXmMfFnTtFfKIBVvbWwigGbBFKkpAwWtTbBKksSdcFfUZTtLlxrRXSTtraAnSsqQGvVGPptTFbtTJjvZzVbJjBzRVvJtTjGMmgptTPmKkxXJjzosSOJjeEsLHRuwxdrRWwGNEQqDdGTtGoOgyYdDYvVSyIiYslpPoQAasSmPUprfdDrUKkgGacOxXcqQCogfFGwAlSsLHwXQqRrtTLVHjJeEFfAmkKmYakKOeoqgGQbjrYyXBbRjJIzAtUdWgdhHQqPpDhfFPpHIqmMVpRrSsPhbBHxXQhcCBQCckKYyDEedqgGvWwLlcTKkWwPpzZsmMmnNMQRnYySsWiTtSyYWWwwLlVJjrRUSstMPpNnAxWwUuXCllLLKkGgCcVDMkuUQqGgoMWwVQKkqeKkLyFftcCvVTHhOYlprRJjPFfZUOomHhMekgGTtkvVzZmvVMBTtQsxFfQqVfFFfldDdxXsHhMLlazgWPpejJRXXSNrRpPOlzZLJjryYtoTtdDWKkoOBbsgjZIiqQziIkbXxkJjBeEblLaxXlLAHiIhCFfcBWbBwHBkWwvFIiJUukKzZTrRtoOcBuDdUimZFfqQQqAaxXnpPNTsiIHPpoOhOoSfFjPpyYJjwEfMoObBDdHvqFfaAxXbcChxXAaFhHfjJhHfIioORrcQqZrHWJJlLBiIbqczZoBbOyYTQaXFavcKkCCZRrOoGHhgVvAxHhXaArnNCJmMwAaSsBDKBbEJaMmAnNLljXdXxTtGWwgbBxXhHwWAaMsSmAgBfFFkKfbYgGfFyGwAatZDSeESJNOoBbECcPpcCOovVcCOhHaALlzuUZNnkvVkKzZzZhSsHJfRJjEeUubfjJFsSsSBEaMMmtTrOoRDdGrsSppHhAakKUtebGgTaBMimrFfRYjCMHyBbHLLltcloGrRqQHhYrRIiiOTtiIpdohHOHqtTPpQyHYyhpCLGglRtTgGgOoXCcApPSHhAaxqQYpPyhUGgJjZwRgGEjJeQqRmMjOpFGgKkBlCcNneARJjMmrHhkoOqQLlwuUItTNtbBTNTtWBbdDjtVvYyOqMEeEPTFwZgGZzJQqjzHFfyrRONnUuLloGgYQqVPMrRXxHhhdDwnQqNzZTtbQqDdvVyrRPpYCltTZzCtTMmRAamPpZztbBGTSsmvsjIihCcBqVDdmrMQqmNEGVgbwWBmPpMgXrRRyYaArxMmzjAaWwlWwLJEmwNreEsWfdDewEeWCBjFfTtNnCcZzNnzPnhDbDdmMaAcPpCuUGgkYyGbuUByYAsSMhHEePpHhLlnGgNfvVfFFvVVZzvmHjwNcCKknTUxXiIuAawWtrwxNyXxYxXTrRfrKOAaoYJPRraSsxrRXAeEpbuxRrXVvUYJaAjrRykKebbzZBvMmaAXxUAagGueEVGCWwaASQqeizZITMmtYyQqQqiIwWCNNoOnVvCMmcRYyrPpMmqHfuMeEcCFnLhiIKgngWwGNGOokRrDiBNnbIdJjHIEkKDrRgIiXxTtDdGcQfuUyYMBpPuUbmdxXDrRzyYVvwJDYdDvAaVGOoUuRrgfFMJjrRRBQwlLGgWqLlXmMLeLZzuURWpPIiwPpggMmGGpqQmDdiIMUuxXroOMmGPpgOoOoVvZzlLsnyRcCBFPvaAcCmMsSBSsCUrRrEeyCKkAVVnNQMmjJeYyELWRruXxxkKCceEXOoOUUutTtTuxXijxzZSsuULWwXQquUxqQXIHhxZXxoWjAhiIcCHBbjfFZiyYiIpUuxhAuhKkHqQyyzZYoOQqYMFAafgawWAqClLUAmLlJJjjmMBwLPplWleFffZTMGNnKkFDdxXDdehiMbBpPRrmRNWwfFYazZAegGIaAitbBjwWJYyTtTVWwPWRrwfFYBQqVCcwZzzZdVxAaQWwkjJhHkVNcPpCpPeVQGgqAaFQqMmfyKkYfFKkkKqteRpfFlLHJhHjJeAaEeWeZzaAamIiRWnNwWSsiojJSsEeOMKkmrztTtcoKkzZSWwsTLUuVIOoGgMmPWlLwkKDqQKVveEgtTTEetKkGvVgVvWgezCcxHhXvuUvWwPjJWwpxXnNVYWjJHLlsGUdDueAAaaIilLrREgarAavVxXPoTuUtOPxXpRjJcjBbNuqpPnDLQqyYKkRnNlGtTHuUhCFfccCMmDGgmIPGBbZRPpGgOoLKnNzGsSIvKaAzrfzZOYBnLbVsUuCLuRmZznNMocCPbKQshdxXDHlyefCcFFrRSsxXttTseESTfGGgqQNIIiinFUNDdQOorRbwWdkKuPpfpPFUDJAajEciCbBlLcIxXENzZdDdNgrReEIiGMTkRrkKxbBdDofqQTtFOXIYgzupYywEUzuqVpPvtPpnNYyVvTqqMifNvRrXxzdDGEekfFbBKRyYrgqQZoOhqQWwHhlIgYEcCexxXjJJjakVlOoLvLGHhglXxKupPWKLNYynAamvVMNxXDRrozZIHhOCcoGzDxMmjOoOovyQqYVvVxuXfpkIpPiKmxXxBbXBbJjxnkUunHhCcaANnGgDdztTZtYVvJSjlLxXfFeCqPpvoOyYyqQYwSJBTtXxSDmbYyeEBmMSeVnJjlLmMcCjJbBPpnFfEeYyYFuaeEAahHIEtMmtTvtAbgGpAaaAgoOsQKRYMXxmmMgGtTgRrtnNsiXxaJjKDTouUZZbGPpCPLIQbpPDdWOiaApPIymMYnOoNMzSsmfkaApjkMlLiIjJQEcflLFtZCcAEHuNjJgXxSsfFlRVvuRrUcvTtVCmyxMmXYSsiIuqQdltTsSdDkKLDKkKLUuqZAazQcVvMmkkTpnoOfboxXKJIinNmOxXhHXUuxMMBmMYNnbaYywvVnNRrtTwgGWsCSfrRTtHnAartWGgsYySyYCJroOnNWUsweiIqOocqNnGgwWPpChbsFkKtBxyYKLlAeEzYpPtgnNDUuYaAyzZaRPprAAadrmTHhlTDdmkBbMDdmKMtxXlLkYrXLoOjGNEenpPgJruUQqRlBnNbmMjUuAaPFlidDIfFLNnTnNEtTeLltzRrBbAQPGEeWsSiIwOnNGgBwepixXsvVJjiIgWwRrPQnNqBbpajoOJJjAZzCpPcGhnjJNsSCgGfFjJDdMruMmrGgRUVvRWyHhJGjRrJJnNjwVNnWwXxDjNWSswnyxopPsNwWVLGoOVvgZHrRhyYGgzTLlgxIpPyyAaYuKKkRrWwUtTuXdDqEeVvxnNXfSsFmDDdzIiIzyYsuUShgGHVyFfpNpPSTtINjJKkXxhHbBLLwWVRrJQqYYyAaxUDxcaVPpvAIiAAaazRZztDcCcNKFfkbJKXKkqQgnNGCcyMmYyIMkKmegIiciIpPXEqNnzkgpecCzlLgPmaeKkZLlzCcQqEAFfDCsSATfcCRKHgGNnhQsSGNVvTqQAamMtBbIhWyvVYSwhCcgGmMHbAWVveETcDzZdlqyRrPtTTjJIittFfXyZlMmiITSrRiIhHleECcgGfFmLlvUQKkqzZhtTtTBbOfFzZKUukLloJjuXxXTtGbjjJOHhohHYQQqUqBbJxXytTYdCvVIUuWvxzZXsSJjfaAFjJSsLlLlVwXxkKvwWVXxdkaAHmMjJWwsSDXLjuUnNJGKkgJdOoWKVvkwFLlUlLKpPDdxPIipXxFfgcCPLltLlBbbaaAcMmsSnNPnNjJKkqtAwWzzZZGeGgpPUubBbBZRbFfBrzfbviIVBLWIiTtwxXoOGNBbfDgGYyqQIihqoOhHEyemMxOzZufEWuyqnNiIXJfFpZzzVvZzZayYJjbYIiMRBbAyScGgPDdxXbHcChhwWHBNQqgBbVlrxWxCRriIcxXZzuULluUYyXJYqYlLuNnmCcMxXLVvtTsGgzTybzZZCjJXwkRKkmMmMiIkUSwWvZzVYXFfxoOPSKduZzDdRghdDkKwJPqFfOBbBbsSCUcxXCRrgwWGklLBbGKaJZZqQViWXxlNnBbzhHZLiIlrrfFkKnGeEkpLlLfFVNLZzSsllLcpPVuKkWwEKTTOotFDddDQZawxXWjhyoOYHIDFfxuULfFUYNjmXRrEexluUOoNNBELaANQJLKkRaZnmMNzDdIcCfFArRrDdRpPezZEpPuYNnybBEeDhHdbyfdcLwWlEYAacEgbBxXKyYkMmVlLvmalCcLJIijxHvVdDfRLlraWwqcCJjQAFyFfcCAaYzZWNebaABjJnNqQxumGCFtLJFPCikKhMIYyicSJnNckKUuuSZAPEvtTQqRsxXEeSarRmryvVhHXxTtxXHhEcCWwacNnVzZjJjJlLvxdlXIitlfFcwvUeEujtTdhHxXKuUDIiInPpsSNUkKrdDmebIPrPpDWlvFfVrfyYXrMgGkKRrSscDrRhVgaZzwWAcWeNRrPpmMbMglLFTtVOUuvVoUVOoapEZEeGTtpluJjhASsiaAxXrRIkKHoUZzCcuRBPVNnzMYVeEXPpxvIiIizKMAWmMXxwKOvVYQqyKlihHczZLlkKExOYOrrliIOoKtToOkQoeEZHhZoBbxXOUHhqRTtokmMKZyKeEhlLHNRizZIZhHbghoOFfFXUlLGguIMupPOossuUPpAaviEeJyYbBTtsxXSmizZbBRFQqfPxXkcOZawJjqQWlNBbsJjpPrJjEekKkIhSsXxuUheEDfDKoOFyhHlWBWoauUAOwgiVWxvVXwYyrdDfFBeEcaAaOHhGUaxWisSZzpybBGFgGPpxXCfFrRfAaYjrRUzAahMqNnQqoOqaifFtTsneENCTioOjsShHyFfYCZcCMmaAcCEeEvVroOAayYRgGejHaAbBrREjFfgGBtCcTSvPpwWZzwWYyAOtgYYyhPIistoYeKkeeExnzZNejJFfTtuUMfFmCOCbXLVvFfQzZoZMgGqRmSsMzZrtPlLPpzhNrmgUuhAaLtFfxpPWDXYyhWkaFTtDdWryYBEeVCcOoQawWoOXRrvpGBbguUpTtPuvbCUjMNnmDdkKnNiTmXxIToXVMUfFNnPuvIikWwyYYifFfFINnVvoDRNMQqmFHhNnrPfYyaGvVaIiEeaFfjbsjcCuUuTgGOogjJGGgtfhHpPTAagJjybDdsCccFfHhRrzZAaAadDIRrwKuUkWivmJjbFXujiIJUzZiIQVvMvVVvsSmHhsboOpnNEXxaiPpVfRrFvdiDQqbBKXqQZzoQUuYrRImsJjSRZzwYyWhiXxeEPBbDdkYcfFCAdDmMrROsSKHMUumdDvVkKkSHGyyYYJPpZoKEYyIhHJYxxhbaALXpXZIihDdMmflOcwYZzyZRrSsiIzvVIiWeESqhuUlLoFfFUuBbfXxxxXHhtZuUzTVvxynsPZeRQyuHOoVTtEHheqBbQcQqwWTOpPwmxOJjZzTcAgFpHHhGfXxRCcbMGDGZUiTdLWbmcpTfFyYtpXbzZIiKkzUmTOwxWwXWGHUCcuwWVvfzyCsSVJXyYkfEQpdDfFZFfzGgmMSskIimXxFGKgJAaSVvsNzZjxaosSOetTcCKXkhHWwnZezZEsuNnjGgMTkTtsNSskYyXxCcOoogGzmMPbPDeubBgpPGEAaPpgGyUutLlIHhTtdtTIiZXxorfUuFjUIittiIiIfiHhNgGniIlvvVtTYEelEkKsSTtBbUukKmGiIowILliTsSiCcZzwkOkEeKoHhPIHhiXFXsatTEeMmhIhXtmFtTfJjMTooYyaYXoOfPpFUlLuxQqyiIdkKXKkCcxXCcXYyzZrsSRpeEvzfFDsHUbWFXLlLiAanQaAaCJjSssSRagGOyYdDtHMmhGLPrRtTxfbZGxUuNnrZzgWwGoOkKskdujNuFgGqQhqblpBbveixXHhsvVCJkPyaAklLKfRrCKVvkpKXMkbBKzCWwXBAaLStTsSQqJnzhOPpHhiISlJqQVwSoOsDhHdjIiFDGIwznNVJOREVvanjOlQqRuUrIUZzuZoIKcmMCkVAHDMTtnNcCQqALvMNTmMtLwtTXbBiIMzZgIiRNnCJzZjwOoaAAGBdWApPUIiKZzkuUudDlxXirRKkzZHQqhBFfbCsScwWyIAtTwMZzBmYEeDxXBwkLxQbExlLTtNnYyoDGgKHhkZhyYdDyYqktjElLDFfMsDiMmtQQoOsXcIibBYyYwWjVVtTpPvMcCjMkkKqwPpBbhinLWyGGrRqQLkKiCcsgBTMHzKkZbuURrcCrtTkkKKRoLlLISRSCJjeCcAhLwQsSqQmEBrRboOeqdhbBQISsipPRFddQUNnBbpMmoOaCcAyYfTtzZFzdDEBjJTtdRZzrjJlLpIiKWwkezZCcMmJlLdvVmMNnsMAYyxBijEEeCceWkOtToUzZjExnLEEiQzwKfLMWSiPGyYibDrReCLvWwVvirWTeHUusScPoLKhuCcuJucCJjsQgGcgJjXppVQwIiEBbUxXuveBraUutTFffKkEqAaydDfWwXiIxplgGRVliNuXVDdvUvuxXUOWwiIlLeEjxeCcdDVpYyiTlBrYGRrgylSzewWAakKckMmWTtwXMIimttTyWrXxCcRBbDdJjETsJjrRyiISrRevDdVpYClxjJzPpHrjRVvHqQEBlviIUuRIFPJjYyEPpmMxZznczWwuvVvBOobVxXUeZGUCEeCcjerTtRhRDDdBZzSmIEZzebBGgBbYZlLzKkLeErWwOhhHHqWwIWwiJjCDBACXFgEepwPpdDWIANPzaeEAZpnWylLYwOLaIaeEGRiIdBdPdCCcLrRleEcCWwfFbBeEBuoUUYyuIiBbqoOVvpXxtfkHhKIpPuUHiPpeJQqaAjErxDWwWeEbagYtAaHhTyGkKQJIxdDZtTiIATtLycCFxsrrRvDfzQbmMyIiwiDTSsVvSeAFTlLYEFVvSCkKcfwWPhHmyPpYJjsssIEWZxITnfPnMMSNfbqQbBpLlPBFYglOsXxKkSsIhcofFOTBbtUHwQtTSsusSUQOzxIilOPIhJGGgeJpPcDdTicdOxXgBbGQUuqRUuFwzkKwQqaJptTwWaZHYNnHSddtVesSdDAZzItbDdnxXNVkIPirpPVvRcxunGFhVvAaZtTFRZzSskKMCSbwtrGgRhVtTmZOuUUBDdzZoZpPEAEiIXKjkKREeFELtHeboOAeUvFoVvOQbBzdDddldMQoORSwIicodHCgGoOQUuqSZMuKkmMUcCmzKkgGMmbBslqAXfFxXqyrRYAMmqXmMUbBfhiqQAahTIMJjBbGMmeQqaANnSKgGkmWwMdDpVifwWFpNlLnCSsSJjhlSsVvLcChHTQtTqfRNWsSOrRgbnRFxEYxNDwWEDTtJjigGnfFzurRIiWxRDFfJEeSHhEOblBbLlBsMmQjNMCWEeXKHhyYjZSszAaKthHYcCycjZzBNnVZzLlZeqCcaHSnNsGFtTfijJdWlpPeELcrMXxMnbGgGDddDnNsgDPawFfBrRYpPieeEpPTtUuERnNPlbBPnXdQrCcRzhHZIiDqQdtxJuUrPpRSyYILlhNZzbQqCVxHhMmtuxpxXZoVvVyynCcCqTIwCvVjEeQEYoOyQEeKokuUmMgvoMoOMMAamjXxNnuUAoOPgNXhHemMaYitTRdmqJmMoBbwZWsSwmMkKhSTtQQNnJEeYiIuSObqQLwKkzKkKkNnZhHhSfFUqQHidfxXYiFkjJRrKtdUZsSXtmYuHhUuJRGgejlgzHKkUQqureERFFffJyvVYVbIigRvrIiRVrMiImwZUzZuzqQgGWrOrLldziSBbsaAQlLjSsEexOdHhDoHaAPHLiEeIyYazKkZRrvjmeExXRzNTtzZKoWsinNaAjJZsOoJoOlLSIikKVHdNMBcjNnrRlbwWBRrWkNnjzyYoOolYwrnUsXeRyQIdDuwpPvIQRrQoQsEOPbHPXJcamIjsSJoCWarRHibztYuIGTttfFXQYyqlLxDITtigGHhNUgGgxXFjVvDEyameoDdOpPDWwKDoxPXxOVsSFfXxvUuJyYTLltXxMmfPpRrCCjrRZBbQVFsPaAxFfXvFiJvaFTRPeEprjJIitVvSsKkFiRBSSssXlEEaAdDFzZqLKkjWwgXxJCeVpPviTcUuXEexpQZItKkyYTRriiIuSXxOosYPURrNqjJEeYykspVvPSaAKLKPpqQfFvYySsFoWwBXPgGEkhHKMGkIflxWqQEfFPRrpfHnFYydDwdFfSOvhIoOfPpcCeEFmAaYyIUutTIjJBmjJMbiUwWgwWDzxfFeEelhAnpPNtbFfgHlBsAHmWJpHhRrNIVueESZCUunNjbBvVuoGghHEegAQTjJLmMHoOhvcrlyYUPpTlGgQLbfOoEKPPpdDeEhXovYwHIisoZmrRmQVvhHcCeivVIWffFIlpXWVjLlJIiFVRriIveOoMGGzlLRilxXBbiGJDrRgrxRrfrxrecCtujXJDjJdjZZzzxhSiIsHJQqlbBGnNgvVNYVvrTtxqEwDlzaAFxXxIIOkKogJThWwHGqQgDdteSWnNwWwsPpysPpSuUDdmvqSsrtdrRSYTtAfFKkHvpOUorzZUjVvJStTzZsnhilcCuGgoOUbBeEvVeKkyYSsrRElwNtTPpRiUehLlzYyRwWrwTtuUpcMpFOoaAwWaAyGgrKjXvVnNxEdoODFIifKkezZtTOQkKICfnNiIhnRDOodgGrmMmMmMrRnNWyYTiIIiPVvdDpBTzZXhHoexRQqHsSFlFfXBbreERIGgixQTUUkNnIJjryYRZtOnTqYKyyeEfFnPprZaxKjJvVkrdRryMjqQgGrTThltyVuUbdkKZzaADfyYFSSsFBgOgHhAaHwWorROgGjaicPJnsZzSgJWwjOTcWGgrtTRxXnkKKXxQqFUufkdZzxYzyPpRczBJseBbEuAYyjdwWDJwjPkKwVEAIiaSKPaAZzpnFftSMmFhHgppcLrQUurrRRRrqeZzZgGmzZIQkicCbpZHCPtTpzZDQiAanGnNpLlBQqqueJwZPpzoUUyYuuxXLYygGytUPozZSlLUynNRduUDKkOoqmJjMFftfFTQtTkIcmMbBjJNnCorRkKWwOoSpPqgxXdeUudrYlrIhijbBzhqHqIiSuUrRqxXQWlhHkrRKpPuULgZkKkKFUiZTtzIuMMclNnPojGgtyMmgiIGYTZzSsnDddDoZQtTqBtZKpPEehHHhkzNjJzvBAOZmtmMTcCMErRJFGgCMmbuakHhawWEqQQSXVUVvPHygaVvqQJpBbRGzEDdeTtoQqQvZzVOBNLjxXVXmGxkuJOJqQjTANXxrQGYBblCcOofqQFSsmGMsRrSLlljJwFfWAKkaxXLGFeEtDvyYTvouUGewWEmMUMGhHlLtjJsFfSsSTwyYWDdOoDxAJiCagVvlFVXyvpPNnVvOCBbcfGEKkArxhdDkeBbOoZWESdxXxShHfGDTOotBrGgRKXTCAaIWgoUuVYJdfOMWwwCBSCBjlLJbcQUxsDdbBlDdkfFWEDvVGSwIIVvWwejJeTYdZzDJVvjyLltdDhYXJjZNkTBCcNrRAPkYyvkKUnEWqQEdWTtKnfPtIiSakKnJjBbbdDyYBNAsOHhypPsSDdLusSUfJApENRrTXKaAkHFYqQyMsLlioxXLlOmMCcJdFfDLlZglraJjAVhHvpPoOPNLlpPaAKVvkpPPpjJnBbcCzrWwYcSspPCtTcpxXmMITtzZiHhoODibLlGVmMvgHhVgGBPpEptpbSsfTXxGgtgVatlPpFfcCnzZNiUuILRcdDGgsXAueAOanMDOwWkKWwgZUOouHyYFsXQRrInNllFxrdFfLlxXDRQyYzOSsoTFAvzZycEmrfbIBbZlLinFpPNnMLqQdbbBrRqKLznPYytBlhIOoDsmMgdDGYHhjJyrRvhjGgSFhHqQKkfYygAafFUdxXDebBIduCcVvUIGqtTZSsyCbqQqQBsjJGcCjqGnNxFxsVTgHhvwhRrVfKkRjvKkkrOaAoqXxRrEkKWwDBbdqQcCCbEClWwPUjljJLnjOodXxDjCsHLlrRyYzZvEegdhhHvLrRlVsgBbiMNOonQGVtLTJgEeyUuYdxtMyYtTLlOymyYXtTrkmPGgGgpBbMilSLtmMkpGbBLeQqvauUFfLVsSvgjSsLOomMlJvGdYyEUUobbNtWwFFVYxXVvRrMmLNnfKSspSBXyXGuitTzjNngGYyJZDtPcCpTdKZrRQuQTEMXwWxXoAaDKkdBVXrfwhsMKlyYhHkKQaETRoPpPuWtGdDZzdDdnNDgggGoeEOUaAuRrRrkSsDpPHMmaAhdcCnSsNsSQyTtbiINjJflNEPOXAQDdOoNcKknNiIbHXxlLPYyIvViZzphBrRbBbopSSVWwQqWGgFYPMmFfSsEKrRUfkEeJjIkKBvkTEeapTuoOUtPIFSbtINzVzTsxMLQCZzZXxqWmMuUrhFbBEwmfFiIlzUzZEiDrjsNnfJjsShHDdEFkKnQcCqQqwWNfBIuUBbKRcWYywapvgGJPpzFfKkTvVVveHxXhSpPhpfwWjqYuUxSgGrhaBcuAaaEeeEyndDaAjggwNiwcdaADPpCdFfDWAarZzIJQJeRrzbBezZeCwnwbzHhZoAaqDVCbKkKDdYxbBHNFaFtTfUNLlqdDyaXVEjHOgzrRqvVQqfIiRhHYxXoHkjJIonHzZFIiPrEjNbpPJKkXtGgvVTvZugDnXaANnLGgUuTDdRrtqQGgqxXkKnnHUuEaRDTKkAcXxCnzZNWQqaCDOrRMzZbBbDkCYrjUlbaqQqdDtOIiPScxEqFqQGvZsSQqfgGGQwWFJjfFeEfRAaOvVHkkKKhtwKkdrRiiIgGDzZqfFQKhSfAEeaqZLlwEdJAHXfFxhUsSFbHYyaOoqPtVAacCBbfFIjJEehHlkOJjAEmMNnaJjJfjJOLAaleYRfRmmaaMmBbJjNnsmYwLNErtgfHTrRpPctTCunNNnbBMuUxvZzmRamCOoHKfFxXctTRdzgRQslsPGgZOoSYDdWTVjvVIjJctSWGgwsHhTCoOwWWDbvQoRGEekSTgGaEBScyyYAaSVvcXdtHXlWwBwWfcCFhHWaAYyaTttJBXgGkKQvKkVuvVbOBVKkaIdfaACQjgGJgGzeEFtRmMpyjrkQNnOzCcRvqQRxUFwsPpUFfcCscCfSgGsCfFJzZllLBbUuWaAybBIylTqQjCVvScTlyYXgfSKyycgeeEEtEIiMmZzMmmuVvYOoMFYzqaqQXcCxlyAbFllLLltGpYyAGgaxUuUfykxAtjkKWJMDdHiiqQIVvfFJbryHhuUKkrvVduvViIBVvQDIiUuuNsVeDwWdxbtSAjZQIVKkjJbByQqvVYSsgGVvzWlZMxWUuJEeMbBMIEeucTXgakjJoxynNYMmvVTZzIsSgvcCaALzDdSZpmMuUmMUXFJVGgmTtCcJqQKkTtjMSSsylJgFuEHkITmBCeUIiqkHvplLNGgkyYrlpATpImIinWoDdtKzZqQkumighsucGgXxCZYxruUwWRVwmAvtUMZQEeSsRrmgGtpILiZwEeoBaAEeTCLUulPkbBGgAZHYyPpBOfHhPEjxMmsVzZCXrRWjJBbQzuDJjLCkpHWtTNyYLdvazCpPvVqPuPVvgHhFOySqUuQwveCepftVvmMwogyCVUWgylqxjXxCzZWwPpSRTEEjLFfgGhOoaAtIGgsmzBDdAribaecCiXSsVzUucCiLwxqzgxXVvGelTtvVYylkqQKtsSmgNnLlfxMvDDePpEdmEetJqvDdoOYEnEzDScKkCKBbKSOFfXxoZznbsSBqQEViGgtTKwWmMYCmMcdGRHDdqGgQiJOnNmMnNCclLiRfZrEemExXeQjXHhJjCBbtSsTVvaUUIxRrCDkQqrhHsSwWeJCBcjJtTCHhbSsehGUoOuSMGDdrFfRVQCdDtUXPaAazZqwfNneECVvceUuEyUIleTHUuhbywqLlBhAaBBJKLlThExXFfebXwaAPyMmnqaApPQffFcZmILVtlXdzMmFcjiGxXZXxjvVWwbBeGznNxDHhdTFYgNNnKTtkdBSsjFVvjJSQRrzCjJdbBuIWfyOlLQqTYXciDdvVFMzRrdDPKKkcVendpbBZxhKkDAxRjWwJrXJjuxzaeEuUHhZstEECKzOoaWwQjmMPUuCtTtTHhcqrRzJjnfNTrjmMJDOodIrRidsvrRkKFPprKZNiEMImMimjIvKeEqQiIkfSCcuHhEqEvTLZJCFzZfAaeZzEfdtTjGgJYPpijdocDoeAFJHqAaQRVpPVfJrhOoSotyYTVFfkKEUuMmrWFfqQJuSlDJkcjLvHiIxqKkQVapCwkKJjsSWEecCKIiVPPBYBTtTYNBHTqQBbfUdDuFRkNjJuRrUaTtbCQfhZbbJHhBbBbjJvnlLWwzZuOruUCctATtRHzbQcsndDRJdVDKIeGmjUbofDbvMMMPJIOoijKcLqybkKiyuKkcwWBbzVMmSsOlTbBzrcsSLnpPYjJlEYJkIMoasltSRVnAaDdDCpgGyYLlezhgRrACcJcEOoLleNEearPgGErUurFDBEekKDbhJNnjoOtWYZsVpPomTRrtkOhxuQqdYyDUxMMmuORlxAbZJriIjJIMWYurwWRMmrRPpUyxGIyYzZovVoObBOvDyYWwXtzZhAsGudWwDbSsTagGjmlLTFwWftTtmMXBdpxCcHhZrWAaAMmTzDdkMgStTGFfeEnKttQqTvIisEeSqQJChghHqQYTteEOcXxYRrXtluUEqQSZzsHKuHGFfidVoBHFXPpxfgtTiIJjmUuMOokKCFnUuOKCwWclxoWeZDdzEYatHhYJwBfFSnAfdMmDFSdCkAaqJjNnmZzvlgjQzQeJoYTZbBzwKTdDCZzlczWwuISbhbBHBsNnmsSZzMTfqQFGeVFfVvVIQqSGuMaAmMDQqnSsMBbXxNnjLlVVPFEeucCUIVoVvAJTAjJZHhRXrEecyPpWYywGMaZzWwIibuMmQIaAVydtmMVvkJOojlMmwjpvpEenebAdOHanmrLMBHddJnExuHXGDdqONZAEzyYsivmpGjLlGeEzYNOcDzoQqaAkfaAFKOKkfrRblLyYZpzAiaALlAaELnayfFYAtYqnuXLHhXQtLlmUjBbjVrRujfuUKttqQruKkGummUIiZJxDnNQrRPmBqsSQFWfVnSsNqokKflFAdDaSBYyYOKkwYykUuanNHhEeiIxteFejJXxaYrZmwzZQqZNnKQqHdUzczkKoOwqQFfAIjERjvRZzSywivVFfQqDiSsGSandpPTtMmBbxhvdMmDdSZMSsmZcnNyYzOospPGJzZuULOFfoQquVfFhMuUvxxTtXSsxWolLUuOPpwWPpwZCcCFflLRkKeEOWShNgGitThyKkzfFGMfZzPokKCIiceDfozZiIFEMnRJBqQgwZuLWwEekKliLoOgueIiNxXrRrchHgPonAubhHUuDzzxNneVvWOqiyzYmMWTTtBbtcCwyZYBbIQNnowdDEXZoOvVCcZdiIVvBrnNRUaNOpGXxCqQRnvzZVEUGzZlIUzNnbBEeWGbjrNmeflLOvVLlFdEOpiIFBQqbgGmgZTUhHuhHtYHIgGnHswtTeERroraAcNnzxFfXXXVmHbBvUlsSGgjgSYyZnNCzzsSbBsDVHXzZDCjJsScNaAAMmsUugWwIliILQqdIiIWYsreEVgGBbJreJiahTtHTtinNIWzZZCZvVqQFfKxXkzqQxXZkKuDhkEZzKkezQqWMzRyAEfETXCcAKWoybsYQqyfYyLFOQvFwfbMpqRHyYhrdXjrRwWzuMMUmMgURTTkVvFJUvJJujrtTRJMTqxlxUjJNYyQyTNlekVvKIUuoOaZPzBFZdCoxXncCyZIieEgpPJgPMVISsSZeQqaznoQdDMmgxhUXeNjDDhbmbHhBlRMWwNAhoDaBENPZaAzVbEeBoUuSsOPJWLlLKLlTDYRrPpveFfEiqyYUBaAAqsSQxjJXmgvVYCRxrznNrRfOoFatzLlZjaOCcvifFfpvvJXIixmNdmUnNgszZivnRrNvEgtdDiUZCkKxUuXLUuctkWSsZztyEeOjEqZqJGbBLVJuUjMVZzeEvQGgKyYcDyYsaNsbUuWjsSyTAywOcCgGXLkobBNfNnciItTGNnhbiIaAIiOvDqQIgkKJjhZzUkeEWwheLTxllLLyCqQoyGHcPpjLlVTkNpPgsGmKZtaBbgGwRJjzXPDblLxPpMJAtBUgSQqgGcCaRLlrHTxdVDdepPIihHEigKkXwdDmiRQCcxXqlLjuUzXxBaXLroUmqQGgsSXbBuUXHeEoKMOpwWlLPvSzywwWbBTHBdHhbdfRRepRsIiSuUwWAnCjaxXxYyXGHnNZEpPzhHZMmsuUSxUuXPcgGGgvVdLJjlyYNPpvrsTLcuUCSAtTrROmiKjyeLVvIiuUyoONlCRZtLovZCCcUmMYIMmBYQZzlCkpOogGmmAamVEeBdFOBuJqQMgECciyYkddDvDjrNSCqQqBZhraTRowWUpPvquTtUgGQVNQqyYVjWwDdBGxXgBzHFqcBAnKrlLfHhFthbnytaAbOoybppYyvkUuXxXxFfcPHhASvLeEfFRaANnrlVsvXXxhVXxlJCKjddDLsUjwRenNqQvvVUuOsHRjqQFvMmfFvBbrxXNnhjfaEuUeEOdCHhODJIyLVvlDFcCSscjzltVeQmMeUsEeFViJeInqQAafFjQoOqJzkRfBbxXVXxStcrRCTDRJjlLtnFNiIZQzZSsrRfFpJqSsAZkceeTSzAGgZXYyUaVvdHXzGgPDSsNEvCkEkKeFfGgpdDZuUtTmfICxyFftoqQYFGgwiUDRrlLBeEHhbcZDdqwWXSsxsjJfJbMmDzZMyYmNnWwnGyftIiXZgElLJzlLgIJAaCfZWmMwDxNnLTvlBbkKKkiMzCfUuFFNYpyYWwWxBHtXbBrGgRxkjbbAaQqMmHgukkKKUGOooObTtQWYdDBtELbBNniuYFWQAHQMmqheEpxHhuTcqvgmsNndDgHfFEBbuUcNJqQjnjpPERKdcYVvyXiKkuuAfOoLlFtTcxJqMRzFTtrIojAaIHhhAargDyRrrSsRkIveNsnNkksdZeNeyPeEQqmPpMRrpVQqQjTMJjtTdVmbBIiXFQqGmMMTLuULEZQXWlIZvxsSpPqQIQqEiIABIRaPpZzbZMSiTHlJeetrskcCKctFfTpccgZzGCCPYyJXQLaoOAYoOGwXxuvcYGOWToeEOFPEDbBdcEVWsYFfoUuNnRrfGkOoKVvrHhsjJSRtTpUKkufFuUUtFfTpDRrdQcZAwWVDlyYnwyGgYhPKcloOJjCNncdUSsZqwxcPpvSXJepFobdDPphzaggGGKnVvNpctbOmMyYWzIliPTMYyqZzhHzmUuSsuYHhyTVaMWPpvXDdyzUSHGMmKkIMUTJqQNnjOwNMiPtdDxXiIkKaRrzZPWwLRKGgnPQqVhKQhHuEdDclLbvVMtiKJjrRheUfGjLcCyYYOosvjfWwxumMPzsZeEfFlVGitlLXOKACcOolLGxGgtpjJdDPCUwWHhVvinNgGmKkmVvjwXSssSmcCzuULpPYywcCZVqQvNrRnviqzJaqQiUhHuIBbsaATBXmMEgcCGvSDdnUnNdqbUDxXRmMYRyYBfYyVvFjqQIhmjwJTJjaXDdGUugKYTtLlFxXuXPgTZzLMmfBaPpvpCcPVYLAQZMmyfcCmAXxaPpAayPpVSsrRQqvUMpPEegGeTbBGJjCYYlLksFGxRrLtCpPscJtuULYiWwYwmMFfLltTLcCjoSsOcAoOaFSwWdDuSWfbBuXMmrVrdDCcZdDYzoOZyoqKRJYPrhXxHTfZqcUuFDiAvboLlBUqlLIiNtTRrnxbjTAoOhHwbFfLxPqQjJphpEmMePBbNnTDxCsYCsmMbTteAtJjhHsAaKPpgrOqSsVBdqKkQqcCQXeLlEWwxwoOsSSsioOJIivtwyskKzpSLSKkqrGZDrCVvkhWwaAcMArMkKVXxTtXmhHUthnNFGTnNdRrDCcRlLentvVTkKlWyMScCAAMUuMrFryEJDdjDdoFDdjAmMJTtjefkKFsSaoKWVVvvwLPpiHhTtBbvTpQAhtTBQqfuavVsDfnNFMmdSjDeWtThHzQFsHkQqdIDWToKZzkrIExXeiIiqgiIFzTtVgbBqQvVqQsSfhHQeXCsjmMJvVrROopoTQAXxBzgGZLuJRfFycKdBtTQqhAaIiHmhHBbouUdctjJTAxXGQqlLZtkKTzgVvwIxEeXiaQzZqtdrArRNzZnGgeSszZkMmKhNOoNQZzlxNZzdoOeEGUzVxOBboamMAjfFyLlYpPBnmZzMJCceRpflLheENOiKhOuUyrFQQqZGwWWwXxoTthJevxAYQGvVgnQquAoOcCfqQnoOhXJPEKkepjyHhDFfdkPpBbBNncvdQKkOEeBdDWDdNgGWcEECcCvVDdcZEQqQqqQcCjqjiODdoVvRInWGlLGJuUNGgYAUCbAHRsXyQVvJHhFTtPHsQqEglLXxGtIiZzZjFfVSsiIjJPACrkibQqeKpPYyCcCkJjFfFSJRdIexXuzZZLMWAagGeftTHRwQzrRzZcqlfZzQqFmXAaStZvZnhHiTBSssvVfiqQAtKVbiNIinKFukepyfwJkKjMmaAvssipPIuUPOBCnqaQqxCcogGpeGgnLxXFnSsBdDYqKmQqDdMGTwUpiIOrtuUeAqLkJjmSHyYWFRqQxvbOxmwWetqUqzkIsSXxUJjgMmxYxbsPkFpPlUuyvfvVfzZTnBBOuueDgVEeGlAaAVElgRdUuDrPFfKNnmMTSslsLdLlDIWwKRxMYoZzBbiXxImTIiXDQqHhGjuKLlkUtlTvTtgwnNWqTtaLlAmIFfoOGSnNvVHDrRGVhSbBztTZcJJNJupLcQqlLDdeBcCceQRKFfkKVJrFvHWVGSstuUvEeSXfXgQJvVgoLlOSfFUuEecYZzzQrRgiDiEuNnGsJHQqxwWxWwXXgmMGVXxSdbBiHLbZzvVHhTMmpNZbAaBlkxXQBTtDlmflLNbBImMsSzVvuUiBFRMeCUtTuzZHhYVafpPtDdZqGaAgsSXfLAaeEFRrfLiqxSaAfhzGoGgdaSsARrmNAoaEUjJaxSCrcCTAvGFBPTPeEwWtTSsebVvvLPplLlElLFfeBIdPJjCyRGgZpgHhcCGRLTtGzfYyzZIiFxXjISmfzyYDdGgZpwWPgGjJgGhvVvVKkxtnUuePajFlUuUuEeNnlLYyYobBLJjlQqTpFcCNkwDeKZzkweNujJVKNnpzZanMmbtqQhHKPpnzxyHEUhHutTEiiWYjJysgZzdePpwKLBbSXuqkKLlbBsbsScEeWmoFfFDjyOoTtvOGsSwilLvVcCctxkbdgFsHhXWwxXgGQqeEDsewzBbEKHXNnRaepPgYyFoVYWwCtTaAnNfFcxvfLOoGDdAcJMiImjIjbBaXdgmuCcgQqOVtVdTSsfgmhHgpPMLygqRneEatojpPUGgKQqXyYgMBlLIieSeEsEbxvJlnbLlxXaAoNnRrqhzZHOaAZgrPjqQyBbYAGYtThpubBvxsaAqDdegmMGANoOnKAegGDQqdEUBvVcfFfjeLlTtjJzoabVZnSsTbgGzKvKCckVVvfFCeEfFkmMKJjFfckUuONdPpDJHhOpvVLCmmfzIiyYGffsFcQqCjnNJfSSsFFlRrhHbBLBfFbtNhHVvnzZTDdwsQhQHZOoJIHiRLyRDtTEDGQsONniKrYuYyxXsOpUuuTYlOWjDdZzEbBbmMxXrRBMmBbUQsSbPOZzsSogNTtIKkqdFfchvaADdVzpPPwWBIyYbBKcCUoOoOuqioOMzBbEFfPpwWRlCPNnPGfqQsTNksfaAFevWnNphlLHJRGgeErFfWaUBbSezfFZEjbZMmCbBrEeYZyXwWDkKNgDdXxGwCXxtoGNjplLIiqQCUuxXIAJhGoDdGbfsBuUvYTLHtvVnNtRMmDdOoJmOOoDdmMoAaYDAaRkKKWOowkgGVvnJjNSseEZzSsXPpAzqmnNMQlLxXRSsjJNYYkmMyBbQtNoTzGlLgiYyKuubBtqLfhrXEOxyYSstDnoONdbPgHhGptoNnOwUuyYYyINniNHFciqGfFgoiItFfTeEQqJkRYXxIifPmRrClLWwPWZHSsErRuqQIrnWLLIOoHNSWNvVnpZzXxkKPkKcCwsuROuoPkKiIVhayDdsDTRQVMYZzEJjjGxXiiXUufZaAVvQqLFfdWeQXRVvGNngynJAaJjjVvLnNMmbBxXUTEfFRXRFXRGxXoZzOrRdjgnNGgILIihDdHIsjJJjSrKkZMmgUugHMgYyGmhmECzZcfvwxPLiAaFwEIhHfFiqMMkcCQMmqKzOShwWWkKyVOxHphBvVCcyYeEbHkeFrRlLBlqxXLtuLkKRCTtVYylJjjJHhtIiqaGWGgGgwOXkKJjxfFUJczhHrRsUvinPjyYwBbMhCcaSbeELhGByYoOjJTnNaHLWwUuEnNXZdMfNnFmmMGuBbSssSiMioGgOHVosaADWfNhFewXLFiKgmZzepxbOfdDmMtTVjJcCklKkCcQnuxXpyNnUnIaAiNzqnNdDdNnDPAahNnHOoCCctInNHyYhwWQqEcjGnNJvVbSdDPbFfBUuRrVvAapvVsBlQfBiIGgbaAxXeQqeLxpPdAawWDbrIuUfTtDgGGgFGgXxfdfAVjIohHOfVptrRTSzZfNneEFfvqYygGzJzZQTtqcNFfncFTzZtjoOJjJjopVvXOdknNdYqQyQqEMKkAYdDJjmMedJfGNnunXAWwatTxdNnDdTeEagGbBzZGgAdDuUgUuiUyFfhUuZzHTZBIeEhAHcSsChJSsVvMmjwcONniMNnACjxphBIipoeSqWwEeOYyqqibBVWUiqYrExSEdDejJdDuBbNRWypPLYyOZJKwNnLuUeEJaACSDdsbOomEBbenDhveEsjdDSPpLlzFfoOISwmMOknZiIaArcCVkKttTSZzsTvdSsDMyYJdcCKcCkDVAlhJjpwWhAaneENXJfFqwWIZDRMmmMofFRRrHhGBlLQqFzZfxSsXvFfrRjfFoOhacCVvATtCcZGLJErjGgTJjtiIUyXAaiIxMTxzuFfDTEefIyFDIBbhuUuUPgGpusHCcKkWLllQqBosUnNMAarRmiIoOcBbCyxNLlnXRrjqvVqsHBFfhHbzqQWDdOjNnbBQMDOopPrIvVyAExnTtGZzpfFzoPpOocCOZaJHhmAagGmGgOVxXGvVKOkqesSqJcpPWitQcCcRrNYYvOzPXyYmMUuUTVdTtDvXvcZzkKBnWwHisjYyMmXnJjNiITqDxNpLHhpgGrIybgGWApdGrRSgBNmmmRrMRGgCwDKkIglLhAsSQEzNnAavVvvVbJnNCyXxYTkUuCQyYqcJVgGvHhqQkxwjJcmnJqQqSbsSLJaAjaABIioSsNnesjUgiIGbBudrGgXwUjJZNsSIwWdekKlLhHpEePHhdnvVXSsOVvoyuUYyeuUXfrNMvVmBWwGnNhHownLlrFyOoqQyYYtkKcCLlPpqZzmMMmrRQHEkKeMmtTIisKUukcCOyYoxXcPlwWYyLIveEMmPJoOjsZzDdDWwPpdXxEgUuSsmitHGgCcIHLaAlOoUuFuxoOQEeaQCcxaXxQLchDOCBbWsroOhSsXxsSMmHSGeoOEgsqmDLDDdDZDdqfVCcGguEgzZGayYOkKoRrBaAEhrRTleuUfrJkxBbMmeaezMmTtObuPpozMvHFfTpPWBscmrfNnTdDtiIzHfgNUXCIQqpvViKJjuUvXxCcBTacCAoOiaELlvVWwQqvEenamFfMAPpNTDMmDshNnyhzBbNTjJtnAABbFfaZmMzPjAVpPvWbBZmzZMWfXxrSsuULloDCIeEtCjEgjHiIipoLpPXZoqJjAaqWhuPpDdCHiSFhHfAaoLGyTtxXnsoOMmmYymNpFpPNtGVvgltTdDLSsiXzgGwevVCcUXxhHRruDdiSSSbByYyhTtHYAaaoOHhAMmMEebGgUuzZBpFsoOwWeEfeytfaEipPZzIspPtdFfkWwmMKIWYBbBqYyZWwFdVRFftTSXfPpYlayYImMizXivIidDVkKjYTtyqABwdXxXRIhilLkKFQqTPQuQtTqOUeOokKIiEbFfcDpDSsCcbDrIigAiAVSuUsvloaiPGSsfxcabdcQoRlyiMskKbdrVtTvHEJUubBUJjuljfFJqQLcNnPuUBbpugNnzmTtMZOozEpPZCNXepfDdMmirVLbelLhrJRhvVwWZXGhKcCkUuHgLTtcyPEsSskBbCcKQqtTYSteOfFDdoWwZfFzFfTZUAauztwYbBLlVOovTxKfzZzZNnFLlClVvWwkKLEZsLRbAaLtIPvdsSDEKkXJooLlOVuxsdDSsNnSUnILvrbBLPFYQSseFHhtxXTSsARBbbEVcCeWqvHhPPxthHjJTpPttTLlTGCqyYSUjbBUTtXpPxlLUHGgAakxBbXlOpChEtwRCcIUuVleIiEckKEXxdBIoOpPJvVjEeGggdDSsaApIswmlFkaAWrrvVdDKkRYETkKtenotTONyRZqIeelNXeoOJuCcvVKwoOjJPpBbJIbMmXamSscolLOCeESBoObYydDDAazZjEPpbjJBPDKkBbbegGZPuqDDRrfrJjpPqHDQMqzZtTWiIEelMmwMmWcCHBbaEcsrsXxilOHhLlBhmzZtbGSmMIlgGggYwllLsSNInNHWTmMNntlLAaMmQKmJmRrvJyCxShHqqTIwXxWdSVvWwEemOfFAaodeJTKQXxZzCcHzdOaAXbBiiIIeBqXlKWbdyMbmWtTarRtTvVWwiYwWHhILPpUupcCPnNfjJFawDbYygakTtVvKwuUWWqKkiIQcrGmxWlnmVQqlamMmdHhhXxavKkwWlLcCiOzLliLocWwsSCJNDdAerojvIiLlZWiiIWwgdfJWtTvqRrQjLsoHZNdDjswWlSsbmMgGxWwcfFZmCRrcxkPcFfLxRrXSslFYpKkKjcSdDOoEeWwgGTtIEYyVPLBQHfjJUwUoOuWnJUjuUJDKaTtyYASrRRXgJjzBOoFXplTtgTzZosSeESsAUurHhcAqNIBblqQxFfrAiILlaPpRSsvVfwHhBZtTziIuhSdZVPxXrkUuLlKRxxQqDAOOxHHhiHRrAkKSxMmmqQMZzGgyYMmjRrJfxpKWIilPpQFfNnqLwWItWmbBSsMOhHWwiNoOdDnaAeEBbIgMaAeLyVLNrAaRnIFTTpPmMpPuJROzDisSTnNYxXaMmAeQqUEdLlpBaApcHVvYyhCZGggkKGAazZORrxXSsIiaAKPpnSKtmNnsvVSJQqBbdCcDUSYymMzNRrKxkEAXJnjGkgfMKqnNQPqdDeFnNpPKxWwdDjvcYZFUrRuhgohHtMeEuZStkKTsBcCxPVvuUPCMJjBlLHcChXxPpwSslMmDLltIBbTtuzaYykKARKkrQqPmMpgdgAamBuUrFghPMPpmfHhGahHxXCyUuYtPJNnjpomMXMWotrnNRRrCvpPhULVvlYqrEzpSNcCKxyYXkfFoOYXpPXOFfQqHQcCswYyWCoLFHzoOEeQqxPtuUTxlAaBgGYyHzZgGXXyNmMnjPuuUZzUsSpiekUMmuOjJzPpjQqXdDxfFNnghsKfFhkdDoayKpLlISsHpvVEePrMiQqHHhhMPpmyqOxkVvdjfFJIDImMkHhKWwAePBHhSVvMGgnNrRmqKkxfBxXMVKkXnNxlzZXsSxBaAbLCpuUPLlZzSBgBbCcGYjJGtZzSVJjvsaAFUlLJSBJpPAAiQqoiIQqOIiISQqpxXPsMmPpnNgAjJTtFpOocCRfnrdOyrRWwMgGmKVUpubBmvCGgyYcCnNcxOtSsiMgGtIaATfFQqZzBbtIiJbBucBgQqGVdDUPVQqxAqvaxXAOobRwfAKkKYywHxdGyYgHhwXxYUumMyXrwWRTlHGMRnuUHZpTQmzOMmdDAaqVvlxDdmzZMBcuUOooNnctvVTEtTHBbhXFfkKtYyTsSEEyOoOeEdmMDegGETSpHelLEyGlLToaVsnNbXxJpPehJhHGgQxXqzcCcJItcSIBbAQkQmHudlLDUZuXxaAJyFcfgYPjJKkLlBbPpIwXsSAugoACoOXXxGggGxbRvIGiIbXxwLYsSbBfAacSsCnNkXxdFdwWHSsPpiZbBzIHixXrRKAadDoORSgGwWnLAzoCKpruUNnIMVvXxFVvfxXpPyYrRjUuOoLRrEelEeIVSScFfCUEemisSxfHKkNnMmYyGMmBAazgGekKJjErwaAWnkOLloBbhHYaAzOPprQuzlpPLzsSHhSsOLCclkKqrRRpPSsrVvLjJRRocCVvkKyoXIieWPpwFfCfFILkVvkKrRxXokaKkmyYklfFLZyPpmZUuvpEekvVKFwtTWXWwxkKXxfImMSsibNYynrOhXxaoOHUGgLwWPoOgzeJjPzGJjgXxZAkpPLlKUuvufWwFTtvfCcGmEeBLTtlyYnEeEeEeQqEwCaAGOSsovHdgGCmdDFfRxFRcCsSEeOoeElLLwUuzwWZdRpiBEyYMRrkKRuLkKlXxidgGHhkDJZzVUuWCLTRrxLlLDXCfFcCAXxeYRINsSnCcVvyYieEwWMAaCcAEAaerKknNCcVepazHhsMmUQqcCCjAasnNqQWgGuUwnNCmHjJIFfgGpPcpfjWwlTfAJjkKaKaAJjUukcgJjyaVvAHhYMjCcJYyIiUXwWyYEnBbJjwhXWGgBbxEeXwJdDjZzmMuUAMOgGoMmGeDdCyoOeCMsFfSmDFYuUgGBUaiIiAaArlDdjqnleyYrRhHbnQqnLMJaAnyuXJjxlXcUuCdiToOvVtiIJAzqfzZtklLrdDRZzeUvJjCnvlPKgWwiINRNnRmMLyeEYciIEeCwIvTeWwEtzsBbSwKkTsyYStBbWzjJjAkkKEegtTAaKucoQRrpOOBbooODdotTjWOoHGrwWUpkKPDklTtEEeEeelLLrRspXxydOoDsuKmMrvVKWxczBDdYtGgZSCYycnNlUypoOPpIiyYVvPQyjwOomMXRLvGmMnpIiFMsLlSsSmCcnNfCsYdDLlaSsBbruSsUmyBkKAuURGgrPHhAajGgbBxNnXgGxQYMmUcCGgwewWdWwDvVFUwWoXEYWweQZzWrnoONRwJLljHdGpPFfgFfFDdnglFEgaTjJQpCUuABMmTiILlpGXPpkwWufDdDjlxHPpfFhdhKDgGiNnPpxXAacDjnUXxuNQuzZTtqyJFpPfbBBEeGggkKxBbUXPZzpiQqIPVYyvOopxTtXxHuuUoOVMLstwQqWLbBzYxdDTpYQLlLCuUtKkwHhahHBNnkPpvkKVzZKfFjJWswrrRBXxbafFyYAiIRHJjiLlnvVgqHhkrRKkrFtaeEcdMpZzGQqZEPGKZQexsSCOoYyGEXxiYhHDHhHvVZzhghmMOoHGdSsHlLhyYwpPWwFfiCcIWgNnpPGxkjBnXxEJjeWwqQSsCBAajLlJbTtBbdXxTrZuUeECGVvhHgXduXAayjvllcFAaUufHhCUZdDzukKnisMmnPrRYvZuUHhiZdUubqdDQVvBMgYlLyhHGQxkjJwWUYiXoOGXJgGcCjxtyXxYcblLBeEClBbvqQnkKLTtlSOXYJyYdvWglLjYxXwmDMmdTtcHeiIErRbBSIPYiIyUuKkEWDdboNuUngclLBbCBqQbpqasSJiIjZTpiIPjJtxXvLlVdDgUXxupPGqQIioOfLYyllLWHhwpmnNMVvzhHuUcCZJLldDxRbgRrsYySDdGByKLaAHhwJjgGJjWeEfQqFLlgGlyYLtrRcCMRGTtTyZeEnBbIiNakXSsbbBqQGaAgTfxXHhSHhdDBHciIQCkKwWAaQLlEQqNngGWSusSXxwJjRjFfcwTgzZGGcCgRNKkhjJFvVscSOoCcWJeEWwaAjABPUupIWwiyjTtJbmMmmuUhHoMjrouXxjJUORKOokkOBmoOMFNVvbBMmNnBbPtKKJPpOoDdjfFCuUOolCcCckUcCMRrCQqcyYHGghmuUMlLrLGnDdwWUheUoAaOqtTDdQMcCmvVuaiIzTCeqmsPpSKJPBbknNKKFMZmowbBBJjqqQilpuUcgBAazzZzOtQqLleElQqyYLVvdIikAIkKhGgHSyYTdDGaAyfFrkqWEewmMbDdBSFfGPBaTFfVTuUyYlGgLeiAsSUfFfyNdDDdNvEPcCpqQsMeEdsbjAasRrGBbgWKLlkJjTtguUGVQzZcnNEJgGszZMIimMmjVkKuUyYvyTMmzVqQvIiZNKNXwWdDMPFXxxUitTRrmMlkKeEqqQQLIXBFfLlbfFJXXxdZgiOdnVvlkwUARrXyGiTtLHlLHhWWwqQwVnFImQQQUZQqCpPcueWPUSsZGSsyiyYCFDdfcSwWsSsToPpOtKhHtlKkLoOoOIuUimnbBDnegGhHPFXxfbeEBdDpGcCgCeBrRaAsSWPpIiwLlqwWRrnKkqWwQueEqQXxfgJjpPdDDyYdEJhHYyjIiYiIDdlLLSWwZzoRDdrOpPqkwGKkSsgWBwWHaAEYRryQwWJVvjqNxoOXneQqhMLlmiIplLPJjpcCOrFdJwWFcCeEqQSsXxfeEmMjDfUYyCcVQqvlcSvFfBlwWNbyoFRZDdkVigvJjtTFfdDoOVGgZkEelzZrzgpiMsSyYBbHnNhdiIgAaLoOrldNQUalLAacXQoOqxBbCATtnJCNnlLrLlpRASpPaAhwyHAcCahvVVZbBEGsnNSHhwGgGkdkKpsSivHhmMltcCOCXxmhHMNnrRbHJeEjebBEPpqQhdDBTZRINnwDdrMAVvEwEjhmvVciIUuCMPoOMmrETQWwwWvEnvxXEjJeWwKdDZYtZZzzTfFFHhflLytTWwkKAgVvGazxXKCcqTtXiIoOvljJlLLsSDwWWvbzQqZyfUuFnoONcCeEuUpvncZaAzCNEwWynrIEekKHUyYaAuElEeLfgmtDdzFFfEJjLbMaumMHhcaEeCWXxwcAQZyBbYzGmUakbBKRrdDHjJcCXPRrDIiDAaddVvIvNnlYyLgGVzJKUaACPpcrRukaJwQyYqOBbKkzXixBbAlLqkKQaMmhxXQqHlMJUujmXIiFfJcCACcaIOoNnoUbBwRrlTkKtoOqQIiqLlgGvvacYAabbBIiBRucbVBbIipjJfbEUueXyYxEeKkrbBnNuUYDdNSRnNWwtbBiITPpPhHrlEjJlqpPQxZzbUurhHmGtTZzyYgsSydjAKHhqQkaWZGgfFyYAJjaFqCuUvVSyqEeQYRrssSdeoOicCuTtBbUbBlNfmVvUFhQvqQVZznMmcGgLlEscgvCcxXVjJBPpEBSsQqxXRNnrVzZvjAabByXXxxUuUukAaRQqFtWwnFfPpXjJWRgGWJhOoagRrKBbBdvVHNpWwEeZJECceVvqMmQbcEFwSJjwCcvKuUkVZzyYUugGOobBBbWtTRnEQqhnNZzqSQqsQWRrGgwnNHdDeDdWMPpDdeZzZGbMmBuUsSCXxiIcJjsSGvHhbBgXZzuUxyYevVfFnRMvQbHJBbGgSwWVNnMtgTjJtTxXMrlLcLcYFfyXxbBBWHBbHzZhmiIRrnNpvvVhjJWfgGtnEeNwWrRpemQoTJwnKkniWKmMCcaQBbqeEELqQbiIfPfFoJrrWzuHXsNCcFfrRwWnarRxGrcrRPYUuxXHhhDPoItTZIiOOoZzpKkPoqQBbzygOIBbiLCrRMmTlFfheEYhxXrRmcZzRrFCcfJDlTtLdyMImbAtBDdEegGExXqbBQTZzuPPRgMmvVmTtAMmoOeHhrFjMmyYKoenRNnqQEyYeKRhHnWwNoOrSvVsPpkrmMqQKkjskKHhXxbFfBpYynNPsdAvVYyZLljJzefFQqEnNEuUeXpPZDdzxbBrRqQavVaXxdbBDAznsSNTWaaaARroOjJAtTldDhHLCcDlnIiNLpPxPpekSstTdbZzDdlLzoOZxXsSBWwbPgGIuUZNnzipWgGjcRanNzFfcVAfyYxnNHhAaAMmkKCgGcWwqQqtCQtUuTwWjwWjDdvrRVwhRsSoUuZzOoOzCFHBtTpPAaQVhWwmsSjJFeWdDJtHhzyYJjMIbEeWgGwRrCOpPojnNfVKbByYbMwsbBSWbBmsSguUGhSXxsbHhkKoOaAXwWxUuKqQBKJGxXJjXxLlvVSHhwTtePpEOTRBCcpPbAaNnoKknsxiIxEeniINrEnNwGZAGGeiIWwSsEyYgoOhHgLlIimSDAWwaLAHhaFfvXvVEeSqbNnJjiIKKEsSuzWwLnuUfFNPpxXyoYVvlaAuUEIiVVQqvvNnGgvneRrENmOKoOFfmzZdvkKdeEDcaqQmTuMmvGgsIwNrcbBCqmSsfxgGXLxXlFtiIThTtHOocYyCMnNTAatStClLrRVbHyYqvSsQiGwDuaATaZirkKxRJmMNfFziIZIiJjNoOJjnnlLzZBFVvfOEoZzAyTtoXxdDfPsSpFRKkraqQLlHhWwNnAOGMHhmnNgMsSpLlJjPMaJjuUhSseEvckKCRrkKlxWEehxXvVfAaiIFDQqoOdKkAaaoOlENnOoeLWCAHaAhSsgKkSsrRGuRFKkRPdDuVvQqpxvVXMqObBLJjMTtmjJyfQqFgeLllTtLnEegSsDXWVMmvUHhcCpPrOohltTSlLGgZYGxXgyMrZexXIrRsSPpIiiErRHhBfggNnzZNRLlsyYzuClLuUFfDZzaPGgaAujlLJUAafFfyaAJrktTKRjYkNsSkcCqDuUYEePpEefFuNnJYyeWwjJoOrRSlLsBykKSsRYyIVvIiQqikmryYRFfMJjKUuYYyYyBFfPphTpwWPtxsSACcfXUuOkKpuUPTtZlLuUHhzaPxXpApPRrEenLCchHcbBCsnNSOBATtTIiVxXvkKtTqQGgvnKkTNnVvkOoDdcCrUQqEvVeGzZFfJjgwWfnNGgcCcCphHxXrRYyPFoiIOsTPbtTBQEeqwWHhpoOkPpgtTRrkyYKtjJiIvViGjJgIfLltaATaAzBBbBRwWNsSzLlZgFyMXiuUIdHhDxgGDdUuFfmYfcCFYVvRrFfyyeOoVIAasfwWpPlLrRKkcCFSfsSFZzhURkKmXxMSsWtLVvEQqeOolCMGhHRnNCzEefOIZzWwNxXneEEmaAMeKkvVWfFWxXaAwpuUPVfFFfOoVZziIuUVTtvWMmLfngAkqKkQwGgWsSLxlLXDNFWrRwKhHvjJaHSswYMuwWGVpPgjJMlLzZofFOoaAFuEGkKeEknfFNgzZGHTLlkKzZVAWrXznNZxDDdXrRxMmouUONvsNnexlLkXxRrWwHNnsxXaztyYhaVvAHTtwOoTXGgxKclLCkteELIfFZYaACCcYAmMTtaJjdUudgBbDdCEuVzBRrCcMmjJppPPGgsSbaXxjNkKnHhkBgGLlbKJeEjNLlvjJvFtTfMDPpdkKMyRrgGurVvRzLqQyYmMDdcROorCFLlHbPpBTtTfFAljJLMmatssSNnPGSsgKkrFfqQtEpaAPeSNzZWrRbBQqUXxuHhfFSRrszyKoOeEeEAOyYAaoaRrYzFfrcCfuUFyYYJFSlLsfUSfFwWslBAyRrYakKdZaCcAcCzZNnzxXwWYUuRrRpDdsSDBbhHdvVPDdCcciICbBpYFfTDKkdgwWqQGWUuOovyYcAAaUVvusSaPldDLPCfFgXMyYmxaAwjzlLZnmMCsScNLlcCkjdbUuBswWZzJjmMJxXjIYhyYVnFgbBAaGdmMjGgLlyvVYGaAxIiNnDdHiOoIKkhuUXuUJvVjgBburRIiImMKkiWIPpPQquLaPqQOoRvKTOotqQkKfRrEIieFfIFPpNHZoOzIIiaAiEeBbpPSkoCczZOKgeEGAqRrrRrLlRCcvbBVmIpyYmMEePsSiZBbFfLlzZzDnNVyYvdnttOoTilLRBbrmMppPPITgVgGgzZTVfGRrghVvHoRrNnORrbSiBbmMhNnUuHIYLlLlLGSHoYYyyOxXKGgkQfupPruUgGiIhDdHQuUqlLjKJCIiSJjIizZRkKKGKDWOoEPpewdqQkKlLmMiKksSRrLuUhhHHllfaAFLSiGgIsjjBiMmIbJFsSPpZvVtQqTCGgjJxvVXlOoLehGgHMmalLAriCcIRexXmWwYyFDhtTHyYdgOoGxXSCAaTtcWwxwWeEqQRLlweNneEWwzZsSzZwHhvVQdDaAEBbeQqVrRpPbBmGBbfzZFghHfFwWMeEgYVsOoqQMmSSsvyGuBqpjJrJWwIElgGLpPhHejJIiTngPpGNTZztUusoDLSJjoOsOzZoldOStSsDSLkXxWrRyYkKwAKsopPIGMmbesSEdRrDpPTlLHhsSMkDdUNnkKlqGgVEevPDdADVvuUwWZtxXwmHhFlGgxkKXHACcJjsXxwWSWwXxkbaIiAEMPpCZzQqrJHhKLlezBbkKZEYykvVjtMmcJjCawWQqANQiIqDdmnNdDVvBbMdPptZyZzFSxWwPKkpOoBRrjJdlLiIyMbBpPtGgunFmXxLNGlfRrUuKkPOoqQXrRMbwWBgnMmNGmIiZpqAaQPIVAIiaoRhHUaAHiIhuejOYMmzZeEJXXBbxxGuUgtTGgjVohzEeLvgGVRsYaAWwyMmHelLbBflLlVvXxTtlyYnNBbWqJjWUuqQMGkvVKIigGgWwQqmZzmlgqCczZMmKMaAmDdNdtTRYySKLXxlkKkvwWVBXxbmMmSElLcCQdZzDqUuSiIdDsEeVpPAaIidDBrRwTtlSsJqFaAbBfUumKkBbQqMtTPomMNeEeEnXgVvGxGKkMDdPpJxXjeupHhiAdDaUunNuTtUXxIvcCYyVQzVvZGgdCrtTtTRoyYyQbBqqQSVVEeNqQFhHWbBzsSZzgGBbQqhCcHZoUfkKFDdosSDaAkVvRrvZzMmfFVAkpPKuUaUxXyOgkKGhHhMmHrdDkEIKvVSOzZDdnNosAatTTlLqQtvUuZzpPYyYmMblLJjcxXOLbJjmMGgJKkzZtTZVdiIDoTtUucrRSsdDClLmtIZNnziGSsghHQqbKkiOozlblLCDdAaVnNOgGtuLFflUFBbfFGgjYMHhmAcOXxqVvQCcLlnNLlGzZgmrFwWfclLCccCuWwMmIiUurRRPQjJqjuPLaAlZtTdIiDzpwWLlvHhnNEIpPbjJVNkcdVvqyYQDCKRrnaknbrRBNEPdzZWwGgBZzzfFZbkKYPVYdDvaAIibByTXxtGgyYwWmokABbawIafFmIMrfvVNDdniwWeKkkKzpPMVvmuaACYoOQbBXwWPwWpWGgtByYRriIlWwLkKdDqXwlqQQtsSXxqQVyYhHeEuUSGfFwmJjZzMApgGcCJwPpgGWwWjCxXcyhdDHkLlDOJMtnNYyymMcChHYYKkUuNnVvyvVVvHGghGytTbCNncBYFgyiEeIYkKwYyQqHhLlWGBbcEsSypPAhHavQqcCbTtBnNcoOCxXzaAuPpqdDQcCvVUFnNDdfYqmDVMmpPclLQqDdPpbBmMrRgGFLjlLJswQqXbBhiIHxGggSsNnnNBbAKkvVyfFYKkrRCkKlLfVvFUuwWkKLlEevrRYyzZbBbQqbPpBpYeEdDyCcVvXxGgEemnkKaDlNnqDmpPyYMwQqaPpeUugBZzdRrDJjDipcuZjCcJFfQINnFfxXyPpJjYiOoEjcVvjZuUzPjJQoOfvVvVkKJjYyKkTtoaTpMhHmsSPtKkGJHhUuXxXxaAawXDdxoBQqryFfZGJjkKvuFfcTtCcbBtrRWWwbtTBXxPpSjmMJzZDdIisZzznhHNJArRUuVvGOMmhHdDvVoOkKEFfHgGtGgFfTAXxaOtToHhPpZzMmbLlBIpPuOoEzZeZzvVsSUjJlEZzewWLnKkMmNECAXxmMaJWLDRrPMZzBbEewWmpTEdKkBjJIiXxbDJjuUbBgGuUYyMmYyCYLlyPpFffFAaLlnwWNVwWvzKkZeEcSsbBBrRbVDsSxXxXdLJjNeEYyUuQqnqFfrYJjhlLLtAdtTfEaALlbKkBDdvVjHhsvBbFfxtTxjSaCTJjZzSstcgGzddhwWWwmWwMQqgZzGdOoPztjJHaORrYylLKHhIieqQEkpPVsSvvFpPfIqQidsSUuJnaLCcpEZsfFGOGgJBbjlPpDPpnNyYdnIUumTtMcwWCKkvVVvDdiNNnaAvVLUuXcwWVvHhUuogGqQxXOkKOsXiBXxCcbIwWxgCiIsBaAbScgGRaSsDeEnQWOoKkrFfpqbBQuUqYyQiIjJPyuUYzDdMNnoYyOmDrRJjCccCCcZgULQqyYluGWpsSPPJjvtTeERrKAauUDddDkTBvzBbZVbJaAzZXxCcXxNBbMHhqQvVyYtTobBnNOXAgaASsuURpPRrUurPpdDLlGOoMHhIHSEFfhHXxgGgkdpoOKkbBdoOXxVibfFBIPYnNoOZzFfpPNnrRlwTtXkyMmYHhuWCcofMmFIigGOpSLlsPrFHCCdePpEDnNggIkDdKigGWKJdDQjjJoOkwSsCPpgHhYXxyIgGGgiGcHhyUuYyYQqLlQqAiIkKHhMTtmcIiCZWwBKkaXxNtWwyYnIitTSAIGgDpPuiIWuUwDixSsXhHLlsSaAIXxRrDdCcUciICfFMmhQqbnNmOoMFftTXxRuUTIitJjbNnTJjrRuUsHiwjvVbKkBbBRrJuUyYUtTuaAWuRrMmCcOioNnEvVeOYyyxbIiWwZSszFvzCdFPXgFfjHhJzicldNnOLlNnoDarRAfAaFyYlRrLqQAajJsSYGgKkyfFAWjJPpCngIiGUBbkTtKnMtrRTgGmNGvVuUugGUfxSHhsxPpXZhHznNZzUuVgDdUmMDYYyCXEXxZkKzeHhxTvVlbXyxnIAOmYyBzYyGgUuIgGVvSFfJoOCcDdTtFkWMmWikKvVIFRhHrmFfMJLljfWwGonNOCaAucCLXlLOoRTIitrQnNqxiIwKkqOoUugGVvxXhHQWhHlwKkWURBbkCctThHBbBbghHJjAacCGZQqLuUyUsSusxEeTlLtSsUuXNnulLUDdeElLNnSYXPpxtTlqtoOwWbHhBIZzgGrREUueiiamMAlsSLIcCYygdeDdAamMEejaAaACcNntTHJjCcqQIixHhPpWPpwsrRSqjJQViIrrRHxXhpPoObOornChBuUPoOpcCUcChIimLXxaAurxXcUuEeEUPvVTRruUtpsSPqQpYyPnNEERrWJjRrwShAdDpgBMmbGGOZvNjdDmvYyKkNBbeEnjJCEecjJBqRrQbEesSFksSKkWwPBbpbBNnKtOoTKHhaQdDiIXDdDdwWNlLXxnmbBMoZzbBIRrJjZkKzqQkKZzEetTrRNnXxDmMdkKqOokcCBbNpPQqvuQkKxXwBpoOZCpPLIilYyMKkmcvVWBbqdzhnvVNIjJyYiHsSmMmWwEDdePOoEBbeIGKkgsxXSSZzsimMIwHhLBblWUuPpScCsiBbZzFfmXxRrMVecCEvPpduUaAxXeOoEPAafHhZzJjOocCDEdqQxTtgGMmekKEFIvVZoOSJYykKVCtrSsNvVFrRfHBYyzZbhvAaViZxXeEzalLkEbBFfelLMIGgnuUUupMmEaAARrGgabBVWwvpPaAfWwRENSsIicCiInmaTtwHvdoOiIqynYyNMmYFfnNqLlQcqQCbBJFfLljFbrVLKkHhmFlLfgGMomhHhIAaVsSvuUeEtZzTEnoOtgGTJgxXGLZznUuoONlUuGmNnMTtNngjDdMsaASmeUugGyYYyErReEBKkvjLliDNIiUundkZzKteXIiQvVxXqxUuEoPTCctNfFpPKWWwdTtpPDVTtvgGLlJgsSfFvkUuKVEDoOmMMKkdDmYpnNCRriIcimmzZKkwvmpZzPXxMVWXxLlMIQHhaAsSdDMmHJdDjhDdDuUVvEbBeLgGlToOtgXxGFfXxBbdHuUOoCcNiIRrZzhHUJjVvDIfFakxXAaeEpDdPyBbYWqQwdQxQqoOXQHRrhDTtXxMmdqCKkcOoMmqwWyYTtdYOolVvLQqsSuhuwWUOiILSsoOfoOFaGQqgONKwFqaAQYyGgxAaZzXhHAafpPxhYuIiURreETtYymiIMXxRrdEINnNncCinNwWqQNdDnQqSMmEesKjJwmQqMWhiIHtTacCAuBbrUuRhOvVoWHhFfwGjJCcgxyYypheEzvVViFfwMmWIXPIiVvpCBlbBLbdDNnIivpPBAzZawWTteEbWeEKkNnCYyYyVvtOAaDdZzkKkhHxXFVvmMfYyKuUouUBbMMmmiITwTYEgGuOlLSsVvoLXgGQqEhxxXbOPpZLBhHbqQVvmMnlLNiINGfmMFkGgDAvCcoOWfOogGmcleEMuUWwnNLltTBeYoOMmHeYyEZxPQqDXxduUQcCqhNVaAvawpHhHkgXjJqQGgxXsSxmvTtmPpMVMFmMzQqZfFraBbmyYMAuUFjhHJpPDdEefUVvhHwWuNLlCQyYqiCMmcaANnRmOABTtbaezZDdEXxDcCpYcxXuUCFlqQIoOEeKHhkiBYycCCcblLtTHWwDLlcCdETeEeDdEkeEpsSFCcBbcCfmmMLKEekqQSsgPpGlxgqCHhSwmMQqvTtVmMPpWsourRoOZzUNSSrRsCcsQqUuoWWwUuwPpOLliIQqaAGgwdDWmZvVNnzoOSsMBNnFfKOosSAWwUUuKvVkDduidaAcYyvVCqQqrRQDQqbCcBowWkKsSOvBbBbEeZzVpOiIoPCcEeyHhYHMmKcAaOoPpbBZzKkUvVuCNHhzRrCmMcrRvViIYyZpPpPigbBEepPoOIisSpPpPUuwtTjJOZzPpoAkKPJjjJFfqQwWEQAnQiIqNaqevKkxXOyYDoLlOBbXJjxMWwmLiKkLsUHsSFfhxXfFGfgsmMgbBoOBbZnNqQwWcCuUkKxNsSnFfXpPUutTULYuUdDygGtjvrjJQqCLlwWwWXwaSsATuUGgqDdrXNnxIiiIkVjJWsSwAaRrvqMBbvVUusSmExXeGgYhHVIjJivXxpEeLZgPpdVvDiOopuZbBmWwMzLHhlLlUDHhddDPGDdnHheETtUUGRGgrVvqwuUBbinNILMmlOoWutTfFUOJGgjFBbfyYrRjJhHojTsStfFXrRUurRgpPjJMmhQqrRHkoOeEKDuUaATijJmMdDdDHhgVPpZzPpmMvGTaAyYSSsszZtOmMAaoVZzjLeCcLlElwWLlLlUuiIQyYqnNfFJIiXUzXxZuVvxSvVjJTtgGpDdZzgYyGlLnNcCmoOrRMIWeENnuUQqPpwAaRroOjYFfyZlQqgGGhHOaACcoYysSNnpPOocDdCkzUuZZIyEeYmmeEMMeEjJZyYrRwWzFfFfmjXxJKkgCcGucCUMMUumiIBLpPuUbRrBTtxXaEeHhAFmoPqfFQzYrRyMmGwWKkZzCxXrHHQCczCcKksSHrWwkKEeRqSsUunNnkKwWnNBNtTneEJBDdbGgGGBbIKMGHVvgGfxYcZtTaACdDEerpPpPRgGUsojYyJOzZSvVsfFcCxpPLIPpTtuUkKlLtmsSkKFfMtCLOoDxmMXRpeiqQsSIUvVIiuSsqQFXxJjfjEeJsSfFwWFaYyAfJjpjJlqQLRrnAadDyDEejJdAaTtGgWwOowWZPpzYNLcClomXxJjvVpDdPhHAaMoOfvVdDFcCnjMtXxTWwmPpJjwWZtgGWwgAOoqWwKkTBbtbBZYbByzkSVsiISCcvHnNkKtTLlhsYyoUNoOQqnsSazZABbcCDdUuFJpPOyYoKmvVHhEoOxXrCcWwYylMiImLkIicCKQqZzaAphHqkKwWQPYyIqQmFfMlUuXCcdDBbFfgRHmMhxXEerlLGErRxXeXHhxzZZzfmMsSdDclBbLvVmMCFZzPmMoAacdDCOZIiqQNbCOowWpIirRHhJjfFPgGQLlxXNZzDdtTnVvemMEDoOPpzZDdbBxXciIyYyzPpkKolLOiIVvoOMpPHHhhmbBZBGgPKkTtrRyYAadkQqKLlSsgGovVOzZjJAffFLlFiaAGguUXcipPPpIGgbBqfFQzmMZCYNnypPUbBHLlKKkPpvkKEEefFLlRrRrLvVlemSsMZuwWfFUQFfqvVpDdPyYWDdDdVvWxXMtPpTLlfFhHsSnNiImKPpxIiDdWkIiKwrbPROorpBMexXNnEmqMyYcCJjmBXxtpPazZAZzTBfeEFVyYXxgGZzvYaAAKkJjwSZzsWgGANXxcCFfKiIQMVvLjHhJlMmrRmtlLxNnXlLTqPpPEeYLlypgGFrRCCcrXxRdDyYMmcOcCLloOnNYiIyoGgSsbBtfUuYHhyFwWiITKAaRrAacUZzdGVvgELlezlLNnZzZYWwpPyUbBuKfFKrhHRkbTtUubvVnNBdgGfFEAaEhHekKYyAawWKroORkaAfFAawWVTtkKuUvsWwuUSyAaoOYexLGmlLMGgglXghkKHZMKkpPIimzGbBAlLiIIimMEeRrYjLlkKDdJaOoAyAakBbKrRCpqQPBbqQkKQqZYyzcaXQqiBbIIbQqBgGfFiQqJjGZjJzgXCcsSxaAxDLWwOXxopPmpPMBbajJAzZlLraAoORxXFMhHpwWPTtDdmwWVmMvgGFfDdkcCKRSUusFvVIiRmMrTDdYshTtHSytWwpUutTPNnTtBbAiiIgGIMIUAaOoJTtjQqEemRgGaSstTACCoOckKNOyYojJbIiBagGYySsARjJdkKJjeEVvDesWITtghHGiNniISsTtznNZaVREerZzQlLqMBbmwekKEWxXHNAAaanhTlLfFlLaUuAOAaotmFfsSMvPpWwJjAOoXxHHJjhOoOjJcNnmMPpCojJUuQqbuapPJjArUuLlHtXYdEeDyhHpPCcaAxIiSbPpvVBUusREehNnHriHhybBYUucHhCrRDdsSemLlEsjJSWCcwdDelEeEeLMSsGgEtTwdDMqQmEeWdDfFgNuUwQqWsSYynGmMVvTtFfbBLlIXxBbyYUuHhBbtTHhuUnNycCOPpNnoTNSslLNnnsSeESsyYRrIiVYHLlEcCevmPXxvVprRMZsuUSQVrtTRmMgGvTtLknNrRKRrlCYyvaAVcBzyYZVvJjpPbDHBfFbhaSLlsAXiZzIxKkdDdTxXiIiIJosSOtUuhBbBbHNzZnpMmqQPTSaAswAyYJjacDpOLtKkVTtgSssSGgGMmvTKHhCJjGgcrpPcCyiIZzjgGJRvVrdDnZzRgpPOoGrLfFlGgiIgkCmOoMwDdihoODSsdHIBbWPgXxGpNuUeEncgGsStKkHfFhnNKkOomMGlLgIihLliIYyHhwWHWwFftTNnnNTscCbjaAKSskJjVDdvRrmMgRyYVvDdroORriIxnSsTtNXrRUNGgnuPpCiIcuSswWUjJmMiIzZDdTtjjJoOlSqQAasLJQqXxcxXCaAVvQqYOmMNnoyKkBbQhiQqIHsSsnjJNUuSMrRmBbwZRrNFfRrnJjzWZzyYnNBEeyJjsSHdDrpyYJjPRFfRJjrmwWFaAULltTHhufbACcaIZzmMFqQBbVCcSsDdoOoOgGulLgDdwxXWGcsRuUrOeEpPuUWwoBbDBbgCCccGPpkKdaAVEevCciILAayYlbBIiPpVDHQqPphcMmMmCjJuUuUFfdvPpDGgdbbpPBsyYjfFuUaAxXJQhHqZvVkqQHhKFfzFfKkiIqQSBLWwlYywWcSsyVvfExXmqGgQEeMebBFAtTaQqBbTtcCwWwWCpPQqzMmnVCcvNqGYyHhfMmtTFgvViIQWwPpPpDwWdJfnNFlLqQjSsPfFmMxXnHhNJjpqQiIZcmPJjoOpcCgHkKhFtXxTfGMUYWwIiyuwCqQlLLpPJWwjoORrjJoOlJGgjGgxXDiItTdZKBbkobBOqYKkBbynNQeEzzZNnEqQqQSsJjeeEjJSsOqOoQFuUDdLlBbfMmGgfhHtTSsIioOCXxcPpiIkvViSskKIBMijJIFfhJjysSYKpSsXMmxuUPqQfFfzZAAaaFssSSCckrvVuUoOwWiIUuQqARjJrsSraAAaRuUaEeQwWqRsSZzKkXsSLlxlLTtENoOnTemVvMBbEaAIrsSpPRiqxXCcQteyYtHWwFHhfhTYUuyaZzAUiTtIuHtjJuWocCOhHGgwGgekKVgGvpPECcoOGjJlLrRxXZzOmMEeosGgjJkKSMlPpDhHdFffFDHoOtTgwWGKkpkKPnNtTyYvQqHhiIXxVBEBbCcAaIMmiqQZhHzFRHhrxXGbaABFDoOhHdzZiImMAaaiIAYzZyfgfFYyEefkKkUxXugGKsrRHhQqbBxanfFfFNZvbBRrVzkKAbBafFOkKodDeEKkmMamMMmadDKbZgRdDgGrIsSiGgGHfQqjJFcCoOGgRrSsUmMuSaAVvAPVvpasSxFfXsJRrjoGgVvOiKfIiFkIPUuScVkKvCsGhEeHgodDOpyYvaUuSsASRrZaAzgGtoOPNnpdDFfxaAXBPCcuUlHhTtNnLCchlLZHhdDzaAHdDMmmhHMSVvBbQSbBUusXxuUqYysYJVvjTAatyNBbVvnrRjJBbASmMsacCeEhyYGgIimomMOMdDqSLlsQvVqQNlLbBLlnnyYNHzWwCcuUxXZdeEDpbTPpsYgGaOlkKLotTOCcfFBboBCMWwmcDdQqmMbsSnNQqOofhJjBqQnNNnrRZzENnebyYNnzmMHhIikKAaqQjMlLmbBpxXPCcHhCfFcHhVvTtKbBENVvAaovVTtOnPpgxXGCgoOGcwlLeEWSssSMFyYyYffFkKFfmpPekKKlLkCceEYyxXbsSSSssTkYyKeENnHqlLQAahtwwWfFhHOokKWZAaPcCprRmMzrRBpiIPHhCcCFfoOhHXrAvVGgaTtRbBloOLoZzOhHxcMmWWwzsSZsSVvdZzvVpPBTtboODgGXvkKVJjxurRUJjqRrghHfFGFuUfKkDkoOSsKvVYywkKKkrRzZorRUuOSokKOsSstUuTWdQtTkgiIfdDFxXwGgShrRHsWEyvVXxYeGOoZYoOPpnNyzaAjJEHhekPCcpcCKlLKHrRhUjJxXMmzrRZqQYSsyuJgLlGjCcEeROoHoOhRcCrMCcmlLUWwGnNgkKfFMmxaAXzUuDdQqAahHXRkKrRrNnxjmMGfFgJJWZzblLBsWwSrKkIYyklhHLKQOomMDmMdqPpcCisSRomMOLlAOodDNnHhGQqgxXaObBVvBGgbKkBZzWwCcgGbosSODdlwJjWjJIiLBbooOBKYykbiFfINnNnwWdbSwUuWsqtPpTdDZzXxcCyYHhdDfLfFlFFfGgSsQkKBuPpYmMyqZzQuUwWUyYBmMbaXxrRvVOojJxxXPpXCcGgQqRrLlvVAMmcHjJOoEepPhmMlfSUusTtnNXxnNwdXxDfVcCvHxdHLDdvOovVVlhUuDWwXkKAayYDosSkKkKOdoOMmHhSsXHwZAVhHvyYaKkzWhybBYxnNhNnsSoiIsSOmqTtCWwcRrPYywWlLpJjjJhHFfetTEyYSsXrAaRJjpHhPnNRrrLgGlRrbBNnRjhHJqQbBxYSsyXSsnNmUuTtMyYmdRiIrNnDEehGgGgHMDAadMxXaAmFlLhHNnQqvVNnfPpYYtTyyQKkJjgGqjYyHnfFVvNhJjAaVDdoOVvvmMXxvxxXXVJsSgGBbaAPCkKcVGgBbyyYoOmMsSYoONnhHxLlAadDjJcMmMmANnaZzCXxdDXKkvKklLpzGfFgiICckaAKyTtYbBZxXVRroOKkvoCchHjJfFfFOiIGgmxXoOQqXxuRrbBUSsumMUoOMhEekKHLuUlfFMBbTmhHMttTmyRrYfFdDVrOoRsgGQqpHhPhHSvdDEeOXxHhljJqpBbPrRFGDdgwWfvVJkxXKjKkVvHNnDdhQvdwWDKkOoMFQqfmVTtgXwWbBEenhHEefFGgNxRcCrAPpaYyOoeEFgGtTfIiAaGGgxXpPxfFDdXjlLJkDdVKkeEkLGglojJOhsfHhFSHKnNkKJcPpCjmIiXjJpPxwdDWOoPpAaDdbBeTtiIQqXxLBbljliILJmMlLBbbBgGYyKkEnHhKkNyYBbpkKPiBbrRIDeRrEaAnNLlGuUgcCUPpUuHhudpZxXVZzvzHhGfFQqgvVPOJGMcCXxgGmMZzNnWwmeEkhHKgIitTlwWgZzpPKkyaAYGHhaAxNnuUXhHLjNncCtTNnwWpPCcGgvVoGgIYpPxXyiWzTtZsSkYyecCgGNniIEKEeNfDdgGFLBbzZhHoAaNnoOAaCcrRVvOlQaATYytyYqqQdDDwmOoMRrWGKkgdyxXLlmMOoGgEemMYBbDwWVtTNnAOtToaFfvKkhHIZziMAamvKkVdTDddpPDNnQqmMXFfYjJy diff --git a/2018/d06/ex1/ex1.py b/2018/d06/ex1/ex1.py new file mode 100755 index 0000000..69c7e8b --- /dev/null +++ b/2018/d06/ex1/ex1.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter, defaultdict +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> int: + def parse(input: list[str]) -> list[Point]: + return [Point(*map(int, line.split(", "))) for line in input] + + def dist(lhs: Point, rhs: Point) -> int: + return sum(abs(a - b) for a, b in zip(lhs, rhs)) + + def points_distances(coords: list[Point]) -> dict[Point, Counter[Point]]: + top_left = Point(min(p.x for p in coords), min(p.y for p in coords)) + bot_right = Point(max(p.x for p in coords), max(p.y for p in coords)) + + return { + p: Counter({root: dist(root, p) for root in coords}) + for p in map( + Point._make, + itertools.product( + range(top_left.x, bot_right.x + 1), + range(top_left.y, bot_right.y + 1), + ), + ) + } + + def remove_areas_on_border( + areas: dict[Point, set[Point]], + top_left: Point, + bot_right: Point, + ) -> dict[Point, set[Point]]: + def on_border(points: set[Point]) -> bool: + return any( + p.x in (top_left.x, bot_right.x) or p.y in (top_left.y, bot_right.y) + for p in points + ) + + return {root: points for root, points in areas.items() if not on_border(points)} + + def points_areas(coords: list[Point]) -> dict[Point, int]: + top_left = Point(min(p.x for p in coords), min(p.y for p in coords)) + bot_right = Point(max(p.x for p in coords), max(p.y for p in coords)) + + distances = points_distances(coords) + areas: dict[Point, set[Point]] = defaultdict(set) + for p, root_distances in distances.items(): + closest, dist = root_distances.most_common()[-1] + if dist == root_distances.most_common()[-2][1]: + continue + areas[closest].add(p) + + areas = remove_areas_on_border(areas, top_left, bot_right) + return {root: len(points) for root, points in areas.items()} + + coords = parse(input.splitlines()) + areas = points_areas(coords) + return max(areas.values()) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d06/ex1/input b/2018/d06/ex1/input new file mode 100644 index 0000000..59dbb49 --- /dev/null +++ b/2018/d06/ex1/input @@ -0,0 +1,50 @@ +80, 357 +252, 184 +187, 139 +101, 247 +332, 328 +302, 60 +196, 113 +271, 201 +334, 89 +85, 139 +327, 161 +316, 352 +343, 208 +303, 325 +316, 149 +270, 319 +318, 153 +257, 332 +306, 348 +299, 358 +172, 289 +303, 349 +271, 205 +347, 296 +220, 276 +235, 231 +133, 201 +262, 355 +72, 71 +73, 145 +310, 298 +138, 244 +322, 334 +278, 148 +126, 135 +340, 133 +311, 118 +193, 173 +319, 99 +50, 309 +160, 356 +155, 195 +61, 319 +80, 259 +106, 318 +49, 169 +134, 61 +74, 204 +337, 174 +108, 287 diff --git a/2018/d06/ex2/ex2.py b/2018/d06/ex2/ex2.py new file mode 100755 index 0000000..f33cc58 --- /dev/null +++ b/2018/d06/ex2/ex2.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> int: + def parse(input: list[str]) -> list[Point]: + return [Point(*map(int, line.split(", "))) for line in input] + + def dist(lhs: Point, rhs: Point) -> int: + return sum(abs(a - b) for a, b in zip(lhs, rhs)) + + def points_distances(coords: list[Point]) -> dict[Point, Counter[Point]]: + top_left = Point(min(p.x for p in coords), min(p.y for p in coords)) + bot_right = Point(max(p.x for p in coords), max(p.y for p in coords)) + + return { + p: Counter({root: dist(root, p) for root in coords}) + for p in map( + Point._make, + itertools.product( + range(top_left.x, bot_right.x + 1), + range(top_left.y, bot_right.y + 1), + ), + ) + } + + coords = parse(input.splitlines()) + distances = points_distances(coords) + return sum(dist.total() < 10000 for dist in distances.values()) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d06/ex2/input b/2018/d06/ex2/input new file mode 100644 index 0000000..59dbb49 --- /dev/null +++ b/2018/d06/ex2/input @@ -0,0 +1,50 @@ +80, 357 +252, 184 +187, 139 +101, 247 +332, 328 +302, 60 +196, 113 +271, 201 +334, 89 +85, 139 +327, 161 +316, 352 +343, 208 +303, 325 +316, 149 +270, 319 +318, 153 +257, 332 +306, 348 +299, 358 +172, 289 +303, 349 +271, 205 +347, 296 +220, 276 +235, 231 +133, 201 +262, 355 +72, 71 +73, 145 +310, 298 +138, 244 +322, 334 +278, 148 +126, 135 +340, 133 +311, 118 +193, 173 +319, 99 +50, 309 +160, 356 +155, 195 +61, 319 +80, 259 +106, 318 +49, 169 +134, 61 +74, 204 +337, 174 +108, 287 diff --git a/2018/d07/ex1/ex1.py b/2018/d07/ex1/ex1.py new file mode 100755 index 0000000..4685b38 --- /dev/null +++ b/2018/d07/ex1/ex1.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> str: + def parse(input: list[str]) -> dict[str, set[str]]: + graph: dict[str, set[str]] = defaultdict(set) + for line in input: + split = line.split() + prev, after = split[1], split[7] + graph[after].add(prev) + graph[prev] # Ensure that all nodes are in the dictionary + return graph + + def topo_sort(graph: dict[str, set[str]]) -> list[str]: + res: list[str] = [] + + queue = {n for n, deps in graph.items() if not deps} + seen: set[str] = set() + + while queue: + # We must pop in alphabetical order + node = min(queue) + queue.remove(node) + + res.append(node) + seen.add(node) + + # Iterate over all nodes as we don't have information on children + for child, deps in graph.items(): + if child in seen: + continue + if deps - seen: + continue + queue.add(child) + + return res + + graph = parse(input.splitlines()) + return "".join(topo_sort(graph)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d07/ex1/input b/2018/d07/ex1/input new file mode 100644 index 0000000..c39d26c --- /dev/null +++ b/2018/d07/ex1/input @@ -0,0 +1,101 @@ +Step F must be finished before step P can begin. +Step R must be finished before step J can begin. +Step X must be finished before step H can begin. +Step L must be finished before step N can begin. +Step U must be finished before step Z can begin. +Step B must be finished before step C can begin. +Step S must be finished before step C can begin. +Step N must be finished before step Y can begin. +Step I must be finished before step J can begin. +Step H must be finished before step K can begin. +Step G must be finished before step Z can begin. +Step Q must be finished before step V can begin. +Step E must be finished before step P can begin. +Step P must be finished before step W can begin. +Step J must be finished before step D can begin. +Step V must be finished before step W can begin. +Step T must be finished before step D can begin. +Step Z must be finished before step A can begin. +Step K must be finished before step A can begin. +Step Y must be finished before step O can begin. +Step O must be finished before step W can begin. +Step C must be finished before step M can begin. +Step D must be finished before step A can begin. +Step W must be finished before step M can begin. +Step M must be finished before step A can begin. +Step C must be finished before step A can begin. +Step F must be finished before step Z can begin. +Step I must be finished before step A can begin. +Step W must be finished before step A can begin. +Step T must be finished before step C can begin. +Step S must be finished before step K can begin. +Step B must be finished before step J can begin. +Step O must be finished before step A can begin. +Step Q must be finished before step P can begin. +Step G must be finished before step M can begin. +Step R must be finished before step T can begin. +Step B must be finished before step G can begin. +Step J must be finished before step O can begin. +Step X must be finished before step E can begin. +Step X must be finished before step C can begin. +Step H must be finished before step Y can begin. +Step Y must be finished before step A can begin. +Step X must be finished before step W can begin. +Step H must be finished before step A can begin. +Step X must be finished before step A can begin. +Step I must be finished before step M can begin. +Step G must be finished before step J can begin. +Step N must be finished before step G can begin. +Step D must be finished before step M can begin. +Step L must be finished before step D can begin. +Step V must be finished before step T can begin. +Step I must be finished before step Y can begin. +Step S must be finished before step J can begin. +Step K must be finished before step Y can begin. +Step F must be finished before step R can begin. +Step U must be finished before step T can begin. +Step Z must be finished before step M can begin. +Step T must be finished before step Z can begin. +Step B must be finished before step I can begin. +Step E must be finished before step K can begin. +Step N must be finished before step J can begin. +Step X must be finished before step Q can begin. +Step F must be finished before step Y can begin. +Step H must be finished before step P can begin. +Step Z must be finished before step D can begin. +Step V must be finished before step O can begin. +Step E must be finished before step C can begin. +Step V must be finished before step C can begin. +Step P must be finished before step A can begin. +Step B must be finished before step N can begin. +Step S must be finished before step W can begin. +Step P must be finished before step D can begin. +Step L must be finished before step W can begin. +Step D must be finished before step W can begin. +Step K must be finished before step C can begin. +Step L must be finished before step M can begin. +Step R must be finished before step O can begin. +Step F must be finished before step L can begin. +Step R must be finished before step H can begin. +Step K must be finished before step O can begin. +Step T must be finished before step W can begin. +Step R must be finished before step K can begin. +Step C must be finished before step W can begin. +Step N must be finished before step T can begin. +Step R must be finished before step P can begin. +Step E must be finished before step M can begin. +Step G must be finished before step T can begin. +Step U must be finished before step K can begin. +Step Q must be finished before step D can begin. +Step U must be finished before step S can begin. +Step J must be finished before step V can begin. +Step P must be finished before step Y can begin. +Step X must be finished before step Z can begin. +Step U must be finished before step H can begin. +Step H must be finished before step M can begin. +Step I must be finished before step C can begin. +Step V must be finished before step M can begin. +Step N must be finished before step I can begin. +Step B must be finished before step K can begin. +Step R must be finished before step Q can begin. +Step O must be finished before step C can begin. diff --git a/2018/d07/ex2/ex2.py b/2018/d07/ex2/ex2.py new file mode 100755 index 0000000..5c8099c --- /dev/null +++ b/2018/d07/ex2/ex2.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> int: + def parse(input: list[str]) -> dict[str, set[str]]: + graph: dict[str, set[str]] = defaultdict(set) + for line in input: + split = line.split() + prev, after = split[1], split[7] + graph[after].add(prev) + graph[prev] # Ensure that all nodes are in the dictionary + return graph + + def job_done(graph: dict[str, set[str]], job: str) -> None: + assert not graph.pop(job) # Sanity check + for node in graph: + graph[node].discard(job) + + def next_job(graph: dict[str, set[str]], ongoing: list[str]) -> str | None: + return min( + (n for n, deps in graph.items() if not deps and n not in ongoing), + default=None, + ) + + def assemble(graph: dict[str, set[str]], additional_time: int, workers: int) -> int: + res = 0 + worker_time = [0] * workers + worker_jobs = [""] * workers + while graph: + # Step to the next worker, ignoring idle workers, with a default for the first step + dt = min((t for t in worker_time if t > 0), default=0) + res += dt + worker_time = [max(0, t - dt) for t in worker_time] + for i in range(workers): + if worker_time[i] != 0: + continue + if worker_jobs[i] != "": + job_done(graph, worker_jobs[i]) + worker_jobs[i] = "" + if (job := next_job(graph, worker_jobs)) is None: + continue + worker_time[i] = additional_time + ord(job) - ord("A") + 1 + worker_jobs[i] = job + assert all(j == "" for j in worker_jobs) # Sanity check + assert all(t == 0 for t in worker_time) # Sanity check + return res + + graph = parse(input.splitlines()) + return assemble(graph, 60, 5) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d07/ex2/input b/2018/d07/ex2/input new file mode 100644 index 0000000..c39d26c --- /dev/null +++ b/2018/d07/ex2/input @@ -0,0 +1,101 @@ +Step F must be finished before step P can begin. +Step R must be finished before step J can begin. +Step X must be finished before step H can begin. +Step L must be finished before step N can begin. +Step U must be finished before step Z can begin. +Step B must be finished before step C can begin. +Step S must be finished before step C can begin. +Step N must be finished before step Y can begin. +Step I must be finished before step J can begin. +Step H must be finished before step K can begin. +Step G must be finished before step Z can begin. +Step Q must be finished before step V can begin. +Step E must be finished before step P can begin. +Step P must be finished before step W can begin. +Step J must be finished before step D can begin. +Step V must be finished before step W can begin. +Step T must be finished before step D can begin. +Step Z must be finished before step A can begin. +Step K must be finished before step A can begin. +Step Y must be finished before step O can begin. +Step O must be finished before step W can begin. +Step C must be finished before step M can begin. +Step D must be finished before step A can begin. +Step W must be finished before step M can begin. +Step M must be finished before step A can begin. +Step C must be finished before step A can begin. +Step F must be finished before step Z can begin. +Step I must be finished before step A can begin. +Step W must be finished before step A can begin. +Step T must be finished before step C can begin. +Step S must be finished before step K can begin. +Step B must be finished before step J can begin. +Step O must be finished before step A can begin. +Step Q must be finished before step P can begin. +Step G must be finished before step M can begin. +Step R must be finished before step T can begin. +Step B must be finished before step G can begin. +Step J must be finished before step O can begin. +Step X must be finished before step E can begin. +Step X must be finished before step C can begin. +Step H must be finished before step Y can begin. +Step Y must be finished before step A can begin. +Step X must be finished before step W can begin. +Step H must be finished before step A can begin. +Step X must be finished before step A can begin. +Step I must be finished before step M can begin. +Step G must be finished before step J can begin. +Step N must be finished before step G can begin. +Step D must be finished before step M can begin. +Step L must be finished before step D can begin. +Step V must be finished before step T can begin. +Step I must be finished before step Y can begin. +Step S must be finished before step J can begin. +Step K must be finished before step Y can begin. +Step F must be finished before step R can begin. +Step U must be finished before step T can begin. +Step Z must be finished before step M can begin. +Step T must be finished before step Z can begin. +Step B must be finished before step I can begin. +Step E must be finished before step K can begin. +Step N must be finished before step J can begin. +Step X must be finished before step Q can begin. +Step F must be finished before step Y can begin. +Step H must be finished before step P can begin. +Step Z must be finished before step D can begin. +Step V must be finished before step O can begin. +Step E must be finished before step C can begin. +Step V must be finished before step C can begin. +Step P must be finished before step A can begin. +Step B must be finished before step N can begin. +Step S must be finished before step W can begin. +Step P must be finished before step D can begin. +Step L must be finished before step W can begin. +Step D must be finished before step W can begin. +Step K must be finished before step C can begin. +Step L must be finished before step M can begin. +Step R must be finished before step O can begin. +Step F must be finished before step L can begin. +Step R must be finished before step H can begin. +Step K must be finished before step O can begin. +Step T must be finished before step W can begin. +Step R must be finished before step K can begin. +Step C must be finished before step W can begin. +Step N must be finished before step T can begin. +Step R must be finished before step P can begin. +Step E must be finished before step M can begin. +Step G must be finished before step T can begin. +Step U must be finished before step K can begin. +Step Q must be finished before step D can begin. +Step U must be finished before step S can begin. +Step J must be finished before step V can begin. +Step P must be finished before step Y can begin. +Step X must be finished before step Z can begin. +Step U must be finished before step H can begin. +Step H must be finished before step M can begin. +Step I must be finished before step C can begin. +Step V must be finished before step M can begin. +Step N must be finished before step I can begin. +Step B must be finished before step K can begin. +Step R must be finished before step Q can begin. +Step O must be finished before step C can begin. diff --git a/2018/d08/ex1/ex1.py b/2018/d08/ex1/ex1.py new file mode 100755 index 0000000..b3dd61a --- /dev/null +++ b/2018/d08/ex1/ex1.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Tree(NamedTuple): + children: list["Tree"] + metadata: list[int] + + @classmethod + def from_raw(cls, raw: list[int]) -> "Tree": + def helper(offset: int) -> tuple[Tree, int]: + n_children, n_metadata = raw[offset], raw[offset + 1] + offset += 2 + + children: list[Tree] = [] + for _ in range(n_children): + tree, offset = helper(offset) + children.append(tree) + metadata = raw[offset : offset + n_metadata] + offset += n_metadata + + return cls(children, metadata), offset + + tree, offset = helper(0) + assert offset == len(raw) + return tree + + def preorder(self) -> Iterator["Tree"]: + yield self + for child in self.children: + yield from child.preorder() + + +def solve(input: str) -> int: + def parse(input: str) -> Tree: + raw = [int(n) for n in input.split()] + return Tree.from_raw(raw) + + tree = parse(input) + return sum(itertools.chain.from_iterable(node.metadata for node in tree.preorder())) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d08/ex1/input b/2018/d08/ex1/input new file mode 100644 index 0000000..3b6e1d2 --- /dev/null +++ b/2018/d08/ex1/input @@ -0,0 +1 @@ +7 11 7 2 5 4 3 4 1 5 0 6 7 5 5 8 1 4 1 1 1 1 1 1 9 0 8 4 8 6 4 1 1 3 6 3 3 2 2 1 1 1 3 1 1 8 0 6 7 7 9 1 9 9 3 2 1 1 2 3 3 3 4 3 3 4 3 7 1 8 0 6 9 9 1 1 4 9 2 3 1 2 3 2 1 3 1 6 0 7 1 5 2 9 4 5 4 1 2 3 1 2 2 1 5 0 10 3 3 5 6 4 3 4 8 1 2 1 1 2 3 3 2 4 2 3 1 5 1 3 7 1 5 0 10 9 7 6 3 8 8 2 2 5 1 3 2 2 1 1 1 5 0 11 8 5 2 8 1 3 4 7 9 9 7 3 3 1 2 3 1 9 0 9 9 2 2 5 7 9 5 3 1 3 2 3 1 3 1 3 2 1 2 3 3 3 5 1 3 3 6 1 5 0 11 6 8 4 8 1 3 3 3 4 6 1 1 3 2 1 1 1 8 0 7 1 3 1 4 1 1 8 2 2 1 3 3 1 1 3 1 9 0 8 4 3 4 1 8 8 6 6 1 1 1 3 3 3 1 1 2 5 5 5 4 5 2 3 5 1 6 0 7 7 5 7 4 8 7 1 1 1 1 3 2 3 1 8 0 6 8 9 1 4 5 5 3 3 2 1 3 2 3 2 1 9 0 10 2 6 9 4 9 4 5 1 6 8 3 1 2 1 3 1 1 1 3 4 2 5 4 1 5 4 4 2 4 5 3 4 1 7 0 8 3 1 4 5 8 1 3 1 1 2 2 1 3 1 3 1 8 0 11 3 1 5 4 6 7 5 6 3 1 9 1 1 3 3 2 1 3 2 1 8 0 11 4 3 2 7 8 1 8 9 4 4 4 3 3 2 3 2 1 2 1 2 2 5 3 3 7 1 5 0 7 2 1 8 2 6 3 4 2 1 1 1 3 1 9 0 9 6 3 1 9 8 1 1 9 1 1 2 3 3 3 1 2 2 1 1 8 0 7 9 1 1 9 1 2 8 3 1 1 1 1 3 3 3 1 4 2 1 2 2 2 3 6 1 5 0 8 1 6 9 3 4 9 9 3 2 2 1 3 3 1 5 0 11 9 2 6 5 6 6 7 8 4 4 1 2 3 1 1 2 1 6 0 6 9 9 3 1 7 2 1 3 1 3 3 3 5 1 1 2 1 3 3 6 1 5 0 8 2 4 1 9 3 6 3 4 1 2 1 2 1 1 9 0 9 4 4 8 2 6 6 2 6 1 3 2 1 1 1 3 1 2 3 1 6 0 6 8 1 8 8 3 7 1 2 2 1 3 1 1 4 2 1 2 3 2 5 5 1 2 5 5 3 5 1 7 0 10 5 6 8 8 3 1 8 5 4 2 1 1 1 1 1 3 2 1 8 0 10 4 3 5 2 5 1 1 1 9 7 2 2 3 1 2 1 2 3 1 5 0 10 7 1 6 2 7 5 9 9 1 9 1 2 1 3 2 3 4 5 4 1 3 4 1 7 0 11 9 8 4 4 4 2 5 5 1 9 3 1 3 2 2 2 2 2 1 7 0 11 1 1 9 5 6 8 5 1 4 9 3 1 1 1 2 3 1 3 1 7 0 8 6 1 1 5 5 5 3 7 1 2 2 3 3 2 3 5 1 2 1 3 4 1 8 0 8 8 6 1 8 3 9 1 2 1 1 1 1 2 1 2 2 1 5 0 7 6 8 3 5 3 1 4 2 1 2 1 3 1 8 0 9 2 5 8 9 5 8 1 1 4 1 2 1 3 2 2 3 1 5 5 3 1 3 5 1 5 0 10 4 1 6 9 1 5 9 6 6 8 1 3 1 1 3 1 7 0 7 7 1 6 1 8 5 4 1 1 2 1 1 2 3 1 7 0 8 6 1 2 4 7 1 4 1 2 1 2 1 3 3 2 1 5 2 1 4 3 6 1 7 0 8 8 6 5 6 1 1 2 9 1 3 3 3 3 1 1 1 7 0 10 1 1 3 2 3 8 2 4 6 6 3 1 3 3 2 2 1 1 9 0 6 3 5 5 5 4 1 2 3 2 1 3 2 1 1 1 2 2 4 4 3 2 1 2 2 3 7 5 4 3 6 1 7 0 8 3 3 5 9 5 2 4 1 1 1 2 1 1 3 2 1 6 0 8 7 4 2 5 5 7 1 3 2 1 1 2 1 3 1 7 0 8 2 3 1 4 6 3 7 3 2 1 1 1 3 3 1 5 3 2 5 5 3 3 7 1 6 0 9 1 1 3 3 3 4 5 1 1 2 3 3 1 1 1 1 8 0 8 1 4 7 5 5 8 3 1 1 2 3 2 1 2 1 2 1 6 0 7 2 4 3 1 7 8 3 3 1 1 3 1 1 1 4 2 2 3 3 1 3 5 1 8 0 6 5 8 1 2 5 7 1 2 1 2 3 1 3 1 1 5 0 8 2 4 1 2 2 1 3 9 2 1 2 2 2 1 7 0 11 8 1 3 2 1 6 5 1 7 5 8 2 3 2 2 3 1 1 5 3 4 3 5 3 6 1 5 0 10 4 8 2 1 1 8 4 4 2 9 1 1 1 3 2 1 7 0 10 4 1 6 8 5 4 9 4 3 6 1 2 1 1 1 2 1 1 8 0 7 9 1 3 1 9 5 3 1 3 2 2 2 2 1 1 4 3 2 2 1 1 3 4 1 9 0 7 7 1 3 5 6 9 9 2 2 1 2 3 3 1 1 3 1 6 0 6 4 7 1 9 5 3 3 1 2 1 1 3 1 6 0 7 8 1 9 1 2 2 4 2 1 1 1 1 3 2 4 2 1 5 1 2 3 4 5 3 7 1 8 0 9 3 1 3 7 1 6 6 8 8 2 1 3 2 2 1 1 2 1 9 0 6 5 5 6 7 1 9 2 1 3 1 1 3 1 3 2 1 6 0 7 3 6 9 1 2 8 7 3 2 1 2 3 1 3 5 1 5 2 3 2 3 4 1 5 0 9 1 8 5 7 5 6 4 4 5 1 1 1 2 1 1 5 0 6 1 7 3 7 1 9 2 2 2 1 3 1 5 0 8 6 4 3 9 1 5 5 8 1 1 1 1 2 2 2 1 2 3 4 1 7 0 6 5 8 1 5 4 6 1 1 3 2 1 1 2 1 7 0 7 3 3 1 5 1 3 8 3 2 3 2 2 1 1 1 8 0 10 1 4 8 3 6 7 8 4 2 7 1 1 3 1 3 1 3 2 3 4 1 5 3 7 1 9 0 7 8 4 1 1 6 4 1 2 2 2 3 1 3 2 2 3 1 9 0 11 6 2 6 1 1 1 7 4 5 2 8 3 1 1 3 3 1 1 3 3 1 5 0 11 5 1 3 4 6 1 1 5 8 7 1 2 3 2 3 1 1 3 4 5 1 4 5 3 1 2 1 2 5 4 3 4 1 7 0 6 4 9 7 6 1 2 3 1 1 2 1 1 1 1 6 0 11 8 3 8 7 2 5 8 5 3 7 1 1 3 2 2 2 1 1 9 0 9 8 4 6 5 3 1 1 7 3 3 2 2 1 3 2 1 2 1 2 5 2 2 3 4 1 6 0 9 5 5 2 9 1 1 9 4 4 1 1 3 3 2 2 1 5 0 7 7 5 1 6 8 3 3 1 3 1 1 3 1 8 0 10 2 4 2 4 1 5 5 1 6 3 3 1 1 3 1 2 2 3 5 1 2 3 3 4 1 9 0 9 4 4 3 6 1 3 5 4 9 1 2 2 1 1 3 3 1 2 1 7 0 8 9 8 7 3 8 1 4 5 3 1 2 1 3 1 3 1 7 0 11 3 5 1 3 1 5 6 5 9 1 5 1 2 1 2 3 3 1 2 3 3 5 3 5 1 5 0 9 1 5 7 1 4 2 3 1 3 1 3 1 3 1 1 6 0 7 4 7 6 2 1 9 7 3 1 2 1 1 2 1 7 0 11 2 4 2 8 8 5 8 8 1 1 2 1 1 1 1 2 2 2 2 2 5 3 2 3 5 1 9 0 9 5 9 5 1 8 5 8 1 1 1 2 3 3 1 3 1 3 1 1 7 0 9 6 4 4 6 3 8 2 1 3 1 2 2 1 1 3 1 1 9 0 9 9 2 1 5 4 9 9 6 5 2 2 2 1 2 1 3 1 1 3 5 2 4 1 5 5 7 5 5 4 3 7 1 8 0 7 6 8 7 4 8 1 5 1 1 2 3 1 3 3 1 1 6 0 11 3 3 4 9 4 1 5 6 5 7 1 1 3 3 3 1 1 1 6 0 7 3 1 3 4 9 6 2 2 2 3 1 1 3 5 2 4 4 5 3 2 3 5 1 7 0 10 8 1 8 2 1 5 7 8 9 6 3 1 1 1 1 2 3 1 6 0 11 8 1 1 2 4 9 6 9 6 7 1 1 1 1 3 2 2 1 5 0 8 8 9 9 1 1 8 1 2 1 3 1 1 1 4 4 3 4 2 3 6 1 6 0 10 5 2 4 1 3 8 6 5 1 2 1 3 2 1 1 3 1 7 0 6 6 9 5 1 5 8 3 1 3 1 3 1 2 1 7 0 9 1 7 7 6 2 1 4 9 1 1 1 2 3 1 2 3 3 2 1 4 2 5 3 7 1 9 0 10 1 1 9 1 1 7 8 9 6 7 2 1 1 2 2 3 3 3 1 1 8 0 11 1 2 4 6 2 6 1 2 2 9 2 2 3 1 3 3 2 1 3 1 5 0 10 7 5 4 3 1 7 4 3 1 5 3 2 1 3 1 1 5 2 1 2 1 4 3 4 1 9 0 11 3 3 6 9 8 4 9 5 1 7 3 3 1 3 3 1 3 2 1 3 1 8 0 6 7 7 1 1 1 6 1 3 2 2 1 2 1 3 1 7 0 10 8 3 7 8 7 1 5 2 1 1 1 1 3 3 3 1 3 5 4 3 3 1 4 4 1 2 4 7 2 4 3 3 4 1 9 0 10 5 2 4 3 1 2 3 9 3 6 2 3 1 3 3 1 1 3 1 1 7 0 7 1 8 9 7 9 4 1 1 3 1 1 3 2 2 1 9 0 8 9 3 3 8 1 2 6 8 2 1 1 2 3 2 3 1 2 2 3 5 3 3 5 1 9 0 8 7 5 3 7 5 1 5 7 1 3 1 2 2 3 3 3 2 1 6 0 9 9 1 1 2 5 7 8 8 6 3 1 1 3 3 3 1 5 0 9 3 3 2 7 1 3 7 7 6 1 3 1 2 3 1 3 3 2 3 3 4 1 9 0 9 2 8 2 8 8 7 1 2 1 2 1 1 1 2 3 3 3 1 1 8 0 8 7 5 6 5 5 1 2 6 2 1 2 1 1 3 1 3 1 5 0 7 5 9 4 1 5 5 2 1 1 1 2 2 5 1 1 1 3 5 1 5 0 6 1 3 5 2 5 1 3 1 1 1 1 1 9 0 6 9 2 6 1 2 2 2 2 1 1 2 3 1 2 3 1 6 0 8 6 3 4 7 8 5 1 1 3 2 3 1 2 1 5 3 4 2 4 4 3 3 5 5 3 6 1 9 0 11 3 1 8 7 7 7 1 9 3 4 3 2 1 2 1 3 3 3 2 2 1 5 0 7 6 6 1 8 6 6 1 1 1 1 1 2 1 6 0 9 6 3 7 1 9 1 5 6 7 2 1 1 2 1 1 2 4 2 4 2 5 3 6 1 9 0 7 9 1 2 2 5 7 2 1 1 1 3 2 3 2 2 3 1 5 0 6 6 8 2 1 6 6 1 1 1 2 1 1 9 0 9 1 8 9 8 8 9 6 4 2 2 2 2 1 2 1 3 3 1 4 1 3 1 2 2 3 4 1 9 0 6 7 3 6 1 7 3 1 1 1 3 1 3 1 1 1 1 9 0 7 4 1 8 5 9 2 3 3 1 2 1 1 1 1 3 1 1 6 0 10 7 4 4 4 4 5 8 1 2 1 1 1 2 1 1 1 2 1 3 2 3 6 1 6 0 8 3 1 9 7 6 9 5 1 1 2 3 3 1 2 1 8 0 6 5 1 7 7 2 1 1 3 1 3 3 2 3 1 1 5 0 11 9 2 5 7 1 6 5 1 5 6 3 1 1 2 2 1 1 1 1 3 2 1 3 5 1 5 0 8 1 4 1 2 4 5 6 8 1 2 1 3 1 1 8 0 7 6 5 5 1 7 3 9 1 1 1 2 3 2 3 3 1 9 0 9 2 2 6 2 4 1 3 3 2 3 2 3 3 1 3 3 2 1 1 3 4 3 2 3 3 3 5 3 5 3 3 5 1 6 0 11 7 3 1 1 8 8 4 4 8 6 7 2 1 1 2 3 3 1 9 0 8 1 3 6 1 2 7 2 2 3 3 2 2 1 2 3 1 3 1 9 0 7 1 5 6 9 4 1 3 2 1 1 3 1 2 3 1 3 5 3 2 3 4 3 6 1 9 0 10 8 9 2 1 3 6 1 4 7 1 2 2 3 2 1 1 1 1 3 1 9 0 8 9 3 4 1 7 8 3 7 3 2 1 2 2 2 1 3 1 1 7 0 8 7 9 1 1 5 2 3 9 1 1 3 2 2 2 1 5 1 1 4 3 4 3 4 1 8 0 8 4 1 5 8 3 8 1 6 1 1 3 3 1 3 3 2 1 5 0 9 3 3 1 4 7 4 7 1 2 1 1 1 1 1 1 5 0 10 1 3 5 1 6 3 9 8 6 7 3 1 1 2 2 4 1 4 3 3 6 1 6 0 10 1 3 5 5 9 9 9 9 5 8 1 1 2 2 2 1 1 7 0 6 5 2 3 6 1 6 3 1 3 2 3 1 1 1 7 0 6 6 5 1 7 9 7 2 3 1 1 1 1 1 2 2 3 2 2 3 3 4 1 9 0 6 1 4 7 4 1 6 2 2 2 3 3 1 3 2 1 1 7 0 7 3 3 1 7 7 5 9 3 2 1 3 1 2 1 1 5 0 10 1 2 4 8 2 4 4 3 1 5 3 1 3 2 1 3 1 2 3 3 3 1 5 3 3 6 1 7 0 11 3 9 3 8 1 9 2 6 7 4 4 1 1 3 3 1 2 3 1 8 0 11 1 9 1 1 7 3 1 9 1 2 2 1 3 3 2 1 1 1 2 1 6 0 6 8 2 1 9 9 1 1 1 2 1 2 3 2 2 5 2 4 5 3 5 1 7 0 6 9 9 9 7 1 5 2 3 1 2 2 3 1 1 7 0 11 9 6 1 6 5 1 7 6 3 8 3 2 3 1 1 1 2 1 1 8 0 11 4 5 6 3 6 9 2 1 4 1 1 1 2 2 1 1 1 3 2 2 5 2 3 5 3 4 1 8 0 6 7 7 9 1 4 1 1 3 3 1 3 1 1 2 1 6 0 10 2 3 8 4 7 9 6 6 1 6 3 3 3 1 3 1 1 5 0 7 1 5 4 5 9 2 1 3 2 3 1 3 5 2 2 3 3 6 1 8 0 7 9 1 2 8 1 4 9 1 2 1 1 3 2 1 3 1 8 0 8 7 1 9 1 4 4 6 3 1 2 1 2 2 3 1 1 1 9 0 11 8 3 6 1 3 2 1 8 6 3 8 1 3 2 1 2 1 3 1 1 4 2 5 1 4 1 3 7 1 7 0 7 3 1 5 7 7 2 3 3 2 2 3 2 1 3 1 8 0 9 1 3 2 6 1 8 9 5 8 2 1 2 1 1 2 1 2 1 8 0 7 6 5 6 7 8 1 3 2 3 3 1 1 1 1 2 1 1 5 5 3 5 4 4 6 5 5 3 3 7 1 5 0 8 8 5 5 1 2 4 3 9 1 3 3 1 2 1 8 0 8 1 9 2 6 5 5 8 4 2 3 1 1 3 3 1 2 1 9 0 7 2 8 1 4 8 4 9 3 1 1 1 2 1 1 1 2 1 4 2 1 5 2 4 3 5 1 8 0 7 7 9 2 7 1 5 1 2 1 2 1 1 3 1 3 1 7 0 7 2 1 2 2 1 4 1 1 1 3 3 3 1 3 1 6 0 7 7 6 7 8 5 6 1 3 3 1 1 3 3 2 4 1 4 4 3 7 1 7 0 7 3 1 4 2 4 1 5 2 2 2 1 1 2 2 1 5 0 8 5 7 1 3 9 9 3 8 1 2 2 1 2 1 5 0 9 6 1 8 6 9 7 2 3 2 1 3 3 3 3 5 2 4 1 1 3 4 3 4 1 8 0 10 9 8 4 1 4 4 8 4 2 5 1 1 1 2 1 3 3 3 1 7 0 6 6 1 6 5 5 9 2 3 2 1 2 3 1 1 8 0 9 7 7 7 1 1 2 6 5 2 2 2 1 3 2 1 1 1 3 3 2 2 3 6 1 9 0 7 4 7 1 4 7 4 4 1 2 2 1 3 2 1 1 3 1 8 0 10 6 8 7 2 2 2 7 5 1 7 3 3 3 2 2 3 2 1 1 6 0 10 1 6 7 7 2 1 4 4 9 8 1 1 2 2 1 2 3 4 1 5 2 5 5 1 4 4 3 3 5 1 6 0 8 5 1 4 3 1 1 3 4 1 1 1 1 3 3 1 9 0 8 2 2 2 9 4 1 7 5 3 3 1 2 2 1 2 3 3 1 7 0 6 3 9 3 7 1 2 2 1 3 1 3 1 2 2 2 1 2 2 3 5 1 6 0 9 8 6 7 9 7 1 1 8 2 1 1 2 3 3 2 1 9 0 10 1 1 3 9 1 7 4 5 4 1 3 3 1 1 1 1 1 2 3 1 9 0 10 3 5 6 6 1 3 4 5 8 4 1 3 3 2 2 1 2 1 1 1 1 2 4 3 3 4 1 5 0 10 6 4 1 9 3 5 1 1 1 2 1 3 1 1 2 1 9 0 10 1 3 2 9 2 6 3 5 5 1 2 1 1 1 1 3 1 3 1 1 7 0 9 7 5 1 6 8 4 6 4 7 3 1 2 2 1 2 1 5 1 2 5 3 6 1 6 0 7 4 6 1 5 7 1 8 3 3 1 3 3 1 1 9 0 8 8 1 7 9 2 2 1 2 1 3 2 3 3 1 1 2 3 1 7 0 8 2 1 1 1 9 8 3 3 2 2 1 1 2 1 1 4 3 5 5 4 3 3 3 5 4 4 3 5 1 9 0 8 1 5 6 9 8 4 9 6 1 1 1 1 2 3 1 3 2 1 8 0 6 4 4 2 1 3 4 3 3 3 1 1 2 1 1 1 9 0 10 8 1 2 3 4 7 7 6 7 1 3 1 3 2 2 2 2 1 2 2 3 1 1 3 3 6 1 5 0 7 1 5 8 1 2 5 4 1 2 2 1 2 1 6 0 9 5 4 2 9 6 3 9 1 9 3 3 1 2 1 3 1 6 0 8 1 2 1 1 8 3 8 4 3 1 3 1 2 3 5 4 3 1 1 1 3 4 1 7 0 8 6 2 1 1 8 1 2 5 2 1 2 1 3 1 2 1 8 0 6 9 8 1 4 3 1 3 3 3 2 1 2 2 1 1 7 0 10 6 6 9 1 1 7 7 8 5 1 2 3 2 2 3 1 2 3 5 3 1 3 7 1 9 0 9 4 8 6 5 1 9 2 3 9 1 1 2 3 2 3 1 3 2 1 9 0 8 1 7 3 7 6 5 3 9 3 1 3 1 3 1 1 1 1 1 8 0 8 2 1 8 1 4 6 8 2 2 3 1 1 2 2 1 1 5 4 3 5 5 1 3 2 4 4 3 5 6 7 2 5 5 3 4 1 6 0 10 1 8 6 5 1 9 4 2 1 3 3 2 3 1 2 3 1 6 0 10 3 5 1 8 2 1 8 6 5 5 1 2 1 1 3 3 1 9 0 10 6 2 9 9 1 7 3 1 5 7 3 2 1 1 2 1 2 2 1 3 1 3 1 3 6 1 7 0 8 2 1 1 9 8 7 8 8 1 1 3 1 3 1 3 1 9 0 9 1 5 4 8 9 3 7 1 1 1 2 1 1 1 1 1 2 3 1 5 0 9 4 6 4 7 4 9 1 9 7 1 2 3 2 3 4 5 3 3 5 3 3 6 1 6 0 11 2 8 6 8 9 9 4 5 3 5 1 1 3 1 1 1 1 1 7 0 8 1 1 9 9 6 1 9 4 1 3 2 1 3 1 1 1 5 0 8 1 5 1 7 8 6 7 6 3 3 3 1 1 2 4 2 3 2 3 3 7 1 5 0 6 7 2 7 4 1 6 1 2 1 3 2 1 6 0 8 5 2 6 4 8 9 1 1 3 3 1 2 1 1 1 5 0 10 7 1 8 9 7 1 1 9 1 6 1 2 2 2 2 3 5 2 5 5 2 2 3 5 1 9 0 9 3 1 9 1 2 4 9 5 7 1 2 1 3 1 2 2 3 1 1 9 0 10 1 7 4 7 1 8 2 8 5 4 2 1 3 1 3 1 1 3 2 1 5 0 6 3 3 6 1 3 5 3 2 2 1 1 5 2 1 4 1 2 3 2 7 3 5 4 3 7 1 6 0 9 2 7 1 4 1 7 7 8 1 3 1 3 2 1 3 1 5 0 7 4 6 2 9 8 3 1 3 1 3 1 3 1 7 0 11 6 3 1 8 2 9 6 8 7 5 7 2 3 1 1 2 1 1 5 5 5 4 5 2 5 3 4 1 9 0 9 2 5 1 8 1 3 6 9 9 3 3 2 3 2 1 3 1 2 1 6 0 10 4 9 9 1 2 9 8 3 2 3 1 2 1 2 3 1 1 8 0 9 8 4 2 5 7 2 8 9 1 1 1 3 1 2 3 3 3 2 4 1 4 3 6 1 8 0 6 8 7 3 2 8 1 1 2 1 3 2 2 1 3 1 7 0 7 2 7 8 9 1 1 9 3 3 1 2 3 1 1 1 5 0 7 1 1 1 3 5 4 4 1 1 1 2 3 1 5 1 5 2 4 3 7 1 7 0 10 8 1 4 8 1 8 3 2 7 4 2 3 1 1 3 2 1 1 7 0 8 1 5 8 6 4 7 9 6 1 3 2 1 1 2 3 1 7 0 10 2 8 2 6 8 2 6 6 2 1 2 3 3 1 3 3 3 1 1 5 2 1 4 3 3 6 1 9 0 7 2 3 8 9 4 1 1 3 3 1 3 2 1 2 1 2 1 6 0 8 2 8 6 5 3 2 1 1 3 1 1 3 2 2 1 7 0 8 8 6 6 2 1 7 3 3 1 2 3 2 1 1 2 3 2 3 5 4 4 5 6 3 3 5 3 3 6 1 9 0 10 1 7 9 9 6 4 8 6 9 2 1 1 2 3 1 1 1 2 2 1 9 0 10 8 4 1 1 1 2 4 1 6 5 1 1 1 2 3 1 2 1 3 1 6 0 7 5 4 9 4 8 3 1 3 3 1 1 2 1 5 1 1 2 3 4 3 7 1 6 0 10 9 3 3 1 6 2 1 1 7 5 1 1 1 2 1 1 1 5 0 9 1 4 5 1 2 6 5 7 1 1 2 3 1 3 1 9 0 10 7 9 6 4 5 5 9 7 3 1 2 1 1 3 1 2 3 2 2 4 5 3 3 2 3 2 3 5 1 6 0 9 6 3 3 3 2 7 5 3 1 2 1 2 1 3 2 1 6 0 10 5 7 9 1 8 2 5 4 4 5 1 3 2 1 3 3 1 9 0 8 3 9 5 1 3 4 2 8 1 1 1 1 1 1 1 2 3 4 4 1 3 4 3 6 1 6 0 10 8 3 2 1 4 2 1 8 3 7 2 1 1 3 1 2 1 6 0 6 1 1 1 2 8 7 1 1 1 1 3 3 1 8 0 6 5 5 7 1 8 1 3 3 3 1 1 1 3 1 3 1 3 2 1 4 3 6 1 6 0 11 7 6 4 7 6 8 9 1 6 6 1 1 2 1 3 1 2 1 6 0 9 4 4 1 1 2 8 2 9 1 1 2 1 2 1 1 1 9 0 9 4 3 8 1 7 8 9 5 1 1 3 3 2 1 1 1 1 1 3 3 3 3 1 3 2 3 6 4 5 3 5 1 5 0 8 3 3 1 3 7 2 7 8 3 1 3 3 3 1 6 0 7 1 2 4 5 4 7 9 1 1 3 1 2 3 1 5 0 7 8 6 7 7 5 3 1 3 1 1 2 1 2 5 2 2 5 3 5 1 6 0 8 1 1 8 7 3 6 4 5 2 2 2 1 1 2 1 6 0 11 4 3 8 4 6 8 2 6 1 8 1 2 1 2 1 1 1 1 8 0 6 8 8 5 1 4 2 2 2 1 2 3 2 2 2 1 3 2 2 4 3 5 1 6 0 9 6 2 1 3 1 1 1 7 6 1 1 1 3 3 3 1 8 0 11 4 7 2 3 5 2 7 2 5 6 1 2 1 1 2 2 1 3 2 1 8 0 11 2 5 4 2 2 6 2 1 4 4 9 2 3 3 1 1 2 1 3 5 5 1 4 1 3 5 1 8 0 8 9 1 6 5 5 5 4 3 1 1 2 3 2 1 2 3 1 8 0 9 4 9 4 2 3 3 1 1 2 2 3 3 1 1 2 3 1 1 7 0 10 4 8 8 6 4 9 3 8 1 5 2 3 1 2 3 1 1 1 5 5 4 1 2 4 2 4 2 5 4 3 5 1 7 0 6 4 8 7 1 7 7 3 1 1 1 1 3 1 1 8 0 6 5 5 5 1 8 5 1 1 1 2 2 2 3 3 1 8 0 7 1 1 9 1 9 5 8 3 3 2 3 1 1 1 1 4 2 4 4 4 3 6 1 8 0 11 1 5 8 4 8 4 7 5 9 5 8 2 1 3 2 2 3 2 1 1 7 0 7 8 1 7 4 6 1 2 2 3 3 2 2 1 1 1 6 0 6 3 1 1 6 9 2 1 1 3 1 3 2 2 1 5 3 5 4 3 4 1 5 0 10 8 1 8 2 1 7 4 3 9 8 2 2 1 3 3 1 9 0 11 1 1 3 7 2 5 3 9 6 2 6 3 3 3 1 2 2 2 1 1 1 8 0 9 1 1 1 3 8 4 6 6 8 2 2 2 1 1 3 1 1 1 4 5 3 3 7 1 9 0 7 6 3 1 8 1 6 8 1 1 3 3 1 1 1 3 2 1 8 0 8 7 9 1 3 8 2 1 7 2 2 2 2 1 1 3 1 1 7 0 11 1 9 9 6 5 4 9 3 8 7 9 1 2 1 1 1 1 1 5 1 3 3 3 5 1 3 4 1 6 0 6 4 9 7 6 1 7 1 1 1 2 2 1 1 5 0 6 2 5 6 1 1 7 2 1 1 2 2 1 6 0 10 9 5 8 4 8 1 8 5 2 8 3 1 2 3 3 3 5 4 3 2 2 1 2 4 5 4 3 4 1 8 0 9 9 3 8 5 9 6 2 1 3 1 2 1 2 1 1 1 1 1 5 0 7 1 8 1 7 7 7 6 1 2 1 1 1 1 6 0 10 4 4 9 6 7 7 1 1 7 7 1 1 3 3 3 2 1 2 5 1 3 6 1 8 0 9 3 4 8 1 6 5 8 1 4 1 1 1 2 1 3 1 2 1 6 0 6 5 1 9 4 2 4 1 2 2 1 1 3 1 5 0 11 5 9 6 9 5 5 2 2 6 5 1 1 2 2 1 1 2 5 2 3 3 1 3 5 1 5 0 6 6 2 4 1 1 2 2 1 3 3 3 1 8 0 9 5 8 7 7 7 6 8 9 1 1 3 1 3 3 2 1 3 1 6 0 9 5 9 1 3 1 4 5 4 3 1 2 2 1 1 2 5 5 5 3 1 3 6 1 8 0 7 4 2 5 2 1 5 3 1 2 2 1 1 1 1 1 1 8 0 10 3 6 9 4 2 3 1 6 8 7 3 1 2 1 3 2 1 1 1 8 0 11 4 7 3 1 5 7 3 1 9 9 5 1 2 3 3 1 2 2 1 2 4 1 2 5 1 3 6 1 8 0 10 1 6 7 9 3 6 2 8 1 1 3 1 3 2 1 1 1 2 1 8 0 8 2 8 4 5 1 3 9 8 3 1 2 3 3 1 1 1 1 5 0 7 6 1 1 1 8 2 3 1 2 2 1 2 4 3 3 1 1 4 3 5 1 1 5 4 3 7 1 6 0 8 3 7 6 3 1 8 8 4 3 1 1 1 3 3 1 5 0 9 3 1 1 6 4 1 6 8 4 2 1 2 1 2 1 7 0 6 6 9 3 7 1 6 1 3 3 1 2 1 1 3 1 1 1 3 1 5 3 7 1 7 0 6 9 2 7 4 1 6 2 3 2 3 1 1 3 1 8 0 8 1 9 1 8 4 9 4 7 2 1 1 2 3 1 1 2 1 5 0 11 2 7 4 1 6 7 6 4 4 8 4 1 1 2 2 1 1 3 2 3 2 5 5 3 4 1 8 0 9 2 6 5 1 8 4 1 4 2 3 3 1 3 2 1 1 1 1 8 0 11 9 7 1 6 1 1 7 6 3 1 3 1 2 3 1 1 3 2 1 1 7 0 8 9 8 9 1 7 4 4 6 2 2 1 3 1 1 2 3 4 3 4 3 7 1 9 0 10 9 8 1 4 5 5 4 7 1 1 1 2 1 1 2 1 1 1 1 1 7 0 9 3 7 1 9 9 9 4 7 5 1 3 1 1 3 1 1 1 6 0 8 6 9 9 4 1 8 1 3 3 3 1 3 1 3 5 4 5 1 4 4 5 3 7 1 8 0 6 3 3 8 1 1 5 1 1 1 1 1 1 2 3 1 9 0 7 2 8 1 1 9 2 6 3 1 3 2 1 3 3 2 2 1 5 0 6 4 1 3 4 3 1 1 1 2 1 2 1 3 2 5 5 3 2 4 4 1 1 2 2 6 2 5 5 3 4 1 6 0 7 5 9 3 1 9 7 4 2 1 2 2 2 1 1 9 0 8 5 1 3 2 3 1 2 6 3 1 1 1 1 1 1 2 1 1 5 0 10 1 2 7 6 3 8 9 3 5 1 2 1 2 1 3 2 3 2 3 3 4 1 5 0 9 1 9 1 7 1 5 2 4 4 3 1 3 2 2 1 9 0 7 8 2 1 8 1 4 5 2 3 2 1 1 3 3 2 1 1 6 0 9 2 2 8 8 3 8 8 1 7 3 2 1 2 2 3 1 3 2 2 3 7 1 9 0 11 5 3 3 5 8 3 3 8 7 1 4 3 1 2 3 1 1 1 1 2 1 9 0 6 3 1 2 1 6 4 2 3 3 1 2 2 1 1 2 1 5 0 9 2 5 1 9 3 5 1 5 8 1 2 3 2 3 3 2 1 1 3 1 4 3 7 1 5 0 7 2 2 4 9 1 9 8 1 3 1 3 1 1 6 0 11 1 3 9 2 5 3 5 4 6 1 5 3 2 1 2 3 1 1 7 0 6 2 1 1 5 8 4 2 1 2 1 1 2 2 2 1 5 3 3 1 3 3 4 1 5 0 7 8 4 1 4 8 9 7 1 1 3 3 3 1 8 0 9 8 3 7 2 7 5 1 4 3 2 1 3 1 3 1 1 3 1 9 0 10 1 7 2 3 7 1 7 5 9 8 3 3 1 3 2 1 2 1 1 5 2 1 3 7 3 6 7 3 5 5 3 6 1 7 0 8 5 9 1 9 2 6 6 3 3 2 1 1 1 2 2 1 7 0 7 7 1 2 9 7 1 7 1 2 3 1 1 1 1 1 6 0 7 1 1 9 2 3 4 2 3 2 1 2 1 3 5 4 1 2 3 5 3 4 1 9 0 11 3 1 4 6 1 4 5 6 2 7 8 1 3 1 2 3 1 3 3 3 1 7 0 9 7 2 3 2 1 7 4 1 2 3 2 1 3 1 2 3 1 6 0 8 8 7 4 5 3 1 7 3 1 2 2 1 3 1 3 1 1 3 3 5 1 6 0 8 9 3 6 2 5 1 1 3 1 2 1 3 2 1 1 8 0 10 1 3 4 1 4 4 8 4 7 6 2 3 1 2 2 2 2 1 1 9 0 6 1 7 1 4 7 7 1 2 1 2 3 3 3 3 1 4 1 1 2 5 3 7 1 5 0 10 2 5 9 7 8 7 1 9 1 6 1 2 1 2 1 1 5 0 10 1 6 1 3 6 7 6 7 4 7 2 3 2 1 3 1 6 0 7 9 3 1 6 4 1 4 2 2 1 2 2 1 3 4 5 5 5 5 1 3 6 1 7 0 8 7 8 3 1 8 7 4 1 2 3 1 2 1 3 3 1 9 0 10 2 4 6 3 5 2 9 7 1 2 3 1 2 2 2 3 2 1 1 1 7 0 6 7 1 5 7 7 4 1 2 2 3 3 2 3 3 5 4 5 2 3 2 1 1 4 2 5 4 3 4 1 9 0 9 6 4 2 5 3 1 4 8 4 3 1 2 2 1 3 1 1 3 1 7 0 10 4 1 8 6 6 5 9 3 7 2 3 1 1 1 3 1 1 1 7 0 10 1 8 9 1 1 8 7 7 6 9 3 1 3 2 3 2 3 1 5 4 5 3 6 1 8 0 7 1 7 5 5 4 4 1 1 3 1 2 1 1 2 2 1 6 0 7 1 3 9 6 2 7 2 2 3 3 1 2 1 1 6 0 11 3 7 7 6 1 3 2 3 3 3 1 1 3 2 2 3 1 4 1 1 1 2 2 3 5 1 5 0 10 8 4 5 3 2 1 5 9 7 6 3 1 3 3 1 1 5 0 10 2 4 8 4 8 8 7 4 1 1 3 1 3 2 1 1 6 0 10 6 7 5 8 3 7 1 6 1 9 2 1 3 3 3 2 2 5 1 1 3 3 4 1 8 0 11 3 5 9 4 3 2 1 6 6 2 4 3 1 3 1 3 1 1 1 1 6 0 11 7 6 3 3 8 1 4 9 9 9 7 1 2 1 2 1 1 1 6 0 6 5 5 1 2 2 2 1 2 3 1 1 1 2 5 2 2 3 6 1 6 0 10 7 9 1 5 3 1 8 8 6 3 2 3 1 1 1 1 1 8 0 7 8 1 8 8 9 8 3 2 2 3 2 2 3 1 1 1 5 0 7 1 2 6 2 6 5 7 1 2 1 2 1 1 1 4 1 4 2 3 1 7 2 5 4 3 4 1 6 0 11 7 3 3 1 3 5 8 8 7 4 4 2 1 1 3 1 3 1 9 0 11 2 2 1 9 8 7 4 7 9 2 2 3 1 2 1 3 1 3 3 1 1 5 0 11 3 6 6 8 2 9 1 4 7 9 7 1 2 1 3 3 2 5 1 3 3 5 1 9 0 11 3 2 8 1 6 4 2 9 7 1 6 1 2 1 3 1 1 1 2 2 1 6 0 7 1 9 8 2 1 3 1 3 3 1 3 1 3 1 9 0 8 5 2 8 7 6 9 1 3 3 2 3 1 2 2 2 2 3 2 5 4 3 3 3 5 1 7 0 7 8 6 2 4 1 5 3 1 1 1 2 2 2 1 1 7 0 6 6 9 2 7 2 1 3 1 3 1 1 1 3 1 9 0 10 1 7 3 4 2 5 7 2 9 7 2 3 1 3 2 3 1 2 2 5 4 3 3 4 3 5 1 9 0 6 9 1 9 3 9 2 3 2 3 2 2 1 3 3 2 1 7 0 7 1 4 1 7 5 4 9 2 1 3 3 2 3 3 1 6 0 10 4 1 9 3 2 6 7 7 4 6 2 1 1 1 1 2 1 1 2 3 4 3 6 1 7 0 7 5 5 7 1 2 6 4 1 2 2 1 2 3 1 1 7 0 8 1 3 6 2 3 3 1 3 2 1 2 3 1 2 1 1 5 0 9 1 5 8 6 5 1 5 4 9 3 1 1 2 1 1 5 4 2 3 4 4 5 5 6 5 4 3 7 1 7 0 7 6 4 4 1 1 7 8 2 3 1 1 3 1 3 1 8 0 8 1 2 3 8 9 1 7 1 1 1 1 1 3 2 1 2 1 9 0 8 7 2 6 4 4 3 4 1 2 3 1 2 3 2 3 2 3 3 1 3 5 2 3 5 3 4 1 7 0 11 7 1 2 5 4 1 5 8 2 6 3 2 1 2 1 1 2 1 1 7 0 9 2 7 9 8 8 3 1 9 3 3 2 2 3 1 1 2 1 8 0 6 1 1 1 2 3 3 2 2 3 3 1 1 1 2 1 5 2 5 3 7 1 9 0 10 1 4 4 7 4 8 6 7 8 4 1 1 3 1 2 3 1 2 3 1 9 0 7 3 2 6 2 8 1 1 3 1 1 1 1 2 3 3 3 1 7 0 6 3 4 1 1 9 8 1 2 2 2 2 2 3 3 4 1 1 4 2 2 3 6 1 7 0 6 1 1 1 9 2 6 2 1 1 1 1 1 3 1 7 0 10 3 1 2 5 3 9 7 2 1 4 1 1 3 2 1 2 3 1 7 0 9 8 5 1 1 9 1 2 1 9 1 1 3 2 2 3 2 2 2 3 3 3 3 3 5 1 9 0 10 2 1 4 4 3 5 6 1 1 8 1 2 2 3 3 1 2 2 3 1 9 0 11 4 9 5 4 9 5 1 8 4 1 3 1 1 1 3 1 2 3 1 3 1 7 0 8 1 2 3 7 6 9 5 2 3 1 2 1 2 1 2 2 1 4 2 4 7 1 1 7 4 5 3 7 1 8 0 9 1 5 7 1 4 1 7 7 8 2 2 3 2 1 1 1 1 1 5 0 9 4 5 5 1 2 5 5 9 1 1 2 3 1 3 1 7 0 11 7 4 2 9 5 8 5 1 9 1 6 1 1 3 2 3 2 1 4 3 2 5 3 5 4 3 7 1 6 0 9 5 7 1 2 5 1 1 7 6 1 2 1 2 1 1 1 8 0 11 3 5 7 6 9 1 6 4 1 4 1 1 3 1 3 3 2 2 3 1 7 0 8 9 7 9 9 1 1 8 7 1 1 2 1 1 1 1 5 5 1 3 4 3 3 3 5 1 5 0 11 8 1 4 8 8 6 9 6 7 3 7 2 1 3 1 1 1 8 0 11 1 3 9 4 4 5 3 7 7 1 1 1 1 1 2 3 3 3 2 1 8 0 10 8 5 3 7 2 1 3 8 1 2 2 1 1 1 1 2 1 1 1 1 5 3 5 3 6 1 8 0 8 6 6 7 5 8 1 7 5 1 1 1 3 2 3 1 2 1 9 0 6 5 3 4 1 1 6 2 1 1 2 1 1 2 2 2 1 9 0 11 8 4 4 3 2 5 1 7 1 4 9 1 1 2 3 3 1 3 3 3 1 2 1 2 3 5 2 4 2 4 3 5 4 6 3 4 3 3 6 1 6 0 6 7 6 5 3 4 1 2 1 2 1 1 2 1 9 0 6 2 4 1 4 1 3 3 2 3 2 1 1 1 3 1 1 7 0 7 4 3 6 9 1 8 1 1 1 3 1 3 3 3 3 5 2 1 1 4 3 4 1 8 0 6 1 4 1 5 3 1 1 3 1 1 2 1 1 1 1 5 0 7 3 9 1 5 4 4 8 2 1 1 1 3 1 7 0 8 8 2 9 5 1 1 9 3 1 2 3 3 3 3 1 4 4 1 1 3 5 1 6 0 8 5 1 3 4 6 1 3 4 3 1 1 2 3 3 1 5 0 8 4 8 9 5 1 5 1 1 3 1 1 2 2 1 9 0 10 1 7 9 8 5 2 7 1 9 4 3 3 2 3 3 1 3 3 1 5 4 3 1 5 3 5 1 9 0 7 2 1 1 3 8 6 8 1 3 1 2 1 1 3 3 3 1 6 0 11 7 4 1 1 3 1 2 3 7 1 3 1 2 3 1 3 2 1 6 0 10 1 9 8 4 7 4 9 8 9 7 3 2 2 3 1 3 3 3 5 2 4 1 3 2 4 5 3 6 1 5 0 8 4 6 8 4 1 7 7 1 1 3 2 2 2 1 9 0 6 2 1 9 5 6 9 1 3 1 1 3 1 3 1 2 1 8 0 11 4 9 2 1 6 5 3 1 9 8 1 2 3 2 2 2 2 2 1 1 4 1 1 3 2 3 6 1 9 0 7 3 6 6 5 1 6 1 3 1 2 3 2 3 1 2 1 1 8 0 9 5 1 3 4 9 4 3 8 9 3 3 1 2 2 3 2 3 1 8 0 9 9 7 2 4 1 1 6 8 5 1 1 1 3 1 3 1 3 3 3 3 3 2 3 3 4 1 7 0 8 2 4 2 4 7 6 8 1 2 1 2 2 1 3 1 1 6 0 9 9 2 8 1 4 7 4 6 2 1 1 1 2 1 2 1 6 0 7 9 1 1 9 7 1 3 2 2 2 1 1 2 1 3 3 5 3 5 1 9 0 9 5 7 3 7 1 3 1 9 6 1 1 3 1 2 3 3 3 2 1 6 0 9 8 9 5 9 4 1 7 5 4 1 3 1 2 3 1 1 7 0 10 8 1 9 1 3 3 5 4 6 8 1 2 1 3 2 2 3 1 4 1 5 1 4 4 1 6 5 4 5 3 5 1 8 0 11 6 8 3 7 6 1 3 4 7 3 3 3 1 3 3 3 2 1 2 1 9 0 10 4 1 9 8 2 5 5 8 7 8 1 2 2 3 2 2 1 1 1 1 5 0 6 1 2 1 6 7 2 2 3 1 3 2 2 3 1 3 4 3 6 1 5 0 7 4 9 5 2 1 1 4 1 1 1 2 3 1 7 0 7 7 4 9 1 1 6 4 1 3 3 3 1 1 1 1 9 0 11 3 8 1 1 5 8 9 8 9 8 9 3 1 3 2 1 1 1 1 3 1 5 3 1 5 1 3 6 1 6 0 8 5 8 1 2 9 8 8 8 3 3 1 2 1 3 1 6 0 8 1 9 4 4 2 6 9 1 1 2 1 1 2 1 1 7 0 6 8 1 6 4 9 2 1 3 2 3 2 2 1 3 1 3 1 4 2 3 6 1 5 0 10 6 4 9 1 9 9 3 2 3 5 2 1 2 3 1 1 7 0 8 8 8 2 1 9 7 9 3 2 2 3 1 3 1 3 1 5 0 6 4 1 4 5 6 1 3 1 1 1 2 1 4 3 4 3 5 1 4 6 3 1 5 5 3 7 1 5 0 11 2 9 4 2 6 1 2 3 3 7 5 1 1 3 2 2 1 7 0 8 1 9 6 1 9 7 6 7 2 2 2 1 2 2 3 1 9 0 11 7 1 7 4 4 5 7 3 5 4 7 2 2 2 1 2 3 3 1 3 3 4 4 2 1 3 1 3 7 1 8 0 10 7 2 5 6 1 9 3 1 7 9 2 3 2 3 3 1 2 1 1 7 0 11 4 7 9 4 5 1 5 9 9 1 6 1 1 3 2 2 2 1 1 7 0 11 1 1 1 2 6 4 3 8 4 5 8 1 1 3 1 2 2 1 2 4 3 3 4 2 1 3 5 1 9 0 8 2 4 7 5 1 6 4 4 1 1 1 1 1 3 1 2 1 1 9 0 9 6 8 3 3 6 1 1 2 5 1 3 3 3 2 2 1 2 1 1 5 0 9 6 6 7 2 9 8 1 6 1 3 3 1 1 2 3 3 3 2 2 3 4 1 9 0 8 9 1 7 9 5 1 2 8 2 2 2 1 3 3 3 2 1 1 7 0 10 5 6 7 4 8 9 7 4 1 8 1 3 1 2 3 2 1 1 9 0 8 1 1 5 4 1 9 4 5 1 2 3 3 2 3 1 2 3 5 2 3 2 3 6 1 7 0 11 1 5 2 8 8 5 2 5 6 1 9 2 3 3 1 1 1 1 1 6 0 9 7 8 4 8 1 9 2 5 3 2 3 3 1 1 3 1 7 0 11 9 5 6 6 2 9 2 4 1 8 6 3 2 1 3 3 2 1 2 1 5 5 5 5 6 4 7 4 3 4 5 3 7 1 8 0 11 4 1 6 1 3 1 1 7 6 2 2 1 1 3 1 3 1 1 3 1 8 0 8 3 2 7 6 7 5 1 9 2 3 3 2 2 3 1 3 1 9 0 9 1 4 2 8 1 8 4 3 2 3 1 1 1 3 2 3 1 2 5 1 5 1 4 2 2 3 5 1 8 0 8 4 4 1 6 7 1 8 2 3 3 1 1 1 2 1 1 1 8 0 6 9 3 4 1 9 7 2 2 3 3 1 3 1 1 1 8 0 11 9 7 6 6 6 1 6 4 1 3 4 1 2 2 1 3 1 1 1 3 4 3 5 5 3 6 1 9 0 11 9 5 5 6 1 7 1 6 2 5 8 1 1 1 1 2 2 1 3 2 1 7 0 7 7 9 2 1 6 9 7 3 1 2 3 3 1 3 1 8 0 9 3 5 4 7 9 8 1 8 6 1 2 2 1 1 2 1 1 1 5 2 5 5 5 3 7 1 9 0 9 4 5 4 4 8 6 2 1 7 3 3 2 1 1 3 3 1 3 1 8 0 6 8 5 4 6 1 9 2 2 3 1 1 3 1 3 1 8 0 6 4 1 9 2 9 2 2 2 2 3 1 2 1 1 4 4 3 2 2 5 2 3 4 3 1 6 5 3 3 7 1 7 0 6 8 1 8 2 4 2 2 1 1 1 1 1 1 1 7 0 8 2 2 7 5 1 1 1 6 1 2 1 1 1 2 3 1 9 0 9 9 1 9 1 2 9 9 6 8 1 3 3 3 1 2 1 3 3 1 5 4 1 3 5 3 3 7 1 7 0 8 8 6 1 9 8 8 8 5 2 2 1 2 2 1 2 1 8 0 10 2 2 5 1 6 4 3 4 2 5 3 3 2 3 1 2 1 1 1 7 0 10 1 4 5 7 5 9 7 1 4 8 2 1 3 1 1 1 1 4 4 2 1 4 3 5 3 6 1 5 0 11 2 3 2 3 2 6 4 1 1 1 5 1 1 1 1 2 1 8 0 9 2 5 2 4 5 3 5 1 3 3 2 1 2 2 3 3 2 1 7 0 10 3 2 1 3 5 1 3 8 3 8 2 1 1 1 3 2 1 1 5 1 3 5 2 3 5 1 6 0 10 6 1 1 5 1 2 2 9 2 3 3 1 3 1 2 1 1 9 0 7 6 4 8 1 7 4 2 2 3 3 3 2 1 1 3 1 1 9 0 7 2 8 6 6 4 1 1 3 3 1 2 3 2 1 1 2 2 1 5 1 4 3 5 1 8 0 8 9 9 9 4 7 9 5 1 2 1 1 1 3 3 3 2 1 6 0 7 2 1 6 1 4 3 8 1 1 3 2 1 2 1 6 0 7 9 6 2 9 9 5 1 3 2 2 1 2 1 4 2 3 3 3 2 3 7 3 4 2 6 3 4 3 3 4 1 7 0 11 1 7 1 2 8 1 9 6 4 7 8 2 3 2 2 1 1 1 1 9 0 10 7 4 1 4 9 1 2 7 2 5 1 2 1 2 2 2 1 3 1 1 9 0 6 9 6 7 3 1 6 3 2 1 2 2 2 3 2 1 4 4 1 1 3 4 1 9 0 7 4 9 1 3 9 1 7 1 1 1 1 1 2 3 3 1 1 6 0 8 6 8 4 3 9 1 7 3 3 3 1 1 3 3 1 7 0 10 1 1 5 8 1 8 6 8 3 9 2 2 1 2 2 1 2 5 4 4 3 3 4 1 6 0 8 8 5 4 1 1 7 1 1 3 1 1 1 1 2 1 8 0 9 2 1 5 9 6 3 9 1 9 2 2 1 2 1 3 2 2 1 5 0 6 1 1 6 5 4 4 2 2 1 1 3 4 3 3 4 3 6 1 8 0 7 1 4 6 5 1 7 8 1 1 1 3 3 1 3 2 1 6 0 8 7 9 2 6 9 1 1 2 3 3 1 3 2 1 1 5 0 9 1 3 7 2 9 3 7 5 3 1 2 1 1 3 1 1 5 3 1 4 3 3 1 4 4 3 4 1 8 0 6 1 1 4 7 8 4 2 3 3 1 1 3 1 2 1 5 0 10 4 8 3 1 2 9 4 6 6 4 1 2 1 2 3 1 9 0 7 7 9 5 9 6 1 4 2 1 2 3 3 1 1 1 1 2 1 3 1 3 4 1 5 0 11 1 3 1 2 2 2 1 1 3 1 1 2 1 2 2 3 1 6 0 11 6 6 2 9 1 5 4 8 6 7 1 2 3 1 3 3 2 1 7 0 11 1 1 1 2 1 1 2 6 5 4 3 3 2 3 3 2 1 1 3 1 3 1 3 7 1 8 0 6 1 9 4 6 3 4 1 1 2 1 1 3 3 2 1 5 0 8 7 8 9 1 1 7 7 8 2 1 3 1 1 1 6 0 8 1 1 6 7 3 7 7 3 3 1 2 1 1 2 1 3 3 3 3 1 1 3 4 1 7 0 8 1 4 3 3 4 2 7 6 1 3 1 3 2 1 1 1 7 0 6 4 6 1 8 7 1 1 3 1 2 3 1 1 1 5 0 8 3 6 2 4 4 1 6 1 3 3 3 1 3 3 3 3 1 4 5 1 4 5 4 3 7 1 9 0 8 1 4 6 8 7 8 4 9 1 1 3 1 2 1 1 1 2 1 5 0 6 4 1 4 5 9 2 1 1 2 2 2 1 9 0 6 1 7 1 5 6 4 3 1 2 3 2 2 2 1 3 4 5 3 1 3 5 2 3 5 1 6 0 8 7 7 5 1 6 5 4 5 2 2 2 1 2 1 1 7 0 6 8 5 1 1 7 1 2 3 3 1 2 3 1 1 8 0 6 2 1 2 2 8 7 1 1 1 1 3 3 3 1 1 4 2 4 2 3 7 1 7 0 6 8 5 8 8 1 8 3 2 2 1 2 2 1 1 9 0 10 7 2 5 9 1 8 5 2 3 8 3 3 3 3 3 1 1 1 1 1 5 0 11 3 2 5 9 6 8 1 7 4 8 7 1 3 3 1 1 1 3 5 2 3 3 1 3 5 1 6 0 10 5 1 2 1 4 4 8 6 4 5 3 3 3 1 1 1 1 5 0 7 5 2 1 4 9 5 1 1 1 2 2 1 1 8 0 11 2 1 7 1 9 2 9 1 6 4 6 1 2 2 3 3 2 2 3 3 1 3 1 5 3 6 1 9 0 6 8 1 1 2 2 4 2 1 2 1 3 3 3 1 2 1 7 0 6 5 5 3 8 1 6 1 1 1 2 2 3 3 1 8 0 8 3 1 4 3 4 6 5 1 3 1 1 2 2 3 1 3 2 4 1 2 4 2 1 6 7 1 5 5 3 6 1 6 0 10 7 9 7 7 7 4 6 8 8 1 3 1 2 3 2 2 1 8 0 11 1 7 2 5 7 5 1 7 3 3 3 2 1 1 3 1 1 3 3 1 7 0 7 1 3 5 4 1 7 7 3 1 3 1 3 1 1 5 1 5 1 4 1 3 5 1 7 0 9 4 4 1 3 6 4 5 7 1 3 1 3 1 3 2 2 1 8 0 8 8 3 8 9 4 6 1 8 1 3 3 1 1 3 1 2 1 5 0 11 8 1 1 1 6 6 7 8 9 9 1 3 3 3 2 1 4 2 3 4 4 3 4 1 6 0 9 7 1 3 7 6 1 3 5 5 2 3 1 1 1 2 1 5 0 6 2 1 5 5 2 1 3 1 2 1 2 1 6 0 8 1 7 6 8 8 1 1 1 3 1 3 3 2 3 1 1 2 1 3 5 1 7 0 10 2 9 1 2 7 7 5 1 8 2 1 1 3 2 2 1 1 1 8 0 8 6 1 9 2 1 3 8 1 3 3 2 2 1 2 1 1 1 9 0 6 9 3 1 7 9 2 2 2 3 1 3 2 3 1 1 1 3 4 5 4 3 5 1 7 0 9 5 2 6 1 4 4 1 3 8 2 1 2 3 3 1 1 1 9 0 7 2 8 1 3 1 9 4 3 2 3 2 3 2 1 2 1 1 9 0 10 2 5 1 1 2 6 8 5 1 5 2 1 2 3 1 1 2 2 2 4 5 4 3 1 2 6 7 6 2 4 4 3 6 1 6 0 9 3 7 3 3 1 2 4 6 8 2 2 1 3 1 2 1 6 0 7 8 6 5 8 1 3 5 1 2 3 1 1 3 1 5 0 11 3 5 2 1 1 8 6 6 9 4 3 2 3 3 1 3 4 5 4 1 5 4 3 4 1 7 0 9 6 2 1 9 1 6 3 9 3 3 3 1 1 3 2 2 1 7 0 11 3 9 2 1 3 4 5 2 9 9 5 1 1 1 3 2 3 2 1 8 0 8 2 6 3 4 1 4 9 9 1 1 1 1 1 2 1 2 5 2 4 1 3 6 1 6 0 8 7 7 5 3 8 2 1 4 3 2 1 1 3 1 1 9 0 7 8 5 5 1 9 9 2 3 1 1 1 3 1 3 2 1 1 7 0 6 1 1 1 4 8 7 3 3 2 2 1 1 3 1 1 5 4 1 1 3 4 1 7 0 7 5 2 4 8 6 4 1 3 3 3 3 1 1 3 1 5 0 11 7 5 6 3 1 2 1 9 9 1 7 2 3 2 3 1 1 5 0 11 5 3 1 8 3 5 4 1 5 6 4 1 1 1 2 1 5 5 3 1 1 4 4 2 5 4 3 5 1 6 0 10 3 8 1 1 9 7 6 3 7 6 2 2 3 3 3 1 1 8 0 8 7 4 8 8 7 8 1 3 3 3 3 3 1 1 1 3 1 7 0 9 2 1 1 1 9 2 6 1 5 2 1 3 3 3 3 1 1 2 1 2 4 3 7 1 6 0 9 2 4 1 1 3 9 7 6 7 1 3 3 1 1 3 1 8 0 6 1 9 4 1 5 1 1 1 2 1 2 1 1 1 1 8 0 6 2 6 4 1 3 4 1 1 1 3 1 2 2 2 5 2 5 2 5 5 3 3 6 1 8 0 8 7 7 7 4 5 1 7 4 1 1 2 1 1 2 3 1 1 9 0 9 2 4 4 5 3 4 5 1 4 2 3 1 3 1 1 1 2 2 1 7 0 11 1 6 2 9 4 9 9 5 1 2 2 3 1 3 1 3 3 3 5 1 4 4 4 1 3 4 1 6 0 11 5 3 6 1 3 9 5 9 9 7 2 3 1 2 3 1 1 1 5 0 11 9 6 2 8 2 2 1 2 7 6 2 2 1 2 3 3 1 7 0 9 3 2 8 5 9 8 6 1 2 1 1 2 3 1 1 1 1 4 2 2 3 5 1 7 0 6 5 1 1 1 3 9 1 1 1 1 1 2 1 1 5 0 6 4 1 5 1 8 5 2 1 3 3 3 1 6 0 10 2 1 3 4 2 8 6 8 7 3 2 2 1 1 1 3 2 3 2 3 4 5 1 2 1 4 8 2 6 3 4 4 3 4 1 5 0 10 1 7 3 8 9 1 8 6 3 2 3 1 3 2 2 1 5 0 6 6 8 3 1 1 7 1 2 2 3 1 1 9 0 7 4 3 3 6 4 7 1 1 2 2 1 3 3 1 1 1 1 2 3 5 3 5 1 6 0 10 7 8 6 6 5 1 1 3 1 1 3 1 1 2 1 1 1 5 0 8 9 7 3 3 7 1 3 9 1 1 3 1 2 1 6 0 6 1 6 6 1 7 6 3 1 2 1 2 3 5 5 5 2 4 3 4 1 6 0 7 4 3 1 6 3 4 2 2 3 1 3 2 1 1 8 0 11 8 3 2 7 9 2 6 8 8 1 6 1 2 1 3 1 1 1 2 1 8 0 11 8 2 2 9 4 5 6 7 1 6 8 1 2 1 3 3 3 1 1 3 2 5 1 3 7 1 7 0 7 4 3 8 8 1 1 8 1 2 1 2 2 1 1 1 5 0 10 5 9 9 3 8 4 7 9 1 8 2 1 1 1 1 1 9 0 7 3 4 5 7 4 1 5 2 1 1 3 2 3 1 2 1 3 3 5 5 3 3 1 1 1 3 4 4 3 3 6 1 6 0 9 7 8 4 1 9 6 5 3 3 2 2 2 1 2 3 1 8 0 9 1 4 1 7 5 5 4 9 2 1 3 3 3 1 1 1 1 1 5 0 10 9 1 9 9 9 1 4 4 9 7 1 2 2 1 3 4 5 4 2 2 2 3 6 1 8 0 8 4 3 2 2 3 2 1 5 2 2 3 1 2 2 2 1 1 5 0 8 3 1 4 6 1 4 6 5 1 1 2 1 1 1 5 0 7 2 3 5 1 6 7 9 2 3 1 2 2 5 3 4 5 5 2 3 5 1 6 0 11 8 3 1 8 8 8 1 3 7 2 2 3 1 2 2 1 3 1 8 0 7 3 2 3 7 1 9 4 1 1 1 3 2 3 3 1 1 9 0 8 6 2 8 1 5 4 2 2 1 1 2 1 3 1 1 2 1 5 4 1 1 1 3 7 1 6 0 7 8 3 7 5 6 5 1 1 1 2 1 2 1 1 7 0 11 8 8 3 4 1 3 2 3 3 9 8 2 3 1 1 1 3 2 1 6 0 10 8 3 9 4 9 2 8 3 3 1 1 2 3 1 2 1 2 1 5 3 3 2 5 6 1 6 5 4 3 5 1 5 0 10 5 8 5 5 5 9 3 9 8 1 1 1 1 1 3 1 5 0 7 4 9 8 9 1 9 1 2 1 1 2 1 1 8 0 11 5 3 4 8 8 3 7 3 1 1 4 1 2 1 3 2 2 1 3 2 4 5 4 3 3 4 1 8 0 8 7 1 5 4 2 2 1 9 3 1 2 3 1 3 1 3 1 9 0 9 5 7 9 3 4 3 6 4 1 1 3 2 1 3 2 3 1 1 1 7 0 11 1 2 6 2 6 4 6 1 1 8 6 2 3 1 2 3 1 1 2 5 1 2 3 6 1 8 0 10 4 9 2 9 5 1 9 2 8 6 3 1 1 1 3 1 3 1 1 7 0 8 1 9 7 9 9 7 4 4 1 2 3 1 2 2 3 1 8 0 7 4 9 1 8 9 7 1 2 2 3 1 1 2 2 3 2 1 1 2 3 1 3 5 1 7 0 11 2 1 4 5 8 4 3 1 9 4 5 1 1 2 3 3 3 1 1 9 0 7 8 5 9 3 1 4 3 1 1 3 3 3 1 3 1 1 1 8 0 8 6 4 6 8 1 3 5 3 1 1 2 3 2 3 1 1 4 1 4 3 3 3 6 1 8 0 10 4 2 7 1 1 1 7 2 9 2 3 2 2 1 1 3 3 1 1 9 0 9 4 4 6 7 4 7 1 9 1 2 1 2 2 1 3 2 1 1 1 5 0 9 2 7 1 6 2 2 7 6 5 1 3 3 1 1 2 1 4 3 2 5 7 1 2 5 5 5 3 5 1 6 0 9 9 1 1 7 2 9 7 6 8 1 3 1 3 3 1 1 5 0 7 6 2 3 5 1 1 3 1 2 3 3 1 1 9 0 10 1 9 3 7 8 3 1 1 4 1 2 2 2 1 3 1 1 1 2 1 4 2 3 5 3 7 1 8 0 6 8 7 4 1 6 3 1 2 2 3 3 1 3 1 1 8 0 6 4 7 5 5 1 8 3 3 3 1 3 1 1 3 1 9 0 8 6 8 8 5 1 7 7 2 1 2 3 2 1 3 1 3 2 2 5 3 1 1 4 2 3 6 1 7 0 6 1 6 9 9 4 7 1 3 3 2 1 3 2 1 7 0 9 5 1 3 6 1 4 8 7 3 1 2 1 3 3 1 3 1 9 0 10 8 4 9 1 7 1 1 4 1 1 1 1 1 2 1 1 1 1 2 3 3 4 2 1 3 3 5 1 8 0 7 3 2 2 4 1 1 9 1 1 3 3 1 1 1 1 1 6 0 7 5 9 1 1 2 9 6 2 3 1 3 1 1 1 8 0 11 6 1 1 7 8 2 3 2 3 9 1 1 1 1 3 1 2 1 3 1 3 2 3 1 3 4 1 9 0 10 5 3 1 3 9 7 9 7 5 7 2 2 2 1 1 1 2 2 1 1 5 0 7 1 9 1 8 8 4 5 2 1 3 1 2 1 5 0 6 9 9 8 9 1 4 2 1 1 3 2 1 3 5 1 3 4 4 7 1 4 5 3 5 1 7 0 9 5 7 8 7 9 7 4 2 1 2 3 2 1 2 1 1 1 8 0 11 6 9 2 5 3 1 1 3 8 3 7 3 2 1 1 3 1 1 1 1 9 0 9 5 1 1 8 2 7 9 1 4 2 1 3 2 3 1 3 1 3 3 3 3 3 3 3 6 1 7 0 9 4 1 3 9 7 6 2 1 2 3 1 1 3 1 3 2 1 8 0 6 5 3 1 1 3 1 2 1 1 3 2 3 1 1 1 9 0 7 6 9 6 1 4 9 6 1 2 2 3 3 3 1 3 1 2 3 2 1 4 3 3 6 1 8 0 11 4 1 1 4 7 3 5 1 6 3 9 1 2 2 3 3 3 3 1 1 8 0 8 2 1 1 3 4 8 2 5 3 1 1 2 2 2 2 1 1 6 0 9 2 9 1 6 2 9 2 5 3 1 3 2 1 2 3 5 2 1 2 2 3 3 5 1 6 0 11 4 1 6 3 5 4 6 4 9 4 4 2 1 1 1 2 2 1 5 0 11 3 3 3 3 6 2 1 1 2 3 9 3 1 1 3 2 1 6 0 8 3 1 8 9 4 1 3 9 3 1 2 2 1 2 3 2 5 2 5 4 3 2 6 4 4 3 3 6 1 5 0 11 1 5 3 7 5 4 9 7 5 2 2 1 1 2 3 2 1 6 0 7 9 5 1 9 9 1 4 2 1 3 2 2 2 1 6 0 6 1 7 5 8 8 5 1 3 2 1 2 2 3 1 2 4 3 2 3 7 1 8 0 7 1 3 2 3 8 1 1 2 1 1 2 3 1 2 1 1 6 0 8 2 5 8 7 6 7 1 3 1 2 3 3 1 1 1 8 0 10 8 7 1 8 2 1 8 6 9 3 1 1 1 2 2 2 3 3 2 4 2 3 2 1 3 3 5 1 8 0 9 8 1 7 9 5 1 9 1 1 2 2 3 2 3 1 1 2 1 5 0 9 8 7 1 9 1 2 2 5 2 2 1 2 1 1 1 9 0 8 1 1 4 4 1 2 8 1 2 3 1 2 2 1 1 3 1 1 5 3 5 1 3 4 1 9 0 9 4 1 7 7 9 3 9 8 1 1 1 1 1 2 1 2 3 2 1 8 0 6 4 7 5 5 1 6 3 1 1 1 1 1 3 2 1 6 0 9 5 4 1 6 7 5 4 4 4 2 1 2 3 1 2 2 2 4 2 4 6 1 7 4 6 3 6 9 7 7 5 4 6 7 4 2 diff --git a/2018/d08/ex2/ex2.py b/2018/d08/ex2/ex2.py new file mode 100755 index 0000000..7354173 --- /dev/null +++ b/2018/d08/ex2/ex2.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections.abc import Iterator + + +@dataclasses.dataclass +class Tree: + children: list["Tree"] + metadata: list[int] + + @classmethod + def from_raw(cls, raw: list[int]) -> "Tree": + def helper(offset: int) -> tuple[Tree, int]: + n_children, n_metadata = raw[offset], raw[offset + 1] + offset += 2 + + children: list[Tree] = [] + for _ in range(n_children): + tree, offset = helper(offset) + children.append(tree) + metadata = raw[offset : offset + n_metadata] + offset += n_metadata + + return cls(children, metadata), offset + + tree, offset = helper(0) + assert offset == len(raw) + return tree + + def preorder(self) -> Iterator["Tree"]: + yield self + for child in self.children: + yield from child.preorder() + + def value(self) -> int: + if not self.children: + return sum(self.metadata, 0) + return sum( + ( + self.children[i - 1].value() + for i in self.metadata + if i <= len(self.children) + ), + 0, + ) + + +def solve(input: str) -> int: + def parse(input: str) -> Tree: + raw = [int(n) for n in input.split()] + return Tree.from_raw(raw) + + tree = parse(input) + return tree.value() + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d08/ex2/input b/2018/d08/ex2/input new file mode 100644 index 0000000..3b6e1d2 --- /dev/null +++ b/2018/d08/ex2/input @@ -0,0 +1 @@ +7 11 7 2 5 4 3 4 1 5 0 6 7 5 5 8 1 4 1 1 1 1 1 1 9 0 8 4 8 6 4 1 1 3 6 3 3 2 2 1 1 1 3 1 1 8 0 6 7 7 9 1 9 9 3 2 1 1 2 3 3 3 4 3 3 4 3 7 1 8 0 6 9 9 1 1 4 9 2 3 1 2 3 2 1 3 1 6 0 7 1 5 2 9 4 5 4 1 2 3 1 2 2 1 5 0 10 3 3 5 6 4 3 4 8 1 2 1 1 2 3 3 2 4 2 3 1 5 1 3 7 1 5 0 10 9 7 6 3 8 8 2 2 5 1 3 2 2 1 1 1 5 0 11 8 5 2 8 1 3 4 7 9 9 7 3 3 1 2 3 1 9 0 9 9 2 2 5 7 9 5 3 1 3 2 3 1 3 1 3 2 1 2 3 3 3 5 1 3 3 6 1 5 0 11 6 8 4 8 1 3 3 3 4 6 1 1 3 2 1 1 1 8 0 7 1 3 1 4 1 1 8 2 2 1 3 3 1 1 3 1 9 0 8 4 3 4 1 8 8 6 6 1 1 1 3 3 3 1 1 2 5 5 5 4 5 2 3 5 1 6 0 7 7 5 7 4 8 7 1 1 1 1 3 2 3 1 8 0 6 8 9 1 4 5 5 3 3 2 1 3 2 3 2 1 9 0 10 2 6 9 4 9 4 5 1 6 8 3 1 2 1 3 1 1 1 3 4 2 5 4 1 5 4 4 2 4 5 3 4 1 7 0 8 3 1 4 5 8 1 3 1 1 2 2 1 3 1 3 1 8 0 11 3 1 5 4 6 7 5 6 3 1 9 1 1 3 3 2 1 3 2 1 8 0 11 4 3 2 7 8 1 8 9 4 4 4 3 3 2 3 2 1 2 1 2 2 5 3 3 7 1 5 0 7 2 1 8 2 6 3 4 2 1 1 1 3 1 9 0 9 6 3 1 9 8 1 1 9 1 1 2 3 3 3 1 2 2 1 1 8 0 7 9 1 1 9 1 2 8 3 1 1 1 1 3 3 3 1 4 2 1 2 2 2 3 6 1 5 0 8 1 6 9 3 4 9 9 3 2 2 1 3 3 1 5 0 11 9 2 6 5 6 6 7 8 4 4 1 2 3 1 1 2 1 6 0 6 9 9 3 1 7 2 1 3 1 3 3 3 5 1 1 2 1 3 3 6 1 5 0 8 2 4 1 9 3 6 3 4 1 2 1 2 1 1 9 0 9 4 4 8 2 6 6 2 6 1 3 2 1 1 1 3 1 2 3 1 6 0 6 8 1 8 8 3 7 1 2 2 1 3 1 1 4 2 1 2 3 2 5 5 1 2 5 5 3 5 1 7 0 10 5 6 8 8 3 1 8 5 4 2 1 1 1 1 1 3 2 1 8 0 10 4 3 5 2 5 1 1 1 9 7 2 2 3 1 2 1 2 3 1 5 0 10 7 1 6 2 7 5 9 9 1 9 1 2 1 3 2 3 4 5 4 1 3 4 1 7 0 11 9 8 4 4 4 2 5 5 1 9 3 1 3 2 2 2 2 2 1 7 0 11 1 1 9 5 6 8 5 1 4 9 3 1 1 1 2 3 1 3 1 7 0 8 6 1 1 5 5 5 3 7 1 2 2 3 3 2 3 5 1 2 1 3 4 1 8 0 8 8 6 1 8 3 9 1 2 1 1 1 1 2 1 2 2 1 5 0 7 6 8 3 5 3 1 4 2 1 2 1 3 1 8 0 9 2 5 8 9 5 8 1 1 4 1 2 1 3 2 2 3 1 5 5 3 1 3 5 1 5 0 10 4 1 6 9 1 5 9 6 6 8 1 3 1 1 3 1 7 0 7 7 1 6 1 8 5 4 1 1 2 1 1 2 3 1 7 0 8 6 1 2 4 7 1 4 1 2 1 2 1 3 3 2 1 5 2 1 4 3 6 1 7 0 8 8 6 5 6 1 1 2 9 1 3 3 3 3 1 1 1 7 0 10 1 1 3 2 3 8 2 4 6 6 3 1 3 3 2 2 1 1 9 0 6 3 5 5 5 4 1 2 3 2 1 3 2 1 1 1 2 2 4 4 3 2 1 2 2 3 7 5 4 3 6 1 7 0 8 3 3 5 9 5 2 4 1 1 1 2 1 1 3 2 1 6 0 8 7 4 2 5 5 7 1 3 2 1 1 2 1 3 1 7 0 8 2 3 1 4 6 3 7 3 2 1 1 1 3 3 1 5 3 2 5 5 3 3 7 1 6 0 9 1 1 3 3 3 4 5 1 1 2 3 3 1 1 1 1 8 0 8 1 4 7 5 5 8 3 1 1 2 3 2 1 2 1 2 1 6 0 7 2 4 3 1 7 8 3 3 1 1 3 1 1 1 4 2 2 3 3 1 3 5 1 8 0 6 5 8 1 2 5 7 1 2 1 2 3 1 3 1 1 5 0 8 2 4 1 2 2 1 3 9 2 1 2 2 2 1 7 0 11 8 1 3 2 1 6 5 1 7 5 8 2 3 2 2 3 1 1 5 3 4 3 5 3 6 1 5 0 10 4 8 2 1 1 8 4 4 2 9 1 1 1 3 2 1 7 0 10 4 1 6 8 5 4 9 4 3 6 1 2 1 1 1 2 1 1 8 0 7 9 1 3 1 9 5 3 1 3 2 2 2 2 1 1 4 3 2 2 1 1 3 4 1 9 0 7 7 1 3 5 6 9 9 2 2 1 2 3 3 1 1 3 1 6 0 6 4 7 1 9 5 3 3 1 2 1 1 3 1 6 0 7 8 1 9 1 2 2 4 2 1 1 1 1 3 2 4 2 1 5 1 2 3 4 5 3 7 1 8 0 9 3 1 3 7 1 6 6 8 8 2 1 3 2 2 1 1 2 1 9 0 6 5 5 6 7 1 9 2 1 3 1 1 3 1 3 2 1 6 0 7 3 6 9 1 2 8 7 3 2 1 2 3 1 3 5 1 5 2 3 2 3 4 1 5 0 9 1 8 5 7 5 6 4 4 5 1 1 1 2 1 1 5 0 6 1 7 3 7 1 9 2 2 2 1 3 1 5 0 8 6 4 3 9 1 5 5 8 1 1 1 1 2 2 2 1 2 3 4 1 7 0 6 5 8 1 5 4 6 1 1 3 2 1 1 2 1 7 0 7 3 3 1 5 1 3 8 3 2 3 2 2 1 1 1 8 0 10 1 4 8 3 6 7 8 4 2 7 1 1 3 1 3 1 3 2 3 4 1 5 3 7 1 9 0 7 8 4 1 1 6 4 1 2 2 2 3 1 3 2 2 3 1 9 0 11 6 2 6 1 1 1 7 4 5 2 8 3 1 1 3 3 1 1 3 3 1 5 0 11 5 1 3 4 6 1 1 5 8 7 1 2 3 2 3 1 1 3 4 5 1 4 5 3 1 2 1 2 5 4 3 4 1 7 0 6 4 9 7 6 1 2 3 1 1 2 1 1 1 1 6 0 11 8 3 8 7 2 5 8 5 3 7 1 1 3 2 2 2 1 1 9 0 9 8 4 6 5 3 1 1 7 3 3 2 2 1 3 2 1 2 1 2 5 2 2 3 4 1 6 0 9 5 5 2 9 1 1 9 4 4 1 1 3 3 2 2 1 5 0 7 7 5 1 6 8 3 3 1 3 1 1 3 1 8 0 10 2 4 2 4 1 5 5 1 6 3 3 1 1 3 1 2 2 3 5 1 2 3 3 4 1 9 0 9 4 4 3 6 1 3 5 4 9 1 2 2 1 1 3 3 1 2 1 7 0 8 9 8 7 3 8 1 4 5 3 1 2 1 3 1 3 1 7 0 11 3 5 1 3 1 5 6 5 9 1 5 1 2 1 2 3 3 1 2 3 3 5 3 5 1 5 0 9 1 5 7 1 4 2 3 1 3 1 3 1 3 1 1 6 0 7 4 7 6 2 1 9 7 3 1 2 1 1 2 1 7 0 11 2 4 2 8 8 5 8 8 1 1 2 1 1 1 1 2 2 2 2 2 5 3 2 3 5 1 9 0 9 5 9 5 1 8 5 8 1 1 1 2 3 3 1 3 1 3 1 1 7 0 9 6 4 4 6 3 8 2 1 3 1 2 2 1 1 3 1 1 9 0 9 9 2 1 5 4 9 9 6 5 2 2 2 1 2 1 3 1 1 3 5 2 4 1 5 5 7 5 5 4 3 7 1 8 0 7 6 8 7 4 8 1 5 1 1 2 3 1 3 3 1 1 6 0 11 3 3 4 9 4 1 5 6 5 7 1 1 3 3 3 1 1 1 6 0 7 3 1 3 4 9 6 2 2 2 3 1 1 3 5 2 4 4 5 3 2 3 5 1 7 0 10 8 1 8 2 1 5 7 8 9 6 3 1 1 1 1 2 3 1 6 0 11 8 1 1 2 4 9 6 9 6 7 1 1 1 1 3 2 2 1 5 0 8 8 9 9 1 1 8 1 2 1 3 1 1 1 4 4 3 4 2 3 6 1 6 0 10 5 2 4 1 3 8 6 5 1 2 1 3 2 1 1 3 1 7 0 6 6 9 5 1 5 8 3 1 3 1 3 1 2 1 7 0 9 1 7 7 6 2 1 4 9 1 1 1 2 3 1 2 3 3 2 1 4 2 5 3 7 1 9 0 10 1 1 9 1 1 7 8 9 6 7 2 1 1 2 2 3 3 3 1 1 8 0 11 1 2 4 6 2 6 1 2 2 9 2 2 3 1 3 3 2 1 3 1 5 0 10 7 5 4 3 1 7 4 3 1 5 3 2 1 3 1 1 5 2 1 2 1 4 3 4 1 9 0 11 3 3 6 9 8 4 9 5 1 7 3 3 1 3 3 1 3 2 1 3 1 8 0 6 7 7 1 1 1 6 1 3 2 2 1 2 1 3 1 7 0 10 8 3 7 8 7 1 5 2 1 1 1 1 3 3 3 1 3 5 4 3 3 1 4 4 1 2 4 7 2 4 3 3 4 1 9 0 10 5 2 4 3 1 2 3 9 3 6 2 3 1 3 3 1 1 3 1 1 7 0 7 1 8 9 7 9 4 1 1 3 1 1 3 2 2 1 9 0 8 9 3 3 8 1 2 6 8 2 1 1 2 3 2 3 1 2 2 3 5 3 3 5 1 9 0 8 7 5 3 7 5 1 5 7 1 3 1 2 2 3 3 3 2 1 6 0 9 9 1 1 2 5 7 8 8 6 3 1 1 3 3 3 1 5 0 9 3 3 2 7 1 3 7 7 6 1 3 1 2 3 1 3 3 2 3 3 4 1 9 0 9 2 8 2 8 8 7 1 2 1 2 1 1 1 2 3 3 3 1 1 8 0 8 7 5 6 5 5 1 2 6 2 1 2 1 1 3 1 3 1 5 0 7 5 9 4 1 5 5 2 1 1 1 2 2 5 1 1 1 3 5 1 5 0 6 1 3 5 2 5 1 3 1 1 1 1 1 9 0 6 9 2 6 1 2 2 2 2 1 1 2 3 1 2 3 1 6 0 8 6 3 4 7 8 5 1 1 3 2 3 1 2 1 5 3 4 2 4 4 3 3 5 5 3 6 1 9 0 11 3 1 8 7 7 7 1 9 3 4 3 2 1 2 1 3 3 3 2 2 1 5 0 7 6 6 1 8 6 6 1 1 1 1 1 2 1 6 0 9 6 3 7 1 9 1 5 6 7 2 1 1 2 1 1 2 4 2 4 2 5 3 6 1 9 0 7 9 1 2 2 5 7 2 1 1 1 3 2 3 2 2 3 1 5 0 6 6 8 2 1 6 6 1 1 1 2 1 1 9 0 9 1 8 9 8 8 9 6 4 2 2 2 2 1 2 1 3 3 1 4 1 3 1 2 2 3 4 1 9 0 6 7 3 6 1 7 3 1 1 1 3 1 3 1 1 1 1 9 0 7 4 1 8 5 9 2 3 3 1 2 1 1 1 1 3 1 1 6 0 10 7 4 4 4 4 5 8 1 2 1 1 1 2 1 1 1 2 1 3 2 3 6 1 6 0 8 3 1 9 7 6 9 5 1 1 2 3 3 1 2 1 8 0 6 5 1 7 7 2 1 1 3 1 3 3 2 3 1 1 5 0 11 9 2 5 7 1 6 5 1 5 6 3 1 1 2 2 1 1 1 1 3 2 1 3 5 1 5 0 8 1 4 1 2 4 5 6 8 1 2 1 3 1 1 8 0 7 6 5 5 1 7 3 9 1 1 1 2 3 2 3 3 1 9 0 9 2 2 6 2 4 1 3 3 2 3 2 3 3 1 3 3 2 1 1 3 4 3 2 3 3 3 5 3 5 3 3 5 1 6 0 11 7 3 1 1 8 8 4 4 8 6 7 2 1 1 2 3 3 1 9 0 8 1 3 6 1 2 7 2 2 3 3 2 2 1 2 3 1 3 1 9 0 7 1 5 6 9 4 1 3 2 1 1 3 1 2 3 1 3 5 3 2 3 4 3 6 1 9 0 10 8 9 2 1 3 6 1 4 7 1 2 2 3 2 1 1 1 1 3 1 9 0 8 9 3 4 1 7 8 3 7 3 2 1 2 2 2 1 3 1 1 7 0 8 7 9 1 1 5 2 3 9 1 1 3 2 2 2 1 5 1 1 4 3 4 3 4 1 8 0 8 4 1 5 8 3 8 1 6 1 1 3 3 1 3 3 2 1 5 0 9 3 3 1 4 7 4 7 1 2 1 1 1 1 1 1 5 0 10 1 3 5 1 6 3 9 8 6 7 3 1 1 2 2 4 1 4 3 3 6 1 6 0 10 1 3 5 5 9 9 9 9 5 8 1 1 2 2 2 1 1 7 0 6 5 2 3 6 1 6 3 1 3 2 3 1 1 1 7 0 6 6 5 1 7 9 7 2 3 1 1 1 1 1 2 2 3 2 2 3 3 4 1 9 0 6 1 4 7 4 1 6 2 2 2 3 3 1 3 2 1 1 7 0 7 3 3 1 7 7 5 9 3 2 1 3 1 2 1 1 5 0 10 1 2 4 8 2 4 4 3 1 5 3 1 3 2 1 3 1 2 3 3 3 1 5 3 3 6 1 7 0 11 3 9 3 8 1 9 2 6 7 4 4 1 1 3 3 1 2 3 1 8 0 11 1 9 1 1 7 3 1 9 1 2 2 1 3 3 2 1 1 1 2 1 6 0 6 8 2 1 9 9 1 1 1 2 1 2 3 2 2 5 2 4 5 3 5 1 7 0 6 9 9 9 7 1 5 2 3 1 2 2 3 1 1 7 0 11 9 6 1 6 5 1 7 6 3 8 3 2 3 1 1 1 2 1 1 8 0 11 4 5 6 3 6 9 2 1 4 1 1 1 2 2 1 1 1 3 2 2 5 2 3 5 3 4 1 8 0 6 7 7 9 1 4 1 1 3 3 1 3 1 1 2 1 6 0 10 2 3 8 4 7 9 6 6 1 6 3 3 3 1 3 1 1 5 0 7 1 5 4 5 9 2 1 3 2 3 1 3 5 2 2 3 3 6 1 8 0 7 9 1 2 8 1 4 9 1 2 1 1 3 2 1 3 1 8 0 8 7 1 9 1 4 4 6 3 1 2 1 2 2 3 1 1 1 9 0 11 8 3 6 1 3 2 1 8 6 3 8 1 3 2 1 2 1 3 1 1 4 2 5 1 4 1 3 7 1 7 0 7 3 1 5 7 7 2 3 3 2 2 3 2 1 3 1 8 0 9 1 3 2 6 1 8 9 5 8 2 1 2 1 1 2 1 2 1 8 0 7 6 5 6 7 8 1 3 2 3 3 1 1 1 1 2 1 1 5 5 3 5 4 4 6 5 5 3 3 7 1 5 0 8 8 5 5 1 2 4 3 9 1 3 3 1 2 1 8 0 8 1 9 2 6 5 5 8 4 2 3 1 1 3 3 1 2 1 9 0 7 2 8 1 4 8 4 9 3 1 1 1 2 1 1 1 2 1 4 2 1 5 2 4 3 5 1 8 0 7 7 9 2 7 1 5 1 2 1 2 1 1 3 1 3 1 7 0 7 2 1 2 2 1 4 1 1 1 3 3 3 1 3 1 6 0 7 7 6 7 8 5 6 1 3 3 1 1 3 3 2 4 1 4 4 3 7 1 7 0 7 3 1 4 2 4 1 5 2 2 2 1 1 2 2 1 5 0 8 5 7 1 3 9 9 3 8 1 2 2 1 2 1 5 0 9 6 1 8 6 9 7 2 3 2 1 3 3 3 3 5 2 4 1 1 3 4 3 4 1 8 0 10 9 8 4 1 4 4 8 4 2 5 1 1 1 2 1 3 3 3 1 7 0 6 6 1 6 5 5 9 2 3 2 1 2 3 1 1 8 0 9 7 7 7 1 1 2 6 5 2 2 2 1 3 2 1 1 1 3 3 2 2 3 6 1 9 0 7 4 7 1 4 7 4 4 1 2 2 1 3 2 1 1 3 1 8 0 10 6 8 7 2 2 2 7 5 1 7 3 3 3 2 2 3 2 1 1 6 0 10 1 6 7 7 2 1 4 4 9 8 1 1 2 2 1 2 3 4 1 5 2 5 5 1 4 4 3 3 5 1 6 0 8 5 1 4 3 1 1 3 4 1 1 1 1 3 3 1 9 0 8 2 2 2 9 4 1 7 5 3 3 1 2 2 1 2 3 3 1 7 0 6 3 9 3 7 1 2 2 1 3 1 3 1 2 2 2 1 2 2 3 5 1 6 0 9 8 6 7 9 7 1 1 8 2 1 1 2 3 3 2 1 9 0 10 1 1 3 9 1 7 4 5 4 1 3 3 1 1 1 1 1 2 3 1 9 0 10 3 5 6 6 1 3 4 5 8 4 1 3 3 2 2 1 2 1 1 1 1 2 4 3 3 4 1 5 0 10 6 4 1 9 3 5 1 1 1 2 1 3 1 1 2 1 9 0 10 1 3 2 9 2 6 3 5 5 1 2 1 1 1 1 3 1 3 1 1 7 0 9 7 5 1 6 8 4 6 4 7 3 1 2 2 1 2 1 5 1 2 5 3 6 1 6 0 7 4 6 1 5 7 1 8 3 3 1 3 3 1 1 9 0 8 8 1 7 9 2 2 1 2 1 3 2 3 3 1 1 2 3 1 7 0 8 2 1 1 1 9 8 3 3 2 2 1 1 2 1 1 4 3 5 5 4 3 3 3 5 4 4 3 5 1 9 0 8 1 5 6 9 8 4 9 6 1 1 1 1 2 3 1 3 2 1 8 0 6 4 4 2 1 3 4 3 3 3 1 1 2 1 1 1 9 0 10 8 1 2 3 4 7 7 6 7 1 3 1 3 2 2 2 2 1 2 2 3 1 1 3 3 6 1 5 0 7 1 5 8 1 2 5 4 1 2 2 1 2 1 6 0 9 5 4 2 9 6 3 9 1 9 3 3 1 2 1 3 1 6 0 8 1 2 1 1 8 3 8 4 3 1 3 1 2 3 5 4 3 1 1 1 3 4 1 7 0 8 6 2 1 1 8 1 2 5 2 1 2 1 3 1 2 1 8 0 6 9 8 1 4 3 1 3 3 3 2 1 2 2 1 1 7 0 10 6 6 9 1 1 7 7 8 5 1 2 3 2 2 3 1 2 3 5 3 1 3 7 1 9 0 9 4 8 6 5 1 9 2 3 9 1 1 2 3 2 3 1 3 2 1 9 0 8 1 7 3 7 6 5 3 9 3 1 3 1 3 1 1 1 1 1 8 0 8 2 1 8 1 4 6 8 2 2 3 1 1 2 2 1 1 5 4 3 5 5 1 3 2 4 4 3 5 6 7 2 5 5 3 4 1 6 0 10 1 8 6 5 1 9 4 2 1 3 3 2 3 1 2 3 1 6 0 10 3 5 1 8 2 1 8 6 5 5 1 2 1 1 3 3 1 9 0 10 6 2 9 9 1 7 3 1 5 7 3 2 1 1 2 1 2 2 1 3 1 3 1 3 6 1 7 0 8 2 1 1 9 8 7 8 8 1 1 3 1 3 1 3 1 9 0 9 1 5 4 8 9 3 7 1 1 1 2 1 1 1 1 1 2 3 1 5 0 9 4 6 4 7 4 9 1 9 7 1 2 3 2 3 4 5 3 3 5 3 3 6 1 6 0 11 2 8 6 8 9 9 4 5 3 5 1 1 3 1 1 1 1 1 7 0 8 1 1 9 9 6 1 9 4 1 3 2 1 3 1 1 1 5 0 8 1 5 1 7 8 6 7 6 3 3 3 1 1 2 4 2 3 2 3 3 7 1 5 0 6 7 2 7 4 1 6 1 2 1 3 2 1 6 0 8 5 2 6 4 8 9 1 1 3 3 1 2 1 1 1 5 0 10 7 1 8 9 7 1 1 9 1 6 1 2 2 2 2 3 5 2 5 5 2 2 3 5 1 9 0 9 3 1 9 1 2 4 9 5 7 1 2 1 3 1 2 2 3 1 1 9 0 10 1 7 4 7 1 8 2 8 5 4 2 1 3 1 3 1 1 3 2 1 5 0 6 3 3 6 1 3 5 3 2 2 1 1 5 2 1 4 1 2 3 2 7 3 5 4 3 7 1 6 0 9 2 7 1 4 1 7 7 8 1 3 1 3 2 1 3 1 5 0 7 4 6 2 9 8 3 1 3 1 3 1 3 1 7 0 11 6 3 1 8 2 9 6 8 7 5 7 2 3 1 1 2 1 1 5 5 5 4 5 2 5 3 4 1 9 0 9 2 5 1 8 1 3 6 9 9 3 3 2 3 2 1 3 1 2 1 6 0 10 4 9 9 1 2 9 8 3 2 3 1 2 1 2 3 1 1 8 0 9 8 4 2 5 7 2 8 9 1 1 1 3 1 2 3 3 3 2 4 1 4 3 6 1 8 0 6 8 7 3 2 8 1 1 2 1 3 2 2 1 3 1 7 0 7 2 7 8 9 1 1 9 3 3 1 2 3 1 1 1 5 0 7 1 1 1 3 5 4 4 1 1 1 2 3 1 5 1 5 2 4 3 7 1 7 0 10 8 1 4 8 1 8 3 2 7 4 2 3 1 1 3 2 1 1 7 0 8 1 5 8 6 4 7 9 6 1 3 2 1 1 2 3 1 7 0 10 2 8 2 6 8 2 6 6 2 1 2 3 3 1 3 3 3 1 1 5 2 1 4 3 3 6 1 9 0 7 2 3 8 9 4 1 1 3 3 1 3 2 1 2 1 2 1 6 0 8 2 8 6 5 3 2 1 1 3 1 1 3 2 2 1 7 0 8 8 6 6 2 1 7 3 3 1 2 3 2 1 1 2 3 2 3 5 4 4 5 6 3 3 5 3 3 6 1 9 0 10 1 7 9 9 6 4 8 6 9 2 1 1 2 3 1 1 1 2 2 1 9 0 10 8 4 1 1 1 2 4 1 6 5 1 1 1 2 3 1 2 1 3 1 6 0 7 5 4 9 4 8 3 1 3 3 1 1 2 1 5 1 1 2 3 4 3 7 1 6 0 10 9 3 3 1 6 2 1 1 7 5 1 1 1 2 1 1 1 5 0 9 1 4 5 1 2 6 5 7 1 1 2 3 1 3 1 9 0 10 7 9 6 4 5 5 9 7 3 1 2 1 1 3 1 2 3 2 2 4 5 3 3 2 3 2 3 5 1 6 0 9 6 3 3 3 2 7 5 3 1 2 1 2 1 3 2 1 6 0 10 5 7 9 1 8 2 5 4 4 5 1 3 2 1 3 3 1 9 0 8 3 9 5 1 3 4 2 8 1 1 1 1 1 1 1 2 3 4 4 1 3 4 3 6 1 6 0 10 8 3 2 1 4 2 1 8 3 7 2 1 1 3 1 2 1 6 0 6 1 1 1 2 8 7 1 1 1 1 3 3 1 8 0 6 5 5 7 1 8 1 3 3 3 1 1 1 3 1 3 1 3 2 1 4 3 6 1 6 0 11 7 6 4 7 6 8 9 1 6 6 1 1 2 1 3 1 2 1 6 0 9 4 4 1 1 2 8 2 9 1 1 2 1 2 1 1 1 9 0 9 4 3 8 1 7 8 9 5 1 1 3 3 2 1 1 1 1 1 3 3 3 3 1 3 2 3 6 4 5 3 5 1 5 0 8 3 3 1 3 7 2 7 8 3 1 3 3 3 1 6 0 7 1 2 4 5 4 7 9 1 1 3 1 2 3 1 5 0 7 8 6 7 7 5 3 1 3 1 1 2 1 2 5 2 2 5 3 5 1 6 0 8 1 1 8 7 3 6 4 5 2 2 2 1 1 2 1 6 0 11 4 3 8 4 6 8 2 6 1 8 1 2 1 2 1 1 1 1 8 0 6 8 8 5 1 4 2 2 2 1 2 3 2 2 2 1 3 2 2 4 3 5 1 6 0 9 6 2 1 3 1 1 1 7 6 1 1 1 3 3 3 1 8 0 11 4 7 2 3 5 2 7 2 5 6 1 2 1 1 2 2 1 3 2 1 8 0 11 2 5 4 2 2 6 2 1 4 4 9 2 3 3 1 1 2 1 3 5 5 1 4 1 3 5 1 8 0 8 9 1 6 5 5 5 4 3 1 1 2 3 2 1 2 3 1 8 0 9 4 9 4 2 3 3 1 1 2 2 3 3 1 1 2 3 1 1 7 0 10 4 8 8 6 4 9 3 8 1 5 2 3 1 2 3 1 1 1 5 5 4 1 2 4 2 4 2 5 4 3 5 1 7 0 6 4 8 7 1 7 7 3 1 1 1 1 3 1 1 8 0 6 5 5 5 1 8 5 1 1 1 2 2 2 3 3 1 8 0 7 1 1 9 1 9 5 8 3 3 2 3 1 1 1 1 4 2 4 4 4 3 6 1 8 0 11 1 5 8 4 8 4 7 5 9 5 8 2 1 3 2 2 3 2 1 1 7 0 7 8 1 7 4 6 1 2 2 3 3 2 2 1 1 1 6 0 6 3 1 1 6 9 2 1 1 3 1 3 2 2 1 5 3 5 4 3 4 1 5 0 10 8 1 8 2 1 7 4 3 9 8 2 2 1 3 3 1 9 0 11 1 1 3 7 2 5 3 9 6 2 6 3 3 3 1 2 2 2 1 1 1 8 0 9 1 1 1 3 8 4 6 6 8 2 2 2 1 1 3 1 1 1 4 5 3 3 7 1 9 0 7 6 3 1 8 1 6 8 1 1 3 3 1 1 1 3 2 1 8 0 8 7 9 1 3 8 2 1 7 2 2 2 2 1 1 3 1 1 7 0 11 1 9 9 6 5 4 9 3 8 7 9 1 2 1 1 1 1 1 5 1 3 3 3 5 1 3 4 1 6 0 6 4 9 7 6 1 7 1 1 1 2 2 1 1 5 0 6 2 5 6 1 1 7 2 1 1 2 2 1 6 0 10 9 5 8 4 8 1 8 5 2 8 3 1 2 3 3 3 5 4 3 2 2 1 2 4 5 4 3 4 1 8 0 9 9 3 8 5 9 6 2 1 3 1 2 1 2 1 1 1 1 1 5 0 7 1 8 1 7 7 7 6 1 2 1 1 1 1 6 0 10 4 4 9 6 7 7 1 1 7 7 1 1 3 3 3 2 1 2 5 1 3 6 1 8 0 9 3 4 8 1 6 5 8 1 4 1 1 1 2 1 3 1 2 1 6 0 6 5 1 9 4 2 4 1 2 2 1 1 3 1 5 0 11 5 9 6 9 5 5 2 2 6 5 1 1 2 2 1 1 2 5 2 3 3 1 3 5 1 5 0 6 6 2 4 1 1 2 2 1 3 3 3 1 8 0 9 5 8 7 7 7 6 8 9 1 1 3 1 3 3 2 1 3 1 6 0 9 5 9 1 3 1 4 5 4 3 1 2 2 1 1 2 5 5 5 3 1 3 6 1 8 0 7 4 2 5 2 1 5 3 1 2 2 1 1 1 1 1 1 8 0 10 3 6 9 4 2 3 1 6 8 7 3 1 2 1 3 2 1 1 1 8 0 11 4 7 3 1 5 7 3 1 9 9 5 1 2 3 3 1 2 2 1 2 4 1 2 5 1 3 6 1 8 0 10 1 6 7 9 3 6 2 8 1 1 3 1 3 2 1 1 1 2 1 8 0 8 2 8 4 5 1 3 9 8 3 1 2 3 3 1 1 1 1 5 0 7 6 1 1 1 8 2 3 1 2 2 1 2 4 3 3 1 1 4 3 5 1 1 5 4 3 7 1 6 0 8 3 7 6 3 1 8 8 4 3 1 1 1 3 3 1 5 0 9 3 1 1 6 4 1 6 8 4 2 1 2 1 2 1 7 0 6 6 9 3 7 1 6 1 3 3 1 2 1 1 3 1 1 1 3 1 5 3 7 1 7 0 6 9 2 7 4 1 6 2 3 2 3 1 1 3 1 8 0 8 1 9 1 8 4 9 4 7 2 1 1 2 3 1 1 2 1 5 0 11 2 7 4 1 6 7 6 4 4 8 4 1 1 2 2 1 1 3 2 3 2 5 5 3 4 1 8 0 9 2 6 5 1 8 4 1 4 2 3 3 1 3 2 1 1 1 1 8 0 11 9 7 1 6 1 1 7 6 3 1 3 1 2 3 1 1 3 2 1 1 7 0 8 9 8 9 1 7 4 4 6 2 2 1 3 1 1 2 3 4 3 4 3 7 1 9 0 10 9 8 1 4 5 5 4 7 1 1 1 2 1 1 2 1 1 1 1 1 7 0 9 3 7 1 9 9 9 4 7 5 1 3 1 1 3 1 1 1 6 0 8 6 9 9 4 1 8 1 3 3 3 1 3 1 3 5 4 5 1 4 4 5 3 7 1 8 0 6 3 3 8 1 1 5 1 1 1 1 1 1 2 3 1 9 0 7 2 8 1 1 9 2 6 3 1 3 2 1 3 3 2 2 1 5 0 6 4 1 3 4 3 1 1 1 2 1 2 1 3 2 5 5 3 2 4 4 1 1 2 2 6 2 5 5 3 4 1 6 0 7 5 9 3 1 9 7 4 2 1 2 2 2 1 1 9 0 8 5 1 3 2 3 1 2 6 3 1 1 1 1 1 1 2 1 1 5 0 10 1 2 7 6 3 8 9 3 5 1 2 1 2 1 3 2 3 2 3 3 4 1 5 0 9 1 9 1 7 1 5 2 4 4 3 1 3 2 2 1 9 0 7 8 2 1 8 1 4 5 2 3 2 1 1 3 3 2 1 1 6 0 9 2 2 8 8 3 8 8 1 7 3 2 1 2 2 3 1 3 2 2 3 7 1 9 0 11 5 3 3 5 8 3 3 8 7 1 4 3 1 2 3 1 1 1 1 2 1 9 0 6 3 1 2 1 6 4 2 3 3 1 2 2 1 1 2 1 5 0 9 2 5 1 9 3 5 1 5 8 1 2 3 2 3 3 2 1 1 3 1 4 3 7 1 5 0 7 2 2 4 9 1 9 8 1 3 1 3 1 1 6 0 11 1 3 9 2 5 3 5 4 6 1 5 3 2 1 2 3 1 1 7 0 6 2 1 1 5 8 4 2 1 2 1 1 2 2 2 1 5 3 3 1 3 3 4 1 5 0 7 8 4 1 4 8 9 7 1 1 3 3 3 1 8 0 9 8 3 7 2 7 5 1 4 3 2 1 3 1 3 1 1 3 1 9 0 10 1 7 2 3 7 1 7 5 9 8 3 3 1 3 2 1 2 1 1 5 2 1 3 7 3 6 7 3 5 5 3 6 1 7 0 8 5 9 1 9 2 6 6 3 3 2 1 1 1 2 2 1 7 0 7 7 1 2 9 7 1 7 1 2 3 1 1 1 1 1 6 0 7 1 1 9 2 3 4 2 3 2 1 2 1 3 5 4 1 2 3 5 3 4 1 9 0 11 3 1 4 6 1 4 5 6 2 7 8 1 3 1 2 3 1 3 3 3 1 7 0 9 7 2 3 2 1 7 4 1 2 3 2 1 3 1 2 3 1 6 0 8 8 7 4 5 3 1 7 3 1 2 2 1 3 1 3 1 1 3 3 5 1 6 0 8 9 3 6 2 5 1 1 3 1 2 1 3 2 1 1 8 0 10 1 3 4 1 4 4 8 4 7 6 2 3 1 2 2 2 2 1 1 9 0 6 1 7 1 4 7 7 1 2 1 2 3 3 3 3 1 4 1 1 2 5 3 7 1 5 0 10 2 5 9 7 8 7 1 9 1 6 1 2 1 2 1 1 5 0 10 1 6 1 3 6 7 6 7 4 7 2 3 2 1 3 1 6 0 7 9 3 1 6 4 1 4 2 2 1 2 2 1 3 4 5 5 5 5 1 3 6 1 7 0 8 7 8 3 1 8 7 4 1 2 3 1 2 1 3 3 1 9 0 10 2 4 6 3 5 2 9 7 1 2 3 1 2 2 2 3 2 1 1 1 7 0 6 7 1 5 7 7 4 1 2 2 3 3 2 3 3 5 4 5 2 3 2 1 1 4 2 5 4 3 4 1 9 0 9 6 4 2 5 3 1 4 8 4 3 1 2 2 1 3 1 1 3 1 7 0 10 4 1 8 6 6 5 9 3 7 2 3 1 1 1 3 1 1 1 7 0 10 1 8 9 1 1 8 7 7 6 9 3 1 3 2 3 2 3 1 5 4 5 3 6 1 8 0 7 1 7 5 5 4 4 1 1 3 1 2 1 1 2 2 1 6 0 7 1 3 9 6 2 7 2 2 3 3 1 2 1 1 6 0 11 3 7 7 6 1 3 2 3 3 3 1 1 3 2 2 3 1 4 1 1 1 2 2 3 5 1 5 0 10 8 4 5 3 2 1 5 9 7 6 3 1 3 3 1 1 5 0 10 2 4 8 4 8 8 7 4 1 1 3 1 3 2 1 1 6 0 10 6 7 5 8 3 7 1 6 1 9 2 1 3 3 3 2 2 5 1 1 3 3 4 1 8 0 11 3 5 9 4 3 2 1 6 6 2 4 3 1 3 1 3 1 1 1 1 6 0 11 7 6 3 3 8 1 4 9 9 9 7 1 2 1 2 1 1 1 6 0 6 5 5 1 2 2 2 1 2 3 1 1 1 2 5 2 2 3 6 1 6 0 10 7 9 1 5 3 1 8 8 6 3 2 3 1 1 1 1 1 8 0 7 8 1 8 8 9 8 3 2 2 3 2 2 3 1 1 1 5 0 7 1 2 6 2 6 5 7 1 2 1 2 1 1 1 4 1 4 2 3 1 7 2 5 4 3 4 1 6 0 11 7 3 3 1 3 5 8 8 7 4 4 2 1 1 3 1 3 1 9 0 11 2 2 1 9 8 7 4 7 9 2 2 3 1 2 1 3 1 3 3 1 1 5 0 11 3 6 6 8 2 9 1 4 7 9 7 1 2 1 3 3 2 5 1 3 3 5 1 9 0 11 3 2 8 1 6 4 2 9 7 1 6 1 2 1 3 1 1 1 2 2 1 6 0 7 1 9 8 2 1 3 1 3 3 1 3 1 3 1 9 0 8 5 2 8 7 6 9 1 3 3 2 3 1 2 2 2 2 3 2 5 4 3 3 3 5 1 7 0 7 8 6 2 4 1 5 3 1 1 1 2 2 2 1 1 7 0 6 6 9 2 7 2 1 3 1 3 1 1 1 3 1 9 0 10 1 7 3 4 2 5 7 2 9 7 2 3 1 3 2 3 1 2 2 5 4 3 3 4 3 5 1 9 0 6 9 1 9 3 9 2 3 2 3 2 2 1 3 3 2 1 7 0 7 1 4 1 7 5 4 9 2 1 3 3 2 3 3 1 6 0 10 4 1 9 3 2 6 7 7 4 6 2 1 1 1 1 2 1 1 2 3 4 3 6 1 7 0 7 5 5 7 1 2 6 4 1 2 2 1 2 3 1 1 7 0 8 1 3 6 2 3 3 1 3 2 1 2 3 1 2 1 1 5 0 9 1 5 8 6 5 1 5 4 9 3 1 1 2 1 1 5 4 2 3 4 4 5 5 6 5 4 3 7 1 7 0 7 6 4 4 1 1 7 8 2 3 1 1 3 1 3 1 8 0 8 1 2 3 8 9 1 7 1 1 1 1 1 3 2 1 2 1 9 0 8 7 2 6 4 4 3 4 1 2 3 1 2 3 2 3 2 3 3 1 3 5 2 3 5 3 4 1 7 0 11 7 1 2 5 4 1 5 8 2 6 3 2 1 2 1 1 2 1 1 7 0 9 2 7 9 8 8 3 1 9 3 3 2 2 3 1 1 2 1 8 0 6 1 1 1 2 3 3 2 2 3 3 1 1 1 2 1 5 2 5 3 7 1 9 0 10 1 4 4 7 4 8 6 7 8 4 1 1 3 1 2 3 1 2 3 1 9 0 7 3 2 6 2 8 1 1 3 1 1 1 1 2 3 3 3 1 7 0 6 3 4 1 1 9 8 1 2 2 2 2 2 3 3 4 1 1 4 2 2 3 6 1 7 0 6 1 1 1 9 2 6 2 1 1 1 1 1 3 1 7 0 10 3 1 2 5 3 9 7 2 1 4 1 1 3 2 1 2 3 1 7 0 9 8 5 1 1 9 1 2 1 9 1 1 3 2 2 3 2 2 2 3 3 3 3 3 5 1 9 0 10 2 1 4 4 3 5 6 1 1 8 1 2 2 3 3 1 2 2 3 1 9 0 11 4 9 5 4 9 5 1 8 4 1 3 1 1 1 3 1 2 3 1 3 1 7 0 8 1 2 3 7 6 9 5 2 3 1 2 1 2 1 2 2 1 4 2 4 7 1 1 7 4 5 3 7 1 8 0 9 1 5 7 1 4 1 7 7 8 2 2 3 2 1 1 1 1 1 5 0 9 4 5 5 1 2 5 5 9 1 1 2 3 1 3 1 7 0 11 7 4 2 9 5 8 5 1 9 1 6 1 1 3 2 3 2 1 4 3 2 5 3 5 4 3 7 1 6 0 9 5 7 1 2 5 1 1 7 6 1 2 1 2 1 1 1 8 0 11 3 5 7 6 9 1 6 4 1 4 1 1 3 1 3 3 2 2 3 1 7 0 8 9 7 9 9 1 1 8 7 1 1 2 1 1 1 1 5 5 1 3 4 3 3 3 5 1 5 0 11 8 1 4 8 8 6 9 6 7 3 7 2 1 3 1 1 1 8 0 11 1 3 9 4 4 5 3 7 7 1 1 1 1 1 2 3 3 3 2 1 8 0 10 8 5 3 7 2 1 3 8 1 2 2 1 1 1 1 2 1 1 1 1 5 3 5 3 6 1 8 0 8 6 6 7 5 8 1 7 5 1 1 1 3 2 3 1 2 1 9 0 6 5 3 4 1 1 6 2 1 1 2 1 1 2 2 2 1 9 0 11 8 4 4 3 2 5 1 7 1 4 9 1 1 2 3 3 1 3 3 3 1 2 1 2 3 5 2 4 2 4 3 5 4 6 3 4 3 3 6 1 6 0 6 7 6 5 3 4 1 2 1 2 1 1 2 1 9 0 6 2 4 1 4 1 3 3 2 3 2 1 1 1 3 1 1 7 0 7 4 3 6 9 1 8 1 1 1 3 1 3 3 3 3 5 2 1 1 4 3 4 1 8 0 6 1 4 1 5 3 1 1 3 1 1 2 1 1 1 1 5 0 7 3 9 1 5 4 4 8 2 1 1 1 3 1 7 0 8 8 2 9 5 1 1 9 3 1 2 3 3 3 3 1 4 4 1 1 3 5 1 6 0 8 5 1 3 4 6 1 3 4 3 1 1 2 3 3 1 5 0 8 4 8 9 5 1 5 1 1 3 1 1 2 2 1 9 0 10 1 7 9 8 5 2 7 1 9 4 3 3 2 3 3 1 3 3 1 5 4 3 1 5 3 5 1 9 0 7 2 1 1 3 8 6 8 1 3 1 2 1 1 3 3 3 1 6 0 11 7 4 1 1 3 1 2 3 7 1 3 1 2 3 1 3 2 1 6 0 10 1 9 8 4 7 4 9 8 9 7 3 2 2 3 1 3 3 3 5 2 4 1 3 2 4 5 3 6 1 5 0 8 4 6 8 4 1 7 7 1 1 3 2 2 2 1 9 0 6 2 1 9 5 6 9 1 3 1 1 3 1 3 1 2 1 8 0 11 4 9 2 1 6 5 3 1 9 8 1 2 3 2 2 2 2 2 1 1 4 1 1 3 2 3 6 1 9 0 7 3 6 6 5 1 6 1 3 1 2 3 2 3 1 2 1 1 8 0 9 5 1 3 4 9 4 3 8 9 3 3 1 2 2 3 2 3 1 8 0 9 9 7 2 4 1 1 6 8 5 1 1 1 3 1 3 1 3 3 3 3 3 2 3 3 4 1 7 0 8 2 4 2 4 7 6 8 1 2 1 2 2 1 3 1 1 6 0 9 9 2 8 1 4 7 4 6 2 1 1 1 2 1 2 1 6 0 7 9 1 1 9 7 1 3 2 2 2 1 1 2 1 3 3 5 3 5 1 9 0 9 5 7 3 7 1 3 1 9 6 1 1 3 1 2 3 3 3 2 1 6 0 9 8 9 5 9 4 1 7 5 4 1 3 1 2 3 1 1 7 0 10 8 1 9 1 3 3 5 4 6 8 1 2 1 3 2 2 3 1 4 1 5 1 4 4 1 6 5 4 5 3 5 1 8 0 11 6 8 3 7 6 1 3 4 7 3 3 3 1 3 3 3 2 1 2 1 9 0 10 4 1 9 8 2 5 5 8 7 8 1 2 2 3 2 2 1 1 1 1 5 0 6 1 2 1 6 7 2 2 3 1 3 2 2 3 1 3 4 3 6 1 5 0 7 4 9 5 2 1 1 4 1 1 1 2 3 1 7 0 7 7 4 9 1 1 6 4 1 3 3 3 1 1 1 1 9 0 11 3 8 1 1 5 8 9 8 9 8 9 3 1 3 2 1 1 1 1 3 1 5 3 1 5 1 3 6 1 6 0 8 5 8 1 2 9 8 8 8 3 3 1 2 1 3 1 6 0 8 1 9 4 4 2 6 9 1 1 2 1 1 2 1 1 7 0 6 8 1 6 4 9 2 1 3 2 3 2 2 1 3 1 3 1 4 2 3 6 1 5 0 10 6 4 9 1 9 9 3 2 3 5 2 1 2 3 1 1 7 0 8 8 8 2 1 9 7 9 3 2 2 3 1 3 1 3 1 5 0 6 4 1 4 5 6 1 3 1 1 1 2 1 4 3 4 3 5 1 4 6 3 1 5 5 3 7 1 5 0 11 2 9 4 2 6 1 2 3 3 7 5 1 1 3 2 2 1 7 0 8 1 9 6 1 9 7 6 7 2 2 2 1 2 2 3 1 9 0 11 7 1 7 4 4 5 7 3 5 4 7 2 2 2 1 2 3 3 1 3 3 4 4 2 1 3 1 3 7 1 8 0 10 7 2 5 6 1 9 3 1 7 9 2 3 2 3 3 1 2 1 1 7 0 11 4 7 9 4 5 1 5 9 9 1 6 1 1 3 2 2 2 1 1 7 0 11 1 1 1 2 6 4 3 8 4 5 8 1 1 3 1 2 2 1 2 4 3 3 4 2 1 3 5 1 9 0 8 2 4 7 5 1 6 4 4 1 1 1 1 1 3 1 2 1 1 9 0 9 6 8 3 3 6 1 1 2 5 1 3 3 3 2 2 1 2 1 1 5 0 9 6 6 7 2 9 8 1 6 1 3 3 1 1 2 3 3 3 2 2 3 4 1 9 0 8 9 1 7 9 5 1 2 8 2 2 2 1 3 3 3 2 1 1 7 0 10 5 6 7 4 8 9 7 4 1 8 1 3 1 2 3 2 1 1 9 0 8 1 1 5 4 1 9 4 5 1 2 3 3 2 3 1 2 3 5 2 3 2 3 6 1 7 0 11 1 5 2 8 8 5 2 5 6 1 9 2 3 3 1 1 1 1 1 6 0 9 7 8 4 8 1 9 2 5 3 2 3 3 1 1 3 1 7 0 11 9 5 6 6 2 9 2 4 1 8 6 3 2 1 3 3 2 1 2 1 5 5 5 5 6 4 7 4 3 4 5 3 7 1 8 0 11 4 1 6 1 3 1 1 7 6 2 2 1 1 3 1 3 1 1 3 1 8 0 8 3 2 7 6 7 5 1 9 2 3 3 2 2 3 1 3 1 9 0 9 1 4 2 8 1 8 4 3 2 3 1 1 1 3 2 3 1 2 5 1 5 1 4 2 2 3 5 1 8 0 8 4 4 1 6 7 1 8 2 3 3 1 1 1 2 1 1 1 8 0 6 9 3 4 1 9 7 2 2 3 3 1 3 1 1 1 8 0 11 9 7 6 6 6 1 6 4 1 3 4 1 2 2 1 3 1 1 1 3 4 3 5 5 3 6 1 9 0 11 9 5 5 6 1 7 1 6 2 5 8 1 1 1 1 2 2 1 3 2 1 7 0 7 7 9 2 1 6 9 7 3 1 2 3 3 1 3 1 8 0 9 3 5 4 7 9 8 1 8 6 1 2 2 1 1 2 1 1 1 5 2 5 5 5 3 7 1 9 0 9 4 5 4 4 8 6 2 1 7 3 3 2 1 1 3 3 1 3 1 8 0 6 8 5 4 6 1 9 2 2 3 1 1 3 1 3 1 8 0 6 4 1 9 2 9 2 2 2 2 3 1 2 1 1 4 4 3 2 2 5 2 3 4 3 1 6 5 3 3 7 1 7 0 6 8 1 8 2 4 2 2 1 1 1 1 1 1 1 7 0 8 2 2 7 5 1 1 1 6 1 2 1 1 1 2 3 1 9 0 9 9 1 9 1 2 9 9 6 8 1 3 3 3 1 2 1 3 3 1 5 4 1 3 5 3 3 7 1 7 0 8 8 6 1 9 8 8 8 5 2 2 1 2 2 1 2 1 8 0 10 2 2 5 1 6 4 3 4 2 5 3 3 2 3 1 2 1 1 1 7 0 10 1 4 5 7 5 9 7 1 4 8 2 1 3 1 1 1 1 4 4 2 1 4 3 5 3 6 1 5 0 11 2 3 2 3 2 6 4 1 1 1 5 1 1 1 1 2 1 8 0 9 2 5 2 4 5 3 5 1 3 3 2 1 2 2 3 3 2 1 7 0 10 3 2 1 3 5 1 3 8 3 8 2 1 1 1 3 2 1 1 5 1 3 5 2 3 5 1 6 0 10 6 1 1 5 1 2 2 9 2 3 3 1 3 1 2 1 1 9 0 7 6 4 8 1 7 4 2 2 3 3 3 2 1 1 3 1 1 9 0 7 2 8 6 6 4 1 1 3 3 1 2 3 2 1 1 2 2 1 5 1 4 3 5 1 8 0 8 9 9 9 4 7 9 5 1 2 1 1 1 3 3 3 2 1 6 0 7 2 1 6 1 4 3 8 1 1 3 2 1 2 1 6 0 7 9 6 2 9 9 5 1 3 2 2 1 2 1 4 2 3 3 3 2 3 7 3 4 2 6 3 4 3 3 4 1 7 0 11 1 7 1 2 8 1 9 6 4 7 8 2 3 2 2 1 1 1 1 9 0 10 7 4 1 4 9 1 2 7 2 5 1 2 1 2 2 2 1 3 1 1 9 0 6 9 6 7 3 1 6 3 2 1 2 2 2 3 2 1 4 4 1 1 3 4 1 9 0 7 4 9 1 3 9 1 7 1 1 1 1 1 2 3 3 1 1 6 0 8 6 8 4 3 9 1 7 3 3 3 1 1 3 3 1 7 0 10 1 1 5 8 1 8 6 8 3 9 2 2 1 2 2 1 2 5 4 4 3 3 4 1 6 0 8 8 5 4 1 1 7 1 1 3 1 1 1 1 2 1 8 0 9 2 1 5 9 6 3 9 1 9 2 2 1 2 1 3 2 2 1 5 0 6 1 1 6 5 4 4 2 2 1 1 3 4 3 3 4 3 6 1 8 0 7 1 4 6 5 1 7 8 1 1 1 3 3 1 3 2 1 6 0 8 7 9 2 6 9 1 1 2 3 3 1 3 2 1 1 5 0 9 1 3 7 2 9 3 7 5 3 1 2 1 1 3 1 1 5 3 1 4 3 3 1 4 4 3 4 1 8 0 6 1 1 4 7 8 4 2 3 3 1 1 3 1 2 1 5 0 10 4 8 3 1 2 9 4 6 6 4 1 2 1 2 3 1 9 0 7 7 9 5 9 6 1 4 2 1 2 3 3 1 1 1 1 2 1 3 1 3 4 1 5 0 11 1 3 1 2 2 2 1 1 3 1 1 2 1 2 2 3 1 6 0 11 6 6 2 9 1 5 4 8 6 7 1 2 3 1 3 3 2 1 7 0 11 1 1 1 2 1 1 2 6 5 4 3 3 2 3 3 2 1 1 3 1 3 1 3 7 1 8 0 6 1 9 4 6 3 4 1 1 2 1 1 3 3 2 1 5 0 8 7 8 9 1 1 7 7 8 2 1 3 1 1 1 6 0 8 1 1 6 7 3 7 7 3 3 1 2 1 1 2 1 3 3 3 3 1 1 3 4 1 7 0 8 1 4 3 3 4 2 7 6 1 3 1 3 2 1 1 1 7 0 6 4 6 1 8 7 1 1 3 1 2 3 1 1 1 5 0 8 3 6 2 4 4 1 6 1 3 3 3 1 3 3 3 3 1 4 5 1 4 5 4 3 7 1 9 0 8 1 4 6 8 7 8 4 9 1 1 3 1 2 1 1 1 2 1 5 0 6 4 1 4 5 9 2 1 1 2 2 2 1 9 0 6 1 7 1 5 6 4 3 1 2 3 2 2 2 1 3 4 5 3 1 3 5 2 3 5 1 6 0 8 7 7 5 1 6 5 4 5 2 2 2 1 2 1 1 7 0 6 8 5 1 1 7 1 2 3 3 1 2 3 1 1 8 0 6 2 1 2 2 8 7 1 1 1 1 3 3 3 1 1 4 2 4 2 3 7 1 7 0 6 8 5 8 8 1 8 3 2 2 1 2 2 1 1 9 0 10 7 2 5 9 1 8 5 2 3 8 3 3 3 3 3 1 1 1 1 1 5 0 11 3 2 5 9 6 8 1 7 4 8 7 1 3 3 1 1 1 3 5 2 3 3 1 3 5 1 6 0 10 5 1 2 1 4 4 8 6 4 5 3 3 3 1 1 1 1 5 0 7 5 2 1 4 9 5 1 1 1 2 2 1 1 8 0 11 2 1 7 1 9 2 9 1 6 4 6 1 2 2 3 3 2 2 3 3 1 3 1 5 3 6 1 9 0 6 8 1 1 2 2 4 2 1 2 1 3 3 3 1 2 1 7 0 6 5 5 3 8 1 6 1 1 1 2 2 3 3 1 8 0 8 3 1 4 3 4 6 5 1 3 1 1 2 2 3 1 3 2 4 1 2 4 2 1 6 7 1 5 5 3 6 1 6 0 10 7 9 7 7 7 4 6 8 8 1 3 1 2 3 2 2 1 8 0 11 1 7 2 5 7 5 1 7 3 3 3 2 1 1 3 1 1 3 3 1 7 0 7 1 3 5 4 1 7 7 3 1 3 1 3 1 1 5 1 5 1 4 1 3 5 1 7 0 9 4 4 1 3 6 4 5 7 1 3 1 3 1 3 2 2 1 8 0 8 8 3 8 9 4 6 1 8 1 3 3 1 1 3 1 2 1 5 0 11 8 1 1 1 6 6 7 8 9 9 1 3 3 3 2 1 4 2 3 4 4 3 4 1 6 0 9 7 1 3 7 6 1 3 5 5 2 3 1 1 1 2 1 5 0 6 2 1 5 5 2 1 3 1 2 1 2 1 6 0 8 1 7 6 8 8 1 1 1 3 1 3 3 2 3 1 1 2 1 3 5 1 7 0 10 2 9 1 2 7 7 5 1 8 2 1 1 3 2 2 1 1 1 8 0 8 6 1 9 2 1 3 8 1 3 3 2 2 1 2 1 1 1 9 0 6 9 3 1 7 9 2 2 2 3 1 3 2 3 1 1 1 3 4 5 4 3 5 1 7 0 9 5 2 6 1 4 4 1 3 8 2 1 2 3 3 1 1 1 9 0 7 2 8 1 3 1 9 4 3 2 3 2 3 2 1 2 1 1 9 0 10 2 5 1 1 2 6 8 5 1 5 2 1 2 3 1 1 2 2 2 4 5 4 3 1 2 6 7 6 2 4 4 3 6 1 6 0 9 3 7 3 3 1 2 4 6 8 2 2 1 3 1 2 1 6 0 7 8 6 5 8 1 3 5 1 2 3 1 1 3 1 5 0 11 3 5 2 1 1 8 6 6 9 4 3 2 3 3 1 3 4 5 4 1 5 4 3 4 1 7 0 9 6 2 1 9 1 6 3 9 3 3 3 1 1 3 2 2 1 7 0 11 3 9 2 1 3 4 5 2 9 9 5 1 1 1 3 2 3 2 1 8 0 8 2 6 3 4 1 4 9 9 1 1 1 1 1 2 1 2 5 2 4 1 3 6 1 6 0 8 7 7 5 3 8 2 1 4 3 2 1 1 3 1 1 9 0 7 8 5 5 1 9 9 2 3 1 1 1 3 1 3 2 1 1 7 0 6 1 1 1 4 8 7 3 3 2 2 1 1 3 1 1 5 4 1 1 3 4 1 7 0 7 5 2 4 8 6 4 1 3 3 3 3 1 1 3 1 5 0 11 7 5 6 3 1 2 1 9 9 1 7 2 3 2 3 1 1 5 0 11 5 3 1 8 3 5 4 1 5 6 4 1 1 1 2 1 5 5 3 1 1 4 4 2 5 4 3 5 1 6 0 10 3 8 1 1 9 7 6 3 7 6 2 2 3 3 3 1 1 8 0 8 7 4 8 8 7 8 1 3 3 3 3 3 1 1 1 3 1 7 0 9 2 1 1 1 9 2 6 1 5 2 1 3 3 3 3 1 1 2 1 2 4 3 7 1 6 0 9 2 4 1 1 3 9 7 6 7 1 3 3 1 1 3 1 8 0 6 1 9 4 1 5 1 1 1 2 1 2 1 1 1 1 8 0 6 2 6 4 1 3 4 1 1 1 3 1 2 2 2 5 2 5 2 5 5 3 3 6 1 8 0 8 7 7 7 4 5 1 7 4 1 1 2 1 1 2 3 1 1 9 0 9 2 4 4 5 3 4 5 1 4 2 3 1 3 1 1 1 2 2 1 7 0 11 1 6 2 9 4 9 9 5 1 2 2 3 1 3 1 3 3 3 5 1 4 4 4 1 3 4 1 6 0 11 5 3 6 1 3 9 5 9 9 7 2 3 1 2 3 1 1 1 5 0 11 9 6 2 8 2 2 1 2 7 6 2 2 1 2 3 3 1 7 0 9 3 2 8 5 9 8 6 1 2 1 1 2 3 1 1 1 1 4 2 2 3 5 1 7 0 6 5 1 1 1 3 9 1 1 1 1 1 2 1 1 5 0 6 4 1 5 1 8 5 2 1 3 3 3 1 6 0 10 2 1 3 4 2 8 6 8 7 3 2 2 1 1 1 3 2 3 2 3 4 5 1 2 1 4 8 2 6 3 4 4 3 4 1 5 0 10 1 7 3 8 9 1 8 6 3 2 3 1 3 2 2 1 5 0 6 6 8 3 1 1 7 1 2 2 3 1 1 9 0 7 4 3 3 6 4 7 1 1 2 2 1 3 3 1 1 1 1 2 3 5 3 5 1 6 0 10 7 8 6 6 5 1 1 3 1 1 3 1 1 2 1 1 1 5 0 8 9 7 3 3 7 1 3 9 1 1 3 1 2 1 6 0 6 1 6 6 1 7 6 3 1 2 1 2 3 5 5 5 2 4 3 4 1 6 0 7 4 3 1 6 3 4 2 2 3 1 3 2 1 1 8 0 11 8 3 2 7 9 2 6 8 8 1 6 1 2 1 3 1 1 1 2 1 8 0 11 8 2 2 9 4 5 6 7 1 6 8 1 2 1 3 3 3 1 1 3 2 5 1 3 7 1 7 0 7 4 3 8 8 1 1 8 1 2 1 2 2 1 1 1 5 0 10 5 9 9 3 8 4 7 9 1 8 2 1 1 1 1 1 9 0 7 3 4 5 7 4 1 5 2 1 1 3 2 3 1 2 1 3 3 5 5 3 3 1 1 1 3 4 4 3 3 6 1 6 0 9 7 8 4 1 9 6 5 3 3 2 2 2 1 2 3 1 8 0 9 1 4 1 7 5 5 4 9 2 1 3 3 3 1 1 1 1 1 5 0 10 9 1 9 9 9 1 4 4 9 7 1 2 2 1 3 4 5 4 2 2 2 3 6 1 8 0 8 4 3 2 2 3 2 1 5 2 2 3 1 2 2 2 1 1 5 0 8 3 1 4 6 1 4 6 5 1 1 2 1 1 1 5 0 7 2 3 5 1 6 7 9 2 3 1 2 2 5 3 4 5 5 2 3 5 1 6 0 11 8 3 1 8 8 8 1 3 7 2 2 3 1 2 2 1 3 1 8 0 7 3 2 3 7 1 9 4 1 1 1 3 2 3 3 1 1 9 0 8 6 2 8 1 5 4 2 2 1 1 2 1 3 1 1 2 1 5 4 1 1 1 3 7 1 6 0 7 8 3 7 5 6 5 1 1 1 2 1 2 1 1 7 0 11 8 8 3 4 1 3 2 3 3 9 8 2 3 1 1 1 3 2 1 6 0 10 8 3 9 4 9 2 8 3 3 1 1 2 3 1 2 1 2 1 5 3 3 2 5 6 1 6 5 4 3 5 1 5 0 10 5 8 5 5 5 9 3 9 8 1 1 1 1 1 3 1 5 0 7 4 9 8 9 1 9 1 2 1 1 2 1 1 8 0 11 5 3 4 8 8 3 7 3 1 1 4 1 2 1 3 2 2 1 3 2 4 5 4 3 3 4 1 8 0 8 7 1 5 4 2 2 1 9 3 1 2 3 1 3 1 3 1 9 0 9 5 7 9 3 4 3 6 4 1 1 3 2 1 3 2 3 1 1 1 7 0 11 1 2 6 2 6 4 6 1 1 8 6 2 3 1 2 3 1 1 2 5 1 2 3 6 1 8 0 10 4 9 2 9 5 1 9 2 8 6 3 1 1 1 3 1 3 1 1 7 0 8 1 9 7 9 9 7 4 4 1 2 3 1 2 2 3 1 8 0 7 4 9 1 8 9 7 1 2 2 3 1 1 2 2 3 2 1 1 2 3 1 3 5 1 7 0 11 2 1 4 5 8 4 3 1 9 4 5 1 1 2 3 3 3 1 1 9 0 7 8 5 9 3 1 4 3 1 1 3 3 3 1 3 1 1 1 8 0 8 6 4 6 8 1 3 5 3 1 1 2 3 2 3 1 1 4 1 4 3 3 3 6 1 8 0 10 4 2 7 1 1 1 7 2 9 2 3 2 2 1 1 3 3 1 1 9 0 9 4 4 6 7 4 7 1 9 1 2 1 2 2 1 3 2 1 1 1 5 0 9 2 7 1 6 2 2 7 6 5 1 3 3 1 1 2 1 4 3 2 5 7 1 2 5 5 5 3 5 1 6 0 9 9 1 1 7 2 9 7 6 8 1 3 1 3 3 1 1 5 0 7 6 2 3 5 1 1 3 1 2 3 3 1 1 9 0 10 1 9 3 7 8 3 1 1 4 1 2 2 2 1 3 1 1 1 2 1 4 2 3 5 3 7 1 8 0 6 8 7 4 1 6 3 1 2 2 3 3 1 3 1 1 8 0 6 4 7 5 5 1 8 3 3 3 1 3 1 1 3 1 9 0 8 6 8 8 5 1 7 7 2 1 2 3 2 1 3 1 3 2 2 5 3 1 1 4 2 3 6 1 7 0 6 1 6 9 9 4 7 1 3 3 2 1 3 2 1 7 0 9 5 1 3 6 1 4 8 7 3 1 2 1 3 3 1 3 1 9 0 10 8 4 9 1 7 1 1 4 1 1 1 1 1 2 1 1 1 1 2 3 3 4 2 1 3 3 5 1 8 0 7 3 2 2 4 1 1 9 1 1 3 3 1 1 1 1 1 6 0 7 5 9 1 1 2 9 6 2 3 1 3 1 1 1 8 0 11 6 1 1 7 8 2 3 2 3 9 1 1 1 1 3 1 2 1 3 1 3 2 3 1 3 4 1 9 0 10 5 3 1 3 9 7 9 7 5 7 2 2 2 1 1 1 2 2 1 1 5 0 7 1 9 1 8 8 4 5 2 1 3 1 2 1 5 0 6 9 9 8 9 1 4 2 1 1 3 2 1 3 5 1 3 4 4 7 1 4 5 3 5 1 7 0 9 5 7 8 7 9 7 4 2 1 2 3 2 1 2 1 1 1 8 0 11 6 9 2 5 3 1 1 3 8 3 7 3 2 1 1 3 1 1 1 1 9 0 9 5 1 1 8 2 7 9 1 4 2 1 3 2 3 1 3 1 3 3 3 3 3 3 3 6 1 7 0 9 4 1 3 9 7 6 2 1 2 3 1 1 3 1 3 2 1 8 0 6 5 3 1 1 3 1 2 1 1 3 2 3 1 1 1 9 0 7 6 9 6 1 4 9 6 1 2 2 3 3 3 1 3 1 2 3 2 1 4 3 3 6 1 8 0 11 4 1 1 4 7 3 5 1 6 3 9 1 2 2 3 3 3 3 1 1 8 0 8 2 1 1 3 4 8 2 5 3 1 1 2 2 2 2 1 1 6 0 9 2 9 1 6 2 9 2 5 3 1 3 2 1 2 3 5 2 1 2 2 3 3 5 1 6 0 11 4 1 6 3 5 4 6 4 9 4 4 2 1 1 1 2 2 1 5 0 11 3 3 3 3 6 2 1 1 2 3 9 3 1 1 3 2 1 6 0 8 3 1 8 9 4 1 3 9 3 1 2 2 1 2 3 2 5 2 5 4 3 2 6 4 4 3 3 6 1 5 0 11 1 5 3 7 5 4 9 7 5 2 2 1 1 2 3 2 1 6 0 7 9 5 1 9 9 1 4 2 1 3 2 2 2 1 6 0 6 1 7 5 8 8 5 1 3 2 1 2 2 3 1 2 4 3 2 3 7 1 8 0 7 1 3 2 3 8 1 1 2 1 1 2 3 1 2 1 1 6 0 8 2 5 8 7 6 7 1 3 1 2 3 3 1 1 1 8 0 10 8 7 1 8 2 1 8 6 9 3 1 1 1 2 2 2 3 3 2 4 2 3 2 1 3 3 5 1 8 0 9 8 1 7 9 5 1 9 1 1 2 2 3 2 3 1 1 2 1 5 0 9 8 7 1 9 1 2 2 5 2 2 1 2 1 1 1 9 0 8 1 1 4 4 1 2 8 1 2 3 1 2 2 1 1 3 1 1 5 3 5 1 3 4 1 9 0 9 4 1 7 7 9 3 9 8 1 1 1 1 1 2 1 2 3 2 1 8 0 6 4 7 5 5 1 6 3 1 1 1 1 1 3 2 1 6 0 9 5 4 1 6 7 5 4 4 4 2 1 2 3 1 2 2 2 4 2 4 6 1 7 4 6 3 6 9 7 7 5 4 6 7 4 2 diff --git a/2018/d09/ex1/ex1.py b/2018/d09/ex1/ex1.py new file mode 100755 index 0000000..3b409e4 --- /dev/null +++ b/2018/d09/ex1/ex1.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import collections +import sys + + +def solve(input: str) -> int: + def parse(input: str) -> tuple[int, int]: + split = input.split() + return int(split[0]), int(split[6]) + + def play_game(players: int, last_marble: int) -> list[int]: + circle = collections.deque([0]) + scores = [0] * players + + for marble in range(1, last_marble + 1): + if marble % 23 == 0: + scores[marble % players] += marble + circle.rotate(7) + scores[marble % players] += circle.pop() + circle.rotate(-1) + else: + circle.rotate(-1) + circle.append(marble) + + return scores + + players, last_marble = parse(input) + scores = play_game(players, last_marble) + return max(scores) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d09/ex1/input b/2018/d09/ex1/input new file mode 100644 index 0000000..7f8b0ac --- /dev/null +++ b/2018/d09/ex1/input @@ -0,0 +1 @@ +476 players; last marble is worth 71657 points diff --git a/2018/d09/ex2/ex2.py b/2018/d09/ex2/ex2.py new file mode 100755 index 0000000..0764be1 --- /dev/null +++ b/2018/d09/ex2/ex2.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import collections +import sys + + +def solve(input: str) -> int: + def parse(input: str) -> tuple[int, int]: + split = input.split() + return int(split[0]), int(split[6]) + + def play_game(players: int, last_marble: int) -> list[int]: + circle = collections.deque([0]) + scores = [0] * players + + for marble in range(1, last_marble + 1): + if marble % 23 == 0: + scores[marble % players] += marble + circle.rotate(7) + scores[marble % players] += circle.pop() + circle.rotate(-1) + else: + circle.rotate(-1) + circle.append(marble) + + return scores + + players, last_marble = parse(input) + scores = play_game(players, last_marble * 100) + return max(scores) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d09/ex2/input b/2018/d09/ex2/input new file mode 100644 index 0000000..7f8b0ac --- /dev/null +++ b/2018/d09/ex2/input @@ -0,0 +1 @@ +476 players; last marble is worth 71657 points diff --git a/2018/d10/ex1/ex1.py b/2018/d10/ex1/ex1.py new file mode 100755 index 0000000..d33ca98 --- /dev/null +++ b/2018/d10/ex1/ex1.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Light(NamedTuple): + pos: Point + vel: Point + + def at(self, time: int) -> Point: + return Point(self.pos.x + self.vel.x * time, self.pos.y + self.vel.y * time) + + +def solve(input: str) -> str: + def parse_light(input: str) -> Light: + pos, vel = map(lambda s: s.split("=<")[1].removesuffix(">"), input.split("> ")) + return Light( + Point(*map(int, map(str.strip, pos.split(",")))), + Point(*map(int, map(str.strip, vel.split(",")))), + ) + + def parse(input: list[str]) -> list[Light]: + return [parse_light(line) for line in input] + + def move_lights(lights: list[Light], time: int) -> set[Point]: + return {l.at(time) for l in lights} + + def bbox_size(points: set[Point]) -> int: + min_x, max_x = min(p.x for p in points), max(p.x for p in points) + min_y, max_y = min(p.y for p in points), max(p.y for p in points) + return (max_x - min_x + 1) * (max_y - min_y + 1) + + def write_message(message: set[Point]) -> str: + min_x, max_x = min(p.x for p in message), max(p.x for p in message) + min_y, max_y = min(p.y for p in message), max(p.y for p in message) + + return "\n".join( + "".join( + "#" if Point(x, y) in message else "." for x in range(min_x, max_x + 1) + ) + for y in range(min_y, max_y + 1) + ) + + lights = parse(input.splitlines()) + max_time = max( + map(abs, itertools.chain.from_iterable((l.pos.x, l.pos.y) for l in lights)) + ) + message = min((move_lights(lights, t) for t in range(max_time)), key=bbox_size) + return write_message(message) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d10/ex1/input b/2018/d10/ex1/input new file mode 100644 index 0000000..ac7e997 --- /dev/null +++ b/2018/d10/ex1/input @@ -0,0 +1,318 @@ +position=<-41150, 41504> velocity=< 4, -4> +position=< 31211, -10213> velocity=<-3, 1> +position=<-51522, -41248> velocity=< 5, 4> +position=< 31227, -51593> velocity=<-3, 5> +position=< 31257, -20560> velocity=<-3, 2> +position=< 41558, 10468> velocity=<-4, -1> +position=< 10539, -30904> velocity=<-1, 3> +position=< 51919, -41253> velocity=<-5, 4> +position=< 31246, 10473> velocity=<-3, -1> +position=<-20471, 20813> velocity=< 2, -2> +position=< 51910, -10222> velocity=<-5, 1> +position=<-20503, 20816> velocity=< 2, -2> +position=< 20901, -41255> velocity=<-2, 4> +position=< 31249, -41249> velocity=<-3, 4> +position=<-10139, 10477> velocity=< 1, -1> +position=< 20888, -30903> velocity=<-2, 3> +position=< 31218, 31158> velocity=<-3, -3> +position=<-30802, 51848> velocity=< 3, -5> +position=< 51923, 51854> velocity=<-5, -5> +position=<-51503, 41504> velocity=< 5, -4> +position=<-10131, 31165> velocity=< 1, -3> +position=<-30809, -10222> velocity=< 3, 1> +position=< 10551, 20818> velocity=<-1, -2> +position=< 31236, 31158> velocity=<-3, -3> +position=<-51534, 20822> velocity=< 5, -2> +position=< 20920, -41250> velocity=<-2, 4> +position=<-30841, 41504> velocity=< 3, -4> +position=< 51932, -41256> velocity=<-5, 4> +position=< 31249, 10469> velocity=<-3, -1> +position=<-41198, 41505> velocity=< 4, -4> +position=<-30833, 41510> velocity=< 3, -4> +position=<-51494, 41507> velocity=< 5, -4> +position=< 10553, 10472> velocity=<-1, -1> +position=<-41174, -20564> velocity=< 4, 2> +position=< 41578, 20816> velocity=<-4, -2> +position=<-51503, -10214> velocity=< 5, 1> +position=<-30824, -30906> velocity=< 3, 3> +position=<-41172, 20816> velocity=< 4, -2> +position=<-41198, 41507> velocity=< 4, -4> +position=< 41578, -30911> velocity=<-4, 3> +position=< 20904, 20817> velocity=<-2, -2> +position=< 51901, 41503> velocity=<-5, -4> +position=< 20872, -30906> velocity=<-2, 3> +position=< 31265, -20560> velocity=<-3, 2> +position=<-10136, -10217> velocity=< 1, 1> +position=< 31246, 20817> velocity=<-3, -2> +position=< 51927, 20820> velocity=<-5, -2> +position=<-30821, -10222> velocity=< 3, 1> +position=<-20492, -10221> velocity=< 2, 1> +position=<-20488, -51596> velocity=< 2, 5> +position=< 41610, -41249> velocity=<-4, 4> +position=< 31257, -30908> velocity=<-3, 3> +position=< 41610, 31160> velocity=<-4, -3> +position=<-10151, 41503> velocity=< 1, -4> +position=<-51527, -10216> velocity=< 5, 1> +position=< 20867, -30903> velocity=<-2, 3> +position=< 31228, 41503> velocity=<-3, -4> +position=<-10160, -41253> velocity=< 1, 4> +position=< 41595, -30907> velocity=<-4, 3> +position=<-51506, 31158> velocity=< 5, -3> +position=<-10142, -10219> velocity=< 1, 1> +position=<-10115, -10222> velocity=< 1, 1> +position=< 10572, -51601> velocity=<-1, 5> +position=< 51899, 20818> velocity=<-5, -2> +position=<-20476, -30910> velocity=< 2, 3> +position=<-41174, 31162> velocity=< 4, -3> +position=< 31246, 41509> velocity=<-3, -4> +position=<-30801, -41253> velocity=< 3, 4> +position=<-10130, 41508> velocity=< 1, -4> +position=<-20473, 10470> velocity=< 2, -1> +position=<-41150, -20565> velocity=< 4, 2> +position=< 31246, 31165> velocity=<-3, -3> +position=< 41610, -41256> velocity=<-4, 4> +position=< 41574, 31164> velocity=<-4, -3> +position=<-41157, -30903> velocity=< 4, 3> +position=< 31241, 10469> velocity=<-3, -1> +position=< 31217, -30912> velocity=<-3, 3> +position=< 10529, 41503> velocity=<-1, -4> +position=< 20901, 51853> velocity=<-2, -5> +position=<-51551, 10472> velocity=< 5, -1> +position=< 41613, 41503> velocity=<-4, -4> +position=<-10134, -41251> velocity=< 1, 4> +position=< 41595, -41253> velocity=<-4, 4> +position=<-51511, 10477> velocity=< 5, -1> +position=<-30837, -10217> velocity=< 3, 1> +position=< 51950, -51602> velocity=<-5, 5> +position=<-51541, 41503> velocity=< 5, -4> +position=< 51907, 51857> velocity=<-5, -5> +position=<-41198, 10469> velocity=< 4, -1> +position=<-30834, 20817> velocity=< 3, -2> +position=< 51947, 31163> velocity=<-5, -3> +position=<-30804, -30912> velocity=< 3, 3> +position=<-30829, -20560> velocity=< 3, 2> +position=< 10547, -30908> velocity=<-1, 3> +position=<-51531, 31166> velocity=< 5, -3> +position=< 51955, 41510> velocity=<-5, -4> +position=<-30861, -30911> velocity=< 3, 3> +position=< 20872, -51596> velocity=<-2, 5> +position=<-30829, 51854> velocity=< 3, -5> +position=<-41150, -10218> velocity=< 4, 1> +position=< 31257, -20560> velocity=<-3, 2> +position=<-20476, 20816> velocity=< 2, -2> +position=<-20468, 10470> velocity=< 2, -1> +position=<-51519, -30911> velocity=< 5, 3> +position=< 51959, 10468> velocity=<-5, -1> +position=< 20888, -51593> velocity=<-2, 5> +position=< 51947, 10475> velocity=<-5, -1> +position=< 31246, 10468> velocity=<-3, -1> +position=<-20516, -41249> velocity=< 2, 4> +position=<-51511, -41248> velocity=< 5, 4> +position=<-41147, 20817> velocity=< 4, -2> +position=<-41150, -51594> velocity=< 4, 5> +position=<-10163, -30908> velocity=< 1, 3> +position=<-10152, -10213> velocity=< 1, 1> +position=<-20460, -30903> velocity=< 2, 3> +position=<-41169, -10219> velocity=< 4, 1> +position=<-51531, -30907> velocity=< 5, 3> +position=<-30812, 41503> velocity=< 3, -4> +position=<-41169, 10477> velocity=< 4, -1> +position=< 10546, 51848> velocity=<-1, -5> +position=<-10139, 20813> velocity=< 1, -2> +position=<-30861, 51851> velocity=< 3, -5> +position=<-20497, -51593> velocity=< 2, 5> +position=< 51949, -20558> velocity=<-5, 2> +position=< 41597, -51595> velocity=<-4, 5> +position=< 51940, 31163> velocity=<-5, -3> +position=< 41589, 10473> velocity=<-4, -1> +position=<-51495, -41257> velocity=< 5, 4> +position=< 31265, -41254> velocity=<-3, 4> +position=< 10527, 10473> velocity=<-1, -1> +position=< 51927, 41509> velocity=<-5, -4> +position=< 20884, 10471> velocity=<-2, -1> +position=<-51493, 41507> velocity=< 5, -4> +position=<-41182, -30912> velocity=< 4, 3> +position=< 10575, 41509> velocity=<-1, -4> +position=< 20884, -20567> velocity=<-2, 2> +position=< 10535, -20560> velocity=<-1, 2> +position=<-51543, 41512> velocity=< 5, -4> +position=<-30825, -10214> velocity=< 3, 1> +position=<-51535, -20559> velocity=< 5, 2> +position=< 10528, -10218> velocity=<-1, 1> +position=<-51538, 41506> velocity=< 5, -4> +position=< 20892, -30905> velocity=<-2, 3> +position=< 31249, -51596> velocity=<-3, 5> +position=< 10539, 20815> velocity=<-1, -2> +position=<-20464, -41248> velocity=< 2, 4> +position=<-41186, -20567> velocity=< 4, 2> +position=<-20492, 20820> velocity=< 2, -2> +position=<-30818, 31165> velocity=< 3, -3> +position=<-10131, -51596> velocity=< 1, 5> +position=< 51919, 20814> velocity=<-5, -2> +position=<-41166, -30905> velocity=< 4, 3> +position=<-10151, 31163> velocity=< 1, -3> +position=< 10522, 10468> velocity=<-1, -1> +position=< 51911, -30912> velocity=<-5, 3> +position=<-41173, 31160> velocity=< 4, -3> +position=< 31260, -41248> velocity=<-3, 4> +position=<-10139, -10220> velocity=< 1, 1> +position=<-30857, -20558> velocity=< 3, 2> +position=< 10531, -10222> velocity=<-1, 1> +position=<-30813, -20566> velocity=< 3, 2> +position=< 51944, -30903> velocity=<-5, 3> +position=<-41198, 20820> velocity=< 4, -2> +position=<-41150, -41252> velocity=< 4, 4> +position=<-20508, 20814> velocity=< 2, -2> +position=< 41554, -41256> velocity=<-4, 4> +position=< 31238, -41248> velocity=<-3, 4> +position=< 20906, -10219> velocity=<-2, 1> +position=< 51912, 41505> velocity=<-5, -4> +position=< 20866, -51602> velocity=<-2, 5> +position=< 10519, 31164> velocity=<-1, -3> +position=<-20479, 51856> velocity=< 2, -5> +position=<-30829, -51596> velocity=< 3, 5> +position=< 51943, -10221> velocity=<-5, 1> +position=< 20917, -41249> velocity=<-2, 4> +position=< 20888, 41507> velocity=<-2, -4> +position=< 51957, 41507> velocity=<-5, -4> +position=<-20499, -10213> velocity=< 2, 1> +position=< 51911, 41503> velocity=<-5, -4> +position=<-51551, -51595> velocity=< 5, 5> +position=<-10139, 51849> velocity=< 1, -5> +position=< 41582, -10222> velocity=<-4, 1> +position=<-41150, 31159> velocity=< 4, -3> +position=< 20888, 41504> velocity=<-2, -4> +position=< 10567, 20821> velocity=<-1, -2> +position=< 51900, -10222> velocity=<-5, 1> +position=<-51503, 20815> velocity=< 5, -2> +position=<-20488, -51596> velocity=< 2, 5> +position=< 51939, -10221> velocity=<-5, 1> +position=< 31270, 10468> velocity=<-3, -1> +position=<-51527, 20816> velocity=< 5, -2> +position=< 51926, 51853> velocity=<-5, -5> +position=<-51543, -20564> velocity=< 5, 2> +position=< 20883, -20558> velocity=<-2, 2> +position=<-41166, 20816> velocity=< 4, -2> +position=< 51936, 41511> velocity=<-5, -4> +position=<-10115, -10220> velocity=< 1, 1> +position=< 31210, -51593> velocity=<-3, 5> +position=<-10115, -41248> velocity=< 1, 4> +position=< 31233, -20559> velocity=<-3, 2> +position=< 20921, -51598> velocity=<-2, 5> +position=<-41185, -30912> velocity=< 4, 3> +position=<-51531, -51600> velocity=< 5, 5> +position=< 10543, -10220> velocity=<-1, 1> +position=< 51924, -30912> velocity=<-5, 3> +position=<-30821, 20813> velocity=< 3, -2> +position=< 10545, -51602> velocity=<-1, 5> +position=<-10126, -41248> velocity=< 1, 4> +position=<-30829, -30907> velocity=< 3, 3> +position=<-51495, 20817> velocity=< 5, -2> +position=< 10548, -41256> velocity=<-1, 4> +position=< 41578, -51599> velocity=<-4, 5> +position=<-41203, -51602> velocity=< 4, 5> +position=< 31253, -10214> velocity=<-3, 1> +position=<-20457, -30908> velocity=< 2, 3> +position=<-10147, 51848> velocity=< 1, -5> +position=<-51502, -20558> velocity=< 5, 2> +position=< 41615, -10222> velocity=<-4, 1> +position=<-41182, -30906> velocity=< 4, 3> +position=< 20912, -10216> velocity=<-2, 1> +position=< 20869, -20566> velocity=<-2, 2> +position=< 10555, 41510> velocity=<-1, -4> +position=<-30835, 10472> velocity=< 3, -1> +position=<-20487, 41505> velocity=< 2, -4> +position=<-20511, -41249> velocity=< 2, 4> +position=< 20913, 20822> velocity=<-2, -2> +position=<-30824, 10469> velocity=< 3, -1> +position=< 10567, 10472> velocity=<-1, -1> +position=< 31238, 31166> velocity=<-3, -3> +position=<-41186, -10219> velocity=< 4, 1> +position=<-41169, -51602> velocity=< 4, 5> +position=< 51947, -20564> velocity=<-5, 2> +position=< 41562, -10219> velocity=<-4, 1> +position=<-10155, 20821> velocity=< 1, -2> +position=< 20884, -51598> velocity=<-2, 5> +position=< 20907, 41505> velocity=<-2, -4> +position=< 10579, 51848> velocity=<-1, -5> +position=< 41586, -30905> velocity=<-4, 3> +position=<-30859, -41248> velocity=< 3, 4> +position=< 20864, 10475> velocity=<-2, -1> +position=< 20876, -30908> velocity=<-2, 3> +position=< 10543, -41248> velocity=<-1, 4> +position=< 31246, -51598> velocity=<-3, 5> +position=<-30833, 41503> velocity=< 3, -4> +position=<-20473, -51595> velocity=< 2, 5> +position=< 31265, -30904> velocity=<-3, 3> +position=<-51493, 31158> velocity=< 5, -3> +position=< 51947, 20821> velocity=<-5, -2> +position=<-41166, -30912> velocity=< 4, 3> +position=<-30813, 41508> velocity=< 3, -4> +position=<-41198, -51601> velocity=< 4, 5> +position=<-10151, 20819> velocity=< 1, -2> +position=< 51907, 51854> velocity=<-5, -5> +position=<-10158, -41254> velocity=< 1, 4> +position=<-41170, -41249> velocity=< 4, 4> +position=< 51907, 51856> velocity=<-5, -5> +position=< 41586, -10216> velocity=<-4, 1> +position=< 31246, -20560> velocity=<-3, 2> +position=<-30826, -10217> velocity=< 3, 1> +position=< 10569, 51848> velocity=<-1, -5> +position=<-20484, -30912> velocity=< 2, 3> +position=< 10559, 41510> velocity=<-1, -4> +position=< 41555, 31167> velocity=<-4, -3> +position=< 20877, -30911> velocity=<-2, 3> +position=<-51549, 20822> velocity=< 5, -2> +position=<-51551, 51856> velocity=< 5, -5> +position=<-10163, 10476> velocity=< 1, -1> +position=<-51530, -10222> velocity=< 5, 1> +position=< 31241, 20817> velocity=<-3, -2> +position=<-51514, 20822> velocity=< 5, -2> +position=<-41155, 31158> velocity=< 4, -3> +position=< 41565, 10468> velocity=<-4, -1> +position=< 51949, 41503> velocity=<-5, -4> +position=< 20874, 10468> velocity=<-2, -1> +position=< 41611, -41253> velocity=<-4, 4> +position=<-30813, -30906> velocity=< 3, 3> +position=< 41574, 41511> velocity=<-4, -4> +position=< 51931, 51856> velocity=<-5, -5> +position=<-20508, -10220> velocity=< 2, 1> +position=< 20891, -41253> velocity=<-2, 4> +position=< 31249, 31159> velocity=<-3, -3> +position=< 41579, 31162> velocity=<-4, -3> +position=<-51527, 51853> velocity=< 5, -5> +position=<-30826, 20819> velocity=< 3, -2> +position=<-20508, 10471> velocity=< 2, -1> +position=<-20472, 10476> velocity=< 2, -1> +position=< 51924, 41507> velocity=<-5, -4> +position=<-30837, -51600> velocity=< 3, 5> +position=<-20487, 41512> velocity=< 2, -4> +position=<-51499, 41512> velocity=< 5, -4> +position=<-51508, -30910> velocity=< 5, 3> +position=<-20483, -20566> velocity=< 2, 2> +position=<-20516, -51596> velocity=< 2, 5> +position=< 20924, -30908> velocity=<-2, 3> +position=<-10144, -41257> velocity=< 1, 4> +position=<-41154, -41257> velocity=< 4, 4> +position=< 51902, -20558> velocity=<-5, 2> +position=< 41610, -10216> velocity=<-4, 1> +position=< 51917, -41248> velocity=<-5, 4> +position=<-20459, 31158> velocity=< 2, -3> +position=< 20884, 31162> velocity=<-2, -3> +position=<-20506, -30908> velocity=< 2, 3> +position=<-51533, -30903> velocity=< 5, 3> +position=<-10168, -30912> velocity=< 1, 3> +position=< 20904, 41506> velocity=<-2, -4> +position=<-51551, 31163> velocity=< 5, -3> +position=<-20500, -51595> velocity=< 2, 5> +position=< 31251, -20561> velocity=<-3, 2> +position=<-41186, -51595> velocity=< 4, 5> +position=<-20496, 31163> velocity=< 2, -3> +position=<-20458, -41257> velocity=< 2, 4> +position=< 41554, -41255> velocity=<-4, 4> +position=<-51511, 31163> velocity=< 5, -3> +position=<-51535, 20821> velocity=< 5, -2> +position=<-30853, -41249> velocity=< 3, 4> +position=< 20912, -51597> velocity=<-2, 5> +position=< 10527, -30903> velocity=<-1, 3> +position=< 41587, 41505> velocity=<-4, -4> diff --git a/2018/d10/ex2/ex2.py b/2018/d10/ex2/ex2.py new file mode 100755 index 0000000..3b70526 --- /dev/null +++ b/2018/d10/ex2/ex2.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Light(NamedTuple): + pos: Point + vel: Point + + def at(self, time: int) -> Point: + return Point(self.pos.x + self.vel.x * time, self.pos.y + self.vel.y * time) + + +def solve(input: str) -> int: + def parse_light(input: str) -> Light: + pos, vel = map(lambda s: s.split("=<")[1].removesuffix(">"), input.split("> ")) + return Light( + Point(*map(int, map(str.strip, pos.split(",")))), + Point(*map(int, map(str.strip, vel.split(",")))), + ) + + def parse(input: list[str]) -> list[Light]: + return [parse_light(line) for line in input] + + def move_lights(lights: list[Light], time: int) -> set[Point]: + return {l.at(time) for l in lights} + + def bbox_size(points: set[Point]) -> int: + min_x, max_x = min(p.x for p in points), max(p.x for p in points) + min_y, max_y = min(p.y for p in points), max(p.y for p in points) + return (max_x - min_x + 1) * (max_y - min_y + 1) + + def write_message(message: set[Point]) -> str: + min_x, max_x = min(p.x for p in message), max(p.x for p in message) + min_y, max_y = min(p.y for p in message), max(p.y for p in message) + + return "\n".join( + "".join( + "#" if Point(x, y) in message else "." for x in range(min_x, max_x + 1) + ) + for y in range(min_y, max_y + 1) + ) + + lights = parse(input.splitlines()) + max_time = max( + map(abs, itertools.chain.from_iterable((l.pos.x, l.pos.y) for l in lights)) + ) + time = min(range(max_time), key=lambda t: bbox_size(move_lights(lights, t))) + return time + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d10/ex2/input b/2018/d10/ex2/input new file mode 100644 index 0000000..ac7e997 --- /dev/null +++ b/2018/d10/ex2/input @@ -0,0 +1,318 @@ +position=<-41150, 41504> velocity=< 4, -4> +position=< 31211, -10213> velocity=<-3, 1> +position=<-51522, -41248> velocity=< 5, 4> +position=< 31227, -51593> velocity=<-3, 5> +position=< 31257, -20560> velocity=<-3, 2> +position=< 41558, 10468> velocity=<-4, -1> +position=< 10539, -30904> velocity=<-1, 3> +position=< 51919, -41253> velocity=<-5, 4> +position=< 31246, 10473> velocity=<-3, -1> +position=<-20471, 20813> velocity=< 2, -2> +position=< 51910, -10222> velocity=<-5, 1> +position=<-20503, 20816> velocity=< 2, -2> +position=< 20901, -41255> velocity=<-2, 4> +position=< 31249, -41249> velocity=<-3, 4> +position=<-10139, 10477> velocity=< 1, -1> +position=< 20888, -30903> velocity=<-2, 3> +position=< 31218, 31158> velocity=<-3, -3> +position=<-30802, 51848> velocity=< 3, -5> +position=< 51923, 51854> velocity=<-5, -5> +position=<-51503, 41504> velocity=< 5, -4> +position=<-10131, 31165> velocity=< 1, -3> +position=<-30809, -10222> velocity=< 3, 1> +position=< 10551, 20818> velocity=<-1, -2> +position=< 31236, 31158> velocity=<-3, -3> +position=<-51534, 20822> velocity=< 5, -2> +position=< 20920, -41250> velocity=<-2, 4> +position=<-30841, 41504> velocity=< 3, -4> +position=< 51932, -41256> velocity=<-5, 4> +position=< 31249, 10469> velocity=<-3, -1> +position=<-41198, 41505> velocity=< 4, -4> +position=<-30833, 41510> velocity=< 3, -4> +position=<-51494, 41507> velocity=< 5, -4> +position=< 10553, 10472> velocity=<-1, -1> +position=<-41174, -20564> velocity=< 4, 2> +position=< 41578, 20816> velocity=<-4, -2> +position=<-51503, -10214> velocity=< 5, 1> +position=<-30824, -30906> velocity=< 3, 3> +position=<-41172, 20816> velocity=< 4, -2> +position=<-41198, 41507> velocity=< 4, -4> +position=< 41578, -30911> velocity=<-4, 3> +position=< 20904, 20817> velocity=<-2, -2> +position=< 51901, 41503> velocity=<-5, -4> +position=< 20872, -30906> velocity=<-2, 3> +position=< 31265, -20560> velocity=<-3, 2> +position=<-10136, -10217> velocity=< 1, 1> +position=< 31246, 20817> velocity=<-3, -2> +position=< 51927, 20820> velocity=<-5, -2> +position=<-30821, -10222> velocity=< 3, 1> +position=<-20492, -10221> velocity=< 2, 1> +position=<-20488, -51596> velocity=< 2, 5> +position=< 41610, -41249> velocity=<-4, 4> +position=< 31257, -30908> velocity=<-3, 3> +position=< 41610, 31160> velocity=<-4, -3> +position=<-10151, 41503> velocity=< 1, -4> +position=<-51527, -10216> velocity=< 5, 1> +position=< 20867, -30903> velocity=<-2, 3> +position=< 31228, 41503> velocity=<-3, -4> +position=<-10160, -41253> velocity=< 1, 4> +position=< 41595, -30907> velocity=<-4, 3> +position=<-51506, 31158> velocity=< 5, -3> +position=<-10142, -10219> velocity=< 1, 1> +position=<-10115, -10222> velocity=< 1, 1> +position=< 10572, -51601> velocity=<-1, 5> +position=< 51899, 20818> velocity=<-5, -2> +position=<-20476, -30910> velocity=< 2, 3> +position=<-41174, 31162> velocity=< 4, -3> +position=< 31246, 41509> velocity=<-3, -4> +position=<-30801, -41253> velocity=< 3, 4> +position=<-10130, 41508> velocity=< 1, -4> +position=<-20473, 10470> velocity=< 2, -1> +position=<-41150, -20565> velocity=< 4, 2> +position=< 31246, 31165> velocity=<-3, -3> +position=< 41610, -41256> velocity=<-4, 4> +position=< 41574, 31164> velocity=<-4, -3> +position=<-41157, -30903> velocity=< 4, 3> +position=< 31241, 10469> velocity=<-3, -1> +position=< 31217, -30912> velocity=<-3, 3> +position=< 10529, 41503> velocity=<-1, -4> +position=< 20901, 51853> velocity=<-2, -5> +position=<-51551, 10472> velocity=< 5, -1> +position=< 41613, 41503> velocity=<-4, -4> +position=<-10134, -41251> velocity=< 1, 4> +position=< 41595, -41253> velocity=<-4, 4> +position=<-51511, 10477> velocity=< 5, -1> +position=<-30837, -10217> velocity=< 3, 1> +position=< 51950, -51602> velocity=<-5, 5> +position=<-51541, 41503> velocity=< 5, -4> +position=< 51907, 51857> velocity=<-5, -5> +position=<-41198, 10469> velocity=< 4, -1> +position=<-30834, 20817> velocity=< 3, -2> +position=< 51947, 31163> velocity=<-5, -3> +position=<-30804, -30912> velocity=< 3, 3> +position=<-30829, -20560> velocity=< 3, 2> +position=< 10547, -30908> velocity=<-1, 3> +position=<-51531, 31166> velocity=< 5, -3> +position=< 51955, 41510> velocity=<-5, -4> +position=<-30861, -30911> velocity=< 3, 3> +position=< 20872, -51596> velocity=<-2, 5> +position=<-30829, 51854> velocity=< 3, -5> +position=<-41150, -10218> velocity=< 4, 1> +position=< 31257, -20560> velocity=<-3, 2> +position=<-20476, 20816> velocity=< 2, -2> +position=<-20468, 10470> velocity=< 2, -1> +position=<-51519, -30911> velocity=< 5, 3> +position=< 51959, 10468> velocity=<-5, -1> +position=< 20888, -51593> velocity=<-2, 5> +position=< 51947, 10475> velocity=<-5, -1> +position=< 31246, 10468> velocity=<-3, -1> +position=<-20516, -41249> velocity=< 2, 4> +position=<-51511, -41248> velocity=< 5, 4> +position=<-41147, 20817> velocity=< 4, -2> +position=<-41150, -51594> velocity=< 4, 5> +position=<-10163, -30908> velocity=< 1, 3> +position=<-10152, -10213> velocity=< 1, 1> +position=<-20460, -30903> velocity=< 2, 3> +position=<-41169, -10219> velocity=< 4, 1> +position=<-51531, -30907> velocity=< 5, 3> +position=<-30812, 41503> velocity=< 3, -4> +position=<-41169, 10477> velocity=< 4, -1> +position=< 10546, 51848> velocity=<-1, -5> +position=<-10139, 20813> velocity=< 1, -2> +position=<-30861, 51851> velocity=< 3, -5> +position=<-20497, -51593> velocity=< 2, 5> +position=< 51949, -20558> velocity=<-5, 2> +position=< 41597, -51595> velocity=<-4, 5> +position=< 51940, 31163> velocity=<-5, -3> +position=< 41589, 10473> velocity=<-4, -1> +position=<-51495, -41257> velocity=< 5, 4> +position=< 31265, -41254> velocity=<-3, 4> +position=< 10527, 10473> velocity=<-1, -1> +position=< 51927, 41509> velocity=<-5, -4> +position=< 20884, 10471> velocity=<-2, -1> +position=<-51493, 41507> velocity=< 5, -4> +position=<-41182, -30912> velocity=< 4, 3> +position=< 10575, 41509> velocity=<-1, -4> +position=< 20884, -20567> velocity=<-2, 2> +position=< 10535, -20560> velocity=<-1, 2> +position=<-51543, 41512> velocity=< 5, -4> +position=<-30825, -10214> velocity=< 3, 1> +position=<-51535, -20559> velocity=< 5, 2> +position=< 10528, -10218> velocity=<-1, 1> +position=<-51538, 41506> velocity=< 5, -4> +position=< 20892, -30905> velocity=<-2, 3> +position=< 31249, -51596> velocity=<-3, 5> +position=< 10539, 20815> velocity=<-1, -2> +position=<-20464, -41248> velocity=< 2, 4> +position=<-41186, -20567> velocity=< 4, 2> +position=<-20492, 20820> velocity=< 2, -2> +position=<-30818, 31165> velocity=< 3, -3> +position=<-10131, -51596> velocity=< 1, 5> +position=< 51919, 20814> velocity=<-5, -2> +position=<-41166, -30905> velocity=< 4, 3> +position=<-10151, 31163> velocity=< 1, -3> +position=< 10522, 10468> velocity=<-1, -1> +position=< 51911, -30912> velocity=<-5, 3> +position=<-41173, 31160> velocity=< 4, -3> +position=< 31260, -41248> velocity=<-3, 4> +position=<-10139, -10220> velocity=< 1, 1> +position=<-30857, -20558> velocity=< 3, 2> +position=< 10531, -10222> velocity=<-1, 1> +position=<-30813, -20566> velocity=< 3, 2> +position=< 51944, -30903> velocity=<-5, 3> +position=<-41198, 20820> velocity=< 4, -2> +position=<-41150, -41252> velocity=< 4, 4> +position=<-20508, 20814> velocity=< 2, -2> +position=< 41554, -41256> velocity=<-4, 4> +position=< 31238, -41248> velocity=<-3, 4> +position=< 20906, -10219> velocity=<-2, 1> +position=< 51912, 41505> velocity=<-5, -4> +position=< 20866, -51602> velocity=<-2, 5> +position=< 10519, 31164> velocity=<-1, -3> +position=<-20479, 51856> velocity=< 2, -5> +position=<-30829, -51596> velocity=< 3, 5> +position=< 51943, -10221> velocity=<-5, 1> +position=< 20917, -41249> velocity=<-2, 4> +position=< 20888, 41507> velocity=<-2, -4> +position=< 51957, 41507> velocity=<-5, -4> +position=<-20499, -10213> velocity=< 2, 1> +position=< 51911, 41503> velocity=<-5, -4> +position=<-51551, -51595> velocity=< 5, 5> +position=<-10139, 51849> velocity=< 1, -5> +position=< 41582, -10222> velocity=<-4, 1> +position=<-41150, 31159> velocity=< 4, -3> +position=< 20888, 41504> velocity=<-2, -4> +position=< 10567, 20821> velocity=<-1, -2> +position=< 51900, -10222> velocity=<-5, 1> +position=<-51503, 20815> velocity=< 5, -2> +position=<-20488, -51596> velocity=< 2, 5> +position=< 51939, -10221> velocity=<-5, 1> +position=< 31270, 10468> velocity=<-3, -1> +position=<-51527, 20816> velocity=< 5, -2> +position=< 51926, 51853> velocity=<-5, -5> +position=<-51543, -20564> velocity=< 5, 2> +position=< 20883, -20558> velocity=<-2, 2> +position=<-41166, 20816> velocity=< 4, -2> +position=< 51936, 41511> velocity=<-5, -4> +position=<-10115, -10220> velocity=< 1, 1> +position=< 31210, -51593> velocity=<-3, 5> +position=<-10115, -41248> velocity=< 1, 4> +position=< 31233, -20559> velocity=<-3, 2> +position=< 20921, -51598> velocity=<-2, 5> +position=<-41185, -30912> velocity=< 4, 3> +position=<-51531, -51600> velocity=< 5, 5> +position=< 10543, -10220> velocity=<-1, 1> +position=< 51924, -30912> velocity=<-5, 3> +position=<-30821, 20813> velocity=< 3, -2> +position=< 10545, -51602> velocity=<-1, 5> +position=<-10126, -41248> velocity=< 1, 4> +position=<-30829, -30907> velocity=< 3, 3> +position=<-51495, 20817> velocity=< 5, -2> +position=< 10548, -41256> velocity=<-1, 4> +position=< 41578, -51599> velocity=<-4, 5> +position=<-41203, -51602> velocity=< 4, 5> +position=< 31253, -10214> velocity=<-3, 1> +position=<-20457, -30908> velocity=< 2, 3> +position=<-10147, 51848> velocity=< 1, -5> +position=<-51502, -20558> velocity=< 5, 2> +position=< 41615, -10222> velocity=<-4, 1> +position=<-41182, -30906> velocity=< 4, 3> +position=< 20912, -10216> velocity=<-2, 1> +position=< 20869, -20566> velocity=<-2, 2> +position=< 10555, 41510> velocity=<-1, -4> +position=<-30835, 10472> velocity=< 3, -1> +position=<-20487, 41505> velocity=< 2, -4> +position=<-20511, -41249> velocity=< 2, 4> +position=< 20913, 20822> velocity=<-2, -2> +position=<-30824, 10469> velocity=< 3, -1> +position=< 10567, 10472> velocity=<-1, -1> +position=< 31238, 31166> velocity=<-3, -3> +position=<-41186, -10219> velocity=< 4, 1> +position=<-41169, -51602> velocity=< 4, 5> +position=< 51947, -20564> velocity=<-5, 2> +position=< 41562, -10219> velocity=<-4, 1> +position=<-10155, 20821> velocity=< 1, -2> +position=< 20884, -51598> velocity=<-2, 5> +position=< 20907, 41505> velocity=<-2, -4> +position=< 10579, 51848> velocity=<-1, -5> +position=< 41586, -30905> velocity=<-4, 3> +position=<-30859, -41248> velocity=< 3, 4> +position=< 20864, 10475> velocity=<-2, -1> +position=< 20876, -30908> velocity=<-2, 3> +position=< 10543, -41248> velocity=<-1, 4> +position=< 31246, -51598> velocity=<-3, 5> +position=<-30833, 41503> velocity=< 3, -4> +position=<-20473, -51595> velocity=< 2, 5> +position=< 31265, -30904> velocity=<-3, 3> +position=<-51493, 31158> velocity=< 5, -3> +position=< 51947, 20821> velocity=<-5, -2> +position=<-41166, -30912> velocity=< 4, 3> +position=<-30813, 41508> velocity=< 3, -4> +position=<-41198, -51601> velocity=< 4, 5> +position=<-10151, 20819> velocity=< 1, -2> +position=< 51907, 51854> velocity=<-5, -5> +position=<-10158, -41254> velocity=< 1, 4> +position=<-41170, -41249> velocity=< 4, 4> +position=< 51907, 51856> velocity=<-5, -5> +position=< 41586, -10216> velocity=<-4, 1> +position=< 31246, -20560> velocity=<-3, 2> +position=<-30826, -10217> velocity=< 3, 1> +position=< 10569, 51848> velocity=<-1, -5> +position=<-20484, -30912> velocity=< 2, 3> +position=< 10559, 41510> velocity=<-1, -4> +position=< 41555, 31167> velocity=<-4, -3> +position=< 20877, -30911> velocity=<-2, 3> +position=<-51549, 20822> velocity=< 5, -2> +position=<-51551, 51856> velocity=< 5, -5> +position=<-10163, 10476> velocity=< 1, -1> +position=<-51530, -10222> velocity=< 5, 1> +position=< 31241, 20817> velocity=<-3, -2> +position=<-51514, 20822> velocity=< 5, -2> +position=<-41155, 31158> velocity=< 4, -3> +position=< 41565, 10468> velocity=<-4, -1> +position=< 51949, 41503> velocity=<-5, -4> +position=< 20874, 10468> velocity=<-2, -1> +position=< 41611, -41253> velocity=<-4, 4> +position=<-30813, -30906> velocity=< 3, 3> +position=< 41574, 41511> velocity=<-4, -4> +position=< 51931, 51856> velocity=<-5, -5> +position=<-20508, -10220> velocity=< 2, 1> +position=< 20891, -41253> velocity=<-2, 4> +position=< 31249, 31159> velocity=<-3, -3> +position=< 41579, 31162> velocity=<-4, -3> +position=<-51527, 51853> velocity=< 5, -5> +position=<-30826, 20819> velocity=< 3, -2> +position=<-20508, 10471> velocity=< 2, -1> +position=<-20472, 10476> velocity=< 2, -1> +position=< 51924, 41507> velocity=<-5, -4> +position=<-30837, -51600> velocity=< 3, 5> +position=<-20487, 41512> velocity=< 2, -4> +position=<-51499, 41512> velocity=< 5, -4> +position=<-51508, -30910> velocity=< 5, 3> +position=<-20483, -20566> velocity=< 2, 2> +position=<-20516, -51596> velocity=< 2, 5> +position=< 20924, -30908> velocity=<-2, 3> +position=<-10144, -41257> velocity=< 1, 4> +position=<-41154, -41257> velocity=< 4, 4> +position=< 51902, -20558> velocity=<-5, 2> +position=< 41610, -10216> velocity=<-4, 1> +position=< 51917, -41248> velocity=<-5, 4> +position=<-20459, 31158> velocity=< 2, -3> +position=< 20884, 31162> velocity=<-2, -3> +position=<-20506, -30908> velocity=< 2, 3> +position=<-51533, -30903> velocity=< 5, 3> +position=<-10168, -30912> velocity=< 1, 3> +position=< 20904, 41506> velocity=<-2, -4> +position=<-51551, 31163> velocity=< 5, -3> +position=<-20500, -51595> velocity=< 2, 5> +position=< 31251, -20561> velocity=<-3, 2> +position=<-41186, -51595> velocity=< 4, 5> +position=<-20496, 31163> velocity=< 2, -3> +position=<-20458, -41257> velocity=< 2, 4> +position=< 41554, -41255> velocity=<-4, 4> +position=<-51511, 31163> velocity=< 5, -3> +position=<-51535, 20821> velocity=< 5, -2> +position=<-30853, -41249> velocity=< 3, 4> +position=< 20912, -51597> velocity=<-2, 5> +position=< 10527, -30903> velocity=<-1, 3> +position=< 41587, 41505> velocity=<-4, -4> diff --git a/2018/d11/ex1/ex1.py b/2018/d11/ex1/ex1.py new file mode 100755 index 0000000..dedbfc5 --- /dev/null +++ b/2018/d11/ex1/ex1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> str: + def cell_power(cell: Point, serial: int) -> int: + rack_id = cell.x + 10 + power = rack_id * cell.y + power += serial + power *= rack_id + return ((power // 100) % 10) - 5 + + def total_power(top_left: Point, serial: int) -> int: + return sum( + cell_power(Point(top_left.x + dx, top_left.y + dy), serial) + for dx, dy in itertools.product(range(3), repeat=2) + ) + + serial = int(input) + cell = max( + map(Point._make, itertools.product(range(1, 300 - 3 + 1), repeat=2)), + key=functools.partial(total_power, serial=serial), + ) + return f"{cell.x},{cell.y}" + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d11/ex1/input b/2018/d11/ex1/input new file mode 100644 index 0000000..197a77e --- /dev/null +++ b/2018/d11/ex1/input @@ -0,0 +1 @@ +1788 diff --git a/2018/d11/ex2/ex2.py b/2018/d11/ex2/ex2.py new file mode 100755 index 0000000..2263bd1 --- /dev/null +++ b/2018/d11/ex2/ex2.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: str) -> str: + def cell_power(cell: Point, serial: int) -> int: + rack_id = cell.x + 10 + power = rack_id * cell.y + power += serial + power *= rack_id + return ((power // 100) % 10) - 5 + + def summed_area(power_map: dict[Point, int]) -> dict[Point, int]: + res: dict[Point, int] = {} + for p in map(Point._make, itertools.product(range(1, 300 + 1), repeat=2)): + res[p] = ( + power_map[p] + + res.get(Point(p.x - 1, p.y), 0) + + res.get(Point(p.x, p.y - 1), 0) + - res.get(Point(p.x - 1, p.y - 1), 0) + ) + assert len(res) == len(power_map) # Sanity check + return res + + def sum_square(top_left: Point, size: int, summed_table: dict[Point, int]) -> int: + bot_right = Point(top_left.x + size - 1, top_left.y + size - 1) + return ( + summed_table[bot_right] + - summed_table.get(Point(top_left.x - 1, bot_right.y), 0) + - summed_table.get(Point(bot_right.x, top_left.y - 1), 0) + + summed_table.get(Point(top_left.x - 1, top_left.y - 1), 0) + ) + + def best_square(summed_table: dict[Point, int]) -> tuple[Point, int]: + return max( + ( + (top_left, size) + for size in range(1, 300 + 1) + for top_left in map( + Point._make, itertools.product(range(1, 300 + 1 - size), repeat=2) + ) + ), + key=lambda t: sum_square(t[0], t[1], summed_table), + ) + + serial = int(input) + power_map = { + p: cell_power(p, serial) + for p in map(Point._make, itertools.product(range(1, 300 + 1), repeat=2)) + } + summed_table = summed_area(power_map) + top_left, size = best_square(summed_table) + return f"{top_left.x},{top_left.y},{size}" + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d11/ex2/input b/2018/d11/ex2/input new file mode 100644 index 0000000..197a77e --- /dev/null +++ b/2018/d11/ex2/input @@ -0,0 +1 @@ +1788 diff --git a/2018/d12/ex1/ex1.py b/2018/d12/ex1/ex1.py new file mode 100755 index 0000000..33f00fc --- /dev/null +++ b/2018/d12/ex1/ex1.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def parse_rules(input: list[str]) -> dict[str, str]: + return {key: val for key, val in map(lambda s: s.split(" => "), input)} + + def parse(input: str) -> tuple[str, dict[str, str]]: + init, rules = input.split("\n\n") + return init.split(": ")[1], parse_rules(rules.splitlines()) + + def step(state: str, rules: dict[str, str]) -> str: + state = "...." + state + "...." + return "".join( + rules.get(state[i - 2 : i + 2 + 1], ".") for i in range(2, len(state) - 2) + ) + + def count_pots(state: str) -> int: + return sum( + i for i, c in enumerate(state, start=-(len(state) - 100) // 2) if c == "#" + ) + + state, rules = parse(input) + assert len(state) == 100 # Sanity check for `count_pots` + for _ in range(20): + state = step(state, rules) + return count_pots(state) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d12/ex1/input b/2018/d12/ex1/input new file mode 100644 index 0000000..e13929b --- /dev/null +++ b/2018/d12/ex1/input @@ -0,0 +1,34 @@ +initial state: #.#.#..##.#....#.#.##..##.##..#..#...##....###..#......###.#..#.....#.###.#...#####.####...#####.#.# + +..#.. => . +#...# => . +.#... => # +#.##. => . +..#.# => # +#.#.# => . +###.. => # +###.# => # +..... => . +....# => . +.##.. => # +##### => . +####. => . +..##. => . +##.#. => # +.#..# => # +##..# => . +.##.# => . +.#### => # +..### => . +...## => # +#..## => # +#.... => . +##.## => . +#.#.. => . +##... => . +.#.## => # +.###. => # +...#. => . +#.### => . +#..#. => # +.#.#. => . diff --git a/2018/d12/ex2/ex2.py b/2018/d12/ex2/ex2.py new file mode 100755 index 0000000..3f3b4a5 --- /dev/null +++ b/2018/d12/ex2/ex2.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def parse_rules(input: list[str]) -> dict[str, str]: + return {key: val for key, val in map(lambda s: s.split(" => "), input)} + + def parse(input: str) -> tuple[str, dict[str, str]]: + init, rules = input.split("\n\n") + return init.split(": ")[1], parse_rules(rules.splitlines()) + + def step(state: str, rules: dict[str, str]) -> str: + state = "...." + state + "...." + return "".join( + rules.get(state[i - 2 : i + 2 + 1], ".") for i in range(2, len(state) - 2) + ) + + def count_pots(state: str) -> int: + return sum( + i for i, c in enumerate(state, start=-(len(state) - 100) // 2) if c == "#" + ) + + def get_diffs(state: str, rules: dict[str, str], iterations: int) -> list[int]: + res: list[int] = [count_pots(state)] + prev_count = res[0] + for _ in range(iterations): + state = step(state, rules) + delta = count_pots(state) - prev_count + prev_count += delta + res.append(delta) + return res + + state, rules = parse(input) + assert len(state) == 100 # Sanity check for `count_pots` + + STEPS = 1000 + deltas = get_diffs(state, rules, STEPS) + # Change in deltas gets into a steady state after some time + average_delta = sum(deltas[-100:]) // 100 + return sum(deltas) + (50000000000 - STEPS) * average_delta + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2018/d12/ex2/input b/2018/d12/ex2/input new file mode 100644 index 0000000..e13929b --- /dev/null +++ b/2018/d12/ex2/input @@ -0,0 +1,34 @@ +initial state: #.#.#..##.#....#.#.##..##.##..#..#...##....###..#......###.#..#.....#.###.#...#####.####...#####.#.# + +..#.. => . +#...# => . +.#... => # +#.##. => . +..#.# => # +#.#.# => . +###.. => # +###.# => # +..... => . +....# => . +.##.. => # +##### => . +####. => . +..##. => . +##.#. => # +.#..# => # +##..# => . +.##.# => . +.#### => # +..### => . +...## => # +#..## => # +#.... => . +##.## => . +#.#.. => . +##... => . +.#.## => # +.###. => # +...#. => . +#.### => . +#..#. => # +.#.#. => .