diff --git a/2023/AdventOfCode/AdventOfCode.csproj b/2023/AdventOfCode/AdventOfCode.csproj
index ede0348..f31cc69 100644
--- a/2023/AdventOfCode/AdventOfCode.csproj
+++ b/2023/AdventOfCode/AdventOfCode.csproj
@@ -27,6 +27,10 @@
Always
+
+
+ Always
+
diff --git a/2023/AdventOfCode/Day13/Day13.cs b/2023/AdventOfCode/Day13/Day13.cs
index 47f558d..8bebd23 100644
--- a/2023/AdventOfCode/Day13/Day13.cs
+++ b/2023/AdventOfCode/Day13/Day13.cs
@@ -69,7 +69,6 @@ private static (int Summary, int Fixed) SummariseTerrain(string input)
return (Summary: result.Sum(r => r.Summary), Fixed: result.Sum(r => r.Fixed));
}
-
private sealed class Grid
{
private readonly string[] _rows;
@@ -113,13 +112,12 @@ public static int FindNewSummary(string[] toCheck, int originalSummary, int summ
{
var candidates = new List<(int Position, int Index)>();
for (var p0 = 0; p0 < toCheck.Length; p0++)
+ for (var p1 = p0 + 1; p1 < toCheck.Length; p1++)
{
- for (var p1 = p0 + 1; p1 < toCheck.Length; p1++)
- {
- var (differs, index) = DiffersByOne(toCheck[p0], toCheck[p1]);
- if (differs) candidates.Add((p0, index));
- }
+ var (differs, index) = DiffersByOne(toCheck[p0], toCheck[p1]);
+ if (differs) candidates.Add((p0, index));
}
+
foreach (var (pos, index) in candidates.Distinct())
{
diff --git a/2023/AdventOfCode/Day14/Day14.cs b/2023/AdventOfCode/Day14/Day14.cs
new file mode 100644
index 0000000..2ad6de5
--- /dev/null
+++ b/2023/AdventOfCode/Day14/Day14.cs
@@ -0,0 +1,122 @@
+using Grid = char[][];
+
+namespace AdventOfCode.Day14;
+
+public sealed class Day14(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day14";
+
+ private readonly string[] _example =
+ [
+ "O....#....", // 10
+ "O.OO#....#", // 9
+ ".....##...", // 8
+ "OO.#O....O", // 7
+ ".O.....O#.", // 6
+ "O.#..O.#.#", // 5
+ "..O..#O..O", // 4
+ ".......O..", // 3
+ "#....###..", // 2
+ "#OO..#...." // 1
+ ];
+
+ [Fact]
+ public void ExampleOne() => CalculateInitialLoadSum(_example).Should().Be(136);
+
+ [Fact]
+ public void PartOne() => WriteOutput(CalculateInitialLoadSum(Input));
+
+ [Fact]
+ public void ExampleTwo() => StressLoad(_example).Should().Be(64);
+
+ [Fact]
+ public void PartTwo() => WriteOutput(StressLoad(Input));
+
+ private static int StressLoad(string[] input)
+ {
+ var states = new Dictionary();
+ var grid = input.Select(i => i.ToCharArray()).ToArray();
+ var maxCycles = 1_000_000_000;
+ var cycle = 1;
+ while (cycle <= maxCycles)
+ {
+ for (var i = 0; i < 4; i++)
+ {
+ grid = Tilt(grid);
+ grid = Rotate(grid);
+ }
+ if (states.TryGetValue(grid.Hash(), out var g))
+ {
+ var cycleLength = cycle - g;
+ var numCycles = (maxCycles - g) / cycleLength;
+ cycle = g + (numCycles * cycleLength);
+ }
+ states[grid.Hash()] = cycle;
+ cycle++;
+ }
+
+ return CalculateLoad(grid);
+ }
+
+ private int CalculateInitialLoadSum(string[] input)
+ {
+ var grid = input.Select(i => i.ToCharArray()).ToArray();
+ grid = Tilt(grid);
+ return CalculateLoad(grid);
+ }
+
+ public static int CalculateLoad(Grid grid)
+ {
+ var load = 0;
+ for (var y = 0; y < grid.Length; y++)
+ for (var x = 0; x < grid[y].Length; x++)
+ {
+ if (grid[y][x] == 'O')
+ load += grid.Length - y;
+ }
+
+ return load;
+ }
+
+ public static Grid Rotate(Grid grid)
+ {
+ var newGrid = Enumerable.Range(0, grid.Length)
+ .Select(y => new char[grid[y].Length])
+ .ToArray();
+ var yy = grid.Length;
+ for (var y = 0; y < grid.Length; y++)
+ {
+ var xx = grid[y].Length;
+ for (var x = 0; x < xx; x++)
+ {
+ newGrid[x][yy - y - 1] = grid[y][x];
+ }
+ }
+
+ return newGrid;
+ }
+
+ public static Grid Tilt(Grid grid)
+ {
+ for (var y = 0; y < grid.Length; y++)
+ for (var x = 0; x < grid[y].Length; x++)
+ {
+ if (grid[y][x] != 'O') continue;
+ var yy = y;
+ while (yy > 0 && grid[yy - 1][x] == '.')
+ {
+ grid[yy][x] = '.';
+ grid[yy - 1][x] = 'O';
+ yy--;
+ }
+ }
+
+ return grid;
+ }
+}
+
+public static class GridExtensions
+{
+ public static string Hash(this Grid grid) =>
+ string.Join(Environment.NewLine, grid.Select(g => string.Join("", g)));
+}
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day14/input.txt b/2023/AdventOfCode/Day14/input.txt
new file mode 100644
index 0000000..89b68da
--- /dev/null
+++ b/2023/AdventOfCode/Day14/input.txt
@@ -0,0 +1,100 @@
+.O#O..##...#O#.#.......##.....O..#.O##.O#......O.........#....O.O..........#...O...#O.#.OO...OO.....
+..............O.#OO..#.#..O..#O..OOO...O......O......O.....O.##.#O.#.O...#....O.#O.O......#OO.O....#
+O.#.O.#..O..OO.#O.#.#.O.......O#.O#..#..#..#......O#..O.#...#O..O.........................#..O..#.##
+....OO..O......OO...O.O.#...###.#.OO.#.OO.#O.....O#....#..#....O....##.O....#O...O...#.#.O#.#O.O#...
+......O#...O..........#..#O...O...O...#.#.#.......O....#....#O....O..O#..O.#..O##..O..#....#..O.O#..
+....O...O..O.#...O.O.....#..#....O.O.##O.#..O......OO..#......O.#O.#O..#.###...#O#..........O....OO#
+#......#.O....#O.#.#O.#.#.O......O##O.##O#.#.......OO.#......O.##.O.###.#......#..###.....O.O.OOO#..
+.#.#.#........#........O..O.O#O.O.O#OO....O#.O..O.....O.O....O#O.O##....#...O#.......#.#O...#..#O..O
+.O.#.O.#...O...O#.OO.........#...O#O..OO..O#..O.O.O#..O#...O...OO#O...#..O...OO...OO.O#.....#....#..
+...#...#............OO##O#...O.#O##O..#.#....#.O.O.O#...O.O..O.O.###..#.O.##.#O....##....#.......O.O
+.#O....OO..OO....O.O.....#.....#...OO.O..#..#.#.OOO...#.O.#...OOO........#....OO#OOO...............O
+.OO.#....O.#O.OO..#.OO.........O.#.O......#O......O#...###.#OO.#.#..........O.#O.#O..O#..#..#.O..OOO
+#.......O.....#.#.##.#.#.#.....O....#.#..O#OO.OO..O#..O......OO#.O..#...OOO#.O..........O.OO.#..O#.O
+....OO....O#OO...O#O#..O#.O.....O.O......#O.#O#......#.....#O.......#.#O....OO......##..##O#O.#..#..
+..#...OO.O.#.#..OO...OO........##........O...OO...O....#.O...OO..O.O.OO.O.#....OOO..#..#.O#.OO..O.#O
+#.#.#.#O..OOO..OOO..O#O.O..O..#O..OO....O#....O#..O.O...O#.....#.#..OO...#...O##O.#O.O.O#..OO.......
+#..O....O....OO..O.....O....O....#O..........#O.O.O#..#...O...##.#.O.#O..#.O.##..OO.O..O..#...O.#..O
+......#..O.#......O.....O#.OO#O.#.O.O.....O...#..O.#OO.......O....O........O.O.#.O.....O#.....##....
+.#...#O..#.O...O#O...O.#..#.#OO...O.O.#O..###..O..OOO...O..#..O.O..O.#...OO.OO.#.O....#....#O.#...#O
+.#OOOO..............#O##OO.....#O#.......O...##...O....O#O.......OOO.#O#OO.#......OOOOOO...##..O..#.
+O....OO.OO.O.#.O#.#.O..OO......OO#..#O..#.#O.O..#OO.#.....#.O...O........OO..O#......OOOO..O.OO...O.
+...OO.##.O.....O...#.O.OOO..O.....O#......#O#O#...#....O..#O...OOO#..O.#.O....O#.....#...O.O##O...#O
+..O........#..###O...O##....O..#.O.##..O.O...O##O.O..O...#O..#OOO###O.O###O#O...#.#......O.OOO.#..O#
+....O...O...#.##....#...OO.#O#O...O###..O...O..OO.O.O..#OO.O#.O...O#O.#..#.......#..O.##O.##.OO...#O
+OO.#...O..O...OO.##..........OO.......#O#O.OO.#O.....O..OO...#O#O...##.O..##O.O.O.OO.OO.#.#O#O...O.#
+......O##.#.#..O#........O....O............O##..#...#..#..#O......O...#...#O..O......#.#..O...O...O#
+O.#..#.#..#..##..#........O#..#O.O....#..O...OOO......#......OO...O.O.#O..#........O....#....O#..#O.
+.......OO.....O......#....OO.O.#O.O....O#..#...O.O.......#...OO.....#.......#...O..#...##.#.O.#..O#.
+O###.........O........O.O..O..O...O#.#....#.OOO..O.O.#..O..##....O....O..#O.O..#........O.#O...O...O
+#..........##....O.#O..#....OO..#...O.O.O..O..OO#..##..#O.OO..O.#..OO.........#.O....O..O...........
+....#...#.....#..OO.O.##...OOO##O..#........OO..O.#.......#.OO#..O....O##.#.O.#.O.###....#..##O..#O#
+..#..........O........#....OO.....O...#.##.#.....#....O..##..............O........#....#..O#...O.O#O
+O...OO.O.......O....O...#...OO#O.....O.O....O#O.......#.#..O.....O...#.....#.#....#O..OOOOO.O...O.O.
+#...O....O.#........#OO.O..O##.#.........O#.O##...#O#..O...#O.#..#...#O..#......O..........O....OO#O
+O.....#O.........O#.O#..OO#...#O.O.....O.#..#....#.O..O..O..O#....O......O.O...O#O......#.O...#..O#O
+#......O.....O#.O.#OO...........O.O...O#..O...OO.O###O...#O.....#..O...OO.O#.....#O.O.#....#..O..#..
+....#.##..O..O.....OO#....O.........OOO###..O.OO.O..O.##.O.OO..#.#O..#..#.#.##......#...##....#.O..O
+.......OO..........O..OO.#..#O.OO#.........O..O#.O..O.#O.O.#......O.....O#....OO..O...O....O..O#OO..
+.O.OO.#OO#......O#O#OO...O#O....##OO.....O#........O....O..O.O..O..O..#....O....OO#..O....OO####O..O
+.....O.O#.#.#.O#.OO.#...O#..OOO....O#O...OO......O.##.OO.......O.O....#...O....O....O..#..#..O.#O...
+...O...O.......O...#.O...O...O....#...OO##..#.O....O.....#.#..O....O.O.....#..OOO....OO..#.###....#.
+....#.O....##....O.#.......O#..###.##O.O.O.......#O#.#O.....O...O.#.O..#.#.....O#.O#......O#O..#O...
+.#.O....O...#.#...O#.....#......O.O.......#....OO....O...O#....O.#......#.##OO...#..#O#...O#.O.##..O
+O.#.#.....O....O....O.O...O..O.#....O....#O.......#.........#.......O.OO.....O.#.OO.#.#.O.OO..O.....
+##..#..O.#...O......#..#.O.O..O...O..#.....##.#...#.O.O##.O....#OOOOOO....##....##.#O#..........#.O.
+.#..#...O.O.O........OO.O..OOO....O#..##..#O..OO.........OO.........#....#.O#..O#..#.#..#O..O.O#....
+..#..OO##..#.....O..##......O..OOO.#.....O.#..#O....#O#O.....#.O..OO.#...O..#...#O...#.........#....
+.........#..O....OO..#OO..O.........#..#O..O..OO....O..##..#O..O.O.O...#O##OOO#.........O.......#...
+...#...OO.....#.O..#........#.#...O.O....OOO.O#O....###..#.#.......#.O......O..#O....###.O##.#..OO.#
+..##O#.#.........OO#O#..OO..O..##.O.O.O.O...O#..OO...#..O...O.O.#.O...#.O.O#....##...O.....#...O..O.
+..#O..#..OOO....#.......#O.....#...O#..O##OOO#.#.....O#O..#O...#....#O.O#......#.OO..#.#.O.......O.#
+O.O.....#O.#.OOOOOO..###..O.......O.#.O.OO...#..O..##.##.#..O..O..O...#O.....OO....O...O..#...#O....
+..O.OO....#.O..O..#.#OO..#.O.......O.OO#....O..O...O#...O...O#...O...#.#O...#..OO....#.O........O...
+.#....#.O#.#....O#O#.##.....O.#.....O..OO....O..O.#.....#OO##.O..O..O..O.......#...OO..#.O.......O..
+O...O#.#O.#.#.#..O..O......#.O..OO..#.O##.#.....#O#.....#O#.....#...#.#O....O.O.....#.......#....#..
+#.O...O.O.....O.O..O...O#O...OO#..##.....O.......#....O..#...O....#..O..OO#.....O..O.O...#....O..O#.
+O..O....O..O##..#....OO.#OO........#O.........O............O.#..#O.O.O##..#.###O..O...O#...#..#.....
+O.......O........O...O...O.###.#.#OO.O.#.#.O.#O.OO....O..O.###....O.O.#.#O..OO##.O.#O#....#.....#...
+..O..O#..OOO..O##O....O#.O.O.O#.#.O.##..O.....#.#..#O...O..O...O....#.......O.O......O#..O.#....#OO.
+.#..O..##....O#.......#....O#..O.###.O.#..O...#OO...O#.....O.O....O#...O#...##O...O..O..#....O.O.O..
+.O.......O#O...OO...O...#.OO#OO#.#O..#OO..#O.#OO....#..#...O#O.OO#...OOO..O..OO..#..#.....O.....#...
+..O..##.##..O#.O..#.O.O.......#O.....OO..OO#.....O#.O.OOO....O...#..O#O#.#OO...#....#...O...........
+.O.#.#...O.O.O.O.#.#O.O..#.OOOOOO.#.OO..#..###..#.#...#.O.O............OOO#O#.O..O....#...O...#.....
+..#..OO..#O.....#.##..O...O.OO........#...OO..#...O....O..O....#O.........O...#.O.....O.#...O.....#.
+#O..#..#O.O#.O...O...O....#O#O.#O#OO...O#.O........O#....#.....#O#...O..O..#O..OOO##.#...O#...#..O..
+.....#O....O.OOO....#..#O......O.#..O.##.O.O.O...OO.O#...O..OO..#.#........##.....#............O.O..
+.O..O..#.O#.OO.O#.....O.O..#O..O.O.....#...OO...O#.##O........#.O.........O#...OOO...#O###...O..#...
+OO.#O....O.....#...#.O...O...O..#....O#....##....O.OOO.O...#.OO.O...O.O#O.....#.......O........O..O.
+..O#O........O.O..O..#.##......#..#.OO......#.....#.O...#.#.OO#O.#..O....O#.O#..O.#..O#...O.O...O#..
+O##..O.#..#...###.###O##....#OOO..O.#.O....O.OO#O...O..O.........O##....OO.O....#....OO...O.........
+OOO..O.#.O.O.O...#.##..#.##.#...O#O..O.#.....#..O.#....O..O....O.....O...O..#.O.##.O#..O.....O...O..
+#.###.OO.....O..O..O...O.O#..#....####..#.......#.#.....O#O...O..O##O.#..#OOO.O#...O..O....#O.#....#
+.O#O.....O.#.#..OO....#.....#......#.....O.............O#..O..OOO#O#.OO#..O...O##..O.##O#...O#O.#..#
+.#...#.O.#..O..#.....OO..#O#....#.O.#.#..O#...#...#..OO#....O#..##O.............O...O..#O..O..O.#O..
+.....##OO.O..#..O#...O...O.#.#.##.O....OOO.#O..O.O.O##....O.O.#.O...OO.O...###O#.O.OO#..O....O......
+.O#O..#.O...#.#O...O##....O..#....O.O#.OO#O#O..O...O.#...O.O.O...O#..OO.O....#..#...OO..O.O.......#.
+O.O........OO...#.##..O........O....OO...O#..O.#OO.....O...O.O.......O....#O#O..O.OO............O..#
+...#O...#O.O...O.##..O....OO#.##.....#...O....O.....#O..OO.#.O...O.....OO...#OO#......#O##O..O....OO
+..#...O#.O..O.....#.....#...#..#..O....O...#......#..#..O#OO.....#O...O...#......O.#.###..#....O..#.
+.O.....#O.O......O#.O..O.##.O...O#OO..........O..###..#....O....O.....#..O#.O.....###......#..###..O
+.O..#.....#..##.##.O......O..O.O...O.O.......#.O..#....#.....O.#.O............OO#...O##...O.O#.O....
+.#.O.O#.#.#O.O..#....O.O..#.....#.#OO.O...##.OO..O.O......##.......O.O###.O..O.....#..OO#...#....#..
+....#.#...#...#.OO..#..........OO......O#..#O##...OO.#..O.#..O.O.OO.....O#O.#..####.OO...#.O..#O..O.
+O.O..O..OOOO....O..O.#.........O....O.#O.#O...O.#....#..O.#..OO.O.#.O#...#....##..#...........#.O#.O
+.......O....#OOO.#.O.......#O#O....#.....OOO.#..#OO#..O.#O##O.O........O.#.O.OOO.....O......#.#....O
+..O.....OO.#.#.O.....O##....O...OO......##..O#O.#O.O..#O.#.#....O...O.#.#..O.#.#OO..##....O......O..
+..O#.#O.O.O..#...#O....O#O...O.........#.O...O#..O###O.....O..#.O....O#OO...O..O....OO#..#...#.....O
+.O.#....OO..O.O...O....#..........OO.##OO##OOO.##OOO..O...#...##....O..O#...O.#O..#.#O.O.....O.##.#.
+....OO#O.........OO.#.O.O.O.#O.O.##..............OO..........O...O.......O..O##.O..#..#...O........O
+O.....#.....O#.#..#.O...O....##O#O.#.##...#..#........O#...#....##.O...#..O......O..OO#....OO.....#.
+...O...#.#O.#..O...........O.O###.O.O...#..#O..O.OO..O..##O..#..#O#.O.OO.#O......O.O....#O.#..O...O#
+..O......#...##.#..OOO....#..#.#.OOO....#.#OO#.#O.#.O.#...#.O.OOO.#...#..O..O..#..#.O....O##..O..#..
+.##..OO...#...#O#.O.....O#...#....O...............#..O#.#.#..OO.#..O.O#.O.....#OO.O.#.O..##...#.O#.O
+..#.O.#...O..##.O#.O....O.O.O#O#.OO....#...#.O.......O#...#O........O.O.O.O.OO.#O........O..OO.O#...
+...#..#OO#...#..#OO.#..#.O.#..OO..O.O....O##..#...OO..O....O#O...#....#...#O#.........O#OO.O...O.#..
+.O#OOO..#....O..#.O..#..OO##..OOO#O#O#O..#.O#.#......#.........##O..O...O#.....O.......###O#O.....OO
+O..OO....O.#..O#.#O#....O.O...##O...#O#O#...O.O...O.O#O.......#..#...OO...#O.#...O#...#.........O##.
+...O.#O.#...O............#...O......##.......O..##O.O.OO.O.O....#O#..#O...#........OO.O..##.O.#.#O.#
+OO..O...#.....O..#OO..OO..#....#....O.O.#O.O.#O.OO...#..#OO..O#OO#.OO.....O...OO.O.O.....OO.#OO...O#
+.#...O...O.#OOO....O#...O.OO.##O...##.##.....O.O..#.....#O......O#...###O.#OO.#O.O.O...#.....#.OOO..
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day15/Day15.cs b/2023/AdventOfCode/Day15/Day15.cs
new file mode 100644
index 0000000..4ae625c
--- /dev/null
+++ b/2023/AdventOfCode/Day15/Day15.cs
@@ -0,0 +1,112 @@
+using System.Text;
+using Lens = (string Label, int FocalLength);
+
+namespace AdventOfCode.Day15;
+
+public sealed class Day15(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day15";
+
+ private readonly string[] _example =
+ [
+ "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
+ ];
+
+ [Fact]
+ public void ExampleOne() => CalculateHASH(_example).Should().Be(1320);
+
+ [Fact]
+ public void ExampleTwo() => CalculateHASHMAP(_example).Should().Be(145);
+
+ [Fact]
+ public void PartOne() => WriteOutput(CalculateHASH(Input));
+
+ [Fact]
+ public void PartTwo() => WriteOutput(CalculateHASHMAP(Input));
+
+ private static int CalculateHASHMAP(string[] input)
+ {
+ var boxes = Enumerable.Range(0, 256)
+ .Select(i => new Box(i + 1))
+ .ToArray();
+ var steps = input.SelectMany(i => i.Split(","));
+ foreach (var step in steps)
+ {
+ var label = string.Empty;
+ if (step.Contains('-'))
+ {
+ label = step[0..^1];
+ var hash = Hash(label);
+ boxes[hash].RemoveLens(label);
+ continue;
+ }
+
+ var split = step.Split('=');
+ label = split[0];
+ var focalLength = int.Parse(split[1]);
+ var h = Hash(label);
+ boxes[h].AddLens(label, focalLength);
+ }
+
+ return boxes.Select(b => b.FocusingPower()).Sum();
+ }
+
+ private static int CalculateHASH(string[] input) =>
+ input
+ .SelectMany(i => i.Split(','))
+ .Select(Hash)
+ .Sum();
+
+ private static int Hash(string step)
+ {
+ var current = 0;
+ foreach (var character in Encoding.ASCII.GetBytes(step))
+ {
+ current = (current + character) * 17 % 256;
+ }
+ return current;
+ }
+
+ private sealed class Box(int number)
+ {
+ public int Number { get; } = number;
+ public LinkedList Lenses { get; } = [];
+
+ public void AddLens(string label, int focalLength)
+ {
+ var lens = Lenses.FindFirst(l => l.Label == label);
+ if (lens is not null)
+ {
+ lens.Value = (label, focalLength);
+ return;
+ }
+ Lenses.AddLast(new LinkedListNode((label, focalLength)));
+ }
+
+ public int FocusingPower() =>
+ Lenses.Select((l, i) => Number * (i + 1) * l.FocalLength).Sum();
+
+ public void RemoveLens(string label)
+ {
+ var lens = Lenses.FindFirst(l => l.Label == label);
+ if (lens is not null)
+ Lenses.Remove(lens);
+ }
+ }
+}
+
+public static class LinkedListExtensions
+{
+ public static LinkedListNode? FindFirst(this LinkedList linkedList, Func predicate)
+ {
+ var cur = linkedList.First;
+ while (cur is not null)
+ {
+ if (predicate.Invoke(cur.Value))
+ return cur;
+ cur = cur.Next;
+ }
+
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day15/input.txt b/2023/AdventOfCode/Day15/input.txt
new file mode 100644
index 0000000..25f099d
--- /dev/null
+++ b/2023/AdventOfCode/Day15/input.txt
@@ -0,0 +1 @@
+vvkcff=7,qsm=6,zfsz=4,kbg=3,cs-,gvh=1,dct=4,bsg-,vqq=5,gl-,trhc-,gvh=4,xf-,gtkl=9,trbd=8,qbscx-,bz=4,zh-,xbx=5,dzd=9,msrgsb=9,xrf=8,sr=1,gfcql=6,vvtdp=7,zdc=9,xxk=1,jbh=5,njc=2,njn-,vcm-,qx=8,lkl-,nkqs-,ldd-,lfz=3,qvnq-,llg=6,sg-,bl-,xxk-,gt=8,cbp-,pzxc-,kqbt=2,cpq-,fttkg-,jsr-,lkl-,xkx=5,hzst-,qtt-,jcxr-,psmm-,njc-,qhnr-,hlk-,xr-,bvpqdj-,fhv=2,fttkg-,jz-,bz=8,tppcb-,vgfr-,jjlrr=2,lfz-,szfq=9,bls=2,qdq-,svcb=9,zgb=3,cf=2,gttk-,lqn=3,zsgct-,ltj-,zdtkk-,mh-,rms-,khl-,nks-,ss-,cntk=5,bs=6,gqg-,db-,zzq-,rpp-,vt=6,fpxz-,vjvm=4,vkz-,vdj=4,hgf=9,sks=2,hlk-,zv=9,vdm-,nvsr=8,sks=4,cbp=3,kqbt-,cl=8,rmh-,ps=9,pn=6,frp-,zbmts-,njn=2,mstnpg=1,bn=3,cbf=4,chdk-,qpllk=3,zc=8,sgklt=4,qn=8,ct=5,zq-,mv-,cclj=5,kz-,hlk=2,kgn-,pv-,pctvf-,qvnq=5,px=9,zx-,nvf=4,hlk-,lx-,bxc=9,dz-,gr=2,qhnr-,llqt-,qp-,jsr=2,btdxxp-,kp-,nzl=7,tjl=3,njn=2,pgx=1,rg=6,qdq-,qsm-,qbx-,zv=9,bnf=7,vvtdp-,dfsb-,srr=1,rktk-,qdk-,rhlv-,cdk-,fdjf=8,pd=3,mqg-,tz=2,frm-,vc=7,ldd-,mz=1,dq=1,klc-,tmn-,sb=6,vhtd-,gvk-,sgl=1,jzl-,bxc=4,ldd-,xqdtf-,vt-,hs-,kkrnf=1,cs-,bsl=6,kxg-,zhc-,dxr-,qct-,lrhgd=1,sf-,hdf-,fd=5,tc=3,gvk=7,hzm=7,xgcpp=6,hdf-,hdf-,sb-,df=6,pdlz=1,kn=5,frm=9,xpdrm-,gjmjrv=5,kqgq=6,pk-,fb-,bgt=7,vfdlhq=4,zbmts-,vv=1,zccc=9,np-,sjlk=8,tss=8,mv=2,pxpr=5,cxmp=3,bxc=4,dhs=4,gtzk-,ljg=2,kcp=5,zdc-,tqjb=7,qdk=7,lx=1,dxz-,ht=1,vvkcff-,xqdtf=2,djd-,trjtl-,pd-,qq=1,kqgq-,tcv=3,cdk-,kxg=7,bxc-,kz-,czt-,mkc=4,tp-,vdm=4,bjng-,sdhl-,gm-,czt=1,mjt=7,lj=9,lztjd=5,djd-,jd-,dcdrv=8,tflk=4,mstnpg-,hnsghx=8,vjk-,zsn-,vl-,hdf=8,njn=7,sf-,hb=1,hzm=5,dx=8,mxg=6,chdk=4,jz-,mstnpg-,vp=6,gfcql-,zsbj-,dz=6,msrgsb=6,ztt=5,mpg=3,sjlk-,rq=9,bsl=8,qh=5,vd=8,njn-,pdlz-,lqn-,ncft=9,pm=8,mfb=8,xg=5,jd=3,sqkc=8,pd-,fr=5,khl-,pctvf-,kqnjk=2,kxg-,ldc-,gft-,dbg=4,cxzq-,fb-,hb=5,kqgq-,qbx-,qvnq-,ql-,cdgvf=6,kcp-,gjz-,kqgq=8,mnz=9,mt-,nlxbzc=2,zstl-,lm-,bx=3,qbm=5,zhc-,jcxr-,cf-,vqp-,hqbmx-,dqj-,qxp=3,qhg=2,pk-,qpllk-,dhs=1,phr=2,ngmd=6,ltj-,pctvf-,zq-,ncft=4,mzr=5,cs=4,nvf-,pgx=5,ktt-,gvh=5,ztt-,vkm=4,scb-,jqk=1,qxp=5,fp=1,pm=1,bz=6,vpd=1,cjd-,czt=4,mx-,bvj-,hs-,mpg=1,tcv=7,hz=3,lztjd-,gvh=3,gt-,tr-,qbm-,gxh-,tflk-,rjtl=8,cnb-,ss=7,xn=7,qbscx-,xpm-,fhb-,gbb=3,tmn=4,jkm-,lfz-,jrg-,xk-,zgb=4,rmh=3,zvc=7,sbvx-,zr=3,kkrnf-,kbg-,vkm-,dt=4,fd-,ckm=6,dbg=6,zkpz=1,gx=6,xn=3,kblbg=7,lls-,xxk=7,zdnd-,zvtkxm=7,kn-,qct-,tflk=4,qq-,dzd=2,bsgjn=5,bnf-,czt-,xt=7,jjlrr-,zbmts-,dxhg-,hd-,qbscx=5,pctvf=7,dqdv=3,kg-,ps=3,bx=6,pctvf-,mt=3,jmjm=1,gnh-,hk-,tlk=4,vpd-,vbg=4,pp=7,jrg=4,vvh=7,jrg-,njc=8,kgn-,kxg=8,tmn-,px=6,qsm-,bl=6,jd=7,kg=1,dr=4,hqcqb-,ldc-,dxhg=7,xrt=6,zh=4,cf=2,kcp-,mstnpg=1,px-,lffflt-,dz-,qds-,kblbg-,pdlz=9,jpb=6,qdk=8,rcm=2,vtng=7,mchc=8,zdtkk-,qmlf-,xm=5,qvccp-,qjzk=1,mjt=4,pqdl=8,sdhl-,gtkl-,chdk=4,trhc=7,mnz-,ztt-,hzst-,cpqh=2,vdj=3,qjzk-,ql-,gdt-,lqv=8,zdtkk-,trbd-,srr-,zbzv=8,kbg-,vp-,mtr-,qvccp=3,rq-,cntk=1,phr=5,qj-,gqh=9,mm-,tppcb-,jgpjxb-,gbb-,fd-,frvv=5,khl-,btdxxp=5,pz-,rpp=5,ltvf=4,dqsq-,fc-,nvf=1,lqv-,cjd=5,nn-,tj-,qbx-,db=3,nq=6,lq-,ntpn=5,dxjtjb-,tqcxq-,gg-,qvs=8,qjzk-,vvkcff-,vtln-,zstl-,xmprb-,ts-,mc-,tp-,dt-,cntk-,tflk=9,dfpx=2,xmprb=3,dkc-,qdgm-,gxh-,zccc-,qrprpd-,pxpr=7,qklv-,gnh-,vbg=5,dcdrv-,gft=6,nvj-,zdc-,kbg-,qq-,zbmts=1,sjlk-,qklv-,jz=4,chdk=3,mxg-,gvh=5,lls=9,zprzq=4,llqt=6,dbg-,ngxq-,ds=9,tn-,hzst-,ztt=8,vkm-,khl=4,jmf-,ztt=3,pz=3,ldc-,xpdrm=7,dp-,xhbs-,mv=1,tmn=5,rms-,pbpxf=1,kcp=8,zsn=3,vv-,gvh-,ln-,cdk-,sb=8,rqr-,nzl=4,lqn=4,vd-,qhg-,hcqh-,mrb-,zdc-,pp-,xkx=7,klc-,lls-,klc-,cxzq-,kblbg=8,qhgf=9,jzl-,zbmts-,cgv=9,qcfz-,rzkc=6,qdk-,hzm-,pd-,fb-,bxc-,ctf=2,vvkcff-,pd-,qk-,pqdl=2,rg=1,hb=1,mtr-,pjc-,sp-,mtr-,hdf=7,jkm-,rj=9,pn=2,qpllk-,mc-,gbb-,qdk-,ft=7,cc-,vjk=3,xn-,vjvm-,gx=4,dxr=6,stv-,bvd=8,xhbs=3,lq=9,mzp=1,kp=2,vvh-,qvnq=6,qvs-,ncft=1,pbpxf-,tsz-,mzp=4,nlxbzc=8,vvkcff=1,tlk-,xms-,tjl-,scb=2,gbb=5,qtt=6,tqcxq=8,bp=6,hs-,cbf=9,msrgsb-,ccvd=1,gbx=9,tjl-,pdlz=1,zprzq=8,khl=4,dll-,tvjb=6,pjc=9,ntpn=1,trhc-,mchc=6,gtcgmx-,djd-,xpdrm-,xrt-,cs-,mx=8,mz=5,ldd-,szfq=9,np=6,xkx-,sgl=7,qdk=3,fb-,kq=8,djd-,lz=7,gt=1,bls-,sp-,ldc-,vp=8,vm-,fcn-,hkjk-,rng-,jd-,tc=7,czt-,pch=2,mng-,vv=6,pjb=6,pn=1,xms=9,vbsz-,qj-,ft-,tqcxq=3,mzt=7,bs-,hb=8,qjzk=7,cclj-,bbl-,gl-,vmkb=9,pbbmt=6,nvc-,nks-,qhnr-,cgv=1,rzkc-,zq=8,kt=7,kgn-,gvk-,zdnd-,qpllk-,rcrfs-,ln-,xpdrm=6,qx-,gjmjrv-,zq-,vpd=5,vj-,rdl=6,lq=4,lg=2,dgcgc=2,njc=4,ldc=9,nff-,cx=1,cf=4,gxh=1,dzd=8,tb-,qk=5,ft=3,vp-,mjt=6,tppcb=2,qrprpd-,xpm=6,kjxx=2,tp=5,hkjk=3,gg-,kd=8,tss=5,ph-,zjn=3,xhbs=6,nvj-,qqzt=7,rcm-,vzd=7,cpq=5,sbvx=4,hhtb=3,xhbs=9,bxc-,lkl-,cntk-,mh-,tmn-,trhc-,msrgsb=3,gh=2,bls=6,vqq-,qq-,rpp=3,qdq=1,zfsz-,xrf-,hqbmx-,lnh-,lrf=6,zl-,gft=8,czt=2,jcxr-,lffflt=5,cf=4,mrrj-,qq=9,kn-,bf-,frp-,frp=4,nn=7,vtlv-,dl=2,sb=4,ckm-,zstl-,kcp-,hzm=7,rj=8,rcm=2,hsxn=5,mzr=8,gm=6,gft-,pkr-,dt=8,xv-,pn=6,sxj=1,bgt=7,qdq-,cn-,df-,gbx-,kcp-,qhgf=3,rqr-,fb=5,kblbg-,rdl-,pmd-,kjxx-,lffflt-,jjqmb-,rmh=8,dct-,gt=4,hjc=4,ds=1,mkc-,fdjf-,qdq=2,zvtkxm=6,pbpxf-,gh-,qklv=8,rb-,dzd=6,jjlrr-,qvs-,ht-,xms-,bx-,kblbg-,frp-,ph-,gl=9,bz-,xn=1,btdxxp=5,zx-,tqjb-,fc=1,mpg=7,cjd-,szp=8,mg=1,kq=3,mrrj-,px-,hgf-,dqr-,dgs=6,gr-,rms=9,lrhpc=4,dct-,srr=2,kxg=6,bvj-,ztqc=9,jqk-,czt-,gnh-,dl-,tr-,jgpjxb=9,jjqmb=1,gdt=6,ljg=5,sr-,jd=1,xlhxd-,tbspnx-,rsmvds=2,vvtdp=6,mng-,hhtb-,rhlv=9,hqbmx=8,vtng=1,xmprb-,ltvf-,qjzk=1,btdxxp-,rpp-,bsl-,gjz=2,mknpz-,vtlv-,ql-,hnsghx=8,rktk-,jpb=6,xk-,vdm-,mkc=4,qbx-,zhc-,pgx-,pbbmt-,phr-,sjlk=6,db-,pz-,cbf=9,jqk=9,kg-,fp-,khl=4,njc-,xrf=6,mx=6,xpdrm-,ztqc=8,ss-,dhs-,cmq-,kqbt-,xg-,rsmvds-,hsxn=5,vmf-,zp=4,qdgm-,szp-,jllf=5,ltvf=3,tflk-,chdk-,rb=3,cxzq-,ldd=9,xms=8,qq-,kqnjk=9,kg=5,tmn=9,hfcm=7,frvv=1,hsxn-,fhb-,hd=5,znc=9,chdk-,hnzjq-,zsgct=1,qmlf=3,vmkb-,qqzt-,ktskt=9,vm-,qh=8,jz-,vv-,bz-,vc=2,zqbqz=2,vpd=2,nks-,jjqmb=8,cnr=4,gnh=5,nvj-,ss-,bls-,kdplr-,hnsghx-,vt=3,cf-,lgp=9,ft=4,rcl-,bz-,lfpjzc=5,qbfzcq=3,xrt=3,zx-,dxr-,gvh=5,mlkg=6,zstl=9,fr=9,vqq=6,kd=5,czt=2,xkx-,lffflt=6,th=7,tbspnx-,ztqc-,kqbt-,ph-,cdgvf=6,xznps-,rhlv=2,xznps=5,mzp-,czt=5,pc-,tlk-,sr-,dll-,xms-,rcl-,xv=4,pc=6,lj=1,lrhgd-,scg=1,mrb-,nvf-,zkpz=2,trjtl-,mknpz-,mx=5,dfpx=7,mrb-,srr=1,fv-,jrg=7,slb=7,jbh=8,znc-,lrhpc-,kz=1,qvccp-,db-,zccc=1,zr-,vd-,pmd-,qhnr-,lrhgd-,ct=8,zzq=5,cdgvf=1,jcxr=3,qcqt=2,jcxr-,gfcql=5,cpq=3,hgnr-,ctf=1,trjtl-,rc-,tz-,gtzk=7,btdxxp=8,ntpn-,cbf=8,vjk=2,scb-,rq-,dbg-,xg=4,jllf=7,dqdv-,nvf=8,jllf=8,khl-,nzl=4,qrprpd=5,xm=9,rpp=3,nr-,dcdrv-,bkl-,vvkcff=7,lztjd-,xpm-,jkm=3,dttz=9,zfsz=8,hn-,vvh=2,pc-,cx=4,vrv=3,vv-,cdd-,pkr-,cn-,pd-,fv=5,rtm-,qhg-,pbpxf=2,bl=2,cbp=5,svcb-,sr=5,gq-,gqg=1,fttkg=2,ts-,bsgjn-,trjtl=7,hjc=1,zprzq=6,mmx-,dpfnqr-,dm=5,lx-,xrt=7,qjzk-,kg-,cclj=7,mxg=5,qvccp=9,cc-,mchc=9,tbspnx=1,bd=2,tqjb=4,kqnjk=8,df-,pdk-,qsm=7,szfq-,dct-,ss=2,kg=5,bx=5,hjc=9,rg=7,hfcm=1,dp-,txx=5,vp=4,vl=3,fr-,jb-,gbx-,vmkb=8,gg-,gz-,klc-,lkl-,xr-,mrrj-,gfcql=3,kt=8,cjd=7,pmd=6,pzxc=8,trhc=8,sqkc=4,qdgm-,qcfz-,gg-,pgx-,mfb-,vzldq-,df-,lrhgd=2,bbl=4,mknpz=7,kblbg-,nff-,rmh=3,sjlk=3,kz=6,cclj-,dr=6,kcp=5,qdk-,mrrj-,xr=4,nvf=5,hfcm-,hzm-,sbvx-,mt=2,gjz=9,frm-,vtln-,fgb=3,qh-,bsgjn=4,vh-,lm-,pbbmt=1,zprzq=2,pjb-,sjlk-,mg=5,tl-,jmf-,kg-,dkc-,hbbl=6,mng=9,ct=7,zr-,vfdlhq=1,sqkc=6,fc-,kqbt-,fc-,sdhl-,bs-,zbzv-,mng-,xpdrm-,rcm=3,rsbz=4,rtm-,dt=1,nks=2,kblbg-,vgfr=6,jzl-,bsgjn-,sks-,rms=7,gt-,pd=4,szp-,rmh-,sqkc=7,hjc-,zfsz-,jvd=8,mkc-,qk-,rq=8,fdz-,hnsghx-,bgt-,jt=4,sjlk=6,dttz-,jzl-,mxg-,cnb=7,lpchk-,zbmts-,bf-,mrrj=7,gttk=4,fp=4,lrhgd=9,kqgq=4,sv-,mh-,frp-,gb-,rcm-,bx=8,rjtl=5,pctvf=5,bxc=1,vtb-,ggvcqj-,rzkc=4,ntpn=1,sqkc=9,svcb=3,bp=3,gtkl-,stv-,jllf-,cxmp=2,cb=9,qmlf=8,vcm=1,nlxbzc=9,vh=7,qvccp=4,xn=2,ft=2,qklv=2,hbl=8,ct=6,ntn-,dxr-,sjn-,hgnr-,pjc=2,gfcql-,cn-,lgp=6,sv-,hn=6,mzp=5,hsxn-,qhg-,qbm=6,tl-,bjng=8,xqdtf-,trbd-,dttz-,sjn=2,vvtdp=1,sgl-,pkr-,rcrfs-,cpqh-,nvc-,jb=3,tqjb-,hzm=1,pzxc-,xqdtf-,lqv=9,ct=5,kbg=3,ts-,qjzk=9,dqj-,phr=3,rtm=5,gr=1,rmh-,rmh=1,zbzv=6,xxk=6,vp=9,qklv=3,sjn-,dx=6,hbl=5,tj-,rmh-,dqr-,vl=4,fhv=6,mlkg=9,cxmp-,tp-,fgb=1,bx-,qdk-,qvnq=4,zgb-,lnh-,nrsgfn-,kblbg=8,tb=9,rms-,cn-,vfdlhq-,trjtl=1,ss=2,gdt=9,chdk=7,lpchk=1,bsgjn=7,gm-,vzd-,mrrj-,mrrj=9,pm-,qhgf=7,gxh=1,mz=1,lfz=4,lx-,kfdb-,rdl=5,mnz=7,hk=7,hzm-,bsgjn-,dfpx=9,lqv-,rng=6,zsbj-,jsm=9,tcv-,zdtkk=8,zjn-,dqr=6,xr-,bnf=9,zh=9,sjn=4,vtng=9,fv=9,lfpjzc-,dqsq-,lztjd=7,nq-,kg-,btdxxp=8,qj=4,bg-,lztjd=8,rktk-,mknpz-,qbx=6,rsbz-,bg=1,cl=5,zvc-,bls-,qq=8,dxr=4,zl=4,mzr=4,mm=2,nxtt-,zq-,scb-,cnb-,rjtl=3,jgpjxb-,cc-,qj-,ht-,qn-,bsl=5,cxzq=4,gft-,cgv-,vl-,qvccp-,zdc=6,cn-,dl-,rms=3,hfcm=6,gg-,sf=3,jqk-,cs=4,gvh=3,srr=8,pgx-,fv=2,tss-,gjmjrv-,pq=6,dfpx=9,zh-,vjk-,dfsb-,xf-,db=6,hnzjq=3,vm-,dxjtjb-,tj=1,njn=5,cbf-,vtng-,trbd=5,ljg=2,vzd=6,ln-,pz-,qpllk-,bsg=7,vfdlhq=8,tpg=4,xk-,cd-,xxk=8,zc-,dpfnqr-,szp-,tlk-,vcm=4,dqr-,bg=5,kgn=2,szfq-,nlxbzc=2,sp=1,gr=8,qds-,ngxq=3,kgn-,qbscx=5,tlk-,jb-,ccvd-,vvkcff=2,nvc=4,ntpn-,zgb-,qn-,dxz-,fdjf=2,xxk=6,tn-,mp-,ngxq=3,hqkg-,cntk-,hzst=3,lls-,znc=4,ntpn=2,dll=1,vgfr=7,vkm=3,dttz-,dqj=6,zbzv-,hqkg=3,sjn-,rc=4,ktskt=8,qk=9,cbf-,fdjf-,dpfnqr=7,qct=7,qdq-,mknpz=6,llqt-,mchc-,tmn-,cj-,hd=9,sp=5,dxr=6,dr-,xznps=1,dp-,vvh=7,gm-,tfm-,ldd-,hqcqb-,kgn=6,jz-,vpvjp-,gft-,rg=6,msrgsb=8,ccvd-,rtm-,qbm=1,zl=6,sg=6,mt-,pch-,hkjk=1,svcb=7,trhc=6,gvh-,zjn=5,ptpr=4,ql-,blllmg-,jjlrr-,tc-,kqgq=3,rhlv=3,hb=1,rcm=3,tp-,cdd-,gbx=2,kcp-,ct-,pz-,ps=7,qp-,dct-,rktk=1,cmk=9,np=3,ss-,jvd=1,xhbs=7,kqnjk=1,hd=9,szfq=7,zfsz=6,qn-,xqdtf=2,qp=2,dz-,lg-,th=7,trbd=1,vtlv-,qvccp=1,ggvcqj=7,kqgq-,lrhgd=6,mv=3,xk-,bsg-,dl=2,qxp=7,dxjtjb=1,gq-,fpxz=1,mstnpg-,pctvf-,rcrfs-,ttj-,nr-,gttk=8,mrb=9,pzxc-,kg=1,xrt=9,pp-,scb-,zkpz=1,kdplr-,vt=5,rsmvds-,bg-,pkr=4,qbx=1,zdtkk-,mm-,cj-,rpp=1,hjc-,qtt-,kz=2,hsxn-,gdt-,sxj-,cclj-,rcrfs=5,cxzq-,gq-,qdgm-,cpqh=1,hk=1,zsn-,rktk=4,fgb-,tflk=3,mzp=9,hbl-,dqdv=9,qsm=6,chdk-,zx=3,kt=6,cd-,klc=2,qklv-,dkc-,nqcfs=2,vvkcff-,klc-,sks=5,gbx=3,lrhpc=6,rj=4,kbg-,mp-,tfm-,hnzjq-,bn=2,bp=8,mxg-,rhlv-,zstl=6,lm=2,pgx-,mrb=7,xr-,mfb-,ngxq-,mp-,mnz=1,vhtd-,cl=1,lm-,hbbl-,mtr=4,dct-,vv-,qhnr=2,khl=4,xznps-,ts-,znc=3,hsxn=4,msrgsb=9,cpqh-,xlhxd=2,ldd=9,pn-,nxtt-,dttz-,pz-,ckm-,gr=8,lx-,qt=3,dll-,sv=1,dxr-,qcqt-,pc=4,qrprpd-,nrsgfn-,cd-,kd=7,vkm-,zx=3,rp-,mg-,bkl=4,mh=8,vm-,mstnpg=3,dxz-,qn=1,qdgm=7,tp-,rktk=9,qbfzcq=6,vpvjp-,slb=2,fdjf=3,gjdbf-,dxblpb=5,qct=5,vp-,vdj=9,bkl-,dhs-,gx-,bnf=6,lq-,pxpr-,mtr=5,jt=1,dr=7,txx=9,cpqh=9,rg-,zv=1,fb=4,lx=4,pz=6,mrrj-,th=9,zjn-,qklv=9,ht-,qjzk=4,mfb=8,bf=2,qds=1,gl-,cs=6,chdk=7,qmlf-,cn=3,nrhbm=3,btdxxp-,mng-,mmx-,ptpr=7,rp-,zsbj-,mng-,vtng-,sr=2,srr-,fttkg=6,ldd=9,qbfzcq-,rg-,fpxz=5,mnz-,nzl=7,kdplr=5,cntk-,hfcm=7,qdq=3,vrv=2,rcrfs-,hn=1,bnf-,hs=4,jvd=6,ljg=9,dttz=7,vzldq=7,bl=4,vvkcff=4,zq-,kblbg-,fhv=3,qp-,kdplr=9,pz-,mkc=3,fdz-,zbzv=9,nrnx=5,fhb-,qxp-,fcn=6,pch-,pp=1,gr-,tvjb=2,vhtd-,bvj-,sr=6,mm=1,vjvm=5,nq=4,lz-,frp=1,jd-,vzd-,np-,bs-,dgcgc-,jrg-,xn-,pch-,pkr=7,vj=6,phr-,vtng=2,tqjb-,dpfnqr-,mtr=6,ldd=7,zdtkk=6,tsz=9,gqh=8,xf=2,hnzjq-,kfdb-,jmf=9,hqbmx-,ss=1,qvnq-,xqdtf-,pm=9,qbx-,nlxbzc=5,mqg=2,gx-,sjn=7,xpm=4,bz-,cnb=2,zh-,px-,zjn-,pjb-,ct-,zhc=1,rcm-,mz=5,hlk=4,tss=1,zh-,vkm-,gtkl=9,dx=4,psmm-,jsm=3,xqdtf=9,qmlf=7,mng-,mng=3,qp=2,jbh-,bvpqdj-,tqcxq-,vhtd-,ljg=2,ft=2,sdhl-,pn-,mrrj=4,qklv-,hgnr-,pp-,ccvd=3,db-,lq-,ktskt=6,nn=7,sgl-,mzt-,gqh=4,dqr-,tpg=6,ph-,mchc=7,zsgct-,jzl-,ccvd-,ln=8,fb-,gl-,cmk-,dqr=7,vjk-,pjc=1,mm=5,vqp=3,bgt=2,zdc-,zccc-,zdnd-,vvh=8,pn=2,tcv=9,zvc=4,qqzt-,kblbg=4,qbx-,qbx=7,mrb=4,lrhgd-,jjlrr-,bls=9,jt-,xqdtf-,gttk-,xmprb-,scg=7,qq-,nr-,gjdbf-,rq=8,mkc=1,lx=6,jrg=1,pch-,gvk=2,pgx-,vkm=6,th=8,zp-,jpb-,vzd-,czt-,fhb-,tvjb=3,cf=4,pxpr-,pbbmt-,jkm-,hd-,vv=8,tppcb-,vpvjp-,fdjf-,ggvcqj-,xms-,kd=9,qds=5,jmjm=3,kcp=7,gkbl-,trbd=1,nzl-,dxblpb=4,gjz=9,lqn=8,vbg-,ds=8,jqk=2,jmjm=7,ntpn=1,bkl-,lgp-,vhtd=3,tcv=3,hs-,zgb-,gjdbf=8,pq-,kkrnf=2,pq-,dkc-,zl-,gg-,ctf=3,vvh-,mm=3,vm-,zsgct-,px-,dbg-,pdk=9,sgl=1,qvs=4,xpm-,rms=1,gjdbf-,gdt-,mstnpg=4,dxblpb-,qds=4,dgcgc=1,sjlk=3,hhtb=9,ptpr-,mchc=5,dll=4,vhtd-,lrf-,zvc-,mh-,mx-,lgp=7,cx=6,njc=9,nq=6,czt=6,sbvx=5,xqdtf-,kv=9,qx=4,tbspnx-,xlhxd-,tppcb=5,tlk-,zh=6,zzq-,cclj-,jcxr=6,bnf=3,zkh-,dqdv-,qvnq=7,dx=7,dbh=4,nks=4,xlhxd-,ztqc=9,ggvcqj-,ngxq-,cmq-,lztjd-,cjd-,rdl=6,ngxq-,pq-,vbsz-,hnsghx=5,bgt-,jmjm-,cn-,gb=3,tfm=3,ss=6,xrt=3,vqp=7,slb=9,zdtkk-,zh=6,qds=5,kdplr=6,dxjtjb-,qds=3,mzt-,hsxn=9,qdq-,rng-,zzq=1,cn=3,sjn=2,lq-,kfdb=6,qn-,mstnpg-,vvtdp-,klc=6,mp-,zprzq-,rc=3,njc=4,pbpxf-,sqkc-,lkl-,vtb=6,xrt=3,gnh=3,kp-,pv-,gr=8,rms-,zjn-,frm-,cxzq-,pdlz=1,vm-,vv=3,ztt=7,hd-,xlhxd-,vmkb-,sp=7,kjxx=8,tmn-,dzd=5,bkl-,mnz-,bp=8,rp-,bvj-,vkz-,qbscx-,mz-,rg=6,qsm=5,mtr=9,dgs=2,gjdbf-,gb-,kd=4,kqgq-,vj=8,qrprpd-,xrt-,qcfz=4,kg-,tqjb-,gbx-,pc-,pk-,bjng-,bs=2,tn-,dttz-,lfpjzc-,pd=1,pxpr-,vkm=8,cb=6,scb=5,tj=6,zjn=3,cgv-,jkm=9,jrg=6,qn=7,kdplr=7,xm=1,lx-,zprzq-,hsxn-,qn=9,fhv-,bxc=5,px=4,nrhbm-,lrf=9,ql-,jsm=4,vj-,dll=8,qbx-,kfdb=1,hkjk-,jvd=5,bz=3,qmlf=9,zsb-,dgs-,gh=5,qk=6,zsn=4,pjc=7,gbx=9,nr=5,ldc-,tqjb=9,lrhgd=8,jcxr=2,zfsz=9,lls-,trhc=4,nks-,nn=8,rzkc-,kqbt-,cntk-,vqp-,zx=3,zzq=2,mfb-,mrrj=2,bs=7,xr-,fv-,chdk=6,xk-,ds-,vv-,dx=7,bvd=2,kd=4,vcm=3,vdj=2,qp=7,ss-,nrhbm-,mlkg-,vd=3,mtr-,fhv=2,kq=1,hqkg-,gqg=2,jsr-,jqk-,kv=8,cbf-,dbh=8,cclj-,rhlv=7,gttk=4,vpvjp-,qct=2,nlxbzc=8,zhc-,pmd=7,rjtl-,qp=3,dp-,ds=8,ql=7,mng=1,hb-,fcn-,kz=2,ctf=5,kblbg-,zbzv-,hk-,cb-,mjt=4,cnb-,hdf=2,nvj-,sv-,gjmjrv-,rhlv-,gb-,lrhpc=7,nr-,gh-,mh-,jsm=5,bp-,dxhg=1,gbx-,cbf-,gkbl=9,dxjtjb-,vjk=7,zsn=1,mxg-,bx=7,qcfz=8,cc=8,scb=8,qct=1,hqcqb-,hzm-,tqcxq-,xqdtf=7,zsb=7,kv=1,frp-,bgt=9,qt=4,ntpn=3,qn=3,sjlk=1,qbx=7,qjzk-,gdt=6,dq=3,dt=3,rqr=7,bkl=8,rcrfs-,ltj=7,ztqc=2,zgb-,pv=4,cjx-,svcb-,tppcb-,stv-,xgcpp-,rdl=8,dqr=8,scb=6,xg-,qtt=4,zx=3,zzq=9,kbg=9,hnzjq-,tqjb-,ngxq=7,qjzk-,tqjb=9,qdgm-,vfdlhq-,bls-,lm-,bsg=8,jbh=1,llqt=2,cmq-,gz=2,frvv=2,gg-,zprzq-,zv-,cx-,cjx-,bsg-,qhnr-,tflk=5,vgfr-,vvh-,kcp=6,ltvf-,ljg-,tmn-,gdt=5,dct-,ntpn-,cx-,nqcfs=5,hk-,frm=2,djd=1,bl-,qbscx-,dxjtjb=1,dxz=8,hqcqb-,xpm-,gtkl-,hhtb=5,rdl=2,dxr=7,jzl=8,nqcfs-,qhgf-,mtr=1,sf-,sq=8,kd=6,gr=4,vrv-,zdtkk=4,cd=1,hqbmx-,vvtdp=7,fp-,jqk=1,zgb=3,tppcb-,tb=2,ntn-,mrb=5,rcl=7,pk=7,gb-,cl=7,cl-,dpfnqr-,rktk-,frm-,vdj=2,zbzv=2,hnsghx=8,jpb=3,qdgm=1,lrhpc-,zhc-,znc-,mp=8,jcxr=8,xbx-,np=7,tr=9,mv-,chdk-,klc=9,zr-,nvc=5,kcp-,mh-,vbg-,mtr=7,xg-,klc=3,ggvcqj-,mzr-,vmkb-,frp=1,djd-,zstl-,ggvcqj-,hdf=4,kgn=5,vzd=5,cf=4,vfdlhq=2,bvd-,hgnr=2,scb=5,lx=1,qds-,mjt-,bp=3,vtng=1,zdc=6,jmjm=8,ckm=4,fv-,sp-,jsm=7,rtm-,ph=4,txx=8,vtlv-,fv=3,sr=5,gx=7,dq-,rp=4,qbfzcq-,hqkg=1,vhtd=3,vm=4,kg-,sq=4,bvj=8,lls=8,qvccp-,ttj=7,dbh=8,qbx-,kq-,rg=9,ccvd-,qstfm-,dttz=5,vh-,dfpx-,bls=9,dqsq-,kbg=9,zprzq-,rc=4,gtzk=5,bvd-,pdlz-,pp-,zvc=8,mnz=3,cf-,mng=1,zx-,bgt=1,ntn=8,mnz-,cpqh-,pjb=3,th=2,ltvf-,bl=6,lq=6,jpb=7,pch=1,gbx=9,hgnr=5,gg-,jbh=6,xmprb-,gxh-,zdc-,tppcb=9,mt-,zq-,lrf-,tqjb=1,bz-,kfdb-,llg=8,jb=5,cjx-,nn-,gz-,vcm-,czt-,zvc-,pctvf=8,jjlrr-,pzxc-,trjtl-,cn-,vtlv=8,qvs-,qsm-,vdm=1,vdj-,pqdl-,tq-,lqv=9,rcrfs=6,df-,qcfz=4,vqp-,qvs=2,ltj-,hb=4,sxj=6,xrt-,hb=1,vzd=7,jt-,qhgf=5,vqq-,hcqh=8,rq=8,hhtb=8,th=9,chdk-,sbvx=3,xxk=7,ttj-,cgv=2,vmf=6,xgqj=4,lq=3,tq-,bvj-,mx-,px-,tz-,bnf=3,jzl-,slb=7,vtlv=9,cmq=5,kbg=1,kfdb=8,lfpjzc-,nrsgfn-,rktk-,kjxx-,xxk-,chdk-,lg-,fr-,mjt=3,rhlv-,slb=7,jzl-,gtkl-,zkpz=5,mmx-,vtlv-,kfp=9,zfsz=7,zdtkk-,vqq=9,ktskt=2,mzr=8,cjx-,dfsb=2,rzkc=1,lrhgd=7,qklv-,ptpr=1,cbp-,qklv-,msrgsb=3,kdplr=1,kg=7,rdl=5,chdk=9,xg=8,qj=5,srr-,lls-,qcfz-,qpllk-,mv=2,lq-,dz-,sdhl-,jllf=8,lztjd-,cxmp=5,zp-,qk=5,cmq-,blllmg=7,sc=7,rhlv-,mp=6,lz=7,cb-,xpm-,zdnd-,trhc=4,bsl=6,mp=1,tsz-,gvh-,ggvcqj-,bl-,pqdl=2,bl=4,cb-,tn-,ktt=1,fdz-,fr-,dq=9,gxh=8,qpllk=8,pjc=6,qpllk=6,tqcxq-,mzr=2,dp=6,mjt-,cx-,ldd=2,xrf-,vvh-,tflk-,sgklt=9,vm=6,qk=8,cj=8,gft=1,dqr-,gjmjrv-,hn=3,ds=1,zc=6,ldc=1,tc=3,vmf=7,mng-,nzl=7,xrt=3,sp=3,dxr=2,lqv=8,zsn-,xg-,xrt=9,mjt=1,qk=4,cbf=4,tppcb-,lnh=8,znc=4,qn=3,tj=6,bf=8,dqj-,rqr=8,chdk-,fhv=7,gxh-,vdm=6,zbmts=8,qdgm=2,zkpz-,zzq=2,qsm=5,jb-,gr-,vmf-,ldc-,hqkg-,vrv=5,ft=2,vvtdp-,kxg=7,cbp-,cj=1,kt-,rc-,xk=1,zv-,rsbz-,lztjd=7,lqn-,tp=3,vcm=7,ztqc=2,vfdlhq-,kfdb=9,bs=4,vvkcff-,zsn-,tpg-,mnz=2,gqh=2,hd-,hjc=4,vhtd=7,bgt-,dxblpb=7,frvv=6,jzl=9,mrb=1,kdplr-,qmlf-,gjz=5,pz-,fttkg-,qpllk-,bl-,gvk=2,hz=5,psmm-,hzst=1,bz-,dqsq=7,dhs-,ltj-,vh-,trhc-,ht=6,rzkc=2,cmk-,gttk=1,xlhxd=4,cx-,nks-,zfsz-,nvc-,bz=6,slb-,jllf=2,rg-,dz=6,jqk=5,zstl-,tlk=7,hs=6,sf=8,vqq-,cjd-,lm-,sq-,pq=3,px-,cntk=7,njn=4,xgcpp=6,vj-,ldd=5,nvc-,xgqj=7,rcm-,gtzk=1,zfsz-,mc-,gb=8,jcxr-,tlk=8,zbmts-,cnr-,qds-,zfsz=2,ptpr=2,vj=5,qhgf-,jz-,nvj=2,cnb-,qdgm-,dm-,vkz=8,rsmvds-,fr=9,qdk-,fdz-,xt-,rsbz-,rsmvds-,lpchk=3,tlk=9,gq=8,qsm=3,zbmts-,hk-,vhtd-,rp-,qpllk-,llqt-,tbspnx=2,nxtt=2,zdtkk-,ktt-,psh-,vgfr-,zbmts-,sf-,tss-,lqn-,kgn=2,mstnpg-,rjtl=7,zvtkxm-,xv-,qdgm=6,vl-,xmprb-,hzst=9,njn-,dqdv-,cgv=7,vv=8,zprzq=1,qct=5,zkpz-,tqjb=4,lgp=3,jmf=4,kz-,cn=4,hzst-,bz=4,kfdb=6,pz-,lnh-,slb=7,pk=7,np-,nrnx=8,nxtt-,tsz-,fhv=1,fpxz=4,jt=1,bgt=3,hz-,zsb-,hjc=4,gnh-,vj=8,vd=7,qt=6,kcp=8,dfpx=5,gqg-,bls-,bs-,nr-,xmprb-,mkc-,vj-,vh=3,kfdb-,vt=6,bvpqdj-,lrhpc=2,qh=8,scg-,mlkg-,lpchk-,vtb=8,jjqmb-,mtr=4,bnf-,ggvcqj=1,sjn=3,mm=4,rdl-,dm-,tlk-,cj=6,dp=1,cmk-,pdk=5,dpfnqr-,gfcql=2,rpp-,gjmjrv-,kdplr-,hcqh=2,bgt=6,jvd-,mzr-,dttz-,kz-,mxg=8,xm=7,vgfr-,tc-,hn-,qq=3,mpg-,ptpr=1,zdnd-,xn=2,stv-,rpp=6,ccvd=5,nxtt-,gjdbf=9,tjl-,hn=6,pz-,pjc-,nvf-,jgpjxb-,bxc=6,psmm-,dl=8,gfcql=2,ds=8,pctvf-,mg-,qh-,fdz=9,rdl=4,qdq=9,nvc-,dqj=1,nn=9,vvkcff=8,gm=9,sb-,rng-,sf=9,xg=5,tbspnx=7,hqkg-,kfdb-,gg=2,pdk=5,rcl-,pzxc=6,tmn-,zsn-,mstnpg-,ql-,qt=1,gt=5,qstfm-,cclj=9,ql=5,xgcpp-,vrv=6,lfz=4,gbb=3,kdplr-,tcv=5,jkm-,qh-,gl-,xg-,pp=9,gq=7,vtlv=1,qrprpd=3,zprzq-,bls=5,vmkb=2,sr=5,mmx-,tp-,fgrngv-,ngmd=5,xg=4,szp=7,rzkc-,xznps-,xms=8,xrf=5,dqsq=5,bnf-,psh-,gft=6,gbx-,lffflt=2,tq=9,sqkc=7,dm=2,cjd=4,mt=8,qbx-,ckm-,db=2,pdk=6,qdq-,tppcb-,ckm=5,rcm=5,fhb-,lx=1,mm-,sks=3,qt-,vzldq=7,qhnr=9,xr-,ntpn-,sv-,gkbl=7,pq=1,kgn-,njc=7,lz=1,fpxz=5,mjt-,hs=2,kv-,rb-,cbp-,tbspnx-,hjc=4,qdk=8,fv-,vtng=5,hgnr-,bvd=3,zstl=7,nkqs=6,ngmd=5,vt-,bvd-,pp=6,phr=8,gft-,mx-,cgv-,xpm-,sp-,qxp-,tsz=6,xkx=2,zkpz-,tbspnx=1,vgfr-,zr-,cb=2,dz=9,th=6,lrhgd=9,lq-,zsb=3,lfpjzc-,rj-,mrrj-,qds-,ctf-,kn-,vtng=5,tl-,pgx=5,lls=7,vpd-,dxz=7,zstl-,hqbmx=8,kgn=4,cpq-,rj-,gvk-,ntn=7,tqcxq=1,vtlv-,dttz=2,xxk=6,tvjb=4,fttkg=1,kv=8,trhc=1,zq-,hhtb=5,stv=5,xxk-,vmf-,lqv-,xr=1,vv=9,zdtkk=2,bls=9,lq-,qk=6,ft=9,gjz-,zp-,hbbl=7,lrhpc-,vkm=1,gfcql-,cn=2,rqr-,mrb=5,trhc-,xhbs=3,xxk=5,cpqh=6,xbx-,mzt-,bsl-,hd=8,hb=4,tj=1,lpchk=4,rms=9,djd=9,jmf-,hdf=7,mqg-,mp=9,tflk=8,pch=1,sbvx=2,jcxr=1,dxz=8,ts=6,xg=6,xg-,th-,rp=6,nr=7,jqk=3,zdnd-,vtng=6,rzkc-,cbf-,cs-,ztqc=1,jvd-,vd-,mchc-,gb=4,gg-,dqsq-,dttz-,vd=7,tl=5,bs-,qhg=8,dzd=1,cf=7,nrhbm-,rp-,dbh=7,gbb-,hqcqb=7,vv=7,tss-,cpq=5,xgcpp-,jb-,df=6,cx-,gjz=5,lqn=2,ttj-,ntn-,pp-,fgb-,sjlk=5,sgl-,ltvf-,vh=9,gq-,pz=1,mfb-,mh=9,nr=8,vtng-,hdf=4,vdm=5,jsr=7,qhgf-,mzp-,cl=3,tvjb=3,kt=2,tsz=5,mrb=3,txx=2,qstfm-,xpm-,pmd=3,dbh-,zvtkxm=6,lj-,mrrj=8,gg=5,cmk-,cn-,mv-,trbd=2,jz=5,tz=3,rkr-,xms=9,qqzt-,rcrfs-,llg=7,lq-,sqkc-,trjtl-,jpb=2,gb-,cxmp-,fcn-,kg-,vkm=4,lrhpc-,vrv-,bp=8,llqt=1,tflk=2,gvh=6,zc=7,nkqs-,trjtl-,vvtdp=3,znc-,dt=5,pp=5,gtkl-,dct-,qdk=1,pp=5,hzm=6,ctf=6,rsmvds-,llg-,gkbl=8,nvf=4,czt=2,gt=9,vvkcff-,zr=1,db-,xn=6,vdj=7,vm-,slb=9,xhbs-,gm=1,rb=2,dr=6,ds=5,ts=9,mh=8,gz-,xrf=6,vrv=8,fr=8,tb=9,bls=7,gm-,sqkc=8,njn-,sks-,sf=2,gqh=4,nkqs-,mfb-,pxpr-,psmm=3,qvs-,cnb-,kcp-,rzkc-,hqbmx-,ct=5,jsr-,jb=7,ql=1,mzr=5,dgs-,gtcgmx=3,dgs-,pdlz=9,slb=2,pc-,nvj=8,qds=4,bs=9,tr-,vpd-,cdgvf=2,xqdtf=5,gm=1,jz=5,psh=8,ccvd=2,sc-,hd-,gtcgmx-,qdq-,ngxq-,xf=5,gtzk-,jkm=3,bnf=2,gl=6,zbzv-,vj-,kd-,bls-,bgt-,jzl=1,cf-,ngxq=8,cnb=3,sjlk-,mzp=7,ql=1,bd-,rq=5,cj=4,xqdtf-,vtln-,tcv-,qqzt=8,fcn=1,bsgjn-,qdgm=5,bgt-,ktt=3,lx-,xrt=8,cnr=6,xpm-,tjl=3,nks=7,kkrnf-,jz-,tz=7,dqsq-,xhbs=3,df=7,tqcxq=6,hz-,rjtl=6,qx-,xk=7,pd=4,gvh-,fpxz-,xmprb=8,lztjd=2,lztjd-,tc=1,hlk=7,tsz=5,pxpr-,qct-,qcfz=2,pv=8,rc=6,vvh=8,zsb-,pmd=4,kjxx=4,qx-,rcm-,ts=6,dgs=7,zzq-,qbm=9,ngmd=9,dm-,mrb=3,mtr-,fttkg-,bkl-,gkbl-,dkc-,hzst=6,lqn=9,kblbg-,jd=2,fd-,bxc=3,vh-,sr-,mxg=8,bsg=2,fcn-,vpvjp=3,qvnq=3,zzq-,ts-,njn-,mknpz-,vqp-,bf=2,qj=8,zv-,btdxxp=8,scg-,kblbg-,ts-,zbzv-,sjn-,tz=5,jgpjxb=2,ltj=7,sf=2,zsn-,fttkg=8,gxh=4,qqzt=5,hnzjq-,qstfm-,ncft-,gt=6,pxpr=3,mpg-,sr-,tj=1,np=3,nqcfs-,hsxn-,rq-,lrhpc=5,hbl=8,xm-,cjx-,cx=9,tss-,tqjb=9,fttkg=8,ktskt=4,kn-,gvh=7,pdk=2,cnr-,sr=4,vdj-,vdm=2,xhbs=5,pp-,zsbj-,vtlv=6,mlkg-,mknpz=6,vhtd-,vvh-,kqgq=9,tvjb=1,ngmd-,vmf=7,mng-,gnh-,kblbg-,hqkg=4,mrrj-,qds=2,dx-,qklv-,nn=2,hkjk-,dbh=6,cdk-,zjn-,rsmvds-,zq-,ztqc-,qvnq-,vdm=8,rktk-,rg-,hhtb=7,tj-,cdk=2,mnz=7,vzldq-,zdnd-,gg-,gm=7,mqg=8,hlk=7,rpp=9,msrgsb=3,xr=5,zx-,zprzq=2,qdk=9,fdz-,tl-,qdk-,mzp=3,bp-,pzxc=4,cs=1,bs-,tlk-,nvc=6,lqn-,tpg=7,jvd=4,gt=2,trhc=6,sr=8,czt-,sjn-,fcn=6,vpd-,mng=9,kdplr=7,dxz-,sjlk=1,ql=3,tlk-,zvc-,cgv=5,lrhgd-,hdf=6,lx=7,jmjm=8,sgl=5,gqh-,czt-,bsl=1,gz-,jbh-,qqzt=6,gfcql=5,cx=7,sxj-,cnb=8,rqr=6,ct-,vcm=1,jsm=7,cx=6,qxp-,ltj=7,sv-,jzl=6,qhnr=5,zprzq=2,dxhg-,hb=6,gr-,sdhl-,phr-,bsl-,vzd-,gjdbf=6,nvc=4,fp-,btdxxp=5,qk=2,lqn-,lrhpc-,kjxx=6,qhg-,nvsr-,zbmts-,gh=7,qcqt-,zjn-,bx=7,ss-,ts=2,lfz-,kp-,bx-,ldc=7,qbm-,ptpr-,tn=6,ps-,zjn-,dqdv=3,gbx=7,frp=1,hs=1,vt-,vjvm=6,gjdbf-,lztjd-,nvf=4,qdq-,phr-,lj=8,dttz-,qrprpd=3,llg-,dgcgc=6,kd-,fd-,hzm-,dxblpb=9,gdt=6,slb-,vt-,gtzk-,zv-,qsm=7,zccc-,vcm=4,sqkc-,mfb-,kqgq=3,kjxx=1,rmh=6,bsgjn=8,srr-,dl-,mfb-,zgb-,gtkl=9,trhc-,zstl=2,jmf-,gq=9,rb=4,cl-,cbf=6,bx-,jzl-,hgf=8,mrrj=2,vvh=7,zvc-,qhnr-,hqcqb-,nvc=2,stv-,scg-,kfdb=8,xqdtf=1,dxhg-,llqt=2,tpg=8,lfpjzc-,sqkc-,gqh-,dbh=2,nr=7,dr=1,qcqt=1,hfcm-,vtng=1,znc-,vhtd-,nlxbzc-,qdq-,dcdrv-,vzldq-,gqg-,rsbz-,tlk-,qsm=8,dbh-,nkqs-,czt-,pdlz=5,tsz-,trbd-,qsm=6,hn-,sr=6,rpp-,bn=8,zkpz=1,vzldq-,kblbg=4,hd-,hzm-,dll=4,pkr=9,qt=4,tcv-,dcdrv=9,ft=2,kgn=1,dxblpb=2,dq-,qrprpd=9,xv=3,gtzk=2,vv=6,vh-,hkjk=8,cxmp=2,lm=7,gl=8,mv-,hgf=2,kq=5,kqnjk-,dx=2,lgp-,vgfr-,gqg-,klc-,cntk-,pbpxf-,szp-,tppcb-,vvkcff=8,qbx-,nxtt-,fv=9,vm=3,cx-,psh-,fhb-,vtln-,cn=2,qt-,gtzk=5,tj-,mg-,tppcb-,vgfr-,ql=5,nr=6,hd=4,dp-,tflk=3,cj-,qdq=5,gtcgmx=8,dpfnqr-,qbx-,tmn=5,hzm-,ldd-,qx=9,pc=2,ktskt=4,kfdb-,nff-,nq-,kqgq=7,qbx-,qq=2,ldc=1,rmh=8,pkr-,ztt-,qq-,qqzt-,zbzv-,pk=8,vmf-,tz=1,hlk-,mh-,lfz-,gtcgmx-,qdk-,pxpr-,zsgct=6,sgl=6,cd=8,jllf=9,fgrngv-,qdgm-,zhc-,qdk=4,pjc-,cdk-,ct=3,dcdrv=4,sgl-,hzst=3,jvd-,svcb-,gvk=2,bvd=2,ncft=7,gx=4,njc=7,rmh=4,ntpn=5,tqjb-,gtcgmx=4,rkr=8,xk-,zbzv=5,qds-,rkr-,xk-,cnb-,dq=8,vpd=6,fcn=1,dl=6,xv=2,qpllk-,pzxc-,pz=7,ldc=4,tmn-,qstfm-,kjxx-,qq=8,pqdl=5,qstfm-,vpd=6,ztt=8,ht-,pm-,xms=9,zsb-,nvsr-,fpxz=3,djd=6,kt=6,nkqs=4,rcm-,dzd=2,nq=8,sb-,rzkc=1,zsb=5,pp=7,ztqc-,bnf-,rqr=1,xn-,jgpjxb-,jsm=8,qhg=4,rsbz=9,qhgf-,rpp-,gq=8,pp-,tfm-,lz=9,mv-,xbx-,lfz=4,mmx-,hlk-,ktskt=6,bvd=6,mm=8,rms=7,pp-,mm-,hbbl=2,bx=4,ntn-,qjzk-,jqk-,jsr=6,qqzt=3,hnsghx=5,ztqc=7,pp-,rc=3,sp-,ltj-,bf-,cl-,sp=9,jzl-,qcqt=5,qvnq-,qpllk=3,mrrj-,xgqj-,rqr-,dgcgc=5,ccvd-,dl=8,msrgsb-,kgn=9,mv-,nvj-,fdz=6,ljg=8,vm-,trhc-,njc-,vgfr=6,dcdrv-,cxzq=2,ntpn=2,mknpz-,cxzq-,pdk-,zprzq-,kqnjk=6,txx-,pv=4,rhlv-,frm=9,gqg-,gh=2,lx=5,tn=4,srr-,trhc=8,bp-,kblbg=8,lkl=7,zbzv=2,gttk-,mstnpg=9,rcrfs=9,jjlrr-,hnsghx=5,xqdtf=3,gtcgmx=1,gkbl-,ngxq-,zkpz-,vc-,gh-,zprzq=6,szp-,xk=4,blllmg-,gl=5,mpg=1,bbl-,nq-,kdplr-,btdxxp=5,msrgsb-,nqcfs-,zp-,dx-,dm=3,jmjm-,vvkcff=9,mz-,gb=8,fd-,bls=8,dx-,fp=4,sbvx=4,ph-,hsxn=6,ctf-,tppcb=4,lfz-,bs=3,lpchk-,nvc-,kqbt=1,ngmd=6,cbp-,llqt=5,hgnr-,dll-,gl=3,pp=6,ht=4,nvf-,rcrfs-,gm-,vh-
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day17/Day17.cs b/2023/AdventOfCode/Day17/Day17.cs
new file mode 100644
index 0000000..da2184b
--- /dev/null
+++ b/2023/AdventOfCode/Day17/Day17.cs
@@ -0,0 +1,103 @@
+using Coord = (int X, int Y);
+
+namespace AdventOfCode.Day17;
+
+public sealed class Day17(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day17";
+
+ private readonly string[] _example =
+ [
+ "2413432311323",
+ "3215453535623",
+ "3255245654254",
+ "3446585845452",
+ "4546657867536",
+ "1438598798454",
+ "4457876987766",
+ "3637877979653",
+ "4654967986887",
+ "4564679986453",
+ "1224686865563",
+ "2546548887735",
+ "4322674655533"
+ ];
+
+ [Fact]
+ public void ExampleOne() => FindLeastHeatLoss(_example, 1, 3).Should().Be(102);
+
+ [Fact]
+ public void PartOne() => WriteOutput(FindLeastHeatLoss(Input, 1, 3));
+
+ [Fact]
+ public void ExampleTwo() => FindLeastHeatLoss(_example, 4, 10).Should().Be(94);
+
+ [Fact]
+ public void PartTwo() => WriteOutput(FindLeastHeatLoss(Input, 4, 10));
+
+ private static int FindLeastHeatLoss(string[] input, int minStep, int maxStep)
+ {
+ var grid = new Dictionary();
+ for (var y = 0; y < input.Length; y++)
+ for (var x = 0; x < input[y].Length; x++)
+ {
+ grid[(x, y)] = input[y][x] - '0';
+ }
+
+ var startRight = new Context((0, 0), ((1, 0), 0));
+ var startDown = new Context((0, 0), ((0, 1), 0));
+ var end = (input.Max(i => i.Length) - 1, input.Length - 1);
+ var dists = new Dictionary()
+ {
+ [startRight] = 0,
+ [startDown] = 0
+ };
+
+ var queue = new PriorityQueue([(startRight, 0), (startDown, 0)]);
+ while (queue.TryDequeue(out var context, out _))
+ {
+ if (context.Position == end && context.Direction.Count >= minStep)
+ return dists[context];
+
+ var nextPositions = GetNextPositions(context, minStep, maxStep).Where(c => grid.ContainsKey(c.Position));
+ foreach (var next in nextPositions)
+ {
+ var n = grid[next.Position];
+ if (!dists.TryGetValue(next, out var nextDist) ||
+ dists[context] + n < nextDist)
+ {
+ dists[next] = dists[context] + n;
+ queue.Enqueue(new Context(next.Position, next.Direction), dists[next]);
+ }
+ }
+ }
+
+ return -1;
+
+ static IEnumerable GetNextPositions(Context context, int minStep, int maxStep)
+ {
+ Coord[] dirs = [(0, -1), (1, 0), (0, 1), (-1, 0)];
+ int idx = Array.IndexOf(dirs, context.Direction.Dir);
+
+ if (context.Direction.Count >= minStep)
+ {
+ var left = dirs[(idx + 1) % 4];
+ yield return new Context(context.Position.Add(left), (left, 1));
+
+ var right = dirs[(idx + 3) % 4];
+ yield return new Context(context.Position.Add(right), (right, 1));
+ }
+
+ if (context.Direction.Count < maxStep)
+ yield return new Context(context.Position.Add(context.Direction.Dir), (context.Direction.Dir, context.Direction.Count + 1));
+ }
+ }
+
+ private record Context(Coord Position, (Coord Dir, int Count) Direction);
+}
+
+public static class CoordExtensions
+{
+ public static Coord Add(this Coord self, Coord other) =>
+ (self.X + other.X, self.Y + other.Y);
+}
diff --git a/2023/AdventOfCode/Day17/input.txt b/2023/AdventOfCode/Day17/input.txt
new file mode 100644
index 0000000..6890cc6
--- /dev/null
+++ b/2023/AdventOfCode/Day17/input.txt
@@ -0,0 +1,141 @@
+154651534533264223246736313357734657147374325514765434772544275388338442868844847827285753355677536765673622573135621137234461521333452441541
+434613344236623124357254431623141437257446714666363524476254466252424656766464543767833234754157661744135677735466542544652224313641123332623
+111656244231261643672337356332261667312415742412843278763423442625288648554467623422864383587622427376656341227463517657723745142466436612332
+165136343443341162231423452344525473231472466432243883553358332844847863852642574732237457642328251735767616161153526651513633151325531232154
+425162642164653166237577573266152444736721465776278554374686666765264272874554378373258465367847432213643665354176363146415334666644611262365
+613514122133246516652772625532462433317163648836726654272423253264346888555473666322576243675582732847512756757567731352746543772145452516552
+626155453666464414642266742147367271742354522737427852567873742477886873632746327236632385366884343653653426445236345115522726141334361523223
+233445262556673526733536651746413563147575357654266553684346345454337877847846826485857685863744744726428867233473156546517773141566416246235
+641435561561714375667267366234645272573576875263433732445848523845477733556458883625652227565862866275433576343554562446215213247637244333232
+244343112625757756556752527222156354666643654263565663323766825737643238637458432585334687355572258385858683564337413464717236627634614245335
+622511244277412256373463253114532558782675534254527477337255738643346838875732373844456288642767446775823833443617342734414445546742464134364
+232661653527512136737133242651268568258836768758565476863528846677644827427636564545542254438262634875278785324345217215221573255456364323646
+342163125674631636272756741733876753363376365254484536663567875535237563747325556248282475755388234386826265535728451311154711775262253262523
+161646332434246516366422434585474757563343222537675475443564782783774933673564723636447725257333384734373455463675443572122357121534335523624
+123555731631462631122134547866353487727242558468687856276647673369944498469843695384872374576783338885232325246434234155564347275466216462454
+545561174551676651765474785526373744832377726384383267847849549584868485684587555989349824354843733527562653635835267727214114156531564126542
+635133373565363436576632865886353776475474363453345866849757894434449454793463649966645799534765882647427848235282432567451572443122673722452
+642226414343346747155675285465842267788573563282724966869795865573458488585776599477384366959625458588566727456434728565762651154674131274374
+326545253656156161562578528675337448234255352454655474849548843788896745335668448487499693883645886242625428582743772748633323634776454552436
+634357257236273434641676333463427456442825557746967373888475656673574387689693878488556877786948848763456868322574633337741346256546411567612
+343572626551346472233274435334853326382783274884978386957557837498668659665838883386493565787476374936347252483473833823477525115332425453726
+167471726674523523363837576458522768588725379334335435874847993666673495753435963487337677646867787555748763657667654858323765571516453574567
+613661427654472164837676527224826677322263548756976866844637934744777345579894573567995439744436565663475865484778637388387376126376311363434
+332146564341247714557765355543847575882764745574488845498797677497459393455599796934573958953463478545932625574324664777785864446151571324625
+123367743334745273483222463366372346633869953873535576634859598469468947347453697855679865337584868945588464854554233623674788227254426756176
+313716535772243853248728528265246652654566478975983939568647946973687746337335358848577685355783475447699742858647578267563735574516276771417
+351326535414113548684553432344334573349596795676375444564636797763549997353888378836644956475689446797459458435532447626346738633357463252246
+432714122562746337536763783537687679887587456575979586859463433388497439459639787495746737835673686598357785945252876652442226547367411136326
+452477371331233435773863458475879846444799475968479835598869696344698586776996537858484577397679965377679774844427852333278645225824472333675
+631667433722873827452456736446343968644467697549586388339636948876594954774564686898578875939493356733475795785436286828852682637445635631761
+157571413664325828647463283258483939793475673666389978378789857487666974965778997896459656755537744584566437576943327533848572474468414223223
+741636266264223763473445236788766685695998546737884839455789746446989657969675647697689754659358868954849359644336588782335457645747644212215
+321435623424464345722357766779593883377487399896635576964695845958644484985494588455576796874395364987489785576967732277848732875475336221211
+614727555532353583428252782446554758844576767583845944996864866748699877555767875657885878855844357553494394868846987576444453884656642616246
+233737327388223853487665523453464346358398956758965449498964674588948549594669946888577967459668467799983438683967655442378326735824386365751
+673246768687733758348574857554544393749565738679958946787459754596994459466656464656768897445596779448697593747375756572865436772535557754211
+643457614367338742587762445569579447794658688474988797855967585494797688679469695647949677664948989438964885938654847566655273344546288527454
+356575457324273366465647997438575963694538459645656465875875558498467756996794875675577589488668578696596764773344453982235353577268774834463
+633321623433836843273528383336387495483596994466468678694577448567758874756598679589888787598979974549335494978894935543458468547346753432673
+115313556652823374565836834655457357764375575949847558498448584896998857699778897468958484945685859667743587393986455533555622566747274273212
+361721666566675563585867769969736437457977596568845687888869944785945999966597767579696498566647648459497896448859646549823383887456845657771
+566775333727343683842886855898484535396649789458788775667657895959489857847847649756675645455448487747566544878794363345357465546682547733763
+254414735335683264443778939565679883759844669979687799894569984775445958994947697948574467695488965998864836795896346753646446375847874672433
+456426575666374752778436466636354345479658879866448567954689488666969789559787778477899466555988658756779836757773759843789762332648335567642
+351567742488247372235344934965784578949884446765976579457465797666777576597797888965785566869857948894695988796985877765736522725583254543235
+171434334834237673275557953568738485776855786997559987678796998855555979896896895866944648887795876484994597774768735943895342452537684668412
+215446886462582568364664365843773343598865897848598887649567985767997987775558897986969587786557664974846754934457657399977443276666265473835
+465524642772282674444999688483968744669969697884768968675856667755869588978987777778756688479874858875856485956778383678364848467348336457636
+638554888368352558545564466374543474458579449967844985989665687669796778598565665685978996767694896664464488694387435497486857272656744254468
+554342247773486773577637634865683778864797597899885495699886665555786598989988566585789756999956469868846587856998747637986452882328285764578
+356255862786352224595948895664463858466766678664577998788787578597575759786996576687679888559667577457984696655549836456779437344226426265754
+344327728558542223875736798864557946696484758456658865878667986887779858975967769959895855669778574955574444997447784479997697275727678226776
+185688448363434853657769586555685584765657675547976766755966769978878585565978896857777886975975457757754555844375839946996747357875666774363
+188646847823335339873347753383354898476646746795758759575756858876698756659779998588587595786588878789886996798394645775775377327888343856565
+376585835485545576499678444683996657888878888664669568695977899766667798886587765978855577569986868598498597755548375584734396348252446866285
+252482488445458564668857694457378544474555679986786959669865687778559756667986678988886997988567476768966857775747448583486837952836458334243
+568273875576773636336636468583957477855454476777689899675986667889855957989669588955569859689556778698468859787765973637553557876483557728433
+777258855472864748746789568983844987477495868466799568877567566898956786999578985578679856597778556996788864976955787478579536498682877426754
+486746238838266398635658476877799564856499847866799676659998588699778869697778668585588858658985987859557944546654553844885868976357783335234
+432546538343684464978799898959754899655774466665797976957989656778766969968779986677588865676977795795798984594464376446445456793582467354323
+445675445468757649737955496899947848875978944558888595885885986689667889689679786896956687668996875976695968445845466543673733955854882452822
+845547862442224993565544479756947896849967456686986898857578566686996698889778666866759667568999765596557497584775656997878746549768672283543
+684633267222384334797446939455895977467496667568887675687589777978876877899688978778668696857898788784877884499464569854374757965234458283724
+343474688774535748367956535996879848797696747958987698658887777887796976897889897966795988997776568978485587988699379999439469658343436567323
+874827456725563636845864834847774697595855795895769566788668898996769887779766978678885778989666865756669564754549795975347599648425422767542
+474487685656557779345799756746568987975977788867866578759879666977886698998766896766757785688587998995864889546774859959537979786353486787288
+448476622346327344394849633848477676895589999989766965867797986767976867987967887887977787657558855546989574989774864779454675636682853752257
+585753566737595834856685897466684454485659499996557697577678968786667879688886698977697667988868697649777848457947944345974539784937645478847
+526737422567653736445595557949964875776686677598867565699869787879997676868998688686896569865888567868449548657679536666538839974386426322388
+376438532548394485644747385746769987468468898888959968879897998879779699977799797897969655865788768759898775688745787438977689674662622788785
+566667755624349557449753755974885754479888679897578959575898887787866996797677898688697775959885896664779888984544757379463567897437482348466
+825528865477734846633574535787859669654464755696677659588668766678779988667778889677766969978559877689564579889986966954957579783973722732573
+837225443233283579866885735685754565665674887986559766667669768869769878996876777869877576898689699875996898759888667767958398534552644667664
+382546845852453743384576376469487666575658657787697887955889678698966776888896679668986958597796878855888476879488546533899866889623484542276
+425854787382438755437489897787654748565774869995858858789777778686988988876669976876799669589796888765674849576847946995979368355366743258765
+483442763688843758979649983365948689564556655885788658767677676798678966779886988767898866685987877649444567589894973438397644933885537466775
+528367522475357954936633653669858868697947975699976879669698668768678896977996879766675875967868668585578799886684784345786679547863735567473
+468866437346689694649889646649655864949678459996566656897896997899999877769698877868779797665759988986547876449876578938779833738388227333758
+472553765763223394543566558465789556569868968969679786675887768976879798887988777896777978589795987868575789448969886537846993856552322236586
+438725732725665543367698347894695644984698687757785876998958878886796788977889776979976565978857795695785658654664639447469336563453345327374
+752684527475356858356769538947864887994964777578596868878595786688697996897976966895667778996756655669666786488657449343635753583365623368382
+662238474247557543977335574444474789758984575559576896658985668797686899779877676885579756886966569688948849458875663439893748795276728624868
+627284635774839657663447478495844795488546775957968689875859669798969976797696768656686786777669657877585775945899734638897465943354826842882
+477373683637773963486939884584669688765484745986998599856699886776988977768687897878775965677968598785546859477447979568539788482256884468684
+534288352852362776377346644983965648844875899898696767765666979997677798967889668976596579585685579496497879769774656777766443893264888876643
+348878668255247558769745438874568966476944676686976778966779695785686666869596757955857669798755886746866867455975943874648364692556332542587
+876433645368648657567688587485676946676594869587879768689767567889678899686999579955655688675787564474685498659747566399858547688856852752467
+165838473255777377896487667369755674495745586666789878877698797986957777895595985576778676695975447697599685769997443984944733487273735824577
+255343267466263654439533888647779686578778848548998567685798767998859796655966789559759756589589565444747869785464433846775549586527386622582
+688347884354244359566733875978765767599684767679766786776899765997858797886569669695579876786998844585868864594578478333399944444638276357778
+474822284677472748995796373366536495648454558779767985967596678757678775859695989875856769978555456646744484579789563589863775962555354664543
+366453867748523683964853389857694764556755958687878689899666869997997689679987796875668755668486745745658664798637377474475787437234834674743
+363562443732545545734364378477876584947468648486949668899969899966867768975655955777997859959585998987576648667543378387967948464546462576674
+167874878723738768695359348787889369679687558659658987576755889567556689776758986668795696689944585447868455639645644897355596775268377276735
+247773478853653687796549535959989449959546696499668794789899987665757658776689876865757679879588877449459645567753465366936963648837272336673
+222375652557565346953989358966346785774974899846557784888885988986665659976796788769889785675554474564585855495434667483995476642786278647522
+434553576855457275763579584778437435786995668545487658896698895667967697989957979667986476844784464594956585475895336959896782462386883685267
+744464444335544467586596755495857785658567959686569979946889595966757978888558655998776575955494577885877899758463587957685933668755858267617
+644275628882728232848796456653896337895695744494848785485779867998759685698955589558985868587766859989865684795897478448968365344543535823515
+726554686753373724433557537597788655459857468954694749756557957577855756788866959445947689978659899444448757937998673848764884762244885447711
+425235653434283265243695843537893943459667974788498948995694446998669697956658867686756569548465998848869369777647664878444453673737576283477
+172525262773245785738594463645547368476847645785679966888845665874887674669557565646849594646596968749855675596779956953652455566688444885514
+125345375647672378628733466636484343465858784644669555446679787944955965989777595965885958547575976744634884867847766735422537444387487284341
+451563673752232342385645834694545383869395797989788799888747845995657848899894698978845959649684959756789856667644834763353725826734536724123
+445231632763376268366333999374547793584334775448785549575484889966545779764785868574559544794569754873699793664983958362483248364447634646242
+716322647664237245474534587464874573968659769669945685795796989844558996985744994959688886989679999446567976556499947367253663588856888324475
+466217513556732443583835736934395945798939399855997765448969987988977494744799597774868776957677763434798998654893377866555842788672354252563
+763135318466752356574346279836755543974997968435566559566886997596847997474476797897584954898487345653855575983647743647352622845262265441574
+147521211823767363586423837798897397945743434337549865475855647445984746796555559489578468754976956897353479459877538276252245575255335541242
+417233764742428782243686786966339493967953973985795894988475767866974465445676859755976567685699473435467494666754468475437273848723743525617
+547625222245535364542567568594648354445394446848834969976894876764464749458486798449655994879664856433867583695357525378868728668286856426734
+273657757123543764474777486478548473866744349346835475674697449784447954698897997454748746884759678778874739587679237757453868428635424265273
+456746564566437628663828342366654383977948778797636598467978879457689784747789889949957354534533955554668885949535875375746632454335316521553
+211363223652275752437672233475483898783399588467657653476978947788659649898698788945383535677637669686796559934642752384368225744364116521715
+265224427432352425758375427368244858645366579477763477385875649896789548867977464773457834947687979789959699568837855372575838756534135757342
+124314564152662653354623284452775537849639978476366763885363339994935443657366978987737333536575865643354964956226857685383362628761664423114
+565771232573734555766578226454828526386378333576636354768343534667569774395543985495375389597977697379998746834562748338264728844411337264621
+627335323645345235387834463625352332558359775734455333369797673447475847688764359498844684788946345857898652853545873823232847466736535216456
+455775554647516626787383523257246878666858668794769883956933696574895888366395894587563576996787973636884676633663736838577725431675114512263
+133721554314256176658574327263626746727945537764994546396999334559948963888866347879359987379539997853793554373647454544586286523161622256227
+564256725767766664538252754683322232674686696996486363587686584544539745857443887665953554854974988354865277575867762743758572544677365671174
+342432131636221665265622536544773525578473465665544949534487559855933653787997577365458355493369777376348425353725478553825664426625171332471
+237257216656246677746266656338352742342777643774666393343975467644559536338776396964378977976739496374458262887655527622836765124312475161536
+427266616626153776676844276685545238247576745848345568853894764458954393436435475885374588443836966727373376234468755826362721444663771736656
+147557137462114333172152683685724484374388878468845559745785559847595584847956963758975763759583262836344766525328423776561343751713555313135
+435513555345226574627155725785658623623654368366485663993468394389367686665939737986853747367664243644824584658886754656736776255427771335234
+243337713474454142437322262563673668225425656764864438569759947386569988545437398855394537774624724273347477386757358281176113674572131474143
+446517731347735351452747574645462778657625382753875786755878793753695787859638943855757868245252276274648626482525487347577175235545312611223
+646214451633672457761737726624383832888827252274856742588632746547443538544659389695326634545728874426373466622252624734646767421266547266356
+615315257433435511264243747347283584524855646533688522764423462854566967663955265725484756727452548278578588734222835657712271114575426772345
+312625411122527753661626644533433776784526283474543685566226555487268787536766288726243547848475264388447642648464531465616414126632121735323
+331642216651537545423424157531886246753822224872522257535524633736775252357567687273487847884255777245652785623886341326327554177734653123612
+514522335365715616642364654513212884235563878372453676345322272885724648352626225488834732247568353765656578486315734534253677227275174154551
+312342353411212641724217467171355638745458746235538653875374228578346242525673575252576582265274547284845384653672644114516666267574626426446
+641656535461165653134137137722477635874264666754876537273748764746874224483372752532865454884388684445242625354215454736174156554454113515152
+251151226161462453633472466415347646547633244767443532463535583635635877275735264463758778722233266528342272775417356141135631314376665444451
+425632161465541424373523554243462375236228647728436237224244444783665877572637583426525378746876552776446464147565673615224667543761522432135
+532454562315245552355534656643543315415435287527884778223325668522753852474448867676375387628636286225571754523771223257562736755636513111414
+562565135566335125441463772322476616346666766454646466557286832778843766453328868242552727864437867631175455255327417542446331156214261133214
+545556525563512364764355571215152443741754226655642557247686658685864827574832252555434336427852877136574545437145171514662256641124656632134
+134114445634224644124445174544414343456644375627553722884563486256653482544748584575362474826271174547117176154323461247334336214255363631564
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day18/Day18.cs b/2023/AdventOfCode/Day18/Day18.cs
new file mode 100644
index 0000000..1741ac1
--- /dev/null
+++ b/2023/AdventOfCode/Day18/Day18.cs
@@ -0,0 +1,124 @@
+using System.Globalization;
+using Vec = (long X, long Y);
+
+namespace AdventOfCode.Day18;
+
+public sealed class Day18(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day18";
+
+ private readonly string[] _example =
+ [
+ "R 6 (#70c710)",
+ "D 5 (#0dc571)",
+ "L 2 (#5713f0)",
+ "D 2 (#d2c081)",
+ "R 2 (#59c680)",
+ "D 2 (#411b91)",
+ "L 5 (#8ceee2)",
+ "U 2 (#caa173)",
+ "L 1 (#1b58a2)",
+ "U 2 (#caa171)",
+ "R 2 (#7807d2)",
+ "U 3 (#a77fa3)",
+ "L 2 (#015232)",
+ "U 2 (#7a21e3)"
+ ];
+
+ [Fact]
+ public void ExampleOne() => CalculateLavaFill(_example).Should().Be(62);
+
+ [Fact]
+ public void ExampleTwo() => CalculateLavaFillHex(_example).Should().Be(952408144115);
+
+ [Fact]
+ public void PartOne() => WriteOutput(CalculateLavaFill(Input).ToString());
+
+ [Fact]
+ public void PartTwo() => WriteOutput(CalculateLavaFillHex(Input).ToString());
+
+ private static long CalculateLavaFillHex(string[] input)
+ {
+ var moves = input.Select(i => i.Split(' '))
+ .Select(i => i[2])
+ .Select(i => i[2..^1])
+ .Select(ParseHex)
+ .ToArray();
+
+ return CalculateArea(moves);
+
+ static (Vec Dir, int Dist) ParseHex(string val)
+ {
+ var dirs = new Dictionary
+ {
+ //0 means R, 1 means D, 2 means L, and 3 means U.
+ ['3'] = (0, -1),
+ ['0'] = (1, 0),
+ ['1'] = (0, 1),
+ ['2'] = (-1, 0),
+ };
+ var dist = int.Parse(val[0..^1], NumberStyles.HexNumber);
+ return (dirs[val[^1]], dist);
+ }
+ }
+
+ private static long CalculateArea((Vec Dir, int Dist)[] moves)
+ {
+ var current = (0L, 0L);
+ var ll = new LinkedList();
+ ll.AddLast(current);
+ var perimeter = moves.Sum(m => m.Dist);
+ foreach (var (dir, dist) in moves[0..^1])
+ {
+ var next = current.Add(dir.Mult(dist));
+ ll.AddLast(next);
+ current = next;
+ }
+
+ var first = ll.First;
+ var cur = first;
+ long sumOne = default;
+ long sumTwo = default;
+ while (cur != null && cur.Prev() != null && cur.Prev() != first)
+ {
+ sumOne += cur.Value.X * cur.Prev()!.Value.Y;
+ sumTwo += cur.Value.Y * cur.Prev()!.Value.X;
+ cur = cur.Prev();
+ };
+
+ var area = Math.Abs(sumOne - sumTwo) / 2;
+ return area - (perimeter / 2) + 1 + perimeter;
+ }
+
+ private static long CalculateLavaFill(string[] input)
+ {
+ var dirs = new Dictionary
+ {
+ ["U"] = (0, -1),
+ ["R"] = (1, 0),
+ ["D"] = (0, 1),
+ ["L"] = (-1, 0),
+ };
+ var moves = input
+ .Select(i => i.Split(' '))
+ .Select(i => (Dir: dirs[i[0]], Dist: int.Parse(i[1])))
+ .ToArray();
+
+ return CalculateArea(moves);
+ }
+}
+
+public static class VecExtensions
+{
+ public static Vec Add(this Vec self, Vec other) =>
+ (self.X + other.X, self.Y + other.Y);
+
+ public static Vec Mult(this Vec self, long multiplier) =>
+ (self.X * multiplier, self.Y * multiplier);
+}
+
+public static class LinkedListNodeExtensions
+{
+ public static LinkedListNode? Prev(this LinkedListNode node) =>
+ node?.Previous ?? node!.List!.Last;
+}
diff --git a/2023/AdventOfCode/Day18/input.txt b/2023/AdventOfCode/Day18/input.txt
new file mode 100644
index 0000000..b5bafea
--- /dev/null
+++ b/2023/AdventOfCode/Day18/input.txt
@@ -0,0 +1,648 @@
+R 8 (#594dc2)
+U 3 (#7deda3)
+R 9 (#594dc0)
+U 5 (#4ce433)
+R 3 (#5bbe72)
+U 7 (#474513)
+R 10 (#379002)
+U 5 (#16bae3)
+L 4 (#4514d0)
+U 4 (#8d5633)
+L 10 (#4e39a0)
+U 2 (#1e0d03)
+L 3 (#9e5f62)
+U 2 (#88aef3)
+L 5 (#42f282)
+U 8 (#308253)
+R 6 (#9ae4f2)
+U 4 (#909ef3)
+R 4 (#46c432)
+U 6 (#7f4ee3)
+R 6 (#276242)
+U 5 (#028b71)
+R 7 (#23cbc2)
+U 8 (#44cef1)
+R 3 (#a89092)
+U 5 (#37f481)
+R 10 (#3b1392)
+U 2 (#5fe4a3)
+R 3 (#10f772)
+U 5 (#0adbe1)
+R 4 (#5c0012)
+U 10 (#3e7871)
+R 6 (#419562)
+U 4 (#68a091)
+R 7 (#9d9570)
+U 5 (#25eba1)
+R 8 (#2a78f2)
+U 7 (#013481)
+R 6 (#5b7540)
+U 4 (#70f5c1)
+R 6 (#742a00)
+U 3 (#3dbc91)
+R 6 (#553232)
+U 6 (#047c81)
+L 6 (#7a3c42)
+U 4 (#047c83)
+L 8 (#0030d2)
+U 7 (#21ed81)
+R 4 (#008dc2)
+U 4 (#424e83)
+R 10 (#283622)
+U 4 (#4a3091)
+R 10 (#ac29f2)
+U 5 (#4a3093)
+R 5 (#579402)
+U 4 (#424e81)
+R 7 (#18ce22)
+U 8 (#7bd643)
+L 7 (#057922)
+U 7 (#bd2693)
+R 10 (#48a832)
+D 6 (#0e2e53)
+R 2 (#6ed792)
+D 13 (#46fb43)
+R 3 (#10e1f2)
+U 9 (#02f941)
+R 3 (#4e2f92)
+U 8 (#1a45c1)
+R 9 (#496e00)
+U 4 (#9bda91)
+R 6 (#496e02)
+U 9 (#17ee31)
+R 2 (#376d02)
+U 3 (#209761)
+R 4 (#859c90)
+U 6 (#744071)
+R 4 (#35b882)
+U 9 (#501e21)
+L 4 (#b782a2)
+D 4 (#432aa1)
+L 10 (#838742)
+U 4 (#05f943)
+L 5 (#28dac2)
+U 4 (#0691c3)
+R 5 (#5f8942)
+U 4 (#6902f1)
+R 9 (#337982)
+D 4 (#6902f3)
+R 5 (#3c1c32)
+U 8 (#515c63)
+R 9 (#a81340)
+U 6 (#7a3e33)
+R 8 (#4fa8a0)
+U 4 (#bc6d03)
+R 3 (#003dd0)
+U 7 (#6495c3)
+R 3 (#59b7e2)
+U 2 (#ca3aa3)
+R 7 (#16a490)
+U 3 (#725193)
+R 2 (#01a6c0)
+U 7 (#619bd1)
+R 4 (#007350)
+D 12 (#53fbf1)
+R 4 (#2d4100)
+D 11 (#315ef3)
+L 6 (#76c240)
+D 5 (#8438d3)
+L 6 (#9526b0)
+D 5 (#357fd1)
+L 3 (#00f410)
+D 2 (#822331)
+L 10 (#81a430)
+D 5 (#822333)
+L 9 (#565f30)
+D 2 (#357fd3)
+L 2 (#693cb0)
+D 7 (#725191)
+R 8 (#043860)
+U 5 (#150223)
+R 2 (#1ef3d0)
+D 5 (#8fd253)
+R 9 (#1ef3d2)
+D 4 (#54d603)
+L 15 (#2df370)
+D 2 (#0d49d1)
+L 4 (#a5e730)
+D 4 (#7c9891)
+R 11 (#70d860)
+D 8 (#2545e1)
+L 4 (#9074a2)
+D 7 (#0076c1)
+L 3 (#74e662)
+D 7 (#644ef1)
+L 5 (#116492)
+D 5 (#233b41)
+L 6 (#9838d0)
+D 13 (#695343)
+R 6 (#8a0fe0)
+D 4 (#41e803)
+L 14 (#52f300)
+D 3 (#240f93)
+L 3 (#b59430)
+D 6 (#65e2a3)
+R 8 (#b59432)
+D 6 (#7608a3)
+R 8 (#3ebc00)
+D 6 (#43d143)
+R 7 (#4516d2)
+D 3 (#0c0a21)
+R 6 (#12b922)
+D 7 (#c37ef1)
+L 9 (#5076e2)
+D 2 (#7b48b3)
+R 9 (#3f58b2)
+D 7 (#544063)
+R 8 (#11d6a2)
+U 9 (#295c83)
+L 5 (#2248c2)
+U 8 (#106cb3)
+R 5 (#3d2e90)
+U 8 (#62a1b3)
+R 5 (#86e910)
+D 4 (#0d82d3)
+R 8 (#714042)
+D 11 (#259d63)
+R 4 (#52d762)
+D 11 (#4ebaf3)
+L 5 (#394030)
+D 11 (#284363)
+R 5 (#7f7a40)
+D 3 (#4db0a1)
+L 4 (#76cb90)
+D 4 (#65d251)
+L 5 (#a0d6c0)
+D 9 (#80f381)
+L 3 (#0dd8a0)
+D 4 (#974581)
+R 5 (#462960)
+D 9 (#829951)
+R 3 (#0e4bd0)
+D 3 (#564a81)
+R 6 (#39ebb0)
+D 4 (#4e35e1)
+R 8 (#564090)
+D 3 (#381e31)
+R 2 (#6f1f90)
+D 7 (#0a9ce1)
+L 10 (#66e1e0)
+D 4 (#83e3a3)
+L 9 (#0386c2)
+U 10 (#975db3)
+L 5 (#0386c0)
+D 10 (#1be7e3)
+L 6 (#1388f0)
+D 4 (#02a033)
+R 9 (#6f9410)
+D 6 (#55cb11)
+R 3 (#59bcf0)
+D 5 (#56d341)
+R 8 (#7cd270)
+D 9 (#8fe951)
+R 3 (#7a5590)
+D 7 (#5e1b43)
+R 7 (#0b4340)
+D 9 (#4c8f73)
+R 10 (#0b4342)
+D 2 (#91dcf3)
+R 4 (#46e650)
+D 7 (#82c663)
+L 6 (#15c010)
+D 2 (#918233)
+L 6 (#6c4110)
+D 6 (#226eb3)
+R 9 (#4eb1e2)
+D 7 (#a00fb3)
+R 3 (#4eb1e0)
+D 10 (#7ceac3)
+R 4 (#af5400)
+U 5 (#0c1943)
+R 7 (#0be800)
+U 9 (#7416e1)
+R 3 (#03ebe0)
+U 9 (#667aa1)
+R 5 (#03ebe2)
+U 9 (#70f0e1)
+R 7 (#40adf0)
+U 3 (#7abe73)
+R 4 (#816d40)
+U 7 (#573993)
+R 9 (#1dfb62)
+U 3 (#1c9ea3)
+R 5 (#862582)
+U 4 (#8da203)
+R 7 (#595ba2)
+U 2 (#5f5163)
+R 3 (#4b4b02)
+U 6 (#3e7753)
+R 5 (#1be5f0)
+U 6 (#117af1)
+R 3 (#96d390)
+D 12 (#117af3)
+R 6 (#63a6d0)
+D 5 (#0864c3)
+L 12 (#326730)
+D 5 (#a46933)
+L 2 (#83cc60)
+D 3 (#6619b1)
+L 4 (#3d6740)
+D 9 (#7da681)
+L 8 (#7adab0)
+D 2 (#52ec81)
+R 8 (#c8b640)
+D 9 (#52ec83)
+R 4 (#9c24d0)
+D 4 (#7f0da1)
+R 7 (#3c72c0)
+D 2 (#4b8811)
+R 7 (#5f81c2)
+D 7 (#36afe3)
+R 5 (#90ca52)
+D 5 (#36afe1)
+R 12 (#5c9362)
+D 4 (#597741)
+R 3 (#21f722)
+D 5 (#5b6911)
+R 7 (#b44bf2)
+D 8 (#4bd781)
+R 8 (#048d52)
+D 6 (#7cf731)
+R 3 (#31dff2)
+D 6 (#229871)
+R 7 (#2fdb10)
+D 11 (#7aa251)
+R 3 (#8d42b0)
+U 5 (#3ddbf3)
+R 5 (#97ec50)
+U 10 (#945873)
+L 5 (#7a6f30)
+U 5 (#5dae33)
+R 4 (#8c8910)
+U 4 (#4d9a43)
+R 7 (#2d9e30)
+U 7 (#039b93)
+R 3 (#5e1e10)
+D 4 (#59f743)
+R 7 (#710a60)
+D 6 (#825003)
+L 7 (#63ba50)
+D 9 (#48a773)
+R 7 (#290ce2)
+D 8 (#2449c1)
+R 3 (#938682)
+D 4 (#2449c3)
+R 11 (#183152)
+D 3 (#14f843)
+R 11 (#a7d150)
+D 8 (#0114e3)
+R 4 (#65d042)
+D 5 (#bf14e3)
+R 3 (#443a52)
+D 2 (#bf14e1)
+R 5 (#5be4d2)
+D 3 (#187923)
+L 2 (#2d9e32)
+D 11 (#191863)
+L 4 (#74efe2)
+D 4 (#66f453)
+L 2 (#6f8c82)
+D 10 (#01da41)
+L 4 (#72fcb2)
+D 2 (#74f501)
+L 4 (#210be2)
+D 8 (#3898a1)
+L 5 (#1c3382)
+D 6 (#af67e3)
+L 5 (#0a2c22)
+D 6 (#53a953)
+R 10 (#1db900)
+D 2 (#795d43)
+R 5 (#7c8060)
+D 7 (#935b73)
+L 12 (#137770)
+D 6 (#1603f3)
+L 3 (#12d9f0)
+D 7 (#622d41)
+L 6 (#0a5e80)
+U 5 (#653773)
+L 3 (#641c70)
+U 2 (#653771)
+L 6 (#63f570)
+U 7 (#69d881)
+L 2 (#3881c2)
+U 6 (#17cc91)
+L 5 (#6bc442)
+U 6 (#17cc93)
+L 7 (#2e2a62)
+U 8 (#1a3171)
+L 2 (#68ec50)
+U 7 (#3c8571)
+R 9 (#4015d0)
+U 8 (#1b48b3)
+L 6 (#a22d90)
+U 9 (#35a193)
+L 7 (#78a320)
+D 8 (#35a191)
+L 7 (#2d6e50)
+D 11 (#7319d1)
+L 4 (#aaee40)
+D 7 (#035af3)
+L 9 (#2dc2c0)
+U 7 (#035af1)
+L 5 (#a3f400)
+U 4 (#5f9c61)
+L 6 (#129ac0)
+U 6 (#954131)
+L 10 (#4d4e40)
+D 8 (#a11d91)
+L 4 (#8bf900)
+D 11 (#a11d93)
+L 6 (#89c6f0)
+U 3 (#4825d1)
+L 3 (#13e6f0)
+U 7 (#67db31)
+L 10 (#4a4de2)
+U 3 (#865ca1)
+R 10 (#49db32)
+U 6 (#3146e1)
+L 6 (#4073d2)
+U 6 (#07a3c1)
+R 11 (#701312)
+U 2 (#07dab3)
+R 7 (#2d5082)
+U 5 (#96ca13)
+R 11 (#9589f2)
+U 7 (#3db203)
+L 11 (#4bea62)
+U 3 (#3db201)
+L 4 (#4dc4f2)
+U 5 (#9ea4c1)
+L 6 (#64fb32)
+D 5 (#09fa31)
+L 7 (#5e78a0)
+D 5 (#24c511)
+L 3 (#794240)
+D 9 (#bd8d21)
+L 4 (#3be3a0)
+U 5 (#a3be21)
+L 4 (#059772)
+U 5 (#2c1081)
+L 8 (#1ab9b2)
+D 4 (#3f7321)
+L 2 (#8187a2)
+D 6 (#88b701)
+L 5 (#270232)
+D 8 (#25b031)
+L 10 (#2d6db2)
+D 6 (#67f511)
+L 6 (#3f0812)
+D 7 (#419593)
+L 10 (#87e622)
+D 5 (#419591)
+L 7 (#21c4e2)
+D 3 (#14b251)
+L 9 (#457152)
+D 7 (#536ee1)
+L 9 (#157d12)
+D 5 (#9a8b51)
+L 2 (#5db272)
+D 5 (#55fa61)
+L 2 (#7c00e0)
+D 7 (#5bb7a1)
+L 7 (#0ed480)
+D 3 (#16ab71)
+L 10 (#5be3f0)
+D 7 (#7fcd71)
+L 3 (#75a4c0)
+D 8 (#522c31)
+R 2 (#1e9120)
+D 6 (#535fa1)
+R 4 (#09afb0)
+D 4 (#11cfb3)
+L 14 (#405a60)
+D 5 (#11e361)
+L 4 (#453f60)
+D 7 (#11e363)
+R 11 (#6dd3d0)
+D 6 (#11cfb1)
+R 7 (#1f9010)
+D 3 (#2dcb51)
+L 6 (#6fa672)
+D 8 (#2cc821)
+L 10 (#c78522)
+D 7 (#0e0ca1)
+L 3 (#390302)
+D 7 (#bcbc73)
+L 8 (#74a632)
+D 4 (#bcbc71)
+L 3 (#517c02)
+D 2 (#0e0ca3)
+L 11 (#156562)
+U 5 (#2cc823)
+L 5 (#6d4c52)
+U 6 (#747d21)
+L 2 (#4e3512)
+U 3 (#4288d1)
+L 12 (#491d20)
+U 7 (#655861)
+L 6 (#27f5b0)
+U 3 (#56b851)
+L 9 (#5db0a0)
+D 10 (#00fa03)
+L 3 (#aa9580)
+U 8 (#31f603)
+L 2 (#795580)
+U 7 (#3c2d43)
+L 2 (#9c0332)
+U 7 (#47eda3)
+R 2 (#9c0330)
+U 5 (#51b393)
+R 2 (#4fbf90)
+U 10 (#0f4123)
+R 3 (#6886a0)
+D 5 (#930b11)
+R 2 (#238c20)
+D 9 (#84f481)
+R 7 (#350920)
+D 4 (#4c1351)
+R 13 (#68e890)
+D 3 (#75e891)
+R 4 (#589192)
+U 9 (#8aa761)
+L 9 (#29d772)
+U 9 (#383641)
+R 9 (#9c0072)
+U 3 (#474a61)
+R 3 (#3042f2)
+U 5 (#6ca7b3)
+L 12 (#64d070)
+U 5 (#5402c3)
+L 6 (#64d072)
+U 5 (#497d93)
+L 6 (#553402)
+U 8 (#669b61)
+L 3 (#242e22)
+D 4 (#2f29c1)
+L 7 (#2f8332)
+D 6 (#7a62a1)
+L 5 (#92a3b2)
+D 8 (#64da21)
+L 7 (#62aa72)
+D 12 (#bf3b51)
+L 6 (#712a52)
+D 6 (#bf3b53)
+L 6 (#0e6852)
+U 8 (#61c6c1)
+L 8 (#625f22)
+U 2 (#1b6273)
+L 5 (#82b9a2)
+U 8 (#53af03)
+R 6 (#2ab050)
+U 9 (#767c13)
+R 4 (#8a69c0)
+U 6 (#767c11)
+R 12 (#1b59d0)
+U 4 (#583af3)
+L 6 (#18f400)
+U 7 (#2874c3)
+L 12 (#bf2752)
+U 4 (#0ca213)
+L 4 (#2a4092)
+U 8 (#7f1033)
+L 10 (#5f6142)
+U 7 (#0cda71)
+R 5 (#02c002)
+U 4 (#76a9e1)
+R 4 (#992e12)
+U 5 (#4e1111)
+R 5 (#7617b0)
+U 2 (#540a41)
+R 8 (#25d660)
+U 6 (#55d3c1)
+R 3 (#48e382)
+D 6 (#524913)
+R 4 (#028612)
+D 7 (#222cc1)
+R 5 (#9bba12)
+D 4 (#222cc3)
+R 3 (#507172)
+U 13 (#320b13)
+R 6 (#2738c2)
+U 4 (#436e03)
+R 6 (#9e9f02)
+U 9 (#5bdf03)
+L 3 (#6d4482)
+U 2 (#5ab0b3)
+L 6 (#168e40)
+D 7 (#483cb3)
+L 5 (#c2c970)
+U 7 (#483cb1)
+L 3 (#084f70)
+U 5 (#3d7573)
+L 3 (#16ebc0)
+D 9 (#be97b3)
+L 5 (#4a29c2)
+D 3 (#76e293)
+L 7 (#4b57e2)
+U 7 (#612c13)
+L 6 (#631142)
+U 2 (#4b5d63)
+L 5 (#90a012)
+U 11 (#246691)
+L 6 (#bf2f62)
+U 10 (#5e6ce1)
+L 8 (#089422)
+U 3 (#4a7871)
+L 5 (#5c1272)
+U 2 (#5becf1)
+L 7 (#924700)
+U 9 (#429751)
+L 4 (#4eade0)
+U 9 (#4e0f91)
+L 9 (#cb3210)
+U 3 (#4ec191)
+L 3 (#1e0bd2)
+U 7 (#41b9a1)
+L 3 (#77ddc2)
+U 7 (#61f901)
+L 6 (#1a1652)
+U 5 (#680581)
+L 7 (#6b0782)
+U 3 (#6471e3)
+L 9 (#4af792)
+U 9 (#a74643)
+L 9 (#462802)
+U 2 (#5ac0e1)
+L 5 (#28aa90)
+U 10 (#17be41)
+L 3 (#28aa92)
+D 3 (#5c9271)
+L 9 (#5c1270)
+D 9 (#73cf11)
+L 6 (#89c7b2)
+D 9 (#168723)
+R 4 (#2d5692)
+D 3 (#2ecbe3)
+R 5 (#1e0902)
+D 3 (#1c5523)
+R 6 (#054080)
+D 7 (#a23633)
+L 7 (#054082)
+U 2 (#0e5de3)
+L 9 (#1e0900)
+U 3 (#1b3423)
+L 4 (#693a72)
+U 4 (#1288d3)
+L 5 (#194c40)
+U 5 (#20e633)
+L 6 (#7d44c0)
+U 9 (#945dd3)
+L 3 (#2561f2)
+U 4 (#bb76d3)
+R 14 (#07f4b2)
+U 3 (#918121)
+L 4 (#2a5b92)
+U 4 (#464a51)
+L 12 (#2a5b90)
+U 3 (#698c81)
+R 5 (#3439b2)
+U 2 (#095ff1)
+R 10 (#4164b2)
+U 5 (#7e0df3)
+R 5 (#1ff532)
+U 3 (#2105c3)
+R 7 (#1f49a2)
+U 4 (#872be1)
+R 10 (#5d2d22)
+U 7 (#872be3)
+R 6 (#5937d2)
+U 5 (#474fe3)
+L 6 (#0a8bb2)
+U 11 (#645453)
+R 6 (#341552)
+D 7 (#32f483)
+R 8 (#025770)
+D 6 (#38d4d3)
+R 5 (#1d6710)
+D 5 (#0fb741)
+R 6 (#6d8f10)
+D 7 (#1b07a1)
+R 9 (#2c38a0)
+D 2 (#ae4871)
+R 3 (#2d1ba0)
+D 3 (#7b2cb3)
+R 7 (#231460)
+D 7 (#58fa43)
+R 4 (#7f8860)
+U 8 (#04e063)
+R 5 (#283330)
+U 4 (#38d4d1)
+R 4 (#006610)
+U 9 (#59cbc3)
+L 8 (#48c4d2)
+U 4 (#2bbeb3)
+L 4 (#48c4d0)
+U 5 (#505f33)
+L 14 (#4f1c22)
+U 4 (#0913c3)
diff --git a/2023/AdventOfCode/Day19/Day19.cs b/2023/AdventOfCode/Day19/Day19.cs
new file mode 100644
index 0000000..7088409
--- /dev/null
+++ b/2023/AdventOfCode/Day19/Day19.cs
@@ -0,0 +1,279 @@
+using System.Collections.Immutable;
+using Rating = System.Collections.Generic.Dictionary;
+using Range = (int Start, int End);
+
+namespace AdventOfCode.Day19;
+
+public sealed class Day19(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day19";
+
+ private readonly string _example =
+"""
+px{a<2006:qkq,m>2090:A,rfg}
+pv{a>1716:R,A}
+lnx{m>1548:A,A}
+rfg{s<537:gd,x>2440:R,A}
+qs{s>3448:A,lnx}
+qkq{x<1416:A,crn}
+crn{x>2662:A,R}
+in{s<1351:px,qqz}
+qqz{s>2770:qs,m<1801:hdj,R}
+gd{a>3333:R,R}
+hdj{m>838:A,pv}
+
+{x=787,m=2655,a=1222,s=2876}
+{x=1679,m=44,a=2067,s=496}
+{x=2036,m=264,a=79,s=2244}
+{x=2461,m=1339,a=466,s=291}
+{x=2127,m=1623,a=2188,s=1013}
+""";
+
+ [Fact]
+ public void ExampleOne() => SumAcceptedParts(_example).Should().Be(19114);
+
+ [Fact]
+ public void ExampleTwo() => CountCombinations(_example).Should().Be(167409079868000);
+
+ [Fact]
+ public void PartOne() => WriteOutput(SumAcceptedParts(ReadAll("input.txt")));
+
+ [Fact]
+ public void PartTwo() => WriteOutput(CountCombinations(ReadAll("input.txt")).ToString());
+
+ private static long CountCombinations(string input)
+ {
+ var split = input.Split(Environment.NewLine + Environment.NewLine);
+ var workflows = ParseWorkflows(split[0]);
+ var acceptedWorkFlows = new List>();
+ var queue = new Queue<(WorkflowResult Result, ImmutableDictionary Ranges)>();
+ var initialRanges = ImmutableDictionary.CreateRange(
+ [
+ KeyValuePair.Create("x", (1, 4000)),
+ KeyValuePair.Create("m", (1, 4000)),
+ KeyValuePair.Create("a", (1, 4000)),
+ KeyValuePair.Create("s", (1, 4000))
+ ]
+ );
+ queue.Enqueue((new LabelResult("in"), initialRanges));
+ var combos = 0L;
+ while (queue.TryDequeue(out var current))
+ {
+ if (current.Result is TerminalResult { Accepted: true } t)
+ {
+ combos += current.Ranges.Values
+ .Aggregate(1L, (acc, cur) => acc *= cur.End - cur.Start + 1);
+ continue;
+ }
+
+ if (current.Result is not LabelResult l)
+ continue;
+
+ var newWorkflow = workflows[l.Label];
+ var ranges = current.Ranges;
+ foreach (var part in newWorkflow.Parts)
+ {
+ if (part is Label lp)
+ queue.Enqueue((new LabelResult(lp.Lbl), ranges));
+ if (part is LessThan lt)
+ {
+ var cur = ranges[lt.Variable];
+ var ltIntersection = Intersection(cur, (1, lt.Value - 1));
+ queue.Enqueue((lt.Result, ranges.SetItem(lt.Variable, ltIntersection)));
+ var elseIntersection = Intersection(cur, (lt.Value, 4000));
+ ranges = ranges.SetItem(lt.Variable, elseIntersection);
+ }
+ if (part is GreaterThan gt)
+ {
+ var cur = ranges[gt.Variable];
+ var gtIntersection = Intersection(cur, (gt.Value + 1, 4000));
+ queue.Enqueue((gt.Result, ranges.SetItem(gt.Variable, gtIntersection)));
+ var elseIntersection = Intersection(cur, (1, gt.Value));
+ ranges = ranges.SetItem(gt.Variable, elseIntersection);
+ }
+ if (part is Terminal term)
+ queue.Enqueue((term.Result == "A"
+ ? TerminalResult.Accept()
+ : TerminalResult.Reject(), ranges));
+ }
+
+ }
+
+ return combos;
+
+ static Range Intersection(Range one, Range two) =>
+ (Math.Max(one.Start, two.Start), Math.Min(one.End, two.End));
+ }
+
+ private static int SumAcceptedParts(string input)
+ {
+ var split = input.Split(Environment.NewLine + Environment.NewLine);
+ var workflows = ParseWorkflows(split[0]);
+ var ratings = ParseRatings(split[1]);
+
+ var currentWorkflow = workflows["in"];
+ var accepted = new List();
+ foreach (var rating in ratings)
+ {
+ while (true)
+ {
+ var result = currentWorkflow.Evaluate(rating);
+ if (result is TerminalResult r)
+ {
+ if (r.Accepted)
+ accepted.Add(rating);
+ break;
+ }
+ if (result is LabelResult w)
+ currentWorkflow = workflows[w.Label];
+ }
+ currentWorkflow = workflows["in"];
+ }
+
+ return accepted.Sum(r => r.Sum());
+ }
+
+ private static IDictionary ParseWorkflows(string v)
+ {
+ var result = new Dictionary();
+ var split = v.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
+ foreach (var w in split)
+ {
+ var endOfLabel = w.IndexOf('{');
+ var label = w[0..endOfLabel];
+ var workflow = w[endOfLabel..];
+ var parsed = workflow[1..^1].Split(',')
+ .Select(WorkflowPart.Parse)
+ .ToArray();
+ result[label] = new Workflow(parsed);
+ }
+
+ return result;
+ }
+
+ private static Rating[] ParseRatings(string split) =>
+ split
+ .Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries)
+ .Select(r => r[1..^1])
+ .Select(r => r.Split(',', StringSplitOptions.RemoveEmptyEntries))
+ .Select(p => p.Select(x => x.Split('=')))
+ .Select(p => p.Select(x => (Cat: x[0], Val: int.Parse(x[1]))))
+ .Select(r => r.ToDictionary(r => r.Cat, r => r.Val))
+ .ToArray();
+}
+
+public class Workflow(WorkflowPart[] parts)
+{
+ public WorkflowPart[] Parts { get; } = parts;
+
+ public WorkflowResult Evaluate(Rating rating)
+ {
+ foreach (var part in Parts)
+ {
+ var r = part.Evaluate(rating);
+ if (r is LabelResult or TerminalResult)
+ return r;
+ }
+
+ throw new Exception("No result from Workflow evaluation.");
+ }
+}
+
+public abstract class WorkflowPart
+{
+ public static WorkflowPart Parse(string val)
+ {
+ if (val is "R" or "A")
+ return new Terminal(val);
+ if (!val.Contains('<') && !val.Contains('>'))
+ return new Label(val);
+ return ParseInequality(val, val.Contains('<') ? '<' : '>');
+ }
+
+ private static WorkflowPart ParseInequality(string val, char relationship)
+ {
+ var parts = val.Split(relationship);
+ var variable = parts[0];
+ var spl = parts[1].Split(':');
+ var value = int.Parse(spl[0]);
+ var branch = spl[1];
+ var result = GetResult(branch);
+
+ return relationship == '<'
+ ? new LessThan(variable, value, result)
+ : new GreaterThan(variable, value, result);
+
+ static WorkflowResult GetResult(string v)
+ {
+ if (v == "A") return TerminalResult.Accept();
+ if (v == "R") return TerminalResult.Reject();
+
+ return new LabelResult(v);
+ }
+ }
+
+ public abstract WorkflowResult Evaluate(Rating value);
+}
+
+public sealed class Terminal(string result) : WorkflowPart
+{
+ public string Result { get; } = result;
+
+ public override WorkflowResult Evaluate(Rating _) =>
+ Result == "A" ? TerminalResult.Accept() : TerminalResult.Reject();
+}
+
+public sealed class LessThan(string variable, int value, WorkflowResult result) : WorkflowPart
+{
+ public string Variable { get; } = variable;
+ public int Value { get; } = value;
+ public WorkflowResult Result { get; } = result;
+
+ public override WorkflowResult Evaluate(Rating rating) =>
+ rating[Variable] < Value ? Result : NoopResult.Instance;
+}
+
+public sealed class GreaterThan(string variable, int value, WorkflowResult result) : WorkflowPart
+{
+ public string Variable { get; } = variable;
+ public int Value { get; } = value;
+ public WorkflowResult Result { get; } = result;
+
+ public override WorkflowResult Evaluate(Rating rating) =>
+ rating[Variable] > Value ? Result : NoopResult.Instance;
+}
+
+public class NoopResult : WorkflowResult
+{
+ public static NoopResult Instance { get; } = new();
+}
+
+public sealed class Label(string label) : WorkflowPart
+{
+ public string Lbl { get; } = label;
+
+ public override WorkflowResult Evaluate(Rating _) =>
+ new LabelResult(Lbl);
+}
+
+public class WorkflowResult { }
+public class LabelResult(string label) : WorkflowResult
+{
+ public string Label { get; set; } = label;
+}
+
+public class TerminalResult : WorkflowResult
+{
+ public bool Accepted { get; }
+
+ private TerminalResult(bool accepted) => Accepted = accepted;
+
+ public static TerminalResult Accept() => new(true);
+ public static TerminalResult Reject() => new(false);
+}
+
+public static class RatingExtensions
+{
+ public static int Sum(this Rating rating) =>
+ rating["x"] + rating["m"] + rating["a"] + rating["s"];
+}
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day19/input.txt b/2023/AdventOfCode/Day19/input.txt
new file mode 100644
index 0000000..7323e55
--- /dev/null
+++ b/2023/AdventOfCode/Day19/input.txt
@@ -0,0 +1,790 @@
+xr{a<2738:hnx,nxz}
+tnx{a>2206:R,s>1050:R,a>2105:R,R}
+fq{x<3126:R,x<3349:R,x<3419:A,R}
+jlv{s<1423:A,R}
+xfj{a<3264:jk,x<1480:R,s>371:mjg,df}
+pmn{m>568:A,R}
+dt{m>3711:A,R}
+vpv{m<2270:A,s<2876:R,A}
+dgm{x>1168:R,m<1657:R,s>321:R,A}
+tm{x>569:R,m>2103:A,a>2493:R,R}
+nk{x<1590:A,x>1812:xv,a<2730:A,R}
+tl{m<1299:A,x<326:R,s>3596:A,R}
+vth{m<777:fh,a>958:ct,a>843:gbt,xvx}
+ssf{a<2461:rvl,s>709:fs,a<3031:zjr,dj}
+fk{x>976:A,a<3806:zcd,vr}
+zbd{s>3482:A,m>2428:R,m>2268:A,A}
+dhb{x<1242:A,x<1401:A,R}
+nds{m>2792:R,dtr}
+plb{a>3402:nns,x<3206:R,R}
+cdh{s>2417:A,a<1027:R,x<1700:A,mjt}
+hrv{x<2742:A,m<881:R,x<2775:R,R}
+xh{m<2283:A,a<2206:A,R}
+fvk{x>703:R,m<2096:A,m<2121:A,A}
+lv{a<1074:A,x<262:R,a>1749:A,R}
+qhr{m>2648:R,m<2530:A,m<2581:A,R}
+mv{a>3151:R,ncd}
+lfd{a>3333:A,A}
+ldt{s>465:A,R}
+qqz{x>2634:R,x>1467:A,m>134:A,A}
+fqd{m>3145:A,s>337:A,A}
+hmg{m>1999:A,s<1374:R,A}
+dl{s<2343:R,A}
+tnh{m>635:pht,m>250:vvf,a>2919:fjp,jjx}
+hlj{a>1084:R,a>1067:A,A}
+mk{a>1590:R,hkr}
+hsx{m>2094:R,R}
+hgn{m>1281:gjd,rl}
+qm{s>110:A,x<981:R,R}
+mjt{m<1253:A,R}
+qqv{m>892:A,R}
+ffr{x>3494:A,A}
+jjx{s<537:qqz,a>2880:A,a<2848:ktd,ntm}
+lz{a<1367:jxb,gpr}
+mq{s<2569:R,s<2602:R,x>2631:A,A}
+rlq{m<1606:R,a<3436:A,s>1030:R,A}
+qvn{a>524:R,a<325:R,R}
+mpf{s>346:mm,R}
+pnp{x>3107:R,m<849:R,R}
+fj{s>942:hv,cdj}
+ml{m<932:A,m<1546:R,x<2968:R,A}
+jk{x<2322:A,A}
+mj{x<953:R,A}
+src{x<2376:R,s<827:A,R}
+sn{a<2735:A,x>2229:R,m<854:R,A}
+hgl{x<3535:A,s<2734:A,R}
+nr{x>2220:R,x<2124:A,x<2164:A,R}
+mp{a<360:A,s>3629:R,A}
+dxh{x<1732:jcp,rbd}
+zr{a>785:R,a<547:nb,s>1372:A,fsq}
+pkb{x<2264:R,s<1389:A,s>1562:A,R}
+tk{m<2503:ql,vvt}
+gv{x<1976:qvj,x>3112:kfs,x>2422:pdl,A}
+xxf{s>779:A,a>565:R,A}
+gf{a>2608:R,s<604:R,vsq}
+pf{a>1065:A,a<1012:R,R}
+hmz{s>2510:A,A}
+gm{a>1801:A,R}
+zfv{s>2589:R,hmz}
+qkg{x<2039:R,x>2076:R,A}
+zk{x<1131:A,a>3242:A,a<3132:nq,A}
+sjt{x<3151:A,m<960:A,a<3687:A,R}
+shr{m>2072:vjv,xpf}
+gq{x<1024:mpf,a<2558:jq,s<450:mpz,gf}
+cxb{a<3791:R,m<3248:A,R}
+vh{m>1713:A,a<2750:R,x>3327:R,R}
+vdt{s<1494:rgr,s>1601:hdz,m>2652:nl,qdz}
+jl{x>774:R,fmv}
+rqd{x<264:R,A}
+qj{x<1450:R,R}
+jb{a>591:A,A}
+tlk{m<2442:A,s>3144:R,R}
+tb{s>3603:R,x<2380:A,A}
+lvg{a<3369:A,A}
+fmv{x>489:A,a>3142:R,R}
+nzc{x<1699:mnj,x<2687:snj,hhm}
+nqd{x>1714:A,rb}
+ffh{m>2056:R,s<999:A,R}
+gkn{x>2114:A,a<3264:R,a>3434:R,R}
+msm{m<2250:rf,m<2318:gt,nxh}
+qfn{x<2674:A,m>2446:A,R}
+qv{s<1234:A,x<698:R,x<1068:A,A}
+lvl{x<741:R,A}
+hsl{s<1364:R,a>2539:R,A}
+ltm{s<556:A,A}
+hnm{a>3612:A,a<3551:A,R}
+qr{a<3123:R,a>3230:A,a>3172:R,A}
+qhs{x<1385:A,x>1530:R,R}
+ph{m>498:A,R}
+pj{m<3141:A,x<1574:R,R}
+pl{s>2852:R,a>2264:R,R}
+thb{x<3288:A,s>44:R,A}
+cgp{a<3718:A,A}
+zx{m>1249:R,R}
+hrc{s>467:R,a>369:R,A}
+jn{s>478:R,R}
+gxl{x>542:zxb,m<1766:A,a>3709:nt,A}
+hf{m<1973:mb,m>2825:clp,ctv}
+mnj{m<2896:A,a>3314:R,x>1091:jnx,R}
+dhk{m<1408:A,a>2612:R,m<1964:R,A}
+jbd{m>3608:A,a>3246:btv,s>108:jkg,A}
+fv{a<2946:vh,x>3172:hgl,A}
+skj{x<968:A,R}
+rzn{a>966:A,a<427:R,A}
+ncd{s>1952:R,s>1807:A,A}
+dmq{a<2580:lmd,a<3301:hhg,s>3227:tk,cj}
+qdz{s>1558:bbf,cmd}
+kjl{m<1835:R,A}
+jnx{s>596:R,x>1309:A,A}
+rhg{s>1291:A,x<2642:A,a>868:A,R}
+hql{a>715:ctp,a<469:mr,cbs}
+ps{x<1604:nn,A}
+hmx{a<2596:hsl,sgs}
+glx{m>963:R,s>936:R,R}
+px{x<1809:R,x<1867:A,R}
+hv{m>2406:zcf,s>1014:pff,A}
+btv{x<3252:R,x<3747:A,m>3479:A,R}
+sfq{s>1562:R,x<2043:R,x<3301:mbb,ghj}
+kkt{x>3042:R,A}
+bnk{x<1916:A,A}
+mtf{x>542:R,A}
+gsh{a<3582:R,A}
+kcl{x<2873:R,R}
+rg{a<1665:fdx,m>2368:dh,a>2769:msm,czv}
+jt{a<721:R,m>2323:A,a>886:R,R}
+pxd{m>3549:R,R}
+ctv{m>2433:A,s<602:A,cmv}
+ghj{x>3625:A,m>3233:A,A}
+dz{s>1616:R,s>1613:A,R}
+gbk{a>3908:stx,x<3498:fq,x>3832:A,R}
+vg{m<2209:A,a>880:A,x>447:A,A}
+fg{a<2323:A,m<2298:R,a<2374:A,R}
+ql{x<2022:vk,a<3625:tb,bfq}
+vjv{m>2857:cnn,x>2663:lz,x>1248:dmq,rg}
+fnl{m<3214:R,R}
+xxj{s>286:A,s>175:A,a<2789:R,R}
+mpz{x<1276:A,m<2304:dhk,R}
+cqm{m<2396:gbk,a<3913:ktj,x<3333:qhd,rq}
+nnt{m<2137:tm,R}
+rhx{x<586:lv,A}
+ms{s>869:R,A}
+fn{m<3668:A,m<3806:A,m>3934:A,A}
+lmb{m>2566:xmd,x>1354:ntr,dkx}
+jcp{a<3756:R,s>2919:R,x<1535:A,A}
+fh{m>444:R,a<922:ng,m>153:A,R}
+brr{x<2563:znz,a>3775:cqm,x>3081:vz,ttt}
+mbb{a<3572:R,R}
+ks{a<596:xmv,m>673:nzk,gzq}
+qx{s<258:A,a<3753:A,A}
+gjd{a<3341:fv,x<3247:tmd,rk}
+kfs{s<2117:A,a>1508:A,a<841:A,R}
+rf{m>2134:R,fvk}
+qp{x<3466:A,x<3649:R,a<2300:rfh,hbg}
+hz{m>2042:dbc,dmf}
+qd{s>340:R,a<1978:A,mj}
+hdz{s>1664:lqr,m>1721:mjq,a>3675:qgh,qhc}
+zf{s<1068:jt,hmg}
+hnx{x>3334:R,x>3042:R,A}
+rrn{a<1958:lx,sfs}
+zb{a>264:R,a>132:R,R}
+bp{s>262:dzp,m<688:R,x<725:vf,A}
+fx{m>1759:jhp,s>2478:mq,R}
+fjk{a>2746:ps,a<2722:cpf,x>2663:xr,mgv}
+mrf{m<489:A,s<528:R,s>542:A,A}
+srt{a<761:A,A}
+gtc{a<2510:A,a>2530:A,x<1318:A,A}
+cql{x>592:A,m<1360:R,kzl}
+zjv{s<3081:A,m>2334:R,x<2919:A,R}
+xq{s<2228:A,s>2357:R,x>3154:R,R}
+rs{m>2291:R,A}
+kt{s<1049:A,s>1143:A,A}
+hjf{m>732:A,s>124:xpm,zfz}
+hzp{m>458:A,m>277:R,R}
+lj{m>1487:hj,s<352:hdk,a>2817:tnh,fjk}
+hnv{a<1695:A,s<3347:R,R}
+mfh{s>232:rhc,kgr}
+mt{x<3500:A,x<3798:zbd,s<3651:gb,R}
+bjz{m>932:A,x>1636:cgl,hzp}
+jm{x<768:pz,a>3055:jnp,nk}
+vhm{s>1096:R,x>3521:R,R}
+nxz{s<492:A,m<516:R,A}
+cmf{m<3598:A,s>2612:hnv,x>2417:xq,bnk}
+kkz{a>1384:gm,xs}
+bx{m<3495:A,x>2544:R,R}
+rgs{x>846:A,m>3177:R,js}
+rr{x>1771:tlr,gq}
+vgl{m<1481:A,R}
+nz{a<1090:tlk,s>3172:R,a<2062:A,pl}
+qcr{a<3136:snf,zrv}
+ng{x<2253:A,m<184:R,a>833:A,A}
+nb{a>503:R,m<2471:A,m<2643:A,R}
+htp{m<1676:R,R}
+zp{m<2524:R,x<854:cxb,x<1523:dhb,zdc}
+tnf{x<3229:A,m>2582:R,x>3273:A,A}
+ggm{s>1813:A,s<1775:A,a<449:xf,R}
+lzb{m<2892:xfj,kl}
+thp{m>2931:R,m>2459:R,R}
+pdl{a<982:R,m>1681:R,a<1895:R,A}
+jj{x<547:R,a>3354:skj,A}
+pff{a>1674:R,m<2017:A,A}
+nrx{a<630:rqd,s>330:jn,m<2657:vg,A}
+bfp{s>1004:R,A}
+xps{m>2596:R,A}
+kxq{m<2896:rs,m>3444:dt,znv}
+xj{a>3487:pm,s>3022:jm,mxs}
+qvj{m<1476:A,a>1321:R,R}
+qlq{s>1326:A,s<1008:A,x<3562:R,A}
+lnk{x<1260:A,x>1890:A,s>1573:R,A}
+hvh{a<3906:R,s<325:R,R}
+bjc{s>486:R,x>1980:A,m<223:A,A}
+bj{m>1311:R,A}
+tjs{m>3593:rhx,rgs}
+ksz{a<334:A,a<430:A,A}
+hp{x<2652:R,s>238:A,A}
+qf{a>3769:A,x>2594:A,R}
+lp{a<3244:A,m>3198:A,s<88:A,A}
+rss{s>2234:R,R}
+tzg{s<2882:jfc,s<3402:bkg,a<3428:sk,mqh}
+txz{m<1810:R,m>2652:R,a>3588:R,R}
+pvn{a>3803:hvh,bpl}
+gft{a<2913:xxj,s>431:krz,A}
+qcc{x<873:R,m<587:R,R}
+dbc{s>1362:A,s>992:R,m<2907:A,R}
+phq{s>3117:A,a>765:R,s<2609:R,lvl}
+vjd{s>571:zjn,bdm}
+rvl{a>1110:zzq,x<1998:nf,x>2809:lpz,rdv}
+lx{m<855:R,x>1922:ms,m>1147:dg,glx}
+qgh{s<1643:xvc,s<1651:R,R}
+xf{x>2654:A,a>195:A,R}
+vr{x>617:R,m<396:A,s<3191:A,A}
+tlr{a>2609:qfn,dm}
+kg{s<242:A,A}
+vk{x<1653:R,m>2231:A,A}
+lsr{a>935:A,x>1110:R,s>462:A,A}
+pn{m<2216:A,a<1631:A,R}
+zfz{x>2899:R,s<52:R,A}
+stg{a>832:R,R}
+gjb{s<23:A,a<3359:R,R}
+jvf{s>119:A,a>2527:A,R}
+dkx{a<3212:cql,s>119:jj,x>524:psl,xb}
+qtc{x<2528:A,m<385:R,A}
+fjp{a<2992:kn,a<3011:dqd,m<146:R,A}
+vvt{x<1894:fbs,a>3605:zbk,R}
+xz{m<1515:A,A}
+js{s>2570:R,A}
+hpt{m>1643:R,x<884:A,m<1598:A,R}
+zq{a>1969:xh,m<1614:kdf,A}
+hbp{x>2963:R,A}
+cpf{m<604:bjc,A}
+jkg{m>3490:A,a>3111:R,m<3422:R,R}
+vrd{m<2920:R,a<3288:A,A}
+jfd{s>397:R,m>3282:vgc,m<3165:trj,fnl}
+rh{x<2285:lks,bx}
+nzp{a<3752:A,R}
+fmf{a<900:bp,a<977:fp,rc}
+lsb{m>2743:A,gkn}
+kdp{a>707:lmq,m>3143:rh,kf}
+gg{m>3476:A,m>3387:A,m<3351:R,R}
+nd{m<360:A,x>3509:R,R}
+cxc{a>2240:A,x<1886:A,A}
+ntm{a<2861:A,R}
+nqg{x>3769:A,x>3742:A,A}
+tg{s<2140:A,m>2294:R,m<2193:R,R}
+sx{s>237:R,A}
+dg{m<1286:R,a>1656:A,m<1382:A,R}
+jsn{x>3365:A,vgl}
+kf{a>393:mc,m<2579:R,tfx}
+bpl{m>863:A,m>467:R,A}
+tz{x<668:A,A}
+db{m>3088:kj,x<1576:lzs,A}
+jmm{s<779:jfd,tzj}
+zrv{m>1431:R,R}
+php{a<1585:R,a<2226:R,A}
+zcf{s<1042:R,A}
+mm{x<534:A,A}
+hdk{s>153:txj,nqd}
+zdt{x>3687:R,kkk}
+hc{x<2498:A,m>1186:A,A}
+vgd{m<176:R,a<842:A,a>1015:R,A}
+zh{a>561:A,s<746:A,x<2554:R,A}
+zjr{a<2709:rr,lj}
+lpm{s<2577:R,a>2647:A,m<2316:R,A}
+smk{a>3635:R,txz}
+cr{s<270:tgc,m>465:pnp,ft}
+tmd{s<3028:qf,R}
+cqx{x<2020:R,x>2434:A,x>2175:A,A}
+xlx{s>3190:R,A}
+ttt{a<3554:tkh,tkq}
+jz{x<1102:R,R}
+hcz{a>3152:A,m<2410:R,x>2244:A,A}
+zqj{s>101:A,s>67:R,m>2989:thb,A}
+kn{m>162:A,s<496:A,s<633:A,R}
+qt{a<1311:A,x>1063:A,A}
+sxk{a<3632:R,x<2553:R,x<2625:A,A}
+xv{s>3601:R,A}
+snx{x<792:R,a<1919:pq,a<2022:hq,bz}
+qmg{x>3327:R,a>3626:bl,a<3496:rlq,tnf}
+gz{s<940:sms,hnk}
+zs{a<2803:hmx,hc}
+mbz{x<1001:zf,hz}
+rl{s>2922:sc,x<3395:dl,zdt}
+sqx{s<144:R,a<3398:R,x>2223:A,A}
+cp{m<2323:A,A}
+cmg{s>1623:A,a<3759:R,a>3876:A,R}
+vtp{m>2564:A,m<979:psh,x>3832:A,nv}
+bq{s<2169:R,s>2329:A,R}
+sxr{s>548:R,R}
+vb{m<1546:bj,m>1725:A,a<3717:hpt,R}
+zl{x>2548:R,m>3433:fn,A}
+kbx{m>2247:A,a>606:R,s>2848:hm,A}
+hr{a<3560:R,x>1405:A,m>1584:A,A}
+ktd{m<167:R,R}
+bk{s<362:A,s>368:R,a>3369:A,A}
+vz{x>3657:vtp,s<954:gsh,s<1183:qmg,jsn}
+jq{m<2577:qhs,gtc}
+nf{s>712:mbz,m>1866:szx,a<647:ss,fmf}
+lmq{x<2537:R,m>2563:R,s>1064:rhg,R}
+znz{x<887:gxl,ffh}
+bdm{s<482:A,s>535:sxr,R}
+mxs{s>2254:jl,x<1103:mv,lf}
+sfd{m<431:A,R}
+rz{x>1978:xn,A}
+lvv{x<2871:A,s<2781:A,s>3509:kkt,R}
+dj{s>417:jg,a>3559:mfh,s>214:vmr,lmb}
+spn{m>417:R,R}
+mc{m<2406:A,m<2653:R,R}
+pvm{x<2944:R,A}
+zcd{a<3691:A,m<386:A,s>2946:R,R}
+vvf{x>2029:ph,a>2937:tp,x<790:A,A}
+vmq{a<850:A,s<3476:A,x<2359:A,A}
+mb{a>3737:xmc,s<542:hnm,x>2277:R,st}
+xjb{m<1846:xpv,s<268:lsb,kxq}
+nt{m<2677:A,x>326:R,R}
+ngf{m<1114:kkz,s>2628:zg,s<2243:qzx,sr}
+tmq{m<3330:R,m>3679:rzn,gg}
+qjd{a>587:bxd,s<1370:kc,s>1572:ksz,hbp}
+lpz{m<2004:ks,m<2966:kr,m<3545:jmm,rqx}
+rhj{m>3073:A,m>2754:R,R}
+vmk{a>1591:A,m>1701:R,m<1465:R,R}
+df{a>3391:R,x>2887:R,x>2143:R,R}
+gdb{s>3482:R,a>3109:A,R}
+sms{x>2207:R,m<524:zb,rrl}
+ss{m>735:mg,x<1028:tq,s<388:sx,kpc}
+kgr{x<2041:zp,a<3722:smk,m<1354:hjf,zqj}
+gbt{a<904:A,a>935:R,a<917:A,A}
+cmd{x<2195:A,s>1535:lvn,sjt}
+lgg{s<293:A,a>3249:A,A}
+trj{m<3048:R,R}
+mgv{x>1466:sn,vt}
+bmj{x<1748:R,A}
+hhg{m>2584:gs,x<2018:qpd,a<2959:vpv,vm}
+jxb{s<2968:tf,a<806:bvq,mt}
+txj{a<2865:kg,hp}
+prp{s<1203:A,R}
+rc{s>427:pf,a<1046:A,s>181:A,hlj}
+cz{a<1470:rss,a>1953:cxc,tg}
+ctp{x<2600:A,s<703:pg,vn}
+hg{m>1875:A,R}
+tgc{s>103:R,x>2902:R,A}
+xpf{a<2558:ngf,x>2202:hgn,xj}
+lms{m>2763:R,x<2186:R,a<3059:A,R}
+pz{m>1122:xz,s<3366:R,s<3707:gdb,A}
+pb{s<3209:R,x<440:A,lpk}
+jg{a>3464:hf,m>1784:nzc,vjd}
+rdv{m>1536:kdp,x>2427:hql,a<735:gz,vth}
+kzc{a>655:A,x>3522:hrc,R}
+st{x>1014:A,s<605:R,R}
+dmf{a<482:R,a<895:A,a<970:A,A}
+znv{a>3379:R,m>3168:A,R}
+zbk{s>3588:R,m>2703:R,x<2271:R,A}
+lks{s<670:A,x<2097:A,A}
+mbq{x<2183:qd,m<1342:cr,ht}
+xmd{x<2331:ntg,m>3377:jbd,fm}
+zln{s>1431:cgp,a<3713:hr,cgk}
+ntg{s>120:A,x>1443:R,a<3366:R,R}
+tzj{x<3372:prp,x>3702:xp,m>3170:R,qlq}
+xs{s<2731:R,m<561:R,vmq}
+tf{x<3480:A,m>2455:A,R}
+rln{a>1779:xdr,R}
+nn{x>822:R,x>491:R,x>227:R,R}
+pm{m<866:fk,s>2803:vb,s>2416:zfv,jgv}
+xnp{s>2075:A,R}
+hbg{s<2746:A,x<3803:A,m<2542:A,A}
+stx{s>975:R,x>3496:R,s>885:R,R}
+lpk{m<2670:A,m>2794:A,R}
+rgr{s<1386:hsx,zln}
+dm{s<338:jvf,m>2519:zgj,ml}
+hrq{m>1466:A,s<3469:zx,s>3766:A,tl}
+mg{m<1308:R,dgm}
+xvx{a<776:srt,a<810:vj,stg}
+tkr{m<2953:R,s<1185:A,a<3952:A,A}
+lf{a>3172:R,s<1944:R,A}
+zbz{m>2489:mnc,a>2239:cp,a<1874:zjv,ftn}
+cdj{m<2436:qtj,a<1945:pj,src}
+jnp{s<3395:R,A}
+lt{x<624:A,a>3655:A,R}
+nrv{x<2171:zk,a>3212:plb,m>3713:hsq,dr}
+tq{m<344:mgz,R}
+bvq{m>2442:mp,rjz}
+hhm{m<3069:R,s>570:hl,s<505:A,zj}
+rqx{x>3506:ddz,vl}
+hkr{s<1564:R,x>2795:A,x>2548:A,R}
+tzp{x>1878:R,x<1197:bk,x>1460:A,A}
+xmc{a<3841:R,m>977:R,s<520:A,R}
+kpc{s>553:A,a>373:R,s>489:mrf,A}
+vgc{x>3361:A,s>257:A,m>3414:A,R}
+nq{x>1800:A,m>3752:A,a>3082:A,R}
+fsq{s>1258:R,m<2431:A,m>2772:A,A}
+ktj{x<3300:rhj,kt}
+nzk{a<786:vhm,A}
+tp{s>516:A,A}
+mgz{s<343:R,R}
+hmk{m>2242:rbh,zs}
+tr{s<580:A,m>1084:A,A}
+in{s>1709:shr,ssf}
+fbs{m>2660:A,m<2567:R,R}
+clc{m<3471:jb,s>2669:xtx,s>2279:R,R}
+zgj{x<2962:A,m>3024:R,A}
+ftn{s<2594:A,s<3498:A,s>3737:R,R}
+nmc{s>1639:A,a>3562:R,x<2452:R,A}
+ls{a<994:R,x<2713:vmk,x>3155:htp,php}
+bbf{x<2285:lnk,x>2861:A,R}
+lm{x>2624:R,A}
+rfh{a<1918:A,s<3053:A,m<2456:A,A}
+bl{x>3168:R,R}
+xn{s<1829:A,A}
+hj{x>1386:gft,fqd}
+snf{a>3072:R,R}
+pg{s<294:A,m<831:A,m>1263:A,A}
+kkk{a<3490:R,x<3523:R,R}
+xpv{x<1729:lgg,A}
+dzp{s>458:R,x<1321:A,A}
+ntr{a<3241:qcr,bfr}
+rk{m>1700:R,m>1433:R,x<3539:A,R}
+vl{s<701:qvn,a>732:A,R}
+hq{s<2487:A,s<3014:R,R}
+dlc{x<3041:clc,tmq}
+zg{x>1814:ls,x<686:hrq,jpr}
+pdr{x>816:R,R}
+tjb{a>1942:zl,cmf}
+sgs{s>1230:R,R}
+cnn{a>2517:tzg,x<1521:tjs,a<1469:dlc,tjb}
+sfs{m<628:R,s>930:tnx,m>1168:R,R}
+cgk{s>1412:A,s<1399:R,R}
+xb{x<285:A,A}
+xmj{s<3313:A,m<2698:R,R}
+jhp{a>1163:A,R}
+jgv{s>2059:vx,x>989:R,m<1617:R,kjl}
+gpr{x>3160:qp,a<3047:zbz,lvv}
+tfx{m<2941:R,x>2491:A,A}
+sr{m<1525:cdh,fx}
+fql{x<1418:R,A}
+ts{a<2631:R,A}
+bfr{m>1646:R,s<85:qqv,x<3051:sqx,A}
+zj{x<3373:R,m>3389:A,m>3219:A,A}
+sk{a<2840:ts,s<3691:qr,s<3876:A,R}
+xtx{a>762:R,m>3708:R,A}
+rx{s<2605:A,qhr}
+vx{s<2277:R,a>3680:R,a>3593:A,R}
+kdf{m<544:A,s<1477:A,A}
+cmv{s<657:R,x<1700:A,a>3646:R,R}
+xpm{m>331:A,R}
+qzx{s>1906:gv,a<1113:ggm,rz}
+qrm{x<2907:R,m<2572:A,a<3489:R,R}
+dtr{m<2474:R,R}
+cx{a<2460:fg,a<2572:R,lpm}
+mnc{m>2641:R,m>2575:R,m>2533:A,R}
+hsq{s<385:R,s>405:bs,m>3834:R,kcl}
+jpr{m<1719:qt,hg}
+hl{m<3427:A,a<3178:A,s>624:R,R}
+vf{a<765:R,m>1268:A,s<141:R,R}
+bhg{s<952:A,R}
+gt{m<2287:qjq,a<3194:R,m<2303:xlx,lt}
+gd{a>2980:R,m<1203:R,R}
+cgl{s<397:R,A}
+cbs{x>2658:hrv,m<812:qtc,zh}
+psh{m>546:R,A}
+tpg{s>2985:A,m<3486:R,R}
+rsv{x<3495:fst,a<247:klf,jlv}
+vm{m>2318:hcz,s>2480:A,hk}
+hnk{m>736:pkb,nr}
+qbg{a<629:A,s>3209:R,mtf}
+vmr{s<336:xjb,m<2583:qjp,m<3422:lzb,nrv}
+dqd{s<491:R,x>2458:A,R}
+jfc{a<3378:R,lm}
+mjq{m>3216:cmg,s>1624:A,s<1610:nzp,dz}
+fm{m>3056:lp,s>98:qtf,A}
+clp{x>2129:R,A}
+zzq{s>1114:hst,s<609:mbq,m<1439:rrn,fj}
+klf{a>120:A,a>56:A,A}
+nl{a>3745:qj,sfq}
+szx{x<761:nrx,db}
+pq{a<1830:R,A}
+rq{x>3602:R,a>3950:tn,a<3931:A,ffr}
+lzs{a>569:R,x<1250:R,R}
+qtf{a<3358:R,x<2905:R,A}
+fph{a<3718:A,x<2225:R,R}
+snj{x>2131:thp,x>1912:qkg,a>3243:ltm,px}
+jc{x<2498:A,a>221:R,m>877:A,R}
+gzj{x>1807:A,m>3696:jz,qv}
+rb{m<919:R,s<98:R,s>121:R,A}
+ht{s>399:A,x>3166:A,m<2596:R,A}
+rjz{a<370:R,A}
+mjg{s<392:A,x<2790:R,A}
+qpd{a>2828:R,bmj}
+nns{s<385:A,s>403:A,A}
+xvc{x>1676:R,s>1628:A,m>687:A,R}
+zxb{x>718:A,R}
+tn{a<3977:R,x<3440:R,R}
+zdc{s<105:A,x>1709:A,R}
+dr{s>368:pxd,R}
+krz{a>2955:A,R}
+fs{a<3398:hmk,s<1304:brr,vdt}
+kzl{x<251:R,x>411:R,s<95:A,A}
+hnd{x>1357:R,A}
+fdx{m>2361:pb,m<2198:phq,m>2290:qbg,kbx}
+rhc{m>2517:scg,x<1676:pvn,x>2698:qfk,fph}
+jh{a>3482:A,R}
+ddz{x<3705:gj,x>3834:A,m<3795:nqg,xxf}
+czv{a<2106:snx,m<2262:nnt,cx}
+xhg{m<2396:R,x<2899:A,R}
+kc{m<2522:A,s<1213:A,a>229:A,R}
+vt{m>515:A,s>566:A,A}
+kl{m>3081:xc,s<378:R,m<2962:vrd,hnd}
+xmv{m>896:A,s>941:nd,pmn}
+qjq{a<3471:R,A}
+tkh{s<1068:jh,qrm}
+cj{s<2474:zrc,dxh}
+mcj{s>3215:cq,pn}
+bxd{a<891:R,a<1032:R,m<2541:A,R}
+mtc{x<2110:R,m<3035:R,R}
+psl{m>1354:lfd,s<67:gjb,s>101:qm,R}
+lmd{m>2534:cqx,s<2646:cz,m<2340:mcj,nz}
+xc{s<372:R,a<3274:A,R}
+gj{a<465:A,m>3758:A,x>3598:A,A}
+bz{m<2223:R,x<963:R,x>1101:A,A}
+vsq{x>1282:A,a<2591:A,A}
+pht{a>2948:gd,s>499:tr,s>425:ldt,R}
+lvn{m<928:R,R}
+gb{m>2419:R,a>1135:R,m<2258:R,R}
+ct{s>866:R,x>2173:R,R}
+vj{s>1039:A,x>2171:A,A}
+ft{a<1806:R,m<255:A,A}
+mqh{a<3675:R,fql}
+bkg{s>3166:R,tpg}
+cq{x<1886:A,A}
+zrc{m>2535:A,x<2119:xnp,x>2452:sxk,bq}
+nv{a<3611:R,R}
+zjn{m<1047:A,R}
+qtj{a<1943:R,x>2213:A,s>778:A,R}
+tkq{m<1388:R,a<3674:bhg,xhg}
+qjp{s>376:bjz,tzp}
+bfq{x<2368:A,x<2523:A,a>3761:R,A}
+mr{x>2674:R,x>2564:R,jc}
+zkg{x<2949:R,x>3122:A,m<3032:A,A}
+hst{s<1346:rln,x<2070:zq,mk}
+fp{m>930:lsr,a<930:qcc,pdr}
+ljh{x>1503:R,x>966:A,A}
+bs{s<411:A,s>415:R,A}
+gzq{s>573:spn,s<216:A,m<286:vgd,A}
+qfk{a<3832:R,a>3913:A,A}
+nxh{s>2539:tz,R}
+hk{a>3128:A,R}
+xdr{m<2195:A,R}
+scg{m<3346:mtc,x<1621:R,s<303:qx,A}
+sc{x>3385:lvg,a<3360:R,m<676:sfd,A}
+kj{s<354:A,m<3555:R,s<487:R,A}
+kr{s<1061:kzc,x<3218:qjd,a>424:zr,rsv}
+qhc{x<2149:R,x>2781:R,m<953:R,nmc}
+qhd{a<3942:bfp,s<1085:zkg,a<3963:tkr,pvm}
+gs{a<2897:A,s>2780:xmj,lms}
+rbh{m<3151:nds,gzj}
+rbd{m>2470:A,m<2224:R,R}
+fst{s<1304:A,m>2596:A,x>3343:A,R}
+hm{s<3488:A,s>3768:A,x>608:R,R}
+vn{s<1194:R,A}
+xp{m<3163:A,m>3391:R,s>1334:A,A}
+dh{x>532:xps,rx}
+lqr{m>2480:A,ljh}
+rrl{s>375:A,x>2075:A,R}
+
+{x=1741,m=2523,a=1038,s=869}
+{x=427,m=395,a=33,s=3014}
+{x=170,m=331,a=1510,s=1074}
+{x=152,m=897,a=1242,s=952}
+{x=1569,m=9,a=779,s=1744}
+{x=454,m=751,a=1610,s=820}
+{x=764,m=1526,a=319,s=1001}
+{x=565,m=667,a=3092,s=133}
+{x=717,m=127,a=2,s=1405}
+{x=1484,m=340,a=1336,s=44}
+{x=2043,m=256,a=1683,s=698}
+{x=974,m=1247,a=1136,s=1947}
+{x=1100,m=160,a=981,s=849}
+{x=1433,m=2789,a=2062,s=11}
+{x=1447,m=197,a=580,s=564}
+{x=9,m=1277,a=1689,s=142}
+{x=3014,m=1127,a=71,s=1035}
+{x=2455,m=919,a=1403,s=1924}
+{x=811,m=1025,a=373,s=1349}
+{x=46,m=2453,a=991,s=1}
+{x=1385,m=1299,a=225,s=1462}
+{x=802,m=123,a=2922,s=2545}
+{x=342,m=693,a=1722,s=1162}
+{x=321,m=221,a=428,s=2130}
+{x=3344,m=622,a=92,s=579}
+{x=1349,m=1013,a=2894,s=1315}
+{x=169,m=8,a=677,s=1053}
+{x=1785,m=1334,a=1554,s=314}
+{x=252,m=86,a=3588,s=1268}
+{x=135,m=6,a=477,s=1356}
+{x=75,m=3120,a=89,s=1078}
+{x=2614,m=733,a=1553,s=1666}
+{x=39,m=918,a=2810,s=2292}
+{x=269,m=771,a=2312,s=996}
+{x=1062,m=889,a=2333,s=1295}
+{x=2178,m=1688,a=458,s=1039}
+{x=45,m=148,a=1642,s=22}
+{x=834,m=794,a=98,s=1313}
+{x=972,m=863,a=877,s=731}
+{x=2321,m=436,a=2342,s=874}
+{x=96,m=647,a=297,s=901}
+{x=822,m=710,a=600,s=1514}
+{x=600,m=401,a=2863,s=683}
+{x=1318,m=493,a=2953,s=595}
+{x=1,m=327,a=1516,s=374}
+{x=3193,m=1755,a=3006,s=872}
+{x=1410,m=1798,a=1427,s=790}
+{x=1526,m=831,a=69,s=777}
+{x=1237,m=104,a=3914,s=412}
+{x=36,m=415,a=79,s=2432}
+{x=101,m=1571,a=17,s=788}
+{x=3117,m=1449,a=163,s=309}
+{x=517,m=1333,a=1122,s=336}
+{x=2907,m=982,a=873,s=524}
+{x=2907,m=1025,a=422,s=833}
+{x=1111,m=1295,a=1088,s=1646}
+{x=2188,m=1467,a=53,s=1973}
+{x=34,m=3017,a=34,s=1428}
+{x=240,m=3881,a=143,s=521}
+{x=274,m=1911,a=31,s=1721}
+{x=618,m=2495,a=1063,s=144}
+{x=1000,m=478,a=944,s=2741}
+{x=2445,m=132,a=4,s=809}
+{x=1653,m=569,a=2011,s=608}
+{x=827,m=1195,a=2518,s=504}
+{x=401,m=711,a=905,s=777}
+{x=1132,m=3298,a=1503,s=439}
+{x=757,m=3640,a=1349,s=682}
+{x=3850,m=164,a=1903,s=775}
+{x=1285,m=662,a=454,s=561}
+{x=216,m=161,a=172,s=183}
+{x=1164,m=1043,a=1275,s=2226}
+{x=2857,m=247,a=1301,s=31}
+{x=855,m=1998,a=1484,s=1567}
+{x=469,m=627,a=557,s=1481}
+{x=2763,m=3064,a=1040,s=2434}
+{x=2249,m=5,a=1411,s=279}
+{x=454,m=3189,a=993,s=1560}
+{x=140,m=1004,a=2119,s=898}
+{x=1115,m=2195,a=259,s=510}
+{x=343,m=2038,a=1527,s=1459}
+{x=2066,m=899,a=675,s=2545}
+{x=2436,m=923,a=608,s=342}
+{x=100,m=42,a=1368,s=71}
+{x=1477,m=153,a=2079,s=286}
+{x=1838,m=1330,a=6,s=1383}
+{x=1630,m=413,a=1027,s=631}
+{x=247,m=651,a=49,s=347}
+{x=409,m=467,a=1329,s=934}
+{x=1367,m=1805,a=535,s=803}
+{x=2157,m=2335,a=969,s=976}
+{x=1778,m=1165,a=1341,s=89}
+{x=162,m=1286,a=1595,s=491}
+{x=1901,m=31,a=10,s=1900}
+{x=102,m=1156,a=955,s=1226}
+{x=138,m=256,a=1556,s=2215}
+{x=2116,m=1849,a=83,s=1338}
+{x=20,m=53,a=608,s=569}
+{x=2861,m=369,a=1042,s=1528}
+{x=194,m=10,a=964,s=297}
+{x=2318,m=328,a=730,s=850}
+{x=1958,m=2008,a=3122,s=1207}
+{x=1221,m=2256,a=38,s=8}
+{x=54,m=2430,a=53,s=936}
+{x=1420,m=952,a=1419,s=59}
+{x=1021,m=561,a=463,s=813}
+{x=12,m=98,a=850,s=46}
+{x=1155,m=1768,a=200,s=1668}
+{x=140,m=1439,a=1916,s=193}
+{x=754,m=397,a=23,s=314}
+{x=1566,m=1054,a=1418,s=392}
+{x=1482,m=1238,a=941,s=1459}
+{x=491,m=551,a=1941,s=1376}
+{x=1695,m=77,a=260,s=2519}
+{x=144,m=204,a=45,s=334}
+{x=351,m=412,a=2647,s=317}
+{x=1176,m=2189,a=383,s=3006}
+{x=298,m=1992,a=2519,s=1478}
+{x=2,m=409,a=1668,s=95}
+{x=38,m=871,a=2346,s=226}
+{x=178,m=151,a=922,s=1006}
+{x=271,m=717,a=498,s=26}
+{x=704,m=1943,a=55,s=260}
+{x=1281,m=1773,a=994,s=818}
+{x=388,m=556,a=2899,s=455}
+{x=2045,m=747,a=732,s=372}
+{x=1,m=2749,a=109,s=852}
+{x=402,m=2322,a=61,s=334}
+{x=157,m=51,a=538,s=911}
+{x=939,m=86,a=1732,s=228}
+{x=55,m=742,a=1219,s=745}
+{x=3336,m=2251,a=220,s=956}
+{x=1194,m=289,a=1956,s=555}
+{x=1639,m=120,a=423,s=315}
+{x=1848,m=455,a=1014,s=1369}
+{x=647,m=428,a=347,s=2516}
+{x=95,m=1386,a=1425,s=1275}
+{x=184,m=67,a=2116,s=440}
+{x=311,m=740,a=2340,s=2521}
+{x=410,m=579,a=575,s=2457}
+{x=183,m=1462,a=540,s=31}
+{x=2602,m=317,a=602,s=389}
+{x=1202,m=34,a=67,s=284}
+{x=609,m=929,a=112,s=2388}
+{x=537,m=1214,a=315,s=2220}
+{x=403,m=706,a=381,s=101}
+{x=1990,m=14,a=3374,s=3250}
+{x=1388,m=2477,a=694,s=489}
+{x=307,m=76,a=414,s=119}
+{x=22,m=1407,a=1937,s=377}
+{x=1102,m=654,a=107,s=700}
+{x=209,m=2473,a=3253,s=122}
+{x=14,m=1115,a=926,s=642}
+{x=1896,m=34,a=1674,s=321}
+{x=1354,m=468,a=1001,s=1676}
+{x=1097,m=2593,a=854,s=1015}
+{x=520,m=1580,a=349,s=1897}
+{x=1925,m=1372,a=3195,s=3561}
+{x=326,m=172,a=829,s=233}
+{x=1455,m=431,a=34,s=450}
+{x=711,m=1946,a=1081,s=443}
+{x=730,m=1041,a=3132,s=797}
+{x=39,m=1887,a=878,s=910}
+{x=1006,m=716,a=2966,s=39}
+{x=239,m=2607,a=3282,s=133}
+{x=1000,m=492,a=1097,s=673}
+{x=134,m=912,a=41,s=147}
+{x=1224,m=2150,a=116,s=1956}
+{x=97,m=1096,a=3302,s=197}
+{x=233,m=1029,a=1051,s=793}
+{x=327,m=363,a=1155,s=428}
+{x=680,m=478,a=3195,s=1672}
+{x=696,m=878,a=2166,s=1045}
+{x=518,m=244,a=944,s=1914}
+{x=700,m=9,a=595,s=589}
+{x=693,m=1652,a=1322,s=615}
+{x=1613,m=781,a=1331,s=2268}
+{x=2542,m=1739,a=2560,s=1474}
+{x=970,m=1490,a=539,s=3847}
+{x=203,m=119,a=511,s=1865}
+{x=134,m=1484,a=165,s=1015}
+{x=110,m=40,a=185,s=901}
+{x=668,m=1023,a=497,s=518}
+{x=795,m=1769,a=1478,s=577}
+{x=482,m=112,a=329,s=2807}
+{x=603,m=1999,a=548,s=1218}
+{x=177,m=2294,a=1863,s=2}
+{x=996,m=837,a=1121,s=1575}
+{x=2244,m=2546,a=2166,s=97}
+{x=335,m=2114,a=18,s=13}
+{x=1683,m=281,a=256,s=373}
+{x=1279,m=1367,a=702,s=786}
+{x=153,m=226,a=646,s=623}
+{x=124,m=4,a=63,s=2308}
+{x=543,m=3722,a=156,s=150}
+{x=117,m=403,a=779,s=831}
+{x=15,m=1018,a=461,s=437}
+{x=59,m=468,a=238,s=137}
+{x=29,m=212,a=2308,s=68}
+{x=662,m=244,a=2403,s=55}
\ No newline at end of file
diff --git a/2023/AdventOfCode/Day20/Day20.cs b/2023/AdventOfCode/Day20/Day20.cs
new file mode 100644
index 0000000..d3316b0
--- /dev/null
+++ b/2023/AdventOfCode/Day20/Day20.cs
@@ -0,0 +1,211 @@
+using System.Reflection;
+
+namespace AdventOfCode.Day20;
+
+public sealed class Day20(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day20";
+
+ private readonly string[] _example =
+ [
+ "broadcaster -> a, b, c",
+ "%a -> b",
+ "%b -> c",
+ "%c -> inv",
+ "&inv -> a"
+ ];
+
+ private readonly string[] _exampleTwo =
+ [
+ "broadcaster -> a",
+ "%a -> inv, con",
+ "&inv -> b",
+ "%b -> con",
+ "&con -> output",
+ ];
+
+ [Fact]
+ public void ExampleOne() => CalculatePulseCounts(_example).Should().Be(32000000);
+
+ [Fact]
+ public void ExampleTwo() => CalculatePulseCounts(_exampleTwo).Should().Be(11687500);
+
+ [Fact]
+ public void PartOne() => WriteOutput(CalculatePulseCounts(Input));
+
+ [Fact]
+ public void PartTwo() => WriteOutput(FindButtonPressesRequired(Input).ToString());
+
+ private static long FindButtonPressesRequired(string[] input)
+ {
+ var modules = ParseInput(input);
+
+ var processingQueue = new Queue<(Pulse Pulse, Module Module, string Input)>();
+ var inputsToRx = GetInputs(modules, "rx")
+ .SelectMany(m => GetInputs(modules, m))
+ .ToDictionary(m => m, _ => new List());
+ var cycles = new List();
+ var i = 0;
+ while (true)
+ {
+ processingQueue.Enqueue((Pulse.Low, modules["broadcaster"], "button"));
+ while (processingQueue.TryDequeue(out var current))
+ {
+ var (pulse, module, inp) = current;
+ var result = module.Receive(inp, pulse);
+ if (inputsToRx.TryGetValue(module.Name, out var occs) &&
+ result.Pulse is { IsHigh: true })
+ {
+ if (occs.Count == 1)
+ cycles.Add(i - occs[0]);
+ occs.Add(i);
+ }
+ if (result.Pulse is not null)
+ {
+ foreach (var res in result.Destinations)
+ {
+ if (modules.TryGetValue(res, out var mod))
+ processingQueue.Enqueue((result.Pulse, mod, module.Name));
+ }
+ }
+ }
+ if (cycles.Count == inputsToRx.Count)
+ return LCM([.. cycles]);
+ i++;
+ }
+
+ static string[] GetInputs(Dictionary modules, string module) =>
+ modules.Keys.Where(m => modules[m].Destinations.Contains(module)).ToArray();
+ }
+
+ static long GCD(long a, long b)
+ {
+ while (b != 0)
+ {
+ (a, b) = (b, a % b);
+ }
+
+ return a;
+ }
+
+ static long LCM(long a, long b) => a * b / GCD(a, b);
+ static long LCM(params long[] l) =>
+ l[1..].Aggregate(l[0], (agg, cur) => agg = LCM(agg, cur));
+
+ private static Dictionary ParseInput(string[] input)
+ {
+ var modules = input
+ .Select(i => i.Split(" -> "))
+ .Select(i => (Name: i[0], Dests: i[1].Split(", ", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)));
+ var destinationLookup = modules.ToDictionary(m => m.Name, m => m.Dests);
+
+ return modules
+ .Select(m => (Name: Norm(m.Name), Module: CreateModule(m.Name, m.Dests, destinationLookup)))
+ .ToDictionary(m => m.Name, m => m.Module);
+
+ static Module CreateModule(string name, string[] destinations, Dictionary lookup) =>
+ name[0] switch
+ {
+ '%' => new FlipFlopModule(Norm(name), destinations),
+ '&' => new ConjunctionModule(Norm(name), destinations, GetInputs(lookup, name)),
+ _ => new SimpleModule(Norm(name), destinations)
+ };
+ }
+
+ private static string[] GetInputs(Dictionary modules, string module) =>
+ modules.Keys.Where(k => modules[k].Contains(Norm(module))).Select(Norm).ToArray();
+
+ private static string Norm(string val) => val.Replace("%", "").Replace("&", "");
+
+ private static int CalculatePulseCounts(string[] input)
+ {
+ var modules = ParseInput(input);
+
+ var processingQueue = new Queue<(Pulse Pulse, Module Module, string Input)>();
+ var n = 1000;
+ for (var i = 0; i < n; i++)
+ {
+ processingQueue.Enqueue((Pulse.Low, modules["broadcaster"], "button"));
+ while (processingQueue.TryDequeue(out var current))
+ {
+ var (pulse, module, inp) = current;
+ var result = module.Receive(inp, pulse);
+ if (result.Pulse is not null)
+ {
+ foreach (var res in result.Destinations)
+ {
+ if (modules.TryGetValue(res, out var mod))
+ processingQueue.Enqueue((result.Pulse, mod, module.Name));
+ }
+ }
+ }
+ }
+
+ return (modules.Values.Sum(m => m.LowPulsesSent) + n) * modules.Values.Sum(m => m.HighPulsesSent);
+ }
+
+ private abstract class Module(string name, string[] destinations)
+ {
+ public string[] Destinations = destinations;
+ public string Name { get; } = name;
+ public int HighPulsesSent { get; protected set; }
+ public int LowPulsesSent { get; protected set; }
+
+ public abstract (Pulse? Pulse, string[] Destinations) Receive(string input, Pulse pulse);
+ protected (Pulse? Pulse, string[] Destinations) Send(Pulse? pulse, string[] destinations)
+ {
+ if (pulse is not null)
+ {
+ if (pulse.IsHigh) HighPulsesSent += destinations.Length;
+ else LowPulsesSent += destinations.Length;
+ }
+
+ return (pulse, destinations);
+ }
+ }
+
+ private sealed class SimpleModule(string name, string[] destinations) : Module(name, destinations)
+ {
+ public override (Pulse? Pulse, string[] Destinations) Receive(string _, Pulse pulse) =>
+ Send(pulse, Destinations);
+ }
+
+ ///
+ /// Flip-flop modules (prefix %) are either on or off; they are initially off. If a flip-flop module receives a high pulse, it is ignored and nothing happens. However, if a flip-flop module receives a low pulse, it flips between on and off. If it was off, it turns on and sends a high pulse. If it was on, it turns off and sends a low pulse.
+ ///
+ ///
+ private sealed class FlipFlopModule(string name, string[] destinations) : Module(name, destinations)
+ {
+ private bool _state = false;
+ public override (Pulse? Pulse, string[] Destinations) Receive(string _, Pulse pulse)
+ {
+ if (pulse.IsHigh) return Send(default, []);
+ _state = !_state;
+ if (_state) return Send(Pulse.High, Destinations);
+ return Send(Pulse.Low, Destinations);
+ }
+ }
+
+ ///
+ /// Conjunction modules (prefix &) remember the type of the most recent pulse received from each of their connected input modules; they initially default to remembering a low pulse for each input. When a pulse is received, the conjunction module first updates its memory for that input. Then, if it remembers high pulses for all inputs, it sends a low pulse; otherwise, it sends a high pulse.
+ ///
+ ///
+ private sealed class ConjunctionModule(string name, string[] destinations, string[] inputs) : Module(name, destinations)
+ {
+ private readonly Dictionary _states = inputs.ToDictionary(i => i, i => false);
+ public override (Pulse? Pulse, string[] Destinations) Receive(string input, Pulse pulse)
+ {
+ _states[input] = pulse.IsHigh;
+ if (_states.Values.All(s => s))
+ return Send(Pulse.Low, Destinations);
+ return Send(Pulse.High, Destinations);
+ }
+ }
+
+ private record Pulse
+ {
+ public bool IsHigh { get; init; }
+ public static Pulse High => new() { IsHigh = true };
+ public static Pulse Low => new() { IsHigh = false };
+ }
+}
diff --git a/2023/AdventOfCode/Day20/input.txt b/2023/AdventOfCode/Day20/input.txt
new file mode 100644
index 0000000..79aaf1e
--- /dev/null
+++ b/2023/AdventOfCode/Day20/input.txt
@@ -0,0 +1,58 @@
+%th -> gv
+%dx -> jx, vs
+%lj -> hd, cx
+%tt -> lp, tn
+%bv -> ml, jx
+%nb -> vc, hb
+broadcaster -> tb, dv, qg, lf
+%jv -> xc
+%sg -> gk, hd
+%fc -> tt
+&tr -> dh
+%sm -> jv
+%pd -> tn, bm
+%sj -> ln, hd
+%lp -> tn, ng
+%nn -> nv
+%bh -> hd, cp
+%lg -> tz, vc
+%gv -> vc, bk
+%sc -> hd
+%qg -> sj, hd
+%dv -> jx, sm
+%cp -> sc, hd
+%cx -> bh
+%xc -> dx
+%kf -> bv
+%gp -> tn, nn
+%nc -> kk, vc
+%vs -> qm, jx
+%bs -> lj
+%xv -> mz
+%mc -> vc
+%kk -> nb
+%ng -> gp
+%mz -> fc
+%bt -> jx
+%ln -> ps
+%hb -> vc, mf
+%lf -> tn, xv
+&xm -> dh
+%mf -> lg
+&dr -> dh
+&jx -> sm, jv, xc, qm, dv, nh, kf
+%bk -> nc
+%gk -> bs
+&tn -> lf, xv, xm, nn, mz, fc, ng
+%qm -> kf
+%ps -> hd, sg
+%tz -> vc, mc
+%nv -> pd, tn
+%ml -> qb, jx
+&nh -> dh
+%tb -> vc, th
+%qb -> bt, jx
+%bm -> tn
+&vc -> tb, mf, dr, th, kk, bk
+&hd -> bs, gk, tr, qg, ln, cx
+&dh -> rx
diff --git a/2023/AdventOfCode/Day21/Day21.cs b/2023/AdventOfCode/Day21/Day21.cs
new file mode 100644
index 0000000..b782226
--- /dev/null
+++ b/2023/AdventOfCode/Day21/Day21.cs
@@ -0,0 +1,109 @@
+using System.Runtime.InteropServices.Marshalling;
+using Coord = (int X, int Y);
+
+namespace AdventOfCode.Day21;
+
+public sealed class Day21(ITestOutputHelper output) : TestBase(output)
+{
+ protected override string Day => "Day21";
+
+ private readonly string[] _example =
+ [
+ "...........",
+ ".....###.#.",
+ ".###.##..#.",
+ "..#.#...#..",
+ "....#.#....",
+ ".##..S####.",
+ ".##..#...#.",
+ ".......##..",
+ ".##.#.####.",
+ ".##..##.##.",
+ "..........."
+ ];
+
+ [Fact]
+ public void ExampleOne() => CountReachableLocations(_example, [6]).First().Should().Be(16);
+
+ [Fact]
+ public void PartOne() => WriteOutput(CountReachableLocations(Input, [64]).First());
+
+ [Fact]
+ public void PartTwo() => WriteOutput(CountReachableLocationsFurther(Input));
+
+ private static long CountReachableLocationsFurther(string[] input)
+ {
+ // 26501365 - 65 =
+ // 26501300
+ // / 131 (width/heigh of grid)
+ // 202300
+ var height = input.Length;
+ var yValues = new List(3);
+ yValues.AddRange(CountReachableLocations(input, Enumerable.Range(0, 3).Select(i => height / 2 + i * height).ToArray()));
+
+ // y = ax^2 + bx + c
+ // yValues_0 = a0^2 + b0 + c = c
+ // yValues_1 = a1^2 + b1 + c = a + b + c
+ // yValues_2 = a2^2 + b2 + c = 4a + 2b + c
+ long c = yValues[0];
+ // yV_1 - c = a + b
+ // yV_2 - c = 4a + 2b
+ // 2(yV_1 - c) = 2a + 2b
+ // (yV_2 - c) - 2(yV_1 - c) == 4a + 2b - 2a - 2b = 2a
+ // a = ((yV_2 - c) - 2(yV_1 - c)) / 2
+ long a = (yValues[2] - c - 2 * (yValues[1] - c)) / 2;
+ long b = yValues[1] - a - c;
+
+ var x = (26501365 - (height / 2)) / height;
+
+ return a * x * x + b * x + c;
+ }
+
+ private static IEnumerable CountReachableLocations(string[] input, int[] steps)
+ {
+ var garden = new Dictionary();
+ Coord start = default;
+ var height = input.Length;
+ var width = input.Max(i => i.Length);
+ for (int y = 0; y < height; y++)
+ {
+ for (int x = 0; x < input[y].Length; x++)
+ {
+ var tile = input[y][x];
+ if (tile == 'S')
+ {
+ start = (x, y);
+ tile = '.';
+ }
+
+ garden.Add((x, y), tile);
+ }
+ }
+ Coord[] dirs = [(0, -1), (1, 0), (0, 1), (-1, 0)];
+
+ var locations = new List([start]);
+ var newLocations = new List();
+ var reached = new List(steps.Length);
+ for (var i = 0; i < steps[^1]; i++)
+ {
+ newLocations.Clear();
+ foreach (var (cx, cy) in locations)
+ foreach (var (px, py) in dirs)
+ {
+ var next = (cx + px, cy + py);
+ if (GetLocation(garden, width, height, next) == '.')
+ newLocations.Add(next);
+ }
+ locations = [..newLocations.Distinct()];
+ if (steps.Contains(i + 1))
+ reached.Add(locations.Count);
+ }
+
+ return reached;
+
+ static char GetLocation(Dictionary garden, int width, int height, Coord loc) =>
+ garden[(((loc.X % width) + width) % width, ((loc.Y % height) + height) % height)];
+
+ }
+}
+
diff --git a/2023/AdventOfCode/Day21/input.txt b/2023/AdventOfCode/Day21/input.txt
new file mode 100644
index 0000000..bb592bd
--- /dev/null
+++ b/2023/AdventOfCode/Day21/input.txt
@@ -0,0 +1,131 @@
+...................................................................................................................................
+.#........#.#.........#................##.#.............#....................#....#....#.#...#.......#..........#........#.........
+....#......#.....................##...#.#....#.#..#...#.......................#.....#..........##....#..#........#.##..#..#...#....
+.#.....#.............#.#...............#...........#.#.#................#...........#.#.....#.......##......#........#.#...........
+.....#...........#.......##.#.#..........#....#....#..#.#..................................#....##...#.#.....#..#.......#...#...#..
+...#....##............#...#..#.....#....##....#....##...........#...............#..##..#..............#..#......#.....#............
+..##....#.........#.......#..#...#...........................................#.....#.#........#...#.......................#.....#..
+..##.#........#..........#......#...#.....#..#.......#........................#..........##......#...#.#..............#......#.....
+........#....##.................................#.##.........#.......#........#...#..#.....................#.#.##....#.........#...
+.#...............#....#..........#....#.#...........................................................#.#.....#...#...#.........#....
+..#........#.##..............#...##.....#..#...#....................................#..##......#..#.......#........................
+...........................................#.................#.#..................#..#..#..#....#..#................#..........#...
+.....#...#...#.#......#.....#.#.....#.#..#........................#..#.##...................#.................................#.#..
+......#...........#.........##....#.#.#....#..............#........#....................#.............#..##...#.............#......
+..#...........##....#......#..#........................#.#........#..#...#...........#............................#.#............#.
+.#....#..#......#..........................#.......................#....#...........#......#.......#...............................
+....#.#...##....#.........#....#...#.#..#............................#.......#...............................................#..#..
+.......#..........##......#..#...#.....#............#...#...................#...............#..#..................#.....#..#...#...
+..................#.........#....#.#....#..#....................#..................................................................
+.#.##.................#....#..#.......##.#.................#.#............#...#..........#.#...#.........##.#...............#......
+..#........#.....#.#.........#.#.....#..#........#...#.....#....#....#.....................##....#...............................#.
+..#...#....#.#.............#..#..#...............##.......##.........#.....................................#....###.....##....#....
+....#..####.....#....................#................#.......#.............#..#..#..........##......##.......#...........#........
+..........##..#........#.......#..............#.#......#..#....#.............#...#................#......##...#..#......#..........
+......#....#...#........#.............................##..#.....#..............#.#......................................##.#...#...
+.#..........................................#.......#...#.##..#............#.......................#.#...##........................
+............#.#...........#.....#....................##...#...#....#.................#.#.........#......#........#......#...#......
+.#.....##.#..#..........#....##............#...........#.#.....#.......#............#.#............#...............................
+.........#........#...#.###.....#.........#.#...##.##....##..........#................................#..........#...##...#........
+...........#.........##...#.#..................................................#.........#..................#.........#.......#....
+....##...#..#.#..#.......................#....#......#............#....#.........###......#..............#.......#...#..........#..
+...........#.......#......#...............................#.....#.......#..#...............#.........##........#.#.........#.......
+......#....#.................#..............#..#..........#...#........................##..............#.........................#.
+.###.##...#.##........#........................#.#.###................#...#.#....#...........#...............##.........#..........
+...........................................#.........#..##.................#...#.#.#..##..#............#.#.#.....##.....#..........
+.#............................................#..#............#....#...#...#......#.#..........................#....#.#..........#.
+...........#...........#................#........#..........#........#...........#..............#.........#....##....#....#...##.#.
+................#............................#...#......#.....................#..............#.........................##..#...#...
+...#....#.............................................#..................#.....#.#..#.....#................#.......#....#..........
+.#....##..#.#.......#.............#..............#...#..#....................#..#........#.#.......................................
+.#...#.......................................................#..........#.........#.......##...#.#.#............###............#.#.
+.....#.....#......#..............#.#...............#....#.....................#......#....#.#........#.........#....#.........#....
+............#.#.###.......................................................#...................#....#...#.......##............#.....
+.#......#..............................#..........#....#....#.#.#........#............#.....#........................#......#......
+................#......................##.......#.......#..#..............##...................#...#...#...........................
+.#...#..................#.......................#...#...#..........#.......#.......#...................##...................#......
+........#...............#...#....................#..#.......................#.............#.#.#..........#..........###........#.#.
+.#..##...#..#............#.....#.....................#......#..............#......#..#..............#.....................#........
+....#...###.....................###..........#....#....#..............#................#.#.......#.#....##............#......#.#...
+......#.....................#.......#.#.#...#....#...#.#.....#..#........##.#..#..#......##........................................
+.......#.#............#...........#........#..............#....##..##..................##..........#...........#.......#..#..#...#.
+..#..#......................#..................................#....#......#...#............##......#......................##...#..
+.#...............................#.#.........#.....................###.#..................##.#...#.......#....................#..#.
+......##................#.........#......#................#........#.....#....#.#.##..#..#...##...#.#...........#................#.
+..#..#.........#...............##..................#........................................#........#......##.....................
+...................#....#......#...................#.#.....#..............#....##................#......#...#......#.........#.....
+....#...........#.......#......#..........#.....................#..#.........##.....##...........###......##.......................
+.................#..#....#..##.........................................#......#..........#............#..#....#.................#..
+.............#..#........#..#..#.#.......#..........#...........#..#.........#.#...................###.....#.......................
+..#............#..#..#..#..................#.##.#...#.#...#............###......#........................#.........#..#.........#..
+...........#..##.#..#.............#...#.............#.........#.....#.......#..................#...##..##......#...#..#............
+..............#...#...#.....##....#.#........#................#.....#.....#......#.......##....#.....#......#..#....#..............
+.............#....#..##..#.................#....#.#......#.#......#...##.....#....###.......#.......#..............................
+............................#..........#.......#................#....#.........#.......#.#..................#......................
+..........#...#.......#......................................##..........#..#......#............#..............#.....#..#..........
+.................................................................S.................................................................
+................#.........#.....#........#......................#....#.#.............#....#...#.............#...........#..........
+.........................................#......#............#...........#.......#......#..##.........##.............#.............
+........#................#.......#..........#.....#..........#........#.................##......#.............#.....#.....#........
+........#........#......#.......#....#...##.....................#.........#.....#.........#.................#..#...................
+.............#............................#.......#......#...##.........##...#......#.....#.#...#....................#.............
+..................................................#......#.......................#..##..#...##........#.#........#.................
+.#...........#..#.......#.....#...............#...#.....#..........#...#.#.#.......#.#..........................#.#................
+.####...............#...........#......#..#...................#....#....#...........#...#...................#.................#.#..
+...............#......#.##...............##..#..#........#..........#.#.............##......#............#...#.....#............#..
+.......................#.....###..#....#..#........................................#.#.............#...#........#..................
+.....................##....#...............#.........#....#.####...#......#.................#.#...........#......##..........#.#...
+..................#.................###...#............................#.#...##..#.#.#..#...#.................................#..#.
+....................#..........#..............#............................#.......#.........................#................#....
+.#..#...............#.........#..#..........#...#..........##.......##.##.....#....#...#.#......#...##.#...........................
+....#...............#....#.............................#.....#.........#..............#......#..............#............#.......#.
+........................#...........#..........#...#............#...#.#....#.............##..............##.#...................#..
+...#..................#.#...#...#.........#...........#.....#...#.##........#.#....#..........#.......##...........................
+.........#.#..........##.#....................#....#................#..#.#.....#...........#.........####.............#.......##...
+.#......#...................#........#.......#........#...#..#..........#..##..#..........#........................................
+.....#....#..#................##.....#......#.........................#.###...................#..#................#..#......#......
+..............#..........................................#.........#.....##.###............#...##.....................##...........
+..#......#..#.#.#.........#...#....................#.........#.........#......#...#.....................................#..........
+.......#...#.................#..........................#...##..#...#.#.........##............#..................#...............#.
+....#.........#.............#.......#.#..........#................#..##.#.#.#...................#.....#............#.....##....#...
+.###...............................#.........#..............#.#......#......#.....##.#.#.......#................#.#..............#.
+...#........#......#........................#.......#.##...#.........#........#...#.......#..##....#...........#....#..##..........
+......#.......#........#.......#..#...#....#.......#....#.#..........##........#..#...............#.......................##..#....
+...................#....#..........#........#.............#...#...##...#..........#.......#...#............#..........##...........
+.#........##......#.#................#.....#..........#....###................#.....#.......###...............#...#..........#..#..
+...#.........#...#....#............#..................##....#......#.....#.......#..........#...#...........#.....#..#.......#.....
+........#.................#........#.........#...............#...........#.##...##.......#..................#.......#....##........
+.###......#.....#......#.....................##..#...#........#........#....#................................#....#.....#.#........
+...........##..............................#..#...........#....#...#......#.#..#......#...............#............................
+.....#.#..#.........#............................#.....#.#.##......#.#.........#.....#.#...........................#...##......#.#.
+..............#.#.#.....#.#.............#..#.#.....#....#..#.#....#.................#....................#..........#........#.....
+..........#.....##.......#................#....................................#..#......#.........#..............#...#......##....
+.##.#......###..............#.#...............###......#.................#.......#......#.............................#....#.#.....
+..#..#...#............#....##.............#........................#.#..................................#......................#...
+......#.....#.............#...#............#....#.......#.....#.................................#..##...#.#..............#.........
+...........#..........#..#.#..................##...........#.......#........#....#.............#....................#.....#........
+....#...........#........##........................................#.#...............#.............#.#...##...#........#...........
+...#..#..............................................................#...#.#...#..#...........#..#..#....#..#..#.......#..#........
+...................#.#.....##...........................#................#.#...#...........#.............................#.........
+.....###.........#.....#...#...##...#..#........###.....#..#..............#.....#...................#...#...........#...#..........
+..............#......................................#..#....#.........##....##..#.......#.......................#.....##..........
+..#...................#...........#................................#.....#.#.#..........................#....#......#......#.......
+..#......#....#..##..#....#............#...........###........................#.........#........#........#............#.........#.
+...................#.##...........#....#..##............#...................#.........#........##........#...........#.#...........
+...#.#......#....#........#.......#....................................#.##..#.........#....#.#.....#.........................#..#.
+....#.#...#...........................................#...#..#....#....#..............#.........................#.....#......#..#..
+......#..................#..........#..#....#.......................#...............#...........#..............#....#.#............
+.#..............#........##......#...#....#...#.#................................................#.....##....#...##...#.#........#.
+.........#.............#..#..#...........................#.............#...........................#....##............#............
+..........#...#.....#..#...#...........#.#.......#........#.....................#.....#.....#...#.#..#......#....#....#...#..#.....
+.#........#............##.................##...............#.....................#.##.................#........#......#............
+....#........##....#..#.#.........#................................#................#.#.....#.............#..#....##.#....##.......
+........#.#.....#.......#.#..##..............##...................#...................#..#....................#..#.......#...#.##..
+.....#.#.........#.#....###..#..#.......#.....#................#....#........#.....................#.###.....#...........#......#..
+......#...#................#..#...##............#......#...................#............................#.........#....##...##.....
+..........#...##.....#....#...........#.....#......#..#.......................##...#.##.....#...#..##...#...#..#..#..........#...#.
+......#............#...........#.#..#...............#.............................#..#.......#...#.................#.......#....#..
+..............#........#............#....#.....##...#.###...................#............#..#.#..................#.............#...
+.............#....#.......#..#......#....#...#..#.......##.............#.##...#.........#..........................#.#...........#.
+.#..............#...#......#.......#..#................#.#.............#....#...............#.......#..............................
+...................................................................................................................................
diff --git a/2023/AdventOfCode/TestBase.cs b/2023/AdventOfCode/TestBase.cs
index c6a3ae2..a96a17d 100644
--- a/2023/AdventOfCode/TestBase.cs
+++ b/2023/AdventOfCode/TestBase.cs
@@ -18,6 +18,9 @@ protected TestBase(ITestOutputHelper output)
protected void WriteOutput(int output, [CallerMemberName] string? callerName = null) =>
WriteOutput(output.ToString(), callerName);
+ protected void WriteOutput(long output, [CallerMemberName] string? callerName = null) =>
+ WriteOutput(output.ToString(), callerName);
+
protected void WriteOutput(string output, [CallerMemberName] string? callerName = null) =>
Output.WriteLine($"{Day} {callerName}: {output}");
diff --git a/2023/AdventOfCode/xunit.runner.json b/2023/AdventOfCode/xunit.runner.json
new file mode 100644
index 0000000..57c2231
--- /dev/null
+++ b/2023/AdventOfCode/xunit.runner.json
@@ -0,0 +1,3 @@
+{
+ "diagnosticMessages": false
+}
\ No newline at end of file