diff --git a/2022/day17/Makefile b/2022/day17/Makefile new file mode 100644 index 0000000..9fc981a --- /dev/null +++ b/2022/day17/Makefile @@ -0,0 +1,111 @@ +# AOC daily Makefile - GNU make only. +# +# Copyright (C) 2021-2023 Bruno Raoult ("br") +# Licensed under the GNU General Public License v3.0 or later. +# Some rights reserved. See COPYING. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later +# + +INPUT := input/input.txt +SHELL := /bin/bash + +CC := gcc +BEAR := bear +CCLSFILE:= compile_commands.json + +LIB := aoc_$(shell uname -m) +INCDIR := ../include +LIBDIR := ../lib +LDFLAGS := -L$(LIBDIR) +#LDLIB := -l$(LIB) -lm +LDLIB := -l$(LIB) + +export LD_LIBRARY_PATH = $(LIBDIR) + +CFLAGS += -std=gnu11 +CFLAGS += -O2 +CFLAGS += -g +# for gprof +# CFLAGS += -pg +CFLAGS += -Wall +CFLAGS += -Wextra +CFLAGS += -march=native +# Next one may be useful for valgrind (some invalid instructions) +# CFLAGS += -mno-tbm +CFLAGS += -Wmissing-declarations +CFLAGS += -Wno-unused-result + +CFLAGS += -DDEBUG_DEBUG # activate general debug (debug.c) +CFLAGS += -DDEBUG_POOL # memory pools management + +VALGRIND := valgrind +VALGRINDFLAGS := --leak-check=full --show-leak-kinds=all --track-origins=yes \ + --sigill-diagnostics=yes --quiet --show-error-list=yes + + +TIME := \time -f "\ttime: %E real, %U user, %S sys\n\tcontext-switch:\t%c+%w, page-faults: %F+%R\n" +export PATH := .:$(PATH) + +.PHONY: clean all compile assembly memcheck memcheck1 memcheck2 part1 part2 ccls bear org + +all: README.org ccls part1 part2 + +memcheck: memcheck1 memcheck2 + +memcheck1: aoc-c + @$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 1 < $(INPUT) + +memcheck2: aoc-c + @$(VALGRIND) $(VALGRINDFLAGS) aoc-c -p 2 < $(INPUT) + @#@valgrind -s --track-origins=yes aoc-c -p 2 < $(INPUT) + +compile: aoc-c + +cpp: aoc-c.i + +assembly: aoc-c.s + +part1: aoc-c + @#$(TIME) aoc.bash -p 1 < $(INPUT) 2>&1 + @$(TIME) aoc-c -p 1 < $(INPUT) + +part2: aoc-c + @#$(TIME) aoc.bash -p 2 < $(INPUT) 2>&1 + @$(TIME) aoc-c -p 2 < $(INPUT) + +ccls: $(CCLSFILE) + +clean: + @rm -f aoc-c core* vgcore* gmon.out aoc-c.s aoc-c.i README.html compile_commands.json + +aoc-c: aoc-c.c common.c + @echo compiling $< + $(CC) $(CFLAGS) $(LDFLAGS) -I $(INCDIR) $^ $(LDLIB) -o $@ + +# generate pre-processed file (.i) and assembler (.s) +%.i: %.c + @echo generating $@ + @$(CC) -E $(CFLAGS) -I $(INCDIR) $< -o $@ + +%.s: %.c + @echo generating $@ + @$(CC) -S -fverbose-asm $(CFLAGS) -I $(INCDIR) $< -o $@ + +# generate README.org from README.html (must cleanup !) +org: README.org + +%.org: %.html + @echo generating $@. Cleanup before commit ! + @pandoc $< -o $@ + +# generate compile_commands.json +$(CCLSFILE): aoc-c.c Makefile + $(BEAR) -- make clean compile + +bear: clean + @touch .ccls-root + @$(BEAR) -- make compile diff --git a/2022/day17/README.org b/2022/day17/README.org new file mode 100644 index 0000000..88da3ac --- /dev/null +++ b/2022/day17/README.org @@ -0,0 +1,374 @@ +** --- Day 17: Pyroclastic Flow --- +Your handheld device has located an alternative exit from the cave for +you and the elephants. The ground is rumbling almost continuously now, +but the strange valves bought you some time. It's definitely getting +warmer in here, though. + +The tunnels eventually open into a very tall, narrow chamber. Large, +oddly-shaped rocks are falling into the chamber from above, presumably +due to all the rumbling. If you can't work out where the rocks will fall +next, you might be crushed! + +The five types of rocks have the following peculiar shapes, where =#= is +rock and =.= is empty space: + +#+begin_example +#### + +.#. +### +.#. + +..# +..# +### + +# +# +# +# + +## +## +#+end_example + +The rocks fall in the order shown above: first the =-= shape, then the +=+= shape, and so on. Once the end of the list is reached, the same +order repeats: the =-= shape falls first, sixth, 11th, 16th, etc. + +The rocks don't spin, but they do get pushed around by jets of hot gas +coming out of the walls themselves. A quick scan reveals the effect the +jets of hot gas will have on the rocks as they fall (your puzzle input). + +For example, suppose this was the jet pattern in your cave: + +#+begin_example +>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>> +#+end_example + +In jet patterns, =<= means a push to the left, while =>= means a push to +the right. The pattern above means that the jets will push a falling +rock right, then right, then right, then left, then left, then right, +and so on. If the end of the list is reached, it repeats. + +The tall, vertical chamber is exactly /seven units wide/. Each rock +appears so that its left edge is two units away from the left wall and +its bottom edge is three units above the highest rock in the room (or +the floor, if there isn't one). + +After a rock appears, it alternates between /being pushed by a jet of +hot gas/ one unit (in the direction indicated by the next symbol in the +jet pattern) and then /falling one unit down/. If any movement would +cause any part of the rock to move into the walls, floor, or a stopped +rock, the movement instead does not occur. If a /downward/ movement +would have caused a falling rock to move into the floor or an +already-fallen rock, the falling rock stops where it is (having landed +on something) and a new rock immediately begins falling. + +Drawing falling rocks with =@= and stopped rocks with =#=, the jet +pattern in the example above manifests as follows: + +#+begin_example +The first rock begins falling: +|..@@@@.| +|.......| +|.......| +|.......| ++-------+ + +Jet of gas pushes rock right: +|...@@@@| +|.......| +|.......| +|.......| ++-------+ + +Rock falls 1 unit: +|...@@@@| +|.......| +|.......| ++-------+ + +Jet of gas pushes rock right, but nothing happens: +|...@@@@| +|.......| +|.......| ++-------+ + +Rock falls 1 unit: +|...@@@@| +|.......| ++-------+ + +Jet of gas pushes rock right, but nothing happens: +|...@@@@| +|.......| ++-------+ + +Rock falls 1 unit: +|...@@@@| ++-------+ + +Jet of gas pushes rock left: +|..@@@@.| ++-------+ + +Rock falls 1 unit, causing it to come to rest: +|..####.| ++-------+ + +A new rock begins falling: +|...@...| +|..@@@..| +|...@...| +|.......| +|.......| +|.......| +|..####.| ++-------+ + +Jet of gas pushes rock left: +|..@....| +|.@@@...| +|..@....| +|.......| +|.......| +|.......| +|..####.| ++-------+ + +Rock falls 1 unit: +|..@....| +|.@@@...| +|..@....| +|.......| +|.......| +|..####.| ++-------+ + +Jet of gas pushes rock right: +|...@...| +|..@@@..| +|...@...| +|.......| +|.......| +|..####.| ++-------+ + +Rock falls 1 unit: +|...@...| +|..@@@..| +|...@...| +|.......| +|..####.| ++-------+ + +Jet of gas pushes rock left: +|..@....| +|.@@@...| +|..@....| +|.......| +|..####.| ++-------+ + +Rock falls 1 unit: +|..@....| +|.@@@...| +|..@....| +|..####.| ++-------+ + +Jet of gas pushes rock right: +|...@...| +|..@@@..| +|...@...| +|..####.| ++-------+ + +Rock falls 1 unit, causing it to come to rest: +|...#...| +|..###..| +|...#...| +|..####.| ++-------+ + +A new rock begins falling: +|....@..| +|....@..| +|..@@@..| +|.......| +|.......| +|.......| +|...#...| +|..###..| +|...#...| +|..####.| ++-------+ +#+end_example + +The moment each of the next few rocks begins falling, you would see +this: + +#+begin_example +|..@....| +|..@....| +|..@....| +|..@....| +|.......| +|.......| +|.......| +|..#....| +|..#....| +|####...| +|..###..| +|...#...| +|..####.| ++-------+ + +|..@@...| +|..@@...| +|.......| +|.......| +|.......| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|..@@@@.| +|.......| +|.......| +|.......| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|...@...| +|..@@@..| +|...@...| +|.......| +|.......| +|.......| +|.####..| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|....@..| +|....@..| +|..@@@..| +|.......| +|.......| +|.......| +|..#....| +|.###...| +|..#....| +|.####..| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|..@....| +|..@....| +|..@....| +|..@....| +|.......| +|.......| +|.......| +|.....#.| +|.....#.| +|..####.| +|.###...| +|..#....| +|.####..| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|..@@...| +|..@@...| +|.......| +|.......| +|.......| +|....#..| +|....#..| +|....##.| +|....##.| +|..####.| +|.###...| +|..#....| +|.####..| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ + +|..@@@@.| +|.......| +|.......| +|.......| +|....#..| +|....#..| +|....##.| +|##..##.| +|######.| +|.###...| +|..#....| +|.####..| +|....##.| +|....##.| +|....#..| +|..#.#..| +|..#.#..| +|#####..| +|..###..| +|...#...| +|..####.| ++-------+ +#+end_example + +To prove to the elephants your simulation is accurate, they want to know +how tall the tower will get after 2022 rocks have stopped (but before +the 2023rd rock begins falling). In this example, the tower of rocks +will be =3068= units tall. + +/How many units tall will the tower of rocks be after 2022 rocks have +stopped falling?/ diff --git a/2022/day17/aoc.h b/2022/day17/aoc.h new file mode 100644 index 0000000..fcd9246 --- /dev/null +++ b/2022/day17/aoc.h @@ -0,0 +1,17 @@ +/* aoc.c: Advent of Code 2022 + * + * Copyright (C) 2022-2023 Bruno Raoult ("br") + * Licensed under the GNU General Public License v3.0 or later. + * Some rights reserved. See COPYING. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ +#ifndef _AOC_H_ +#define _AOC_H_ + +extern int parseargs(int ac, char**av); +extern int testmode(void); +#endif /* _AOC_H_ */ diff --git a/2022/day17/common.bash b/2022/day17/common.bash new file mode 100644 index 0000000..55db188 --- /dev/null +++ b/2022/day17/common.bash @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# +# common.bash: Advent of Code 2022, common bash functions +# +# Copyright (C) 2022-2023 Bruno Raoult ("br") +# Licensed under the GNU General Public License v3.0 or later. +# Some rights reserved. See COPYING. +# +# You should have received a copy of the GNU General Public License along with this +# program. If not, see . +# +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=2034 +export cmdname=${0##*/} +export debug=0 +export res +export LANG=C + +shopt -s extglob +set -o noglob + +usage() { + printf "usage: %s [-d DEBUG] [-p PART]\n" "$cmdname" + exit 1 +} + +checkargs() { + local part=1 + while getopts p:d: todo; do + case "$todo" in + d) + if [[ "$OPTARG" =~ ^[[:digit:]+]$ ]]; then + debug="$OPTARG" + else + printf "%s: illegal [%s] debug level.\n" "$CMD" "$OPTARG" + exit 1 + fi + ;; + p) + if [[ "$OPTARG" =~ ^[12]$ ]]; then + part="$OPTARG" + else + printf "%s: illegal [%s] part.\n" "$CMD" "$OPTARG" + exit 1 + fi + ;; + *) + usage + ;; + esac + done + # Now check remaining argument (backup directory) + shift $((OPTIND - 1)) + + (( $# > 1 )) && usage + return "$part" +} + +main() { + local -i part + + checkargs "$@" + part=$? + parse "$part" + solve "$part" + printf "%s: res=%s\n" "$cmdname" "$res" +} diff --git a/2022/day17/common.c b/2022/day17/common.c new file mode 100644 index 0000000..b7363c0 --- /dev/null +++ b/2022/day17/common.c @@ -0,0 +1,59 @@ +/* common.c: Advent of Code 2022, common functions + * + * Copyright (C) 2022-2023 Bruno Raoult ("br") + * Licensed under the GNU General Public License v3.0 or later. + * Some rights reserved. See COPYING. + * + * You should have received a copy of the GNU General Public License along with this + * program. If not, see . + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include +#include +#include + +#include "aoc.h" +#include "debug.h" + +static int _testmode = 0; + +static int usage(char *prg) +{ + fprintf(stderr, "Usage: %s [-t][-d debug_level] [-p part] [-i input]\n", prg); + return 1; +} + +int testmode(void) +{ + return _testmode; +} + +int parseargs(int ac, char **av) +{ + int opt, part = 1; + + while ((opt = getopt(ac, av, "td:p:")) != -1) { + switch (opt) { + case 't': + _testmode = 1; + break; + case 'd': + debug_level_set(atoi(optarg)); + break; + case 'p': /* 1 or 2 */ + part = atoi(optarg); + if (part < 1 || part > 2) + return usage(*av); + break; + case 'i': + + default: + return usage(*av); + } + } + if (optind < ac) + return usage(*av); + return part; +} diff --git a/2022/day17/input/example.txt b/2022/day17/input/example.txt new file mode 100644 index 0000000..97a1aa1 --- /dev/null +++ b/2022/day17/input/example.txt @@ -0,0 +1 @@ +>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>> diff --git a/2022/day17/input/input.txt b/2022/day17/input/input.txt new file mode 100644 index 0000000..b2f8a7a --- /dev/null +++ b/2022/day17/input/input.txt @@ -0,0 +1 @@ +>><<<>>>><<<><>>><><<<<>>>><>>>><<<<>><<<<>>>><<<<>>>><<<>>>><<<>><<<<>>><<<<><><<>>><>>>><<<>>><<><<<><<<>>><<>>><<<><<><<>><<>><<<>>>><<<<><<>>>><>><<<>><<>>><<<>>>><<<<>>><<>>><><<<>>><<>>>><>>><<<<>>>><<>><<<<><<<<>><<<<>>><<>>><<<<><>>>><<<><<<<>><>>><<<<><<>>><>><<><><<>>><<<>>><<<<><<>>><><<<>><><<<<>><><<<>><<<>><>><>><<><<<<>>>><<<<>>><><<<><<>>>><<><<>><<>><><<<>>><>><<<>><<<><<><><<>>><<>>>><<<<>>>><<><<>><<<><<>><<<<><>>><>><<>>>><<<<>>><<<>>><<<>>><>>><>>><<<<>>><<<<><<<<>>>><>><<><<>><<<><><>>>><>>>><<<><<<><<<><<>><<<>>><<<>>><<<>>>><<>>><<<>><<<>>><<<<><<<><<>><<<><<>>><<<<>><<<><<<>><<<>><<>>>><<>><>><<<><<<<>>>><><<>><<>>><<><<>>><<>>>><<>>><<><<<<>>><<<>>><><<<>><<><<<><>>>><<>>><<<<>>>><<>>><<<<><<<<>>><<<<>><<><<<<><<><<<><<<<><><<>>>><<>>>><>>><<>>>><<<<>><><<<>>>><<>>><<<>>>><<>><<>><<<<>>><<<>><<>><<<<>>><>>>><<<>>>><<<>><<<<>><<>>><<<>>><<>><<<><<<>>>><<>>><>><<>>>><<>>><>><>><<<<>><<<<>>>><<>><<<>><<<>>><<<>><<>>><<>>>><<>><<>><<><<<<><<<>>>><>><>><<<<>><>><<>>>><<<>><>>><<>><>><>>>><<<<>>><<<>>><>><<<<>>><<<<>>><><<<><<<><<<>>>><<<<><>>>><<><<<>>>><<>>>><>><>>><<<>>>><<<>>>><>>><<<<>>><<<><>>><>>>><<<>><><<<<>>><<<<>><<<><<<<><<<>>><<<<>>><<<<>><<<><>>><<<><<>><<<<>><<<<>>><<>>><<<>>><<<<>>><>><<<>>>><<<<>><<<>><>>><<<>>>><>>>><<><<<>>>><>>>><<<<>>><<<<><<<><<<>>>><<<>><<<<>>>><<<<>>>><<<<><<<>><>>><><<<<>><<<<>>>><<>><<>><<>><<<>>>><<>><<<<><<<<>><>><<<<>>><<<>>><<<>>><<<<><<>><<<<><<>>><<<>>><<<>><><>><<>><<<<>>><<<<>>>><<<>><>>>><<<<><>>>><>>><<<<>><<>>>><<<<>>><<<>>>><>>><<<><<><<<>><>>>><<<>><<<<>>><>>><<<>><>><<<>>>><<<<>>>><<>><<<>>><<<<>>><<<<><>><<<>><<<>><<<>>><>>><<<>><<<<>>><<<<>>><<<<>>><<<<>><<<<>><<<<>>><<<<>>>><<<>><<<>>><<>>>><<>><<<>>>><<<>><<>>>><<<>><<<<>>><<<<><<>>><>><>>>><<>>>><<<<><<<><<><<<><<<<>><><<<><<<>><<<><<>><<<<>>><<<>><<>>>><><<<><><>><>><<<<>><<><>><<<>>><<<>>>><<<><<<>><<>><<>>>><<<<><<>><>><<<>>>><<><<<>>><>>>><<<<>>>><<>>><<>>><<<>>>><<<>>>><<>><<<>>>><<<<>><<<>><<<<>><>><<>><<<>><<<>><<>>>><<<>><<<>><<<<>><<<<>><<<<>>><<<><<<><<<<>>>><<><<<<><<>><>>><<<<>>><<<<><<<<><<<>>><<<><<<>>>><>>><<>>>><>><><<><<<<>>><<<>>><>><<><<<>><<<<>>>><<>>><<<<>><<<><<<>>><<>>><>>>><<>>><<<<>><><<>><<><<>>>><<><<<<>>><<<>>>><>>><<>>><<>>><<>><<<><<<<>><>>>><>>><<<><<<<>>>><<<<>>><>>>><<<<>>><<<><>><><<<<>>><<>>>><<>>><<<>><<>>>><<<>>>><<>>><<>>>><>>><<<<>>>><<<<>>><><<<<>>>><><<<<>><<>>>><<><<>>>><<<><><>>>><><<<<>><<<<>>><<>><>><<<><<<<>>>><<<>>><<<<><<>>>><<<>>>><<<<>>><<<><<<>><<<>>>><<<<>><>>>><<<>><<<>><>>>><<>>>><><<<>>><<<>>>><><<>>><<<><<<><>>>><<>>><<<>>>><><>><><>>>><><<<<><<>><<<>>><>>><<<<>>>><<<<>>>><<<<>>><<><><<>>><<<<>><>>>><<>>><<<>>><<<<>>><<<<>><>><<<<>>>><<>><<>><<<<>><<<<>>>><>>><<<>>>><<<>><<<<>>>><>>>><<>><>>>><>>><<>>>><<<>>>><<<<>><<<<>>>><<<><<<<>>><>>><<<<>><<<<>><>>><>><<<<><<<>><<<><<>><>>>><<<<>><><<<><>>><<<><<>><<<<>>>><<><<<>>><<>><<<><<><<<<>>><<<<><<<><<<>>><>><<<><<<>>>><>>>><<<>>>><<<<>>>><<<>>><><<>>>><<>>>><><<>>><>>>><<<>>><>>>><<<><<<<>><<<>>><<><<><>>>><<<>>><><<<>>><>><>>><<<<>>><<><<<<>>><<<<>>><<>><<>>><<<><<<<>>><<><<<>>>><<<<>>><<<>><>>><<<>><<<>>><>>>><<>><<<<><<>>>><<>>>><<<><<>>>><><>><>>><>><<>><<<<><<><<>>>><>><<<>>><>>><>>>><<<>>>><<<>><<<>><<>><><<<<><<<<>>>><<>>>><<>><<<>><<>><<<<><<<>><>>>><<>>><<<<>><>>><<<<>><<<<>>><<<<><<<>><<<>>>><<<>>><<<>>>><<<<><<<<>>>><<>><<>>><<<><<<>>>><<>>><>><<>>>><<<>>>><<>>>><>>><>>><<>><<<<><<<<>><<<<>>><<<<>><>><<<>><>>>><><<<<>>>><>><<<>>>><<<><<>>><<><><<<>>><>><<><>>><<<<><<>><<<>><<<>>><<>>><<<>>><<<><<>><>>>><>><<<<>><><>>><>>>><>>><<<>>><<>><<<><>>><>>><<>>>><<<><<<<>>><<<<><<>><<<>>>><<<>>><<<><>>>><><<><<<<>>><<<<>><<<<>><<>>><<>>>><>>>><<<><<<><>>>><>><<>>><<>>>><<<<><>><><<<><<<>>><<<<>><<<><<<><>>><<<>>><>>><<<<>>><><>>>><<<<><<<<>>><<>>><<>>>><<<<>>>><>>><><<>>>><><<<>>><<<>>>><>><<>>><<<>>>><>>>><<<<>>>><>><<<>>>><>><>>>><<><>>><<>>><>>>><<<>>>><<<<><<<<>>><<<<>>>><><>><<><<><<<<>>>><<><<>><<>><<<>><<<<>>>><><><<>><>>>><>>><<>>><<>><<<<>><<>><<<<>>>><>>>><<>>>><<<>>>><<<<>>>><<>>><><<<<>>><<>><>>><<>>>><<<<>>><<<<>>><<>>><<><<<<>>><>>>><<<>>>><<<<><>>>><<<<>><<<<>>>><<>><<<>><<<<>>><<<<>><<<>><>>><<<>>>><>>>><<<><<<>>>><<<>>><<<<><<>>><<<>>><<>><><<<<>>>><<><<<>>><<<>>><<<>>><<<<>><<<<>><<<<>>>><<<><>><<><<<<>>>><<<<>><<<>>>><><<<>>><<<><>>>><<>>>><<<<>>>><<<<>>><<>><<<>>><<><<>>><<<>>>><<<<><<<<>>>><<<>>>><<<>>>><<><<<>>><<<>>><>><<>>><<<><<<>>>><<<>>>><<>>>><<<<>>>><<>>><>>><<<<>>><<<<><<<>>><<<><<<<>>>><><<>>><>>>><<>>>><<<>>><>><<<>>><<<>>><<>>>><<<<><<>><<>>>><<<<>><<>>>><>><<<<>>>><<><<<><>>>><<<<><<<>><<>>>><>><<>><<<<>>>><<<<>><<>>>><<>>><><<<<>><><<<<><<<<>>>><><>><<<<>><<<>>><>><<<><<<>><<<<>>>><>>><<<<>>><<<<><<>>><<<<>>><<<<><<<<>>>><>>>><<<>>>><>>><<>>>><<<<>><<><<<>>><<<>>>><<><<<<>>><>><<>>>><<<<>><><>><<><>><>>><<><<<>><<<<><>>><<<<>>><>>><>>>><>>><<>>>><<<<>>>><<<<>><>><<<<><<<<><<<<>><<<>>>><<<><<<>><>>><>>><<>>><<<<><<><<>>><<<>><<<>>><><<>>>><<<<>>><<<>>>><<>><<<>>>><<<<>>><<<<>>><>>><<<>>><<>><<<>>>><>>>><<>>><>><>><<>><<>>><<<<>>>><><><<>>>><<<>>>><<><<<>>>><>><>>><>>><<>><>>>><>><<>>><<<<>>><<<>>><<<>>>><<><<<>><><<>><>>>><<>>>><<<<>>>><>><><<<<>><<>>>><>><><>>><<<>>><>>>><>><<<<>><>><>><<<>>><><<>><>><<>><<<<>>>><><<>>><<<>>>><><<<><<<<>>>><>>><<>>><<<><<<<>><<<>>>><<<>>><<<>><>><<<<><<<<><<<>>>><<<>>><<><<<>>><<<<>>>><<<>>><><<<>><<<><<>>>><><>>><<<><<<>><<>>>><<<>><<<<><<><<<<>>><<>>><<<<>>>><<<>>>><<<<>>><<<<>><>><<>>><<><<<>>>><<<>><<<<><<>>>><<<<>><<<<>><<>>>><><<<<>><<<<>>><<<<>>>><<>>>><>>>><<>><<>>><<<>><<><<<>>>><<>>>><<<>><<<><<>><<><<<>><<<<><<>>>><>>><<>>>><<<><<>>>><<<>>>><<<>><<<<>>>><<<<>><<<<>><>>><>>>><<>>>><<><<>>><<<<><<>>>><>><<>><>>>><<<<>>><<<<>><<<<>>>><<<<><<<<><<><<><><<>>>><>><>>><<<<>><<>>><>>>><><<<><<>><<<>>>><<<<>><<<<><<>><<<><<>><<<>>><>><<<>><<>>>><<>><><><<<>>>><<<><<<>>>><>><<<>>><<<>>>><<>>>><<<<>>>><>><<<>><<<>>>><<<<>>>><>><<<<><<<>>><<<<>>><<>>><>>>><><>>>><<>>><<<>>>><>><<<<>>>><<>>><<><<><<<<>>>><<<><<<<>>>><<>>>><<<><<>>>><<<<>>>><<<<>>>><<<>>><<<<>>><<<><<<><<<>><<>><>>><<><<><<<<>><<<<>>>><<<<><<>>>><<<>><<<>>><<<>>><<<<><<<<>>><<<<>><<<>><>>><<>>><<<<>>><><<><<<>>><>><>>><<<>>>><<<>>><<<<>>>><<<>>><<<><<<><<<>>>><>>>><<<<>>><<>>><<>>>><<<><<<>>><<<>>>><<<<><<<<>>><<>><>>>><<<<><>><>><<>>><<><<<>>>><<<<>><<<<>><<>>>><<<<>>><<<<><>><<<>>>><<<<>>>><<<>>><<>>><<>>><><>>><><<<<><<<<>><<><><<><<<<>><<<>>>><<>>><<<<>><<<>>><<<<>>>><<<<>>>><<<>><<<><<>>><>>><<<<>><<>>><>><<<<>>><<<<>>>><<>><>>>><<<<>>><>><>><<<>>>><<<>>><<<>><<<<>>>><<<>>><<<>>>><<>><>>><<<<>>><<>><<<><<<>><<<>><<<>><<<<>><<<><<>>><><<<>>>><<<<>>><>>><<>>>><<<><<>>><>>>><><<>><<>><<<<>><<<<>>><<<>>>><>>>><<<><><<<<>><<>>>><<<<>>>><<<>>><<<<>>>><<<>>><<>>><<>>>><<>>><>>>><<<>><<<><>><<<><<><>>><>>>><<<>>><<>>>><<>><>><>>>><<<<>><<>>>><<><<>>><>><<<<><<><<<>>>><<<<>>><>>>><<<>>><<<<><<<>>>><<>>>><<<<>>>><<><<<<><><<>>><<<<>><>><<<>><<><>><<>>>><<<<><<<><<<>>><<<><<>>><<>>>><><<>>>><<>><>>>><<<<>>>><>><<><<<<>>>><<<<>>><<<>><<<>>><<>>><<<<><>>><<><>><<<<><>>>><<<>>><<<<><<><>><<<>>>><<><><><<>><<>>>><<<<>>><<<>>>><<<>><>>>><>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>><>>>><<>>>><<<>>><<<<>><<<>><<><<>><>>>><<<><<<>>>><<<>>><<<>>>><<<>>>><<<>>>><<<<>><<<<>>><<<>>>><<><<<<><<<<>>>><<<<>><<<<>>>><<<>>><<<<>><<<<>>>><><<<<><<<<><>><<<>><<<><<>><<><<<>><<>><<>>>><<>>><>>><<<<>>><<<<>><<<<>>>><<<>>>><>><>>>><>>>><<>>><<<>><<>>><<<<><<<<>>><<<>>>><<><<>><<<<>><<<><<<>>><><<<<>><<<<>><<<>>>><>>>><<>>><<<<>>><<<<>>><<>>>><<<>>><<<<>>>><<<<>>><<<><><<<>>>><<<>><>>>><<<<>><<><<><<<><<<><>><<>>>><<<><<<<>><>>>><<>>>><>>><<<<>>><<<<>><<>>><<<>>><<<<>><<<<>>>><<<><>>><<<<>><>><<<><<<>>>><>>><<<<>>><<<>><>><>><<<>>>><<>>>><<<><<>>><<<<>>>><<>>><<<>><<<<>>><<>>><<<<><<<<>>>><<>>>><<<<>>>><<<<>>>><<><<<>><<<<>><<<>><<<>><<<<>>><>>><<<><>>>><<<<>>>><<>>>><<<>><<<<><><<<<>>><<<<>>>><<>>><<>>><<<>><<<<>>>><<<<>>>><>><>><<<<>>>><<<>>>><<><<<><<>><<<<>><<<>><<<<>><>>>><<<<>>>><<<<>>>><<<>>>><<<<>>><<>>>><<>>>><><<<>><<<>>><<<><<>>><><<<><>>>><<<<>>><>><>><<>>>><<<<>>>><<<<>>><>><<<<><<>>><>>>><<>><<>>>><<>>><<<<>>><<<>>><>><<<>><<<>>>><<<>><<<>><<>>><>><<<<>>><<<<>><<<><<<>><<<<>>>><<><<<>>><<<<>>><<><<><>>>><<<>>><<<>>>><<<>><<<>><<<<>><<<<>>><<<<>>>><<<>>><<<>><<<<>><<<>>>><><<><<><>><<<>>><<>>><<<<>>>><<<<>>><<<><<>><<<><<<<>><<<<>>><<<<><>>><<<>><<><><<<>>>><<<<><<<>>><<<>>>><<<<>>>><<<>><<<<>>>><<<><<<<>><<>>>><<<>><<>>>><<><<<>>>><><>><<<<>>><><<<>>>><<<><<><<>>><<<<>>><<<>><>><<<><<<>><<<<><<<<>><<<<><<<<>><><><<<><>>><>>><>>>><<<<>>>><<<>>><><>>>><<<<>>><<<>>><<<<>><<<>><<<><<><<><<>>>><><<<>><<><>>><<<<>>><<<<>>><<><<<<>><<<<><<<><<<>>>><<<>><<<>><<<<>><<<<><<<>>>><<<<><<<<>><<<<><<<<>>><<<<>>><>>><<<<>><<>>>><<<>>>><<<<>>><<>><<<<>><>>><>>>><<><<>>>><<>><>>>><>>><>><<>>>><<<<>>>><<<<><<<<><<<>>><<<>><<<<>>><><<<<>><<<<>><><<<<>>><<<<><<><<><<>><<<><>>>><<<<>><>><<>>>><<<>>>><>><>><<>>>><>><><<<>><><>>><<>>><<>><>>><>>>><<<<>><<>>><<>>><>><<<>>>><<<>><<<>>>><<<<>><<<<>>><<<>>>><<<<>>><>>><><<<<>>><>><<<>><<<<><<><<<>><<>>><<><<<<>>><<<>>><<<><>><><<<<>>>><<<><<><>><<>>>><<<>>><<<>>><<<><>><><<>>><<><<>>><><<>>>><>>><<<<>>><<>>><<<<><>><<<><><<<<><<>>><<>>>><<<>>><<<>><<>>>><<<><<<>><<>>>><<>>><<<<>>><<<>>>><<>>>><<<<><<>><<>><<><>>><<><<<<>><<>><<<>><<<<><><<<<>>><>><<<<>>>><<<>>>><<<<>><>>>><>>>><<<<><<>>><<<<>><<<<>><<<>><<<>><><<<<><<><<<><>>>><<<<>>>><>><><>><<<<><<>>>><<><>><<>>><<<<>>>><<<<>>>><>>>><<>>><<<>>>><<>>><<<>>>><<<<>><<<><>>>><<>><<>>><><<>><<<>>>><><<>>>><<<>><<<<>>><><>>><<<><<>>><<<<>><<<>><>><<<>>><<<<>><<<<><<<<>>><<<<>>>><><<<<>><<<<>><<<><<>><<><<<>><<<>><<>>>><>><>><<>>><<><<>>>><>>><<><<<><<>><<>><<><>>>><<>>><<><<<>>>><<<<><<>>>><<><<><<<>>><<><<<>><<<<>><<<<><<>><<<>>><<>>><<<<>>><<>><<<>>>><<<<>>>><>>>><<<<>><<>><<<<>>><<><<<>>>><<<>><<<<>><<<>>>><>><<>>>><<<<>>><<<<>>>><>>>><<<<>><>>>><<<<><<<<>>><<>>><<<<>><<>>>><><<>><<>>><<<>><<<<>><>>><>>>><>>><<<<><>>>><<<>><>>><<<<>><<<>>><<<><<<>>><<<<>>>><<<>>>><>>><<>><<>><<>>><<<<>>>><<<<>>><<<>><<><<<>><>><<<>>>><<<>><<<>><<<>>>><<<><>><<<>>>><<>>>><<>>><<<>>><>>>><<<<><<<<>>>><<>><<<<><<<<>>><<>><<<>><>>><>>>><<<<>>>><<<>><<>>><>>>><<>><<>>><<><<><<>>><<>><<<>>>><<>>>><<<<>>>