Some analysis of code and performance
[advent-of-code-21.git] / profiling / profiling.ipynb
diff --git a/profiling/profiling.ipynb b/profiling/profiling.ipynb
new file mode 100644 (file)
index 0000000..cf7c87f
--- /dev/null
@@ -0,0 +1,4664 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 274,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [],
+   "source": [
+    "import glob\n",
+    "import json\n",
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 275,
+   "metadata": {
+    "Collapsed": "false",
+    "scrolled": true,
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent01)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent01' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent01' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent01' for advent-of-code21-0.1.0.0..\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent01/build/advent01/advent01 ...\n",
+      "1521\n",
+      "1543\n",
+      "      20,426,624 bytes allocated in the heap\n",
+      "       1,552,136 bytes copied during GC\n",
+      "         412,104 bytes maximum residency (2 sample(s))\n",
+      "         136,760 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         3 colls,     3 par    0.002s   0.001s     0.0003s    0.0003s\n",
+      "  Gen  1         2 colls,     1 par    0.002s   0.001s     0.0004s    0.0004s\n",
+      "\n",
+      "  Parallel GC work balance: 29.88% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.013s  (  0.012s elapsed)\n",
+      "  GC      time    0.004s  (  0.001s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.023s  (  0.017s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,561,715,663 bytes per MUT second\n",
+      "\n",
+      "  Productivity  57.8% of total user, 71.1% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent02)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent02' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent02' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent02' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent02/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent02/build/advent02/advent02-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:55:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      courseP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text [Command]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m55 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcourseP\u001b[0m\u001b[0m = commandP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:56:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      commandP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text Command\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m56 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcommandP\u001b[0m\u001b[0m = forwardP <|> upP <|> downP\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:58:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      forwardP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text Command\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mforwardP\u001b[0m\u001b[0m = Forward <$> (\"forward \" *> decimal)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:59:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      upP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "               Data.Text.Internal.Text Command\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mupP\u001b[0m\u001b[0m = Up <$> (\"up \" *> decimal)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:60:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      downP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Command\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m60 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mdownP\u001b[0m\u001b[0m = Down <$> (\"down \" *> decimal)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent02/Main.hs:63:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Command]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m63 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent02/build/advent02/advent02 ...\n",
+      "2039912\n",
+      "1942068080\n",
+      "       2,701,328 bytes allocated in the heap\n",
+      "              64 bytes copied during GC\n",
+      "         223,280 bytes maximum residency (1 sample(s))\n",
+      "         124,880 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0003s    0.0003s\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.003s elapsed)\n",
+      "  MUT     time    0.003s  (  0.003s elapsed)\n",
+      "  GC      time    0.000s  (  0.000s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.002s elapsed)\n",
+      "  Total   time    0.009s  (  0.007s elapsed)\n",
+      "\n",
+      "  Alloc rate    975,508,007 bytes per MUT second\n",
+      "\n",
+      "  Productivity  29.6% of total user, 39.3% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent03)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent03' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent03' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent03' for advent-of-code21-0.1.0.0..\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent03/build/advent03/advent03 ...\n",
+      "2724524\n",
+      "2775870\n",
+      "      12,725,280 bytes allocated in the heap\n",
+      "       3,135,472 bytes copied during GC\n",
+      "         214,088 bytes maximum residency (1 sample(s))\n",
+      "         125,880 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         2 colls,     2 par    0.005s   0.004s     0.0021s    0.0024s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0004s    0.0004s\n",
+      "\n",
+      "  Parallel GC work balance: 8.64% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.008s  (  0.007s elapsed)\n",
+      "  GC      time    0.006s  (  0.005s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.019s  (  0.015s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,635,549,285 bytes per MUT second\n",
+      "\n",
+      "  Productivity  40.4% of total user, 47.5% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent04)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent04' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent04' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent04' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent04/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent04/build/advent04/advent04-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:72:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘forceCall’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m72 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mforceCall\u001b[0m\u001b[0m (BingoNum n _) = BingoNum n True\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:99:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      bingoP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text ([Int], [[[Int]]])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m99 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbingoP\u001b[0m\u001b[0m = (,) <$> calledP <*> (blankLines *> squaresP)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:101:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      calledP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text [Int]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m101 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcalledP\u001b[0m\u001b[0m = decimal `sepBy` \",\"\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:103:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      squaresP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text [[[Int]]]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m103 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msquaresP\u001b[0m\u001b[0m = squareP `sepBy` blankLines\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:104:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      squareP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text [[Int]]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m104 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msquareP\u001b[0m\u001b[0m = rowP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:105:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      rowP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                Data.Text.Internal.Text [Int]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m105 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrowP\u001b[0m\u001b[0m = paddedDecimal `sepBy1` \" \"\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:108:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      paddedDecimal :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                         Data.Text.Internal.Text Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m108 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpaddedDecimal\u001b[0m\u001b[0m = (many \" \") *> decimal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:110:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      blankLines :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                      Data.Text.Internal.Text [()]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m110 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mblankLines\u001b[0m\u001b[0m = many1 endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent04/Main.hs:113:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> ([Int], [[[Int]]])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m113 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent04/build/advent04/advent04 ...\n",
+      "82440\n",
+      "20774\n",
+      "      87,851,256 bytes allocated in the heap\n",
+      "      15,993,040 bytes copied during GC\n",
+      "       2,460,448 bytes maximum residency (4 sample(s))\n",
+      "         153,864 bytes maximum slop\n",
+      "              65 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0        18 colls,    18 par    0.016s   0.012s     0.0007s    0.0010s\n",
+      "  Gen  1         4 colls,     3 par    0.040s   0.006s     0.0015s    0.0037s\n",
+      "\n",
+      "  Parallel GC work balance: 28.31% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.038s  (  0.033s elapsed)\n",
+      "  GC      time    0.057s  (  0.018s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.100s  (  0.054s elapsed)\n",
+      "\n",
+      "  Alloc rate    2,339,122,861 bytes per MUT second\n",
+      "\n",
+      "  Productivity  37.5% of total user, 60.6% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent05)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent05' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent05' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent05' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent05/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent05/build/advent05/advent05-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘Control.Applicative’ is redundant\n",
+      "      except perhaps to import instances from ‘Control.Applicative’\n",
+      "    To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:26:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: [Line] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m26 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m trace = M.size $ M.filter (> 1) diagram\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:30:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part2 :: [Line] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m30 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m trace = M.size $ M.filter (> 1) diagram\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:66:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      traceP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text [Line]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m66 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mtraceP\u001b[0m\u001b[0m = lineP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:67:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      lineP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Line\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mlineP\u001b[0m\u001b[0m = Line <$> (pointP <* \" -> \") <*> pointP\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:68:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      pointP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text (V2 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m68 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpointP\u001b[0m\u001b[0m = V2 <$> (decimal <* \",\") <*> decimal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent05/Main.hs:71:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Line]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m71 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent05/build/advent05/advent05 ...\n",
+      "5092\n",
+      "20484\n",
+      "     575,260,608 bytes allocated in the heap\n",
+      "     446,639,040 bytes copied during GC\n",
+      "      24,474,608 bytes maximum residency (14 sample(s))\n",
+      "         367,632 bytes maximum slop\n",
+      "             115 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       106 colls,   106 par    0.208s   0.183s     0.0017s    0.0045s\n",
+      "  Gen  1        14 colls,    13 par    0.528s   0.105s     0.0075s    0.0152s\n",
+      "\n",
+      "  Parallel GC work balance: 25.86% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.393s  (  0.353s elapsed)\n",
+      "  GC      time    0.716s  (  0.268s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.020s  (  0.020s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    1.135s  (  0.644s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,464,438,774 bytes per MUT second\n",
+      "\n",
+      "  Productivity  36.4% of total user, 58.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent06)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent06' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent06' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent06' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent06/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent06/build/advent06/advent06-tmp/Main.dyn_o ) [Data.List.Split changed]\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent06/build/advent06/advent06 ...\n",
+      "352195\n",
+      "1600306001288\n",
+      "       3,994,656 bytes allocated in the heap\n",
+      "              64 bytes copied during GC\n",
+      "         223,184 bytes maximum residency (1 sample(s))\n",
+      "         124,976 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0004s    0.0004s\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.004s  (  0.004s elapsed)\n",
+      "  GC      time    0.000s  (  0.000s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.009s  (  0.007s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,117,434,116 bytes per MUT second\n",
+      "\n",
+      "  Productivity  38.0% of total user, 50.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent07)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent07' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent07' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent07' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent07/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent07/build/advent07/advent07-tmp/Main.dyn_o ) [Data.List.Split changed]\n",
+      "\n",
+      "\u001b[;1madvent07/Main.hs:12:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: [Int] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m12 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m = bestFuel loss1\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent07/Main.hs:13:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part2 :: [Int] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m13 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m = bestFuel loss2\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent07/build/advent07/advent07 ...\n",
+      "336721\n",
+      "91638945\n",
+      "       9,374,760 bytes allocated in the heap\n",
+      "         532,856 bytes copied during GC\n",
+      "         318,896 bytes maximum residency (2 sample(s))\n",
+      "         135,760 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         1 colls,     1 par    0.001s   0.000s     0.0002s    0.0002s\n",
+      "  Gen  1         2 colls,     1 par    0.002s   0.001s     0.0003s    0.0004s\n",
+      "\n",
+      "  Parallel GC work balance: 55.07% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.009s  (  0.009s elapsed)\n",
+      "  GC      time    0.002s  (  0.001s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.017s  (  0.012s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,025,488,891 bytes per MUT second\n",
+      "\n",
+      "  Productivity  53.8% of total user, 70.2% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent08)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent08' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent08' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent08' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent08/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent08/build/advent08/advent08-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent08/Main.hs:99:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      displaysP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                     Data.Text.Internal.Text [Display]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m99 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mdisplaysP\u001b[0m\u001b[0m = displayP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent08/Main.hs:100:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      displayP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text Display\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m100 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mdisplayP\u001b[0m\u001b[0m = Display <$> (patternsP <* \" | \") <*> patternsP\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent08/Main.hs:102:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      patternsP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                     Data.Text.Internal.Text [[Char]]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m102 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpatternsP\u001b[0m\u001b[0m = patternP `sepBy` \" \"\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent08/Main.hs:103:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      patternP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text [Char]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m103 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpatternP\u001b[0m\u001b[0m = many1 letter\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent08/Main.hs:106:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Display]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m106 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent08/build/advent08/advent08 ...\n",
+      "255\n",
+      "982158\n",
+      "   3,831,978,128 bytes allocated in the heap\n",
+      "      41,889,816 bytes copied during GC\n",
+      "       2,251,264 bytes maximum residency (19 sample(s))\n",
+      "         162,616 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       906 colls,   906 par    0.240s   0.062s     0.0001s    0.0012s\n",
+      "  Gen  1        19 colls,    18 par    0.078s   0.031s     0.0016s    0.0025s\n",
+      "\n",
+      "  Parallel GC work balance: 32.00% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    1.966s  (  1.771s elapsed)\n",
+      "  GC      time    0.304s  (  0.080s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.014s  (  0.014s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    2.290s  (  1.868s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,949,274,255 bytes per MUT second\n",
+      "\n",
+      "  Productivity  86.5% of total user, 95.5% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent09)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent09' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent09' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent09' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent09/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent09/build/advent09/advent09-tmp/Main.dyn_o ) [Linear changed]\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent09/build/advent09/advent09 ...\n",
+      "15\n",
+      "1134\n",
+      "         632,576 bytes allocated in the heap\n",
+      "              64 bytes copied during GC\n",
+      "         223,184 bytes maximum residency (1 sample(s))\n",
+      "         124,976 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0003s    0.0003s\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.001s  (  0.001s elapsed)\n",
+      "  GC      time    0.000s  (  0.000s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.007s  (  0.004s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,193,744,586 bytes per MUT second\n",
+      "\n",
+      "  Productivity   8.1% of total user, 14.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent10)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent10' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent10' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent10' for advent-of-code21-0.1.0.0..\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent10/build/advent10/advent10 ...\n",
+      "339537\n",
+      "2412013412\n",
+      "       3,868,496 bytes allocated in the heap\n",
+      "              64 bytes copied during GC\n",
+      "         223,184 bytes maximum residency (1 sample(s))\n",
+      "         124,976 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0003s    0.0003s\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.003s  (  0.003s elapsed)\n",
+      "  GC      time    0.000s  (  0.000s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.009s  (  0.006s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,516,570,168 bytes per MUT second\n",
+      "\n",
+      "  Productivity  29.7% of total user, 42.9% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent11)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent11' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent11' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent11' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent11/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent11/build/advent11/advent11-tmp/Main.dyn_o ) [Linear changed]\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent11/build/advent11/advent11 ...\n",
+      "1627\n",
+      "329\n",
+      "      54,909,424 bytes allocated in the heap\n",
+      "       1,785,512 bytes copied during GC\n",
+      "         268,416 bytes maximum residency (2 sample(s))\n",
+      "         141,184 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0        12 colls,    12 par    0.005s   0.002s     0.0001s    0.0002s\n",
+      "  Gen  1         2 colls,     1 par    0.002s   0.001s     0.0003s    0.0004s\n",
+      "\n",
+      "  Parallel GC work balance: 20.48% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.031s  (  0.028s elapsed)\n",
+      "  GC      time    0.006s  (  0.002s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.044s  (  0.034s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,758,386,456 bytes per MUT second\n",
+      "\n",
+      "  Productivity  71.4% of total user, 83.2% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent12)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent12' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent12' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent12' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent12/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent12/build/advent12/advent12-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent12/Main.hs:85:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      graphP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text [([Char], [Char])]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m85 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgraphP\u001b[0m\u001b[0m = edgeP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent12/Main.hs:86:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      edgeP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text ([Char], [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m86 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35medgeP\u001b[0m\u001b[0m = (,) <$> many1 letter <* \"-\" <*> many1 letter\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent12/Main.hs:89:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [([Char], [Char])]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m89 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent12/build/advent12/advent12 ...\n",
+      "4495\n",
+      "131254\n",
+      "   1,018,073,152 bytes allocated in the heap\n",
+      "     457,994,984 bytes copied during GC\n",
+      "      38,962,240 bytes maximum residency (19 sample(s))\n",
+      "         366,016 bytes maximum slop\n",
+      "             129 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       227 colls,   227 par    0.234s   0.181s     0.0008s    0.0049s\n",
+      "  Gen  1        19 colls,    18 par    1.223s   0.291s     0.0153s    0.0553s\n",
+      "\n",
+      "  Parallel GC work balance: 57.92% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    1.524s  (  1.436s elapsed)\n",
+      "  GC      time    1.323s  (  0.338s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.135s  (  0.134s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    2.987s  (  1.911s elapsed)\n",
+      "\n",
+      "  Alloc rate    668,225,062 bytes per MUT second\n",
+      "\n",
+      "  Productivity  55.5% of total user, 82.1% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent13)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent13' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent13' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent13' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent13/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent13/build/advent13/advent13-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:11:24: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘^+^’ from module ‘Linear’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m11 |\u001b[0m\u001b[0m import Linear (V2(..), \u001b[;1m\u001b[35m(^+^)\u001b[0m\u001b[0m)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                        ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:66:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      inputP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text (S.Set (V2 Int), [Fold])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m66 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35minputP\u001b[0m\u001b[0m = (,) <$> sheetP <* many1 endOfLine <*> foldsP\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:68:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      sheetP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text (S.Set (V2 Int))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m68 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msheetP\u001b[0m\u001b[0m = S.fromList <$> dotP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:69:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      dotP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                Data.Text.Internal.Text (V2 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m69 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mdotP\u001b[0m\u001b[0m = V2 <$> decimal <* \",\" <*> decimal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:71:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      foldsP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text [Fold]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m71 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mfoldsP\u001b[0m\u001b[0m = foldP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:72:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      foldP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Fold\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m72 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mfoldP\u001b[0m\u001b[0m = Fold <$> (\"fold along \" *> axisP) <* \"=\" <*> decimal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:74:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      axisP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Axis\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35maxisP\u001b[0m\u001b[0m = (\"x\" *> pure X) <|> (\"y\" *> pure Y)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent13/Main.hs:77:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text\n",
+      "                         -> (S.Set (V2 Int), [Fold])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m77 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent13/build/advent13/advent13 ...\n",
+      "763\n",
+      "███  █  █  ██  █    ███   ██  ███   ██ \n",
+      "█  █ █  █ █  █ █    █  █ █  █ █  █ █  █\n",
+      "█  █ ████ █  █ █    █  █ █    █  █ █  █\n",
+      "███  █  █ ████ █    ███  █    ███  ████\n",
+      "█ █  █  █ █  █ █    █ █  █  █ █ █  █  █\n",
+      "█  █ █  █ █  █ ████ █  █  ██  █  █ █  █\n",
+      "\n",
+      "       6,531,504 bytes allocated in the heap\n",
+      "         354,392 bytes copied during GC\n",
+      "         214,088 bytes maximum residency (1 sample(s))\n",
+      "         125,880 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         1 colls,     1 par    0.001s   0.000s     0.0002s    0.0002s\n",
+      "  Gen  1         1 colls,     0 par    0.000s   0.000s     0.0003s    0.0003s\n",
+      "\n",
+      "  Parallel GC work balance: 31.97% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.006s  (  0.006s elapsed)\n",
+      "  GC      time    0.001s  (  0.001s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.013s  (  0.009s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,104,134,445 bytes per MUT second\n",
+      "\n",
+      "  Productivity  46.5% of total user, 62.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent14)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent14' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent14' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent14' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent14/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent14/build/advent14/advent14-tmp/Main.dyn_o ) [Data.MultiSet changed]\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘Control.Applicative’ is redundant\n",
+      "      except perhaps to import instances from ‘Control.Applicative’\n",
+      "    To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:67:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-local-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘elems’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35melems\u001b[0m\u001b[0m = S.union (MS.toSet firsts) (MS.toSet seconds)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:73:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      stringify :: (a, a) -> [a]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m73 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mstringify\u001b[0m\u001b[0m (a, b) = [a, b]\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:81:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      inputP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text ([Char], M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m81 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35minputP\u001b[0m\u001b[0m = (,) <$> (many1 letter) <* many1 endOfLine <*> rulesP\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:83:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      rulesP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text (M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m83 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrulesP\u001b[0m\u001b[0m = M.fromList <$> ruleP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:84:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      ruleP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text ([Char], [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m84 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mruleP\u001b[0m\u001b[0m = (,) <$> many1 letter <* \" -> \" <*> many1 letter\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:87:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text\n",
+      "                         -> ([Char], M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m87 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent14/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent14/build/advent14/advent14-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:7:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘Control.Applicative’ is redundant\n",
+      "      except perhaps to import instances from ‘Control.Applicative’\n",
+      "    To import instances alone, use: import Control.Applicative()\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m7 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Control.Applicative\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:67:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-local-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘elems’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35melems\u001b[0m\u001b[0m = S.union (MS.toSet firsts) (MS.toSet seconds)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:73:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      stringify :: (a, a) -> [a]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m73 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mstringify\u001b[0m\u001b[0m (a, b) = [a, b]\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:81:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      inputP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text ([Char], M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m81 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35minputP\u001b[0m\u001b[0m = (,) <$> (many1 letter) <* many1 endOfLine <*> rulesP\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:83:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      rulesP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                  Data.Text.Internal.Text (M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m83 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrulesP\u001b[0m\u001b[0m = M.fromList <$> ruleP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:84:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      ruleP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text ([Char], [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m84 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mruleP\u001b[0m\u001b[0m = (,) <$> many1 letter <* \" -> \" <*> many1 letter\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent14/Main.hs:87:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text\n",
+      "                         -> ([Char], M.Map [Char] [Char])\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m87 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent14/build/advent14/advent14 ...\n",
+      "2712\n",
+      "8336623059567\n",
+      "      23,386,192 bytes allocated in the heap\n",
+      "         469,768 bytes copied during GC\n",
+      "         265,168 bytes maximum residency (2 sample(s))\n",
+      "         140,336 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         4 colls,     4 par    0.002s   0.000s     0.0001s    0.0002s\n",
+      "  Gen  1         2 colls,     1 par    0.002s   0.001s     0.0003s    0.0003s\n",
+      "\n",
+      "  Parallel GC work balance: 57.81% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.014s  (  0.012s elapsed)\n",
+      "  GC      time    0.003s  (  0.001s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.023s  (  0.016s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,717,613,851 bytes per MUT second\n",
+      "\n",
+      "  Productivity  60.5% of total user, 75.8% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent15)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent15' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent15' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent15' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent15/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent15/build/advent15/advent15-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:10:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘<|, ><’ from module ‘Data.Sequence’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m10 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.Sequence ((<|), (|>), (><))\u001b[0m\u001b[0m --, ViewR( (:>) ), ViewL( (:<) ))\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:11:31: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘sum’ from module ‘Data.Foldable’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m11 |\u001b[0m\u001b[0m import Data.Foldable (foldl', \u001b[;1m\u001b[35msum\u001b[0m\u001b[0m) -- (toList, foldr', foldl', all)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                               ^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:16:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘*^, ^*’ from module ‘Linear’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m16 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Linear (V2(..), (^+^), (^-^), (*^), (^*))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘Empty’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern Main.Empty :: forall {a}. Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:<’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:<) :: forall {a}. a -> Q.Seq a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:21:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:>’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m21 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:21:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:>) :: forall {a}. Q.Seq a -> a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m21 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:34:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘grid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m34 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Cave\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:34:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘goal’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m34 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Cave\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:44:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘cost’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m44 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m                       \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:51:5: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘unwrapPos’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m51 |\u001b[0m\u001b[0m     \u001b[;1m\u001b[35munwrapPos :: s -> BasePosition\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:67:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:78:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m78 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:84:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m84 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:88:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m88 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:99:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m99 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:114:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m114 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:120:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m120 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:124:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m124 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:129:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘cost’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:44:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m129 |\u001b[0m\u001b[0m        let !\u001b[;1m\u001b[35mcost\u001b[0m\u001b[0m = (gridCost - 1 + tileR + tileC) `mod` 9 + 1\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m             ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:151:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m151 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m = listArray ((V2 0 0), (V2 r c)) $ map mkCell $ concat rows\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:207:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m207 |\u001b[0m\u001b[0m        \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:207:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘grid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m207 |\u001b[0m\u001b[0m        \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent15/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent15/build/advent15/advent15-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:10:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘<|, ><’ from module ‘Data.Sequence’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m10 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Data.Sequence ((<|), (|>), (><))\u001b[0m\u001b[0m --, ViewR( (:>) ), ViewL( (:<) ))\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:11:31: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘sum’ from module ‘Data.Foldable’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m11 |\u001b[0m\u001b[0m import Data.Foldable (foldl', \u001b[;1m\u001b[35msum\u001b[0m\u001b[0m) -- (toList, foldr', foldl', all)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                               ^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:16:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘*^, ^*’ from module ‘Linear’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m16 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Linear (V2(..), (^+^), (^-^), (*^), (^*))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘Empty’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern Main.Empty :: forall {a}. Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:<’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:<) :: forall {a}. a -> Q.Seq a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:21:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:>’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m21 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:21:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:>) :: forall {a}. Q.Seq a -> a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m21 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:34:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘grid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m34 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Cave\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:34:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘goal’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m34 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Cave\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:44:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘cost’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m44 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmakeLenses ''Agendum\u001b[0m\u001b[0m                       \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:51:5: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘unwrapPos’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m51 |\u001b[0m\u001b[0m     \u001b[;1m\u001b[35munwrapPos :: s -> BasePosition\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:67:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m67 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:78:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m78 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:84:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m84 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:88:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m88 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:99:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m99 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:114:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m114 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:120:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘goal’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m120 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgoal\u001b[0m\u001b[0m <- asks _goal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:124:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m124 |\u001b[0m\u001b[0m     do \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:129:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘cost’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:44:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m129 |\u001b[0m\u001b[0m        let !\u001b[;1m\u001b[35mcost\u001b[0m\u001b[0m = (gridCost - 1 + tileR + tileC) `mod` 9 + 1\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m             ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:151:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m151 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m = listArray ((V2 0 0), (V2 r c)) $ map mkCell $ concat rows\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:207:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘grid’ shadows the existing binding\n",
+      "      defined at advent15/Main.hs:34:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m207 |\u001b[0m\u001b[0m        \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent15/Main.hs:207:8: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘grid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m207 |\u001b[0m\u001b[0m        \u001b[;1m\u001b[35mgrid\u001b[0m\u001b[0m <- asks _grid\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m        ^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent15/build/advent15/advent15 ...\n",
+      "503\n",
+      "2853\n",
+      "   3,777,538,616 bytes allocated in the heap\n",
+      "     924,751,680 bytes copied during GC\n",
+      "      28,278,080 bytes maximum residency (39 sample(s))\n",
+      "         904,040 bytes maximum slop\n",
+      "             111 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       873 colls,   873 par    0.879s   0.676s     0.0008s    0.0016s\n",
+      "  Gen  1        39 colls,    38 par    1.118s   0.304s     0.0078s    0.0202s\n",
+      "\n",
+      "  Parallel GC work balance: 39.64% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    3.163s  (  2.865s elapsed)\n",
+      "  GC      time    1.823s  (  0.808s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.173s  (  0.172s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    5.165s  (  3.848s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,194,300,602 bytes per MUT second\n",
+      "\n",
+      "  Productivity  64.6% of total user, 78.9% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent16)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent16' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent16' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent16' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent16/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent16/build/advent16/advent16-tmp/Main.dyn_o ) [Data.Bitstream changed]\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:58:38: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral n0)\n",
+      "          arising from a use of ‘BS.take’ at advent16/Main.hs:58:38-44\n",
+      "        (Num n0) arising from the literal ‘1’ at advent16/Main.hs:58:46\n",
+      "    • In the second argument of ‘($)’, namely ‘BS.take 1 bs’\n",
+      "      In the second argument of ‘($)’, namely ‘BS.unpack $ BS.take 1 bs’\n",
+      "      In the expression: head $ BS.unpack $ BS.take 1 bs\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m       let value = head $ BS.unpack $ \u001b[;1m\u001b[35mBS.take\u001b[0m\u001b[0m 1 bs\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                      ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:59:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral n0)\n",
+      "          arising from a use of ‘BS.drop’ at advent16/Main.hs:59:13-19\n",
+      "        (Num n0) arising from the literal ‘1’ at advent16/Main.hs:59:21\n",
+      "    • In the second argument of ‘($)’, namely ‘BS.drop 1 bs’\n",
+      "      In a stmt of a 'do' block: _ <- put $ BS.drop 1 bs\n",
+      "      In the expression:\n",
+      "        do bs <- get\n",
+      "           let value = head $ BS.unpack $ BS.take 1 bs\n",
+      "           put $ BS.drop 1 bs\n",
+      "           return value\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m       put $ \u001b[;1m\u001b[35mBS.drop\u001b[0m\u001b[0m 1 bs\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m             ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:123:29: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a case alternative:\n",
+      "        Patterns of type ‘Integer’ not matched:\n",
+      "            p where p is not one of {7, 6, 5, ...}\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m mkOperator pType contents = \u001b[;1m\u001b[35mcase pType of\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                             ^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent16/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent16/build/advent16/advent16-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:58:38: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral n0)\n",
+      "          arising from a use of ‘BS.take’ at advent16/Main.hs:58:38-44\n",
+      "        (Num n0) arising from the literal ‘1’ at advent16/Main.hs:58:46\n",
+      "    • In the second argument of ‘($)’, namely ‘BS.take 1 bs’\n",
+      "      In the second argument of ‘($)’, namely ‘BS.unpack $ BS.take 1 bs’\n",
+      "      In the expression: head $ BS.unpack $ BS.take 1 bs\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m58 |\u001b[0m\u001b[0m       let value = head $ BS.unpack $ \u001b[;1m\u001b[35mBS.take\u001b[0m\u001b[0m 1 bs\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                      ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:59:13: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral n0)\n",
+      "          arising from a use of ‘BS.drop’ at advent16/Main.hs:59:13-19\n",
+      "        (Num n0) arising from the literal ‘1’ at advent16/Main.hs:59:21\n",
+      "    • In the second argument of ‘($)’, namely ‘BS.drop 1 bs’\n",
+      "      In a stmt of a 'do' block: _ <- put $ BS.drop 1 bs\n",
+      "      In the expression:\n",
+      "        do bs <- get\n",
+      "           let value = head $ BS.unpack $ BS.take 1 bs\n",
+      "           put $ BS.drop 1 bs\n",
+      "           return value\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m       put $ \u001b[;1m\u001b[35mBS.drop\u001b[0m\u001b[0m 1 bs\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m             ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent16/Main.hs:123:29: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a case alternative:\n",
+      "        Patterns of type ‘Integer’ not matched:\n",
+      "            p where p is not one of {7, 6, 5, ...}\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m123 |\u001b[0m\u001b[0m mkOperator pType contents = \u001b[;1m\u001b[35mcase pType of\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                             ^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent16/build/advent16/advent16 ...\n",
+      "852\n",
+      "19348959966392\n",
+      "      13,136,984 bytes allocated in the heap\n",
+      "         719,248 bytes copied during GC\n",
+      "         995,112 bytes maximum residency (2 sample(s))\n",
+      "         217,304 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0         2 colls,     2 par    0.001s   0.001s     0.0003s    0.0003s\n",
+      "  Gen  1         2 colls,     1 par    0.003s   0.001s     0.0005s    0.0006s\n",
+      "\n",
+      "  Parallel GC work balance: 40.78% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.003s elapsed)\n",
+      "  MUT     time    0.012s  (  0.011s elapsed)\n",
+      "  GC      time    0.004s  (  0.002s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.023s  (  0.016s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,086,681,415 bytes per MUT second\n",
+      "\n",
+      "  Productivity  52.3% of total user, 68.8% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent17)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent17' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent17' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent17' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent17/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent17/build/advent17/advent17-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent17/Main.hs:8:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-imports\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    The import of ‘_x, _y’ from module ‘Linear’ is redundant\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m8 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mimport Linear (V2(..), (^+^), _x, _y)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m  |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent17/Main.hs:63:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      targetP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text (V2 Int, V2 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m63 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mtargetP\u001b[0m\u001b[0m = boundify <$> (\"target area: x=\" *> regionP) <*> (\", y=\" *> regionP)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent17/Main.hs:66:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      regionP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text (Int, Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m66 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mregionP\u001b[0m\u001b[0m = (,) <$> (signed decimal <* \"..\") <*> signed decimal\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent17/Main.hs:69:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> (V2 Int, V2 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m69 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent17/build/advent17/advent17 ...\n",
+      "5995\n",
+      "3202\n",
+      "     142,847,576 bytes allocated in the heap\n",
+      "      15,235,936 bytes copied during GC\n",
+      "         264,784 bytes maximum residency (5 sample(s))\n",
+      "         133,288 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0        30 colls,    30 par    0.014s   0.007s     0.0002s    0.0020s\n",
+      "  Gen  1         5 colls,     4 par    0.005s   0.001s     0.0002s    0.0003s\n",
+      "\n",
+      "  Parallel GC work balance: 4.59% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.052s  (  0.045s elapsed)\n",
+      "  GC      time    0.019s  (  0.009s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.000s  (  0.000s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.077s  (  0.057s elapsed)\n",
+      "\n",
+      "  Alloc rate    2,728,607,274 bytes per MUT second\n",
+      "\n",
+      "  Productivity  68.0% of total user, 78.6% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent18)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent18' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent18' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent18' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent18/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent18/build/advent18/advent18-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:33:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: [Tree] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m33 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m numbers = magnitude total\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:36:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      part2 :: (Foldable t, Monad t) => t Tree -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m36 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m numbers = maximum [ magnitude $ snailAdd a b \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:45:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘left’:\n",
+      "        Patterns of type ‘(Tree, Cxt)’ not matched:\n",
+      "            ((Leaf _), Top)\n",
+      "            ((Leaf _), (L _ _))\n",
+      "            ((Leaf _), (R _ _))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m45 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mleft (Pair l r, c) = (l, L c r)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:48:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘right’:\n",
+      "        Patterns of type ‘(Tree, Cxt)’ not matched:\n",
+      "            ((Leaf _), Top)\n",
+      "            ((Leaf _), (L _ _))\n",
+      "            ((Leaf _), (R _ _))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m48 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mright (Pair l r, c) = (r, R l c)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:59:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘t’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m59 |\u001b[0m\u001b[0m upmost l@(\u001b[;1m\u001b[35mt\u001b[0m\u001b[0m, Top) = l\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m           ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:74:5: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a pattern binding:\n",
+      "        Patterns of type ‘Loc’ not matched:\n",
+      "            ((Leaf _), Top)\n",
+      "            ((Leaf _), (L _ _))\n",
+      "            ((Leaf _), (R _ _))\n",
+      "            ((Pair (Pair _ _) (Pair _ _)), Top)\n",
+      "            ...\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m74 |\u001b[0m\u001b[0m     \u001b[;1m\u001b[35m((Pair (Leaf nl) (Leaf nr)), _) = p0\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:77:39: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a lambda abstraction:\n",
+      "        Patterns of type ‘Tree’ not matched: Pair _ _\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m77 |\u001b[0m\u001b[0m       Just leftReg -> modify leftReg (\u001b[;1m\u001b[35m\\(Leaf n) -> Leaf (n + nl)\u001b[0m\u001b[0m)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:80:41: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a lambda abstraction:\n",
+      "        Patterns of type ‘Tree’ not matched: Pair _ _\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m80 |\u001b[0m\u001b[0m       Just rightReg -> modify rightReg (\u001b[;1m\u001b[35m\\(Leaf n) -> Leaf (n + nr)\u001b[0m\u001b[0m)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:97:25: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘c’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m97 |\u001b[0m\u001b[0m rightmostOnLeft t@(_, L \u001b[;1m\u001b[35mc\u001b[0m\u001b[0m r) = rightmostOnLeft $ up t\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                         ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:97:27: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘r’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m97 |\u001b[0m\u001b[0m rightmostOnLeft t@(_, L c \u001b[;1m\u001b[35mr\u001b[0m\u001b[0m) = rightmostOnLeft $ up t\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                           ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:98:25: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘l’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m98 |\u001b[0m\u001b[0m rightmostOnLeft t@(_, R \u001b[;1m\u001b[35ml\u001b[0m\u001b[0m c) = Just $ rightmostNum $ left $ up t\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                         ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:98:27: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘c’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m98 |\u001b[0m\u001b[0m rightmostOnLeft t@(_, R l \u001b[;1m\u001b[35mc\u001b[0m\u001b[0m) = Just $ rightmostNum $ left $ up t\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                           ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:106:25: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘l’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m106 |\u001b[0m\u001b[0m leftmostOnRight t@(_, R \u001b[;1m\u001b[35ml\u001b[0m\u001b[0m c) = leftmostOnRight $ up t\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                         ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:106:27: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘c’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m106 |\u001b[0m\u001b[0m leftmostOnRight t@(_, R l \u001b[;1m\u001b[35mc\u001b[0m\u001b[0m) = leftmostOnRight $ up t\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                           ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:107:25: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘c’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m107 |\u001b[0m\u001b[0m leftmostOnRight t@(_, L \u001b[;1m\u001b[35mc\u001b[0m\u001b[0m r) = Just $ leftmostNum $ right $ up t\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                         ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:107:27: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-matches\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘r’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m107 |\u001b[0m\u001b[0m leftmostOnRight t@(_, L c \u001b[;1m\u001b[35mr\u001b[0m\u001b[0m) = Just $ leftmostNum $ right $ up t\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                           ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:121:5: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a pattern binding:\n",
+      "        Patterns of type ‘Loc’ not matched:\n",
+      "            ((Pair _ _), Top)\n",
+      "            ((Pair _ _), (L _ _))\n",
+      "            ((Pair _ _), (R _ _))\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m121 |\u001b[0m\u001b[0m     \u001b[;1m\u001b[35m((Leaf sn), _) = n0\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m     ^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:147:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      sfNumbersP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                      Data.Text.Internal.Text [Tree]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m147 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msfNumbersP\u001b[0m\u001b[0m = sfNumberP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:149:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      sfNumberP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                     Data.Text.Internal.Text Tree\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m149 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msfNumberP\u001b[0m\u001b[0m = regularP <|> pairP\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:151:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      regularP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text Tree\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m151 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mregularP\u001b[0m\u001b[0m = Leaf <$> decimal\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:152:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      pairP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Tree\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m152 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpairP\u001b[0m\u001b[0m = Pair <$> (\"[\" *> sfNumberP) <*> (\",\" *> sfNumberP) <* \"]\"\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent18/Main.hs:155:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Tree]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m155 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent18/build/advent18/advent18 ...\n",
+      "2501\n",
+      "4935\n",
+      "     985,731,848 bytes allocated in the heap\n",
+      "       4,292,096 bytes copied during GC\n",
+      "         362,792 bytes maximum residency (6 sample(s))\n",
+      "         136,920 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       231 colls,   231 par    0.062s   0.018s     0.0001s    0.0022s\n",
+      "  Gen  1         6 colls,     5 par    0.008s   0.002s     0.0004s    0.0006s\n",
+      "\n",
+      "  Parallel GC work balance: 27.31% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    0.521s  (  0.471s elapsed)\n",
+      "  GC      time    0.069s  (  0.019s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.001s  (  0.001s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    0.597s  (  0.494s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,892,803,172 bytes per MUT second\n",
+      "\n",
+      "  Productivity  87.4% of total user, 95.5% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent19)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent19' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent19' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent19' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent19/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent19/build/advent19/advent19-tmp/Main.dyn_o ) [Data.MultiSet changed]\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:40:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Worphans\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Orphan instance: instance Show Transform\n",
+      "    To avoid this\n",
+      "        move the instance declaration to the module of the class or of the type, or\n",
+      "        wrap the type with a newtype and declare the instance on the new type.\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m40 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35minstance Show Transform where\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:44:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: nullTrans :: Endo a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m44 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mnullTrans\u001b[0m\u001b[0m = Endo id\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:45:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: rotX :: Endo (V3 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m45 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrotX\u001b[0m\u001b[0m = Endo \\(V3 x y z) -> V3    x (- z)   y\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:46:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: rotY :: Endo (V3 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m46 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrotY\u001b[0m\u001b[0m = Endo \\(V3 x y z) -> V3    z    y (- x)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:47:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: rotZ :: Endo (V3 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m47 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mrotZ\u001b[0m\u001b[0m = Endo \\(V3 x y z) -> V3 (- y)   x    z\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:48:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      translate :: (Linear.Vector.Additive f, Num a) => f a -> Endo (f a)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m48 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mtranslate\u001b[0m\u001b[0m v = Endo (v ^+^)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:79:30: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral b0) arising from a use of ‘^’ at advent19/Main.hs:79:30\n",
+      "        (Num b0) arising from the literal ‘2’ at advent19/Main.hs:79:31\n",
+      "    • In the first argument of ‘(+)’, namely ‘x ^ 2’\n",
+      "      In the first argument of ‘(+)’, namely ‘x ^ 2 + y ^ 2’\n",
+      "      In the expression: x ^ 2 + y ^ 2 + z ^ 2\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m79 |\u001b[0m\u001b[0m   where pythag (V3 x y z) = x\u001b[;1m\u001b[35m^\u001b[0m\u001b[0m2 + y^2 + z^2\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                              ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:79:36: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral b0) arising from a use of ‘^’ at advent19/Main.hs:79:36\n",
+      "        (Num b0) arising from the literal ‘2’ at advent19/Main.hs:79:37\n",
+      "    • In the second argument of ‘(+)’, namely ‘y ^ 2’\n",
+      "      In the first argument of ‘(+)’, namely ‘x ^ 2 + y ^ 2’\n",
+      "      In the expression: x ^ 2 + y ^ 2 + z ^ 2\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m79 |\u001b[0m\u001b[0m   where pythag (V3 x y z) = x^2 + y\u001b[;1m\u001b[35m^\u001b[0m\u001b[0m2 + z^2\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                    ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:79:42: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wtype-defaults\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    • Defaulting the following constraints to type ‘Integer’\n",
+      "        (Integral b0) arising from a use of ‘^’ at advent19/Main.hs:79:42\n",
+      "        (Num b0) arising from the literal ‘2’ at advent19/Main.hs:79:43\n",
+      "    • In the second argument of ‘(+)’, namely ‘z ^ 2’\n",
+      "      In the expression: x ^ 2 + y ^ 2 + z ^ 2\n",
+      "      In an equation for ‘pythag’:\n",
+      "          pythag (V3 x y z) = x ^ 2 + y ^ 2 + z ^ 2\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m79 |\u001b[0m\u001b[0m   where pythag (V3 x y z) = x^2 + y^2 + z\u001b[;1m\u001b[35m^\u001b[0m\u001b[0m2\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                                          ^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:103:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘mkReconstruction’:\n",
+      "        Patterns of type ‘[Scanner]’ not matched: []\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m103 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mmkReconstruction (s:ss) = Reconstruction {found = [], working = [s], waiting = ss}\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:117:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a pattern binding: Patterns of type ‘[Scanner]’ not matched: []\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m117 |\u001b[0m\u001b[0m   where \u001b[;1m\u001b[35m(current:workers) = working\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:132:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      scannersP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                     Data.Text.Internal.Text [Scanner]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m132 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mscannersP\u001b[0m\u001b[0m = scannerP `sepBy` blankLines\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:133:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      scannerP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text Scanner\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m133 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mscannerP\u001b[0m\u001b[0m = scannerify <$> nameP <*> beaconsP\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:142:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      nameP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m142 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mnameP\u001b[0m\u001b[0m = (\"--- scanner \" *>) decimal <* \" ---\" <* endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:144:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      beaconsP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text [V3 Int]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m144 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbeaconsP\u001b[0m\u001b[0m = beaconP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:145:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      beaconP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text (V3 Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m145 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mbeaconP\u001b[0m\u001b[0m = V3 <$> (signed decimal <* \",\") <*> (signed decimal <* \",\") <*> (signed decimal)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:147:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      blankLines :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                      Data.Text.Internal.Text [()]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m147 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mblankLines\u001b[0m\u001b[0m = many1 endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent19/Main.hs:150:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Scanner]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m150 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent19/build/advent19/advent19 ...\n",
+      "355\n",
+      "10842\n",
+      "   4,266,547,304 bytes allocated in the heap\n",
+      "      79,835,392 bytes copied during GC\n",
+      "       1,228,664 bytes maximum residency (61 sample(s))\n",
+      "         175,576 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       967 colls,   967 par    0.296s   0.075s     0.0001s    0.0015s\n",
+      "  Gen  1        61 colls,    60 par    0.177s   0.055s     0.0009s    0.0012s\n",
+      "\n",
+      "  Parallel GC work balance: 66.48% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    6.359s  (  6.048s elapsed)\n",
+      "  GC      time    0.443s  (  0.100s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.030s  (  0.029s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    6.838s  (  6.181s elapsed)\n",
+      "\n",
+      "  Alloc rate    670,893,811 bytes per MUT second\n",
+      "\n",
+      "  Productivity  93.4% of total user, 98.3% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent20)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent20' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent20' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent20' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent20/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent20/build/advent20/advent20-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent20/Main.hs:36:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      part1 :: Enhancement -> Image -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m36 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m enhancement image = fst $ evalRWS (enhanceImage 2) enhancement image\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent20/Main.hs:38:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      part2 :: Enhancement -> Image -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m38 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m enhancement image = fst $ evalRWS (enhanceImage 50) enhancement image\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent20/Main.hs:60:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘showImage’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m60 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowImage\u001b[0m\u001b[0m image = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent20/build/advent20/advent20 ...\n",
+      "5225\n",
+      "18131\n",
+      "   4,967,912,192 bytes allocated in the heap\n",
+      "   6,829,295,704 bytes copied during GC\n",
+      "     196,918,408 bytes maximum residency (55 sample(s))\n",
+      "       2,929,528 bytes maximum slop\n",
+      "             486 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0      1148 colls,  1148 par    2.151s   1.658s     0.0014s    0.0090s\n",
+      "  Gen  1        55 colls,    54 par    9.083s   3.698s     0.0672s    0.1647s\n",
+      "\n",
+      "  Parallel GC work balance: 44.36% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    5.140s  (  4.701s elapsed)\n",
+      "  GC      time    9.075s  (  3.216s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    2.159s  (  2.141s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time   16.380s  ( 10.061s elapsed)\n",
+      "\n",
+      "  Alloc rate    966,567,938 bytes per MUT second\n",
+      "\n",
+      "  Productivity  44.6% of total user, 68.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent21)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent21' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent21' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent21' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent21/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent21/build/advent21/advent21-tmp/Main.dyn_o ) [Data.MultiSet changed]\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:45:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: Game -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m45 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m game = scoreGame finalGame\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:49:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part2 :: Game -> MS.Occur\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m49 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m game = max (Player1 `MS.occur` winners) (Player2 `MS.occur` winners)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:116:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      playerP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text Player\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m116 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mplayerP\u001b[0m\u001b[0m = (\"1\" *> pure Player1) <|> (\"2\" *> pure Player2)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:118:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      playerStateP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                        Data.Text.Internal.Text (Player, PlayerState)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m118 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mplayerStateP\u001b[0m\u001b[0m = playerify <$> (\"Player \" *> playerP) <*> (\" starting position: \" *> decimal)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:121:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      gameP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Game\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m121 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgameP\u001b[0m\u001b[0m = gamify <$> playerStateP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:126:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> Game\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m126 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent21/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent21/build/advent21/advent21-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:45:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: Game -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m45 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m game = scoreGame finalGame\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:49:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part2 :: Game -> MS.Occur\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m49 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m game = max (Player1 `MS.occur` winners) (Player2 `MS.occur` winners)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:116:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      playerP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text Player\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m116 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mplayerP\u001b[0m\u001b[0m = (\"1\" *> pure Player1) <|> (\"2\" *> pure Player2)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:118:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      playerStateP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                        Data.Text.Internal.Text (Player, PlayerState)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m118 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mplayerStateP\u001b[0m\u001b[0m = playerify <$> (\"Player \" *> playerP) <*> (\" starting position: \" *> decimal)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:121:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      gameP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                 Data.Text.Internal.Text Game\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m121 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mgameP\u001b[0m\u001b[0m = gamify <$> playerStateP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent21/Main.hs:126:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> Game\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m126 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent21/build/advent21/advent21 ...\n",
+      "734820\n",
+      "193170338541590\n",
+      "   3,812,461,008 bytes allocated in the heap\n",
+      "     292,492,272 bytes copied during GC\n",
+      "       6,362,032 bytes maximum residency (38 sample(s))\n",
+      "         197,344 bytes maximum slop\n",
+      "              70 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       882 colls,   882 par    0.491s   0.277s     0.0003s    0.0021s\n",
+      "  Gen  1        38 colls,    37 par    0.589s   0.125s     0.0033s    0.0176s\n",
+      "\n",
+      "  Parallel GC work balance: 29.68% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    2.493s  (  2.275s elapsed)\n",
+      "  GC      time    1.041s  (  0.364s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.038s  (  0.038s elapsed)\n",
+      "  EXIT    time    0.003s  (  0.001s elapsed)\n",
+      "  Total   time    3.579s  (  2.681s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,529,157,497 bytes per MUT second\n",
+      "\n",
+      "  Productivity  70.7% of total user, 86.3% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent22)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent22' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent22' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent22' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent22/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent22/build/advent22/advent22-tmp/Main.dyn_o ) [Control.Lens changed]\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:33:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part1 :: [Cuboid] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m33 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart1\u001b[0m\u001b[0m cuboids = sweepX (filter isLocal cuboids)\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:34:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature: part2 :: [Cuboid] -> Int\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m34 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpart2\u001b[0m\u001b[0m cuboids = sweepX cuboids\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:87:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      cuboidsP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                    Data.Text.Internal.Text [Cuboid]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m87 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcuboidsP\u001b[0m\u001b[0m = timeify <$> cuboidP `sepBy` endOfLine\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:90:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      cuboidP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text Cuboid\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m90 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mcuboidP\u001b[0m\u001b[0m = cubify <$> (partiyP <* \" \") <*> (boundsP `sepBy` \",\")\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:98:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘vecify’:\n",
+      "        Patterns of type ‘[a]’ not matched:\n",
+      "            []\n",
+      "            [_]\n",
+      "            [_, _]\n",
+      "            (_:_:_:_:_)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m98 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mvecify [c1, c2, c3] = V3 c1 c2 c3\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:100:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      partiyP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text Parity\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m100 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpartiyP\u001b[0m\u001b[0m = (\"on\" *> pure On) <|> (\"off\" *> pure Off)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:102:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      boundsP :: Data.Attoparsec.Internal.Types.Parser\n",
+      "                   Data.Text.Internal.Text (Int, Int)\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m102 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mboundsP\u001b[0m\u001b[0m = (,) <$> ((\"x\" <|> \"y\" <|> \"z\") *> \"=\" *> signed decimal) <*> (\"..\" *> signed decimal)\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent22/Main.hs:105:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Top-level binding with no type signature:\n",
+      "      successfulParse :: Data.Text.Internal.Text -> [Cuboid]\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m105 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35msuccessfulParse\u001b[0m\u001b[0m input = \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent22/build/advent22/advent22 ...\n",
+      "545118\n",
+      "1227298136842375\n",
+      "   2,191,299,168 bytes allocated in the heap\n",
+      "      15,263,592 bytes copied during GC\n",
+      "         600,320 bytes maximum residency (16 sample(s))\n",
+      "         136,960 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       513 colls,   513 par    0.172s   0.051s     0.0001s    0.0044s\n",
+      "  Gen  1        16 colls,    15 par    0.025s   0.010s     0.0006s    0.0012s\n",
+      "\n",
+      "  Parallel GC work balance: 22.36% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time    1.635s  (  1.511s elapsed)\n",
+      "  GC      time    0.194s  (  0.058s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.003s  (  0.003s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    1.838s  (  1.575s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,340,478,006 bytes per MUT second\n",
+      "\n",
+      "  Productivity  89.1% of total user, 96.1% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent23)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent23' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent23' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent23' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent23/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent23/build/advent23/advent23-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:18:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘Empty’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m18 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:18:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern Main.Empty :: forall {a}. Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m18 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern Empty   <- (Q.viewl -> Q.EmptyL)  where Empty = Q.empty\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:<’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:19:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:<) :: forall {a}. a -> Q.Seq a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m19 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern x :< xs <- (Q.viewl -> x Q.:< xs) where (:<)  = (Q.<|)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: data constructor ‘:>’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:20:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wmissing-signatures\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern synonym with no type signature:\n",
+      "      pattern (:>) :: forall {a}. Q.Seq a -> a -> Q.Seq a\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m20 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mpattern xs :> x <- (Q.viewr -> xs Q.:> x) where (:>)  = (Q.|>)\u001b[0m\u001b[0m \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:253:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘hallRow’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:52:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m253 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mhallRow\u001b[0m\u001b[0m = S.findMin $ S.map (^. _r) halls\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:269:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘transits’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:43:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m269 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mtransits\u001b[0m\u001b[0m = S.delete here $ S.fromList $ [V2 hr c | c <- [cMin..cMax]] ++ [V2 r tc | r <- [hr..tr]]\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:284:11: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘transits’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:43:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m284 |\u001b[0m\u001b[0m           \u001b[;1m\u001b[35mtransits\u001b[0m\u001b[0m = S.delete here $ S.fromList $ [V2 r hc | r <- [tr..hr]] ++ [V2 tr c | c <- [cMin..cMax]]\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m           ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:288:17: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘hallRow’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:52:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m288 |\u001b[0m\u001b[0m mkRoomRoomRoute \u001b[;1m\u001b[35mhallRow\u001b[0m\u001b[0m rooms here routes =  M.foldrWithKey' (mkRoomRoomRoute1 hallRow here) routes rooms\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                 ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:292:18: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘hallRow’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:52:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m292 |\u001b[0m\u001b[0m mkRoomRoomRoute1 \u001b[;1m\u001b[35mhallRow\u001b[0m\u001b[0m here@(V2 hr hc) there@(V2 tr tc) entry routes \n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m                  ^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent23/Main.hs:305:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wname-shadowing\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    This binding for ‘transits’ shadows the existing binding\n",
+      "      defined at advent23/Main.hs:43:1\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m305 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mtransits\u001b[0m\u001b[0m = S.delete here $ S.unions [transitUp, transitAcross, transitDown]\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent23/build/advent23/advent23 ...\n",
+      "14460\n",
+      "41366\n",
+      "  57,573,004,072 bytes allocated in the heap\n",
+      "  12,620,236,792 bytes copied during GC\n",
+      "      46,724,816 bytes maximum residency (395 sample(s))\n",
+      "         538,976 bytes maximum slop\n",
+      "             144 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0     13463 colls, 13463 par    4.934s   1.756s     0.0001s    0.0292s\n",
+      "  Gen  1       395 colls,   394 par   25.652s   6.850s     0.0173s    0.0706s\n",
+      "\n",
+      "  Parallel GC work balance: 70.59% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time   44.219s  ( 40.856s elapsed)\n",
+      "  GC      time   26.684s  (  4.728s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    3.902s  (  3.877s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time   74.811s  ( 49.464s elapsed)\n",
+      "\n",
+      "  Alloc rate    1,302,001,880 bytes per MUT second\n",
+      "\n",
+      "  Productivity  64.3% of total user, 90.4% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent24)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent24' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent24' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent24' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent24/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent24/build/advent24/advent24-tmp/Main.dyn_o ) [Data.Attoparsec.Text changed]\n",
+      "\n",
+      "\u001b[;1madvent24/Main.hs:70:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a pattern binding:\n",
+      "        Patterns of type ‘Maybe Interval’ not matched: Nothing\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m70 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mJust (Interval a b) = z\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent24/Main.hs:174:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘*:’:\n",
+      "        Patterns of type ‘Interval’, ‘Interval’ not matched:\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IP _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IN _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IP _) (GHC.Num.Integer.IS _))\n",
+      "            ...\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m174 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35m(Interval a b) *: (Interval c d) \u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent24/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent24/build/advent24/advent24-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent24/Main.hs:70:9: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-uni-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In a pattern binding:\n",
+      "        Patterns of type ‘Maybe Interval’ not matched: Nothing\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m70 |\u001b[0m\u001b[0m         \u001b[;1m\u001b[35mJust (Interval a b) = z\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m         ^^^^^^^^^^^^^^^^^^^^^^^\u001b[0m\u001b[0m\n",
+      "\n",
+      "\u001b[;1madvent24/Main.hs:174:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wincomplete-patterns\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Pattern match(es) are non-exhaustive\n",
+      "    In an equation for ‘*:’:\n",
+      "        Patterns of type ‘Interval’, ‘Interval’ not matched:\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IP _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IN _))\n",
+      "            (Interval (GHC.Num.Integer.IS _) (GHC.Num.Integer.IS _))\n",
+      "            (Interval (GHC.Num.Integer.IP _) (GHC.Num.Integer.IS _))\n",
+      "            ...\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m174 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35m(Interval a b) *: (Interval c d) \u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m    |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent24/build/advent24/advent24 ...\n",
+      "91398299697996\n",
+      "41171183141291\n",
+      "  98,300,706,304 bytes allocated in the heap\n",
+      "     344,957,792 bytes copied during GC\n",
+      "         280,672 bytes maximum residency (924 sample(s))\n",
+      "         163,968 bytes maximum slop\n",
+      "              62 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0     22855 colls, 22855 par    6.658s   1.697s     0.0001s    0.0043s\n",
+      "  Gen  1       924 colls,   923 par    1.111s   0.361s     0.0004s    0.0015s\n",
+      "\n",
+      "  Parallel GC work balance: 40.37% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.002s elapsed)\n",
+      "  MUT     time  101.104s  ( 94.732s elapsed)\n",
+      "  GC      time    7.619s  (  1.910s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.150s  (  0.149s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time  108.879s  ( 96.794s elapsed)\n",
+      "\n",
+      "  Alloc rate    972,276,847 bytes per MUT second\n",
+      "\n",
+      "  Productivity  93.0% of total user, 98.0% of total elapsed\n",
+      "\n",
+      "Build profile: -w ghc-9.2.2 -O1\n",
+      "In order, the following will be built (use -v for more details):\n",
+      " - advent-of-code21-0.1.0.0 (exe:advent25)  --enable-profiling (configuration changed)\n",
+      "Configuring executable 'advent25' for advent-of-code21-0.1.0.0..\n",
+      "Preprocessing executable 'advent25' for advent-of-code21-0.1.0.0..\n",
+      "Building executable 'advent25' for advent-of-code21-0.1.0.0..\n",
+      "[1 of 1] Compiling Main             ( advent25/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent25/build/advent25/advent25-tmp/Main.dyn_o ) [Linear changed]\n",
+      "\n",
+      "\u001b[;1madvent25/Main.hs:94:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘showGrid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m94 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowGrid\u001b[0m\u001b[0m (Grid (V2 minR minC, V2 maxR maxC) cucumbers) = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "[1 of 1] Compiling Main             ( advent25/Main.hs, /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent25/build/advent25/advent25-tmp/Main.p_o )\n",
+      "\n",
+      "\u001b[;1madvent25/Main.hs:94:1: \u001b[;1m\u001b[35mwarning:\u001b[0m\u001b[0m\u001b[;1m [\u001b[;1m\u001b[35m-Wunused-top-binds\u001b[0m\u001b[0m\u001b[;1m]\u001b[0m\u001b[0m\u001b[;1m\n",
+      "    Defined but not used: ‘showGrid’\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\n",
+      "\u001b[;1m\u001b[34m94 |\u001b[0m\u001b[0m \u001b[;1m\u001b[35mshowGrid\u001b[0m\u001b[0m (Grid (V2 minR minC, V2 maxR maxC) cucumbers) = \n",
+      "\u001b[;1m\u001b[34m   |\u001b[0m\u001b[0m\u001b[;1m\u001b[35m ^^^^^^^^\u001b[0m\u001b[0m\n",
+      "Linking /home/neil/Programming/advent-of-code-21/dist-newstyle/build/x86_64-linux/ghc-9.2.2/advent-of-code21-0.1.0.0/x/advent25/build/advent25/advent25 ...\n",
+      "435\n",
+      "   2,884,443,392 bytes allocated in the heap\n",
+      "     771,632,904 bytes copied during GC\n",
+      "       1,740,216 bytes maximum residency (204 sample(s))\n",
+      "         181,984 bytes maximum slop\n",
+      "              63 MiB total memory in use (0 MB lost due to fragmentation)\n",
+      "\n",
+      "                                     Tot time (elapsed)  Avg pause  Max pause\n",
+      "  Gen  0       500 colls,   500 par    0.585s   0.361s     0.0007s    0.0022s\n",
+      "  Gen  1       204 colls,   203 par    0.705s   0.144s     0.0007s    0.0043s\n",
+      "\n",
+      "  Parallel GC work balance: 30.44% (serial 0%, perfect 100%)\n",
+      "\n",
+      "  TASKS: 26 (1 bound, 25 peak workers (25 total), using -N12)\n",
+      "\n",
+      "  SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)\n",
+      "\n",
+      "  INIT    time    0.004s  (  0.003s elapsed)\n",
+      "  MUT     time    7.067s  (  6.800s elapsed)\n",
+      "  GC      time    1.257s  (  0.473s elapsed)\n",
+      "  RP      time    0.000s  (  0.000s elapsed)\n",
+      "  PROF    time    0.032s  (  0.032s elapsed)\n",
+      "  EXIT    time    0.002s  (  0.001s elapsed)\n",
+      "  Total   time    8.363s  (  7.309s elapsed)\n",
+      "\n",
+      "  Alloc rate    408,156,917 bytes per MUT second\n",
+      "\n",
+      "  Productivity  84.9% of total user, 93.5% of total elapsed\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "! cd .. && for i in {01..25}; do cabal run advent${i} --enable-profiling -- +RTS -N -pj -s -hT ; done"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 316,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "rm: cannot remove '../times_raw.csv': No such file or directory\n"
+     ]
+    }
+   ],
+   "source": [
+    "! rm ../times.csv\n",
+    "! rm ../times_raw.csv"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 317,
+   "metadata": {
+    "Collapsed": "false",
+    "scrolled": true,
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Warning: The package list for 'hackage.haskell.org' is 24 days old.\n",
+      "Run 'cabal update' to get the latest list of available packages.\n",
+      "Resolving dependencies...\n",
+      "Up to date\n",
+      "1521\n",
+      "1543\n",
+      "Up to date\n",
+      "2039912\n",
+      "1942068080\n",
+      "Up to date\n",
+      "2724524\n",
+      "2775870\n",
+      "Up to date\n",
+      "82440\n",
+      "20774\n",
+      "Up to date\n",
+      "5092\n",
+      "20484\n",
+      "Up to date\n",
+      "352195\n",
+      "1600306001288\n",
+      "Up to date\n",
+      "336721\n",
+      "91638945\n",
+      "Up to date\n",
+      "255\n",
+      "982158\n",
+      "Up to date\n",
+      "15\n",
+      "1134\n",
+      "Up to date\n",
+      "339537\n",
+      "2412013412\n",
+      "Up to date\n",
+      "1627\n",
+      "329\n",
+      "Up to date\n",
+      "4495\n",
+      "131254\n",
+      "Up to date\n",
+      "763\n",
+      "███  █  █  ██  █    ███   ██  ███   ██ \n",
+      "█  █ █  █ █  █ █    █  █ █  █ █  █ █  █\n",
+      "█  █ ████ █  █ █    █  █ █    █  █ █  █\n",
+      "███  █  █ ████ █    ███  █    ███  ████\n",
+      "█ █  █  █ █  █ █    █ █  █  █ █ █  █  █\n",
+      "█  █ █  █ █  █ ████ █  █  ██  █  █ █  █\n",
+      "\n",
+      "Up to date\n",
+      "2712\n",
+      "8336623059567\n",
+      "Up to date\n",
+      "503\n",
+      "2853\n",
+      "Up to date\n",
+      "852\n",
+      "19348959966392\n",
+      "Up to date\n",
+      "5995\n",
+      "3202\n",
+      "Up to date\n",
+      "2501\n",
+      "4935\n",
+      "Up to date\n",
+      "355\n",
+      "10842\n",
+      "Up to date\n",
+      "5225\n",
+      "18131\n",
+      "Up to date\n",
+      "734820\n",
+      "193170338541590\n",
+      "Up to date\n",
+      "545118\n",
+      "1227298136842375\n",
+      "Up to date\n",
+      "14460\n",
+      "41366\n",
+      "Up to date\n",
+      "91398299697996\n",
+      "41171183141291\n",
+      "Up to date\n",
+      "435\n"
+     ]
+    }
+   ],
+   "source": [
+    "! cd .. && for i in {01..25}; do /usr/bin/time -f \"%C,%S,%E,%M\" -o times.csv -a cabal run advent${i}; done"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 318,
+   "metadata": {
+    "Collapsed": "false",
+    "scrolled": true,
+    "tags": []
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "1521\n",
+      "1543\n",
+      "2039912\n",
+      "1942068080\n",
+      "2724524\n",
+      "2775870\n",
+      "82440\n",
+      "20774\n",
+      "5092\n",
+      "20484\n",
+      "352195\n",
+      "1600306001288\n",
+      "336721\n",
+      "91638945\n",
+      "255\n",
+      "982158\n",
+      "15\n",
+      "1134\n",
+      "339537\n",
+      "2412013412\n",
+      "1627\n",
+      "329\n",
+      "4495\n",
+      "131254\n",
+      "763\n",
+      "███  █  █  ██  █    ███   ██  ███   ██ \n",
+      "█  █ █  █ █  █ █    █  █ █  █ █  █ █  █\n",
+      "█  █ ████ █  █ █    █  █ █    █  █ █  █\n",
+      "███  █  █ ████ █    ███  █    ███  ████\n",
+      "█ █  █  █ █  █ █    █ █  █  █ █ █  █  █\n",
+      "█  █ █  █ █  █ ████ █  █  ██  █  █ █  █\n",
+      "\n",
+      "2712\n",
+      "8336623059567\n",
+      "503\n",
+      "2853\n",
+      "852\n",
+      "19348959966392\n",
+      "5995\n",
+      "3202\n",
+      "2501\n",
+      "4935\n",
+      "355\n",
+      "10842\n",
+      "5225\n",
+      "18131\n",
+      "734820\n",
+      "193170338541590\n",
+      "545118\n",
+      "1227298136842375\n",
+      "14460\n",
+      "41366\n",
+      "91398299697996\n",
+      "41171183141291\n",
+      "435\n"
+     ]
+    }
+   ],
+   "source": [
+    "! cd .. && for i in {01..25}; do /usr/bin/time -f \"%C,%S,%E,%M\" -o times_raw.csv -a advent${i}; done"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 319,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "mv: cannot stat '../*prof': No such file or directory\n"
+     ]
+    }
+   ],
+   "source": [
+    "!mv ../*prof ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 320,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mv ../times.csv ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 321,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "!mv ../times_raw.csv ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 322,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "mv: cannot stat '../*hp': No such file or directory\n"
+     ]
+    }
+   ],
+   "source": [
+    "!mv ../*hp ."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 323,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/bin/bash: -c: line 1: syntax error near unexpected token `;'\n",
+      "/bin/bash: -c: line 1: ` for f in *hp ; do hp2ps $<_io.TextIOWrapper name='advent24.prof' mode='r' encoding='UTF-8'> ; done'\n"
+     ]
+    }
+   ],
+   "source": [
+    "! for f in *hp ; do hp2ps ${f} ; done"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 324,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "25"
+      ]
+     },
+     "execution_count": 324,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "len(glob.glob('*prof'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 325,
+   "metadata": {
+    "Collapsed": "false",
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[{'program': 'advent13',\n",
+       "  'total_time': 0.03,\n",
+       "  'total_alloc': 4493632,\n",
+       "  'total_ticks': 96,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent10',\n",
+       "  'total_time': 0.02,\n",
+       "  'total_alloc': 2383248,\n",
+       "  'total_ticks': 60,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent03',\n",
+       "  'total_time': 0.05,\n",
+       "  'total_alloc': 8298128,\n",
+       "  'total_ticks': 168,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent07',\n",
+       "  'total_time': 0.04,\n",
+       "  'total_alloc': 5589544,\n",
+       "  'total_ticks': 132,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent20',\n",
+       "  'total_time': 35.11,\n",
+       "  'total_alloc': 3090735840,\n",
+       "  'total_ticks': 119712,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent19',\n",
+       "  'total_time': 21.74,\n",
+       "  'total_alloc': 2623652352,\n",
+       "  'total_ticks': 74148,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent01',\n",
+       "  'total_time': 0.06,\n",
+       "  'total_alloc': 12058592,\n",
+       "  'total_ticks': 192,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent18',\n",
+       "  'total_time': 1.73,\n",
+       "  'total_alloc': 588717288,\n",
+       "  'total_ticks': 5916,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent06',\n",
+       "  'total_time': 0.02,\n",
+       "  'total_alloc': 2507624,\n",
+       "  'total_ticks': 72,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent09',\n",
+       "  'total_time': 0.01,\n",
+       "  'total_alloc': 469984,\n",
+       "  'total_ticks': 36,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent08',\n",
+       "  'total_time': 6.57,\n",
+       "  'total_alloc': 2499222744,\n",
+       "  'total_ticks': 22404,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent23',\n",
+       "  'total_time': 172.99,\n",
+       "  'total_alloc': 38150694448,\n",
+       "  'total_ticks': 589896,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent21',\n",
+       "  'total_time': 9.43,\n",
+       "  'total_alloc': 2400838008,\n",
+       "  'total_ticks': 32160,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent22',\n",
+       "  'total_time': 5.54,\n",
+       "  'total_alloc': 1384180736,\n",
+       "  'total_ticks': 18876,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent16',\n",
+       "  'total_time': 0.05,\n",
+       "  'total_alloc': 8613496,\n",
+       "  'total_ticks': 180,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent25',\n",
+       "  'total_time': 25.72,\n",
+       "  'total_alloc': 1910248008,\n",
+       "  'total_ticks': 87696,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent11',\n",
+       "  'total_time': 0.12,\n",
+       "  'total_alloc': 39102056,\n",
+       "  'total_ticks': 396,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent02',\n",
+       "  'total_time': 0.02,\n",
+       "  'total_alloc': 1818928,\n",
+       "  'total_ticks': 72,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent15',\n",
+       "  'total_time': 13.51,\n",
+       "  'total_alloc': 2458599000,\n",
+       "  'total_ticks': 46080,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent17',\n",
+       "  'total_time': 0.2,\n",
+       "  'total_alloc': 88071992,\n",
+       "  'total_ticks': 672,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent05',\n",
+       "  'total_time': 2.26,\n",
+       "  'total_alloc': 434487576,\n",
+       "  'total_ticks': 7692,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent12',\n",
+       "  'total_time': 6.69,\n",
+       "  'total_alloc': 722598152,\n",
+       "  'total_ticks': 22800,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent04',\n",
+       "  'total_time': 0.19,\n",
+       "  'total_alloc': 54628920,\n",
+       "  'total_ticks': 636,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent14',\n",
+       "  'total_time': 0.05,\n",
+       "  'total_alloc': 15471000,\n",
+       "  'total_ticks': 180,\n",
+       "  'initial_capabilities': 12},\n",
+       " {'program': 'advent24',\n",
+       "  'total_time': 340.53,\n",
+       "  'total_alloc': 66538931736,\n",
+       "  'total_ticks': 1161240,\n",
+       "  'initial_capabilities': 12}]"
+      ]
+     },
+     "execution_count": 325,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "profs = []\n",
+    "for fn in glob.glob('*prof'):\n",
+    "    with open(fn) as f:\n",
+    "        j = json.load(f)\n",
+    "        prof = {}\n",
+    "        for n in 'program total_time total_alloc total_ticks initial_capabilities'.split():\n",
+    "            prof[n] = j[n]\n",
+    "        profs.append(prof)\n",
+    "profs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 326,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>total_time</th>\n",
+       "      <th>total_alloc</th>\n",
+       "      <th>total_ticks</th>\n",
+       "      <th>initial_capabilities</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>program</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>advent01</th>\n",
+       "      <td>0.06</td>\n",
+       "      <td>12058592</td>\n",
+       "      <td>192</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent02</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>1818928</td>\n",
+       "      <td>72</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent03</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>8298128</td>\n",
+       "      <td>168</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent04</th>\n",
+       "      <td>0.19</td>\n",
+       "      <td>54628920</td>\n",
+       "      <td>636</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent05</th>\n",
+       "      <td>2.26</td>\n",
+       "      <td>434487576</td>\n",
+       "      <td>7692</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent06</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>2507624</td>\n",
+       "      <td>72</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent07</th>\n",
+       "      <td>0.04</td>\n",
+       "      <td>5589544</td>\n",
+       "      <td>132</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent08</th>\n",
+       "      <td>6.57</td>\n",
+       "      <td>2499222744</td>\n",
+       "      <td>22404</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent09</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>469984</td>\n",
+       "      <td>36</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent10</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>2383248</td>\n",
+       "      <td>60</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent11</th>\n",
+       "      <td>0.12</td>\n",
+       "      <td>39102056</td>\n",
+       "      <td>396</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent12</th>\n",
+       "      <td>6.69</td>\n",
+       "      <td>722598152</td>\n",
+       "      <td>22800</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent13</th>\n",
+       "      <td>0.03</td>\n",
+       "      <td>4493632</td>\n",
+       "      <td>96</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent14</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>15471000</td>\n",
+       "      <td>180</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent15</th>\n",
+       "      <td>13.51</td>\n",
+       "      <td>2458599000</td>\n",
+       "      <td>46080</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent16</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>8613496</td>\n",
+       "      <td>180</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent17</th>\n",
+       "      <td>0.20</td>\n",
+       "      <td>88071992</td>\n",
+       "      <td>672</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent18</th>\n",
+       "      <td>1.73</td>\n",
+       "      <td>588717288</td>\n",
+       "      <td>5916</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent19</th>\n",
+       "      <td>21.74</td>\n",
+       "      <td>2623652352</td>\n",
+       "      <td>74148</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent20</th>\n",
+       "      <td>35.11</td>\n",
+       "      <td>3090735840</td>\n",
+       "      <td>119712</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent21</th>\n",
+       "      <td>9.43</td>\n",
+       "      <td>2400838008</td>\n",
+       "      <td>32160</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent22</th>\n",
+       "      <td>5.54</td>\n",
+       "      <td>1384180736</td>\n",
+       "      <td>18876</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent23</th>\n",
+       "      <td>172.99</td>\n",
+       "      <td>38150694448</td>\n",
+       "      <td>589896</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent24</th>\n",
+       "      <td>340.53</td>\n",
+       "      <td>66538931736</td>\n",
+       "      <td>1161240</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent25</th>\n",
+       "      <td>25.72</td>\n",
+       "      <td>1910248008</td>\n",
+       "      <td>87696</td>\n",
+       "      <td>12</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "          total_time  total_alloc  total_ticks  initial_capabilities\n",
+       "program                                                             \n",
+       "advent01        0.06     12058592          192                    12\n",
+       "advent02        0.02      1818928           72                    12\n",
+       "advent03        0.05      8298128          168                    12\n",
+       "advent04        0.19     54628920          636                    12\n",
+       "advent05        2.26    434487576         7692                    12\n",
+       "advent06        0.02      2507624           72                    12\n",
+       "advent07        0.04      5589544          132                    12\n",
+       "advent08        6.57   2499222744        22404                    12\n",
+       "advent09        0.01       469984           36                    12\n",
+       "advent10        0.02      2383248           60                    12\n",
+       "advent11        0.12     39102056          396                    12\n",
+       "advent12        6.69    722598152        22800                    12\n",
+       "advent13        0.03      4493632           96                    12\n",
+       "advent14        0.05     15471000          180                    12\n",
+       "advent15       13.51   2458599000        46080                    12\n",
+       "advent16        0.05      8613496          180                    12\n",
+       "advent17        0.20     88071992          672                    12\n",
+       "advent18        1.73    588717288         5916                    12\n",
+       "advent19       21.74   2623652352        74148                    12\n",
+       "advent20       35.11   3090735840       119712                    12\n",
+       "advent21        9.43   2400838008        32160                    12\n",
+       "advent22        5.54   1384180736        18876                    12\n",
+       "advent23      172.99  38150694448       589896                    12\n",
+       "advent24      340.53  66538931736      1161240                    12\n",
+       "advent25       25.72   1910248008        87696                    12"
+      ]
+     },
+     "execution_count": 326,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "performance = pd.DataFrame(profs).set_index('program').sort_index()\n",
+    "performance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 327,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='program'>"
+      ]
+     },
+     "execution_count": 327,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.total_ticks.plot.bar()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 328,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='program'>"
+      ]
+     },
+     "execution_count": 328,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.total_ticks.plot.bar(logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 329,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='program'>"
+      ]
+     },
+     "execution_count": 329,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.total_alloc.plot.bar()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 330,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='program'>"
+      ]
+     },
+     "execution_count": 330,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEvCAYAAACkIWHqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAZu0lEQVR4nO3df7RldXnf8ffHwVGDQlRorfxwMCA6dWnUG9q0Jq40/hhjCDZay8TGxhBYxrKS1fYPMW2iq7aWxJVEo0TXNKFoU/mh0YSRqaiRSGNQGUADiOgsRLlgwyiK+AMRfPrHOSN3Ludc7j3n7D3fM+f9WuusOed77rOfZzabZ773u/fZJ1WFJOng9pADXYAkqXs2e0laADZ7SVoANntJWgA2e0laADZ7SVoANntJWgA2e0laADNv9kmemORPk7x3rTFJUn+ynk/QJjkX+Hng9qp66orxbcBbgE3An1TV2Svee29VvXTVdh4wNsoRRxxRW7ZsWfdfQpIEV1111Ver6shR7x2yzm2cB7wNeNe+gSSbgHOA5wHLwJVJLq6qz05XLmzZsoXdu3dPuxlJWihJvjTuvXUt41TV5cAdq4ZPAvZU1U1VdQ9wAXDKxFVKkjozzZr9UcAtK14vA0cleWySdwDPSPJagFFjqyU5I8nuJLv37t07RVmSpNXWu4wzSkaMVVV9DXjVqsEHjI0I3AHsAFhaWvJWnJI0Q9PM7JeBY1a8Phq4bZpikpycZMedd945zWYkSatM0+yvBE5IclySzcCpwMXTFFNVO6vqjMMPP3yazUiSVllXs09yPnAFcGKS5SSnVdW9wJnApcANwEVVdf00xTizl6RurOs6+74tLS2Vl15K0sYkuaqqlka919TtEpzZS1I3prkaZ+aqaiewc2lp6fQDXYskdWHLWZeMfe/ms1/UWV5n9pK0AJpq9l6NI0ndaKrZS5K6YbOXpAXQVLN3zV6SutFUs3fNXpK60VSzlyR1o6lm7zKOJHXDD1VJ0gQO1IejJtXUzF6S1A2bvSQtAJu9JC2Appq9J2glqRtNNXuvs5ekbjTV7CVJ3bDZS9ICsNlL0gKw2UvSArDZS9ICaKrZe+mlJHWjqWbvpZeS1I2mmr0kqRs2e0laADZ7SVoANntJWgA2e0laADNv9kmemORPk7x3xdihSd6Z5H8kefmsc0qS1rauZp/k3CS3J7lu1fi2JDcm2ZPkLICquqmqTlu1iV8E3ltVpwO/MJPKJUnrtt6Z/XnAtpUDSTYB5wAvBLYC25NsHRN/NHDL8Pl9Gy9TkjSNdTX7qrocuGPV8EnAnuFM/h7gAuCUMZtYZtDw151TkjQ70zTeo7h/tg6Dhn5UkscmeQfwjCSvHb73PuAlSd4O7By1sSRnJNmdZPfevXunKEuStNohU8RmxFhV1deAV60a/DbwyrU2VlU7gB0AS0tLNUVdkqRVppnZLwPHrHh9NHDbNMV4IzRJ6sY0zf5K4IQkxyXZDJwKXDxNMd4ITZK6sd5LL88HrgBOTLKc5LSquhc4E7gUuAG4qKqun6YYZ/aS1I11rdlX1fYx47uAXbMqpqp2AjuXlpZOn9U2JUmNXQbpzF6SutFUs3fNXpK60VSzlyR1o6lm7zKOJHWjqWbvMo4kdaOpZi9J6kZTzd5lHEnqRlPN3mUcSepGU81ektQNm70kLYCmmr1r9pLUjaaavWv2ktSNppq9JKkbNntJWgDTfC3hzCU5GTj5+OOPP9ClSDrAtpx1ydj3bj77RT1WcnBoambvmr0kdaOpZi9J6kZTyzhqy7hfo/0VWhvlksyBZ7OXGmJTnJ6TlNFcxpGkBWCzl6QF0FSz93YJktSNptbsq2onsHNpaen0A12LJLViFudymprZS5K6YbOXpAVgs5ekBWCzl6QF0NQJWkk6EBbhw2zO7CVpAfTS7JNsTXJRkrcneWkfOSVJ95u42Sc5N8ntSa5bNb4tyY1J9iQ5azj8QuCtVfXrwCumqFeSNIFpZvbnAdtWDiTZBJzDoLlvBbYn2Qr8L+DUJG8CHjtFTknSBCZu9lV1OXDHquGTgD1VdVNV3QNcAJxSVbdX1b8DzgK+OnG1kqSJzPpqnKOAW1a8Xgb+SZItwG8BhwJvGhWY5AzgDIBjjz12xmVJ0mKbdbPPiLGqqpsZNvJxqmpHkq8AJ2/evPlZM65LkhbarK/GWQaOWfH6aOC29Qb7HbSS1I1ZN/srgROSHJdkM3AqcPF6g73FsSR1Y5pLL88HrgBOTLKc5LSquhc4E7gUuAG4qKquX+82ndlLUjcmXrOvqu1jxncBuyauSOrQInwsXhqlqdsluIwjSd1oqtm7jCNJ3Wiq2Tuzl6RuNHWLY7+DVmqb5zzmV1Mze0lSN5pq9i7jSFI3mmr2nqCVpG401ewlSd1o6gTtIvFEl6Q+NTWzd81ekrrRVLN3zV6SutFUs5ckdcNmL0kLwGYvSQugqWbvCVpJ6kZTzd4TtJLUjaaavSSpGzZ7SVoANntJWgA2e0laADZ7SVoATTV7L72UpG401ey99FKSutFUs5ckdcNmL0kLwGYvSQvAZi9JC8BmL0kLoJfvoE1yLPA24KvA56vq7D7ySpIGJp7ZJzk3ye1Jrls1vi3JjUn2JDlrOPwk4JKq+lVg6xT1SpImMM0yznnAtpUDSTYB5wAvZNDUtyfZClwDnJrko8BlU+SUJE1g4mZfVZcDd6waPgnYU1U3VdU9wAXAKcArgddV1b8AXjRpTknSZGZ9gvYo4JYVr5eHYx8EfiPJO4CbRwUmOSPJ7iS79+7dO+OyJGmxzfoEbUaMVVVdB7x0rcCq2gHsAFhaWqoZ1yVJC23WzX4ZOGbF66OB29YbnORk4OTjjz9+xmVJWm3LWZeMfe/ms11tPdjMehnnSuCEJMcl2QycCly83mBvhCZJ3Zjm0svzgSuAE5MsJzmtqu4FzgQuBW4ALqqq6zewTW9xLEkdmHgZp6q2jxnfBeyacJs7gZ1LS0unT1qXJOmBmrpdgjN7SepGU83eNXtJ6kZTzV6S1I2mmr3LOJLUjV7uerle83qC1uuVJbWuqZm9JKkbTTV7l3EkqRtNNXuvxpGkbjTV7CVJ3Wiq2buMI0nd8Gocza1xV0F5BZT0QE3N7CVJ3bDZS9ICsNlL0gJoqtl7glaSutFUs/c6e0nqRlPNXpLUDZu9JC0Am70kLQCbvSQtAJu9JC2Appq9l15KUjeaavZeeilJ3Wiq2UuSumGzl6QF0NQtjqWDiV9Er5Y4s5ekBWCzl6QFYLOXpAXQy5p9kp8CXj7Mt7Wq/tlG4l37lKTpTDyzT3JuktuTXLdqfFuSG5PsSXIWQFX936p6FfAB4J3TlSxJ2qhplnHOA7atHEiyCTgHeCGwFdieZOuKH/kl4PwpckqSJjBxs6+qy4E7Vg2fBOypqpuq6h7gAuAUgCTHAndW1TdHbS/JGUl2J9m9d+/eScuSJI0w6xO0RwG3rHi9PBwDOA34n+MCq2pHVS1V1dKRRx4547IkabHN+gRtRowVQFW97kGDk5OBk48//vgZlyVJi23WzX4ZOGbF66OB29YbXFU7gZ1LS0unz7gu6aA27oo1r1bTPrNu9lcCJyQ5DrgVOJXBSdl1aWFm7/80kg5G01x6eT5wBXBikuUkp1XVvcCZwKXADcBFVXX9erfpLY4lqRsTz+yravuY8V3Arkm22cLMXpIORk3dLsGZvSR1o6lmL0nqRlPN3u+glaRuNPXlJV562Q1vJCepqZm9JKkbTTV7l3EkqRtNNXuvxpGkbjS1Zi+1yk9Wa941NbOXJHWjqWbvmr0kdaOpZu+avSR1o6lmL0nqhs1ekhaAzV6SFkBTzd4TtJLUjaaavSdoJakbTTV7SVI3/ATtnDkYP8npXTml7jmzl6QFYLOXpAXQVLP3ahxJ6kZTzd6rcSSpGwftCVpP+knS/Zqa2UuSumGzl6QFYLOXpAVgs5ekBWCzl6QF0MvVOEkeArwBOAzYXVXv7COvJGlg4pl9knOT3J7kulXj25LcmGRPkrOGw6cARwHfB5YnL1eSNIlplnHOA7atHEiyCTgHeCGwFdieZCtwInBFVf0H4NenyClJmsDEzb6qLgfuWDV8ErCnqm6qqnuACxjM6peBrw9/5r5Jc0qSJjPrE7RHAbeseL08HHsf8IIkbwUuHxWY5Iwku5Ps3rt374zLkqTFNusTtBkxVlX1HeC0tQKragewA2BpaalmXJckLbRZz+yXgWNWvD4auG29wd71UpK6MetmfyVwQpLjkmwGTgUuXm+wd72UpG5Mc+nl+cAVwIlJlpOcVlX3AmcClwI3ABdV1fUb2KYze0nqwMRr9lW1fcz4LmDXhNvcCexcWlo6fdK6JEkP1NTtEpzZS1I3mmr2rtlLUjeaavbO7CWpG001e2f2ktSNppq9JKkbTTV7l3EkqRu93M9+vbz0cv5tOeuSse/dfPaLeqxE0kpNzewlSd2w2UvSAmiq2btmL0ndaKrZe+mlJHWjqWYvSeqGzV6SFoDNXpIWQFPN3hO0ktSNppq9J2glqRupau+7vZPsBb405u0jgK9OsNlJ4vqKOVhzWd/85Gq9vj5ztV7fWnFPqKojR0ZU1Vw9gN19xfUVc7Dmsr75ydV6fe6L6eOaWsaRJHXDZi9JC2Aem/2OHuP6ijlYc1nf/ORqvb4+c7Ve30RxTZ6glSTN1jzO7CVJG2Szl6QFYLOXpAVgs5ekBTC3zT7J76zx3guSnJZky6rxX10jJkleluRfDZ//bJI/SvLqJOveT0k++iDvH7Hq9b8Z5jkjSdaI+5dJHjN8fmSSdyW5NsmFSY4eE/MHSf75emtfEfeYJL+T5NeG++I/JflAkjclefQacT+T5G1J/jLJnyc5O8nxD5LrBUnenuTiYdzbk2zbaM0rtudx0cFxMekxMYw9qI6LWR0Tw211clyM3Na8Xo2T5MtVdeyI8TcCzwauBk4G3lxVbx2+d3VVPXPM9v4Y+AfAZuCbwMOAncDPAX9fVb85IubvVg8BTwJuBKiqp42I+WENSf4z8FPAu4GfB5ar6t+Pqe+zVbV1+PxC4BPAe4DnAi+vqueNiNl324kjgQuB86vqmlHbXxW3C7gWOAx4yvD5RcDzgKdX1SkjYs4G/iHwV8CLgS8CnwdeDbyxqt4zIubNDPbXu4Dl4fDRwCuAL4za5+uo3eOig+NikmNiGHfQHReTHBPDuN6Oi5Em+ahuX4/hjhz1uAu4d0zMtcAhw+c/CuwC/nD4+po1cl07/POhwNeAzcPXh+x7b0TMxcCfAU8GngBsAW4ZPn/CmJhrVjy/Gjh0Rd6ReYbv37ji+VWr3vv0WrmAE4DfBq4HPge8DnjSGrk+PfwzwK3rzHXtiueHAB8fPn80cN2YmM+PGQ+D/6k9Lho5LiY5Jg7W42KSY6Lv42LUo/VlnG8AJ1TVYasejwK+MibmkKq6F6CqvsHgX+vDkryHwb/E4+yL+T5wZVXdM3x9L3DfqICq+gXgzxl8wOHpVXUz8P2q+lJVjbuR2yOSPCPJs4BNVfXtFXlH5hn66yT/Jckjhs9fDINfkYFx94Su4ba/UFVvqKp/DLwMeDiDg3qchwx/NT8GeOS+X2+TPJbx+/AH+5YTgMcDm4a5v87gf9JR7k5y0ojxnwDuXqO+b+BxsU9fx8UkxwQcnMfFho+J4ft9HhcjC2j2AfxX4KQx7/3umPEPAM8Zs60frJHr/wCPHDH+OOBTD1LnocAfMPiXe/lBfvayVY9/NBx/LGvc3IjBv+SvB748fPyAwYzl3cCxY2KumXC/bwf+fvh4CfAR4MPArcAZY2L+NYOlgQ8N63vRcPxI4N1jYp4JfBL47DDuQ8ANw7FneVy0c1xMckwcrMfFNMdEX8fFqMfcrtmPM5zhUFXfHfHeUVV16wa3dyiDX51uX8fPPh34yap6x0ZyDGM3AQ+rqu+s42cPZzAj+dqD/Nwjq+pbG61lRT2pqnuTHAL8OINf38fNkBjO4J4I7KnBLGm9uR4HHMVgprdcVf9vkpofJIfHxf0/N9FxMckxMYxbiONiI8fE8Od7OS5+GNN6sx+ecT6JwX/0Am5j8K/n2MIniekzV+v19Z1rzLaeXFWf6yOu9VyLWl+Sh9ZguWLl2BFVteb93yeJ6yum71z72civAX0/gOcDexj82vQnw8cHh2PPn1VMn7lar6/vXGvU8OUJj5kNx7Wea9HqA36GwVU4exks4WxZ8d7Va2xvw3F9xfSda9TjENr2FuC5NTiR8UNJjmNwIukpM4rpM1fr9fWWK8kfjckfBldGjH5zgrjWc1nffn4PeEFVXZ/kpcCHk/xyVX2C8Sd1J43rK6bvXA/QerM/hPuvs13pVgYnpmYV02eu1uvrM9crgf8IfG/Ee9vXqG+SuNZzWd/9NlfV9QBV9d4kNwDvS3IWwyuJZhjXV0zfuR6g9WZ/LnBlkgsYXI8Kg0u/Th2+N6uYPnO1Xl+fua5kcK31365+I8nr16hvkrjWc1nf/b6f5HE1PCE7nNX+LIMrZ35sjVyTxPUV03euB5iHE7RPAU5hxVl54OKq+uwsY/rM1Xp9feXK4CqNu2sDVxRMGtd6LuvbL+a5wN6q+syq8cOBM6vqv80qrq+YvnONtJEF/gP1AH5zPWPTxvSZq/X63Bfui3msz32xxjY28sMH6sGIs848yAdDJonpM1fr9bkv3BfzWJ/7Yvyj6TX7JNuBXwKOS3LxircexeCeFDOJ6TNX6/X1mav1+vrMZX3zk6v1+sZputkDf8vgnhZHAL+/YvwuYPUd5KaJ6TNX6/X1mav1+vrMZX3zk6v1+kZq/gStJGl6rd/1EoAkv5jkC0nuTPLNJHcl+easY/rM1Xp9feZqvb4+c1nf/ORqvb4H2MgC/4F6MPjI/VO6jukzV+v1uS/cF/NYn/ti/GMuZvYMvv3lhh5i+szVen195mq9vj5zWd/85Gq9vv3MxZp9krcwuFf0X7DiY9dV9b5ZxvSZq/X6+szVen195rK++cnVen2rtX41zj6HAd9hcGfFfQpY6y86SUyfuVqvr89crdfXZy7rm59crde3n7mY2UuSpjMXa/ZJnpTkr5JcN3z9tAy+aX2mMX3mar2+PnO1Xl+fuaxvfnK1Xt8DTHN2t68H8DEG34B0zYqxkd9MP01Mn7lar8994b6Yx/rcF+MfczGzB36kqj61auzeDmL6zNV6fX3mar2+PnNZ3/zkar2+/cxLs/9qkh9jeLP+DL6xZc0vOZ4wps9crdfXZ67W6+szl/XNT67W69vfRn4NOFAPBt9M/xEGZ6NvBf4GeMKsY/rM1Xp97gv3xTzW574Y/5iLq3GSbKqq+5IcCjykqu7qIqbPXK3X12eu1uvrM5f1zU+u1utbbV6Wcb6YZAfwT4FvdRjTZ67W6+szV+v19ZnL+uYnV+v17W8jvwYcqAfwCOBlDD5AcDPwNuDZs47pM1fr9bkv3BfzWJ/7Yo1tbOSHW3gAjwbeBdzXZUyfuVqvz33hvpjH+twX+z/mZRmHJM9J8sfA1cDDGfwrN/OYPnO1Xl+fuVqvr89c1jc/uVqvbz8b+ZfhQD2ALwLvB7YDh3YV02eu1utzX7gv5rE+98X4x7xcjXNYVW3oRv2TxPSZq/X6+szVen195rK++cnVen0P2EbLzT7JWxl+iGCUqvqNWcT0mav1+vrM1Xp9feayvvnJ1Xp947S+Zr8buIrB+tQzgS8MHz8O3DfDmD5ztV5fn7lar6/PXNY3P7lar2+0SdZ++n4AlwEPXfH6ocBls47pM1fr9bkv3BfzWJ/7Yvyj9Zn9Po8HHrXi9SOHY7OO6TNX6/X1mav1+vrMZX3zk6v1+vYzL99UdTZwTZLLhq+fA7y+g5g+c7VeX5+5Wq+vz1zWNz+5Wq9vP02foF0pyeOBXwZuAH4EuK2qLp91TJ+5Wq+vz1yt19dnLuubn1yt17efjaz5HKgH8GvAtcDXGaxdfRf46Kxj+szVen3uC/fFPNbnvlhjGxv54QP1GP4lHw58evj6ycCFs47pM1fr9bkv3BfzWJ/7YvxjXk7Q3l1VdwMkeVhVfQ44sYOYPnO1Xl+fuVqvr89c1jc/uVqvbz/zcoJ2OcmPAn8BfDjJ14HbOojpM1fr9fWZq/X6+sxlffOTq/X69jM3J2j3SfIc4HDgg1V1T1cxfeZqvb4+c7VeX5+5rG9+crVeH8xhs5ckbdy8rNlLkqZgs5ekBWCzl6QFYLOXgCSbpoyflyvbtKA8QauDXpItwAeBTwLPAD4PvAL4LHAu8HwGX+Ac4LeGf15SVa8Zxp8GvIbBpW5fAL5XVWcmOQ+4Y7jNq4ELgTcz+HLo7wKvrKobk/wK8GJgE/BU4PeBzQw++v494Oeq6o7u9oA0P9fZS9M6ETitqj6e5Fzg1cPxu6vq2cP7jnwCeBaDj6R/KMmLgU8Bv83gXuJ3AR8FPrNiu08CnltV9yU5DPjpqro3yXOBNwIvGf7cUxn8o/BwYA/wmqp6RpI/ZPAPz5s7+ntLgM1ei+OWqvr48PmfAfu+4efC4Z8/Afx1Ve0FSPK/gZ8evvexfTPvJO9h0OD3eU9V7fsSicOBdyY5gcG3Cz10xc9dVlV3AXcluRPYORy/FnjaLP6C0lpcs9eiWL1eue/1t4d/ZkzcuPF9vr3i+RsYNPWnAiczmMXv870Vz3+w4vUPcNKlHtjstSiOTfKTw+fbgb9Z9f4ngeckOWJ4snY78DEGyzjPSfLo4UnYlzDe4cCtw+e/MrPKpRmw2WtR3AD82yR/BzwGePvKN6vqK8BrGdw+9jPA1VX1l1V1K4O1908CH2FwUvfOMTl+D/jvST7O4GSs1AyvxtFBb3g1zgeGyyuTxD+yqr41nNm/Hzi3qt4/yxqlrjmzlx7c65N8GrgO+CKDOw9Kc8WZvSQtAGf2krQAbPaStABs9pK0AGz2krQAbPaStABs9pK0AP4/w5QO6gvnswUAAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.total_alloc.plot.bar(logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 331,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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MrOm55177rlsu+223Hvvvbz++uuMHDly0GoaPXo0O+ywA3fcccf6huD4449n77335sYbb+Sggw7iW9/6FgcccMCg1SBJray7weorRnYZJH7m6sFafH8POxw0NY0h6MsVl6icU3ks8BqVEyi0pC233JIXXngBgH333Zf58+fT2dnJU089xaJFi5g2bdobngOwevVqtt9+ezbbbDO+853v1LzJvmtOtfe///1ccMEFAHR2dvL8888DlV0NP/jBD7jsssvWD2x85JFH2GmnnfjUpz7F4Ycfzm9+85t+v35J0qal1i0ElwDnAZetm1B1xaUPUPniXxwR1wO7AHdl5v8fEdcA/1mPQns7TLDexowZw/ve9z4mTZrEIYccwuTJk5kyZQoRwdlnn812223HmDFjGDZsGFOmTOGEE07glFNO4ZhjjuHqq69m//33p729vaZl7b///sydO5epU6fyuc997g2Pfe1rX2PWrFlcdNFFtLW1ccEFF7D99tsD0N7ezg033MAHPvAB2tvbeeCBB/jud7/L5ptvznbbbcfpp59e9/dFkjQ0Ra2bwyNiR+CGzJxU3H8PcGZmHlTcX/dN9iiwJjOvioj5mfl3vWW3t7fnSy+99IZpy5YtY9ddd635hag1uZ4lNUszdxlExKtUfmQPiTEE3V5xCfga8I2I2AdY1NPMETELmAWVzd+SJG1CSjeGYCANQU9XXHoZOKm3mYvLPM6DyhaCAdTRMm666SZOO+20N0wbP3481113XZMqkiSpYiANwaBdcWmoOuiggzjooIOaXYYkSRsYyJkK119xKSKGU7ni0vV9CYiIGRExzxPoSJI2Mf29/PGgqfWww0G54lJmLsjMWW1tbX2tW5KkVla6axnUtMug0VdckiRJjeXFjSRJUnMbgj6NIThzdH1vvajl8sdQ+yWQV6xYwaRJk3p/nRuZ79Zbb+Wwww7rc0Z3jj32WB555JFuH/vEJz7BAw88sNH5TzjhBK655poNpnd9P+677z5OOOGEAdUqSRp8TW0IyjyGoN4NQZncf//9dHZ2stNOO23wWGdnJ9/61reYOHFiv7K7vh+77bYbHR0d/PGPf+x3vZKkwecugx7MmTOH3/3ud0ydOpVTTz2VzOTUU09l0qRJ7LbbbsyfP3/982677TamTp3Kueeey4oVK9hnn33YY4892GOPPbjzzjtrWl5f53vmmWc48sgjmTx5Mu9+97vXX7fgxRdf5MQTT2S33XZj8uTJXHvttRvM+73vfY8jjjhi/f0tttiC008/nb333pu77rqL/fbbb/1lmy+66CJ23nln9ttvP04++WRmz569fr5Fixbx3ve+l5122mn91oKu7wfAjBkzuPLKK2t6HyRpE1G6owyaevnj4o2YMWLEiGaW0a25c+eydOlSlixZAsC1117LkiVLuPfee3n66afZa6+92HfffZk7dy7nnHMON9xwAwAvv/wyN998MyNHjuThhx9m5syZ679cN2abbbbp03xnnHEGu+++Oz/4wQ+45ZZb+NjHPsaSJUs466yzGD16NPfddx8Azz777Abz3nHHHcyc+edxoi+99BKTJk3iS1/60huet3LlSs466yzuuecettxySw444ACmTJmy/vHHH3+c22+/nd/+9rccfvjhHHvssRu8HwB77rknc+fO5bOf/Wyv74Mk9UvXXcGDd5XCehlSZyocsOJwiwXt7e0nN7OOWtx+++3MnDmTtrY2tt12W6ZPn87ixYvZaqut3vC81157jdmzZ7NkyRLa2tp46KGHasrv63y33377+l//BxxwAKtWrWL16tX85Cc/ecOv8Te/+c0bzPv444/z1re+df39trY2jjnmmA2e98tf/pLp06fzlre8BYC//du/fUNdRx55JJttthkTJ07kiSee6LHWbbbZhpUrPWeVJJVZUxuCVlLrRaDOPfdctt12W+69915ef/11Ro4cOSjzdVdPRJCZRHR3Vuk/GzVqFK+88sr6+yNHjqS7cRy9vebqLTsbe+4rr7zCqFGjNpolSWouxxD0YMstt+SFF15Yf3/fffdl/vz5dHZ28tRTT7Fo0SKmTZu2wfNWr17N9ttvz2abbcZ3vvMdaj0LY1/n23ffffne974HVI4+2Hrrrdlqq6344Ac/yHnnnbf+ed3tMth1111Zvnx5rzVNmzaNn/3sZzz77LOsXbu22/EIXXV9PwAeeuihfh1hIUlqnNbZQtDg/UFjxozhfe97H5MmTeKQQw7h7LPP5q677mLKlClEBGeffTbbbbcdY8aMYdiwYUyZMoUTTjiBU045hWOOOYarr76a/fffn/b29pqW19f5zjzzTE488UQmT57Mm970Ji699FIAvvCFL/CP//iPTJo0iba2Ns444wyOPvroN8x76KGHcuut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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance[['total_ticks', 'total_alloc']].plot.bar(\n",
+    "    logy=True, secondary_y=['total_alloc'], \n",
+    "    figsize=(8, 6), title=\"Internal time and memory\")\n",
+    "plt.savefig('internal_time_and_memory_log.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 332,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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TZq0QebixYvZY489mDt3LgsWLGDq1KlMnjyZiRMn8sADD7T+hZEklVKpd6e326xZs7j77ruZP38+l19+Oeeeey533HEHTz75JG9605vYe++9mTVrFt/4xje46qqrAHjhhRe49tprGT58OA888AAzZsxg3rx53T7OsGHDOO2005g3bx5nnXUWABdccMG66Z/97GeZNm0aV1xxBWvWrOG5557j6aefBuC+++7jyCOP5Ac/+AGTJ0/mM5/5DJ/73Of40Ic+xKpVq1izZk3/vDiSpNKxiXfhpptuYsaMGXR0dLDtttsybdo05s6dy+abb77efH/72984/vjjmT9/Ph0dHdx/f59+ZQfAddddx0UXXQRAR0cHY8aM4emnn+aJJ57gkEMO4fLLL+cNb3gDAG95y1v46le/ytKlS3n/+9/P+PHj+/z4kqRqcHd6F5o5CQ7AmWeeybbbbssdd9zBvHnzWLVqVb/VNGbMGHbccUduvvnmdeOOOuoo5syZw4gRI5g+fTrXXXddvz2+JKlc3BKvM3r0aJ599lkA9t57b7773e/ysY99jKeeeoobb7yRr3/96zzyyCPr5gFYsWIFY8eOZbPNNuPCCy9send2/WM1euc738k555zD3//937NmzZp1l2wdNmwYV155JdOnT2fUqFEcddRRLF68mJ133pnPfvazLF68mDvvvJP99tuvj6+EJA1Onf3qacnwhl8bnbqiTdX0XambeE8/CWu1rbbaire97W1MmDCBgw46iIkTJzJp0iQigjPOOIPtttuOrbbaiiFDhjBp0iSOPvpojjvuOA4//HAuu+wy9t13X0aObO5sevvuuy+zZs1i8uTJfPGLX1xv2re+9S1mzpzJ97//fTo6OjjnnHPYfvvtARg5ciRXXXUV73rXuxg5ciQLFy7kRz/6EUOHDmW77bbj5JNPbvnrIkkqp6bOnd4fOjt3+j333MOuu+46IPWofVzPkgbKQG+Jl+7c6ZIkaWCUenf6YHDNNddw4oknrjdu3LhxXHHFFQNUkSRpsLCJ97Pp06czffr0gS5DkjQIuTtdkqSKsolLklRRNnFJkirKJi5JUkWVu4mfOqa1tx40cylSaP5ypEuWLGHChAlNPdWulrvhhht473vf2+uMzhxxxBEsXry402nHHnssCxcu7Hb5o48+mp/85CcbjG98Pe666y6OPvroPtUqSepZuZt4m7W6iZfJggULWLNmDTvvvPMG09asWcP3vvc9dtttt43Kbnw9dt99d5YuXcpDDz200fVKknpmE6/TeD3xzOy3a4oDvV7uqaee4tBDD2XixIm8+c1v5s477wTgueee45hjjmH33Xdn4sSJXH755Rsse/HFF3PIIYesGx41ahQnn3wye+21F7/73e/YZ5991l1C9fvf/z677LIL++yzD5/85CfXXecc4MYbb+Stb30rO++887qt8sbXA+B973sfl156aVOvgyRp4/g78Tr11xMHuPzyy5k/f36/XFMcYJtttunVcqeccgp77LEHV155Jddddx0f/ehHmT9/PqeffjpjxozhrrvuAlh37fF6N998MzNmzFg3/PzzzzNhwgROO+209eZbtmwZp59+OrfffjujR49mv/32Y9KkSeumP/roo9x0003ce++9HHzwwRxxxBEbvB4AU6ZMYdasWXzhC1/o8XWQJG0cm3g3+vua4r1d7qabblq3lb3ffvuxfPlyVqxYwa9//ev1tnq33HLLDZZ99NFHeeUrX7luuKOjg8MPP3yD+f7whz8wbdo0XvGKVwDwgQ98YL26Dj30UDbbbDN22203HnvssS5r3WabbVi2bFm3z0eS1Dc28W5szDXFX3rpJYYPH94vy3VWT0SQmUREt8uOGDGClStXrhsePnw4HR0dTT1GvZe97GVNzbty5UpGjBjRbZYkqW/8TrxO4zW+9957b2bPns2aNWt44oknuPHGG5k6deoG861YsYLtt9+ezTbbjB/+8IdNX1O8t8vtvffeXHzxxUDtqPWtt96azTffnAMOOICzzjpr3Xyd7U7fddddWbRoUY81TZ06ld/85jc8/fTTrF69utPv1xt1dm30+++/f6OOzJckNa/cW+JtvjB74/XEzzjjDH73u9/12zXFe7vcqaeeyjHHHMPEiRN5+ctfzoUXXgjAl7/8ZT796U8zYcIEOjo6OOWUU3j/+9+/3rLvec97uOGGG9h///27fYwddtiBL33pS+y111686lWvYrfddmPMmO5/njdx4sT1Xo/Pf/7zXH/99bznPe29HrwkbWq8nvgm4q9//Sv77rsvN998c6e70es999xzjBo1itWrV3PYYYfx8Y9/nMMOO6zpx3rxxReZNm0aN910E0OGbPg50fUsaaB4PXFV0ogRI/jKV77CI4880uO8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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance[['total_ticks', 'total_alloc']].plot.bar(\n",
+    "    logy=False, secondary_y=['total_alloc'], \n",
+    "    figsize=(8, 6), title=\"Internal time and memory\")\n",
+    "plt.savefig('internal_time_and_memory_linear.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 333,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# times = pd.read_csv('times.csv', \n",
+    "#                     names=['program', 'system', 'elapsed', 'memory'], \n",
+    "#                     index_col='program')\n",
+    "# times.index = times.index.str.slice(start=len('cabal run '))\n",
+    "# times.elapsed = pd.to_numeric(times.elapsed.str.slice(start=2))\n",
+    "# times"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 334,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>system</th>\n",
+       "      <th>elapsed</th>\n",
+       "      <th>memory</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>program</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>advent01</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>10212</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent02</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7876</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent03</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>10760</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent04</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>0.05</td>\n",
+       "      <td>14236</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent05</th>\n",
+       "      <td>0.07</td>\n",
+       "      <td>0.47</td>\n",
+       "      <td>49372</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent06</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7948</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent07</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>10164</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent08</th>\n",
+       "      <td>0.21</td>\n",
+       "      <td>0.98</td>\n",
+       "      <td>12252</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent09</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>6644</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent10</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7456</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent11</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.04</td>\n",
+       "      <td>11272</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent12</th>\n",
+       "      <td>0.11</td>\n",
+       "      <td>1.15</td>\n",
+       "      <td>61132</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent13</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>11504</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent14</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>11020</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent15</th>\n",
+       "      <td>0.18</td>\n",
+       "      <td>1.39</td>\n",
+       "      <td>53240</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent16</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>12128</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent17</th>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>11604</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent18</th>\n",
+       "      <td>0.03</td>\n",
+       "      <td>0.17</td>\n",
+       "      <td>11812</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent19</th>\n",
+       "      <td>0.15</td>\n",
+       "      <td>3.88</td>\n",
+       "      <td>12524</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent20</th>\n",
+       "      <td>0.34</td>\n",
+       "      <td>2.49</td>\n",
+       "      <td>207144</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent21</th>\n",
+       "      <td>0.16</td>\n",
+       "      <td>1.03</td>\n",
+       "      <td>22020</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent22</th>\n",
+       "      <td>0.14</td>\n",
+       "      <td>0.76</td>\n",
+       "      <td>12508</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent23</th>\n",
+       "      <td>2.29</td>\n",
+       "      <td>27.19</td>\n",
+       "      <td>98824</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent24</th>\n",
+       "      <td>4.00</td>\n",
+       "      <td>27.92</td>\n",
+       "      <td>12432</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent25</th>\n",
+       "      <td>0.19</td>\n",
+       "      <td>4.21</td>\n",
+       "      <td>13748</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "          system  elapsed  memory\n",
+       "program                          \n",
+       "advent01    0.01     0.02   10212\n",
+       "advent02    0.00     0.01    7876\n",
+       "advent03    0.00     0.01   10760\n",
+       "advent04    0.02     0.05   14236\n",
+       "advent05    0.07     0.47   49372\n",
+       "advent06    0.00     0.01    7948\n",
+       "advent07    0.00     0.01   10164\n",
+       "advent08    0.21     0.98   12252\n",
+       "advent09    0.00     0.01    6644\n",
+       "advent10    0.00     0.01    7456\n",
+       "advent11    0.01     0.04   11272\n",
+       "advent12    0.11     1.15   61132\n",
+       "advent13    0.00     0.01   11504\n",
+       "advent14    0.00     0.02   11020\n",
+       "advent15    0.18     1.39   53240\n",
+       "advent16    0.01     0.01   12128\n",
+       "advent17    0.00     0.02   11604\n",
+       "advent18    0.03     0.17   11812\n",
+       "advent19    0.15     3.88   12524\n",
+       "advent20    0.34     2.49  207144\n",
+       "advent21    0.16     1.03   22020\n",
+       "advent22    0.14     0.76   12508\n",
+       "advent23    2.29    27.19   98824\n",
+       "advent24    4.00    27.92   12432\n",
+       "advent25    0.19     4.21   13748"
+      ]
+     },
+     "execution_count": 334,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "times = pd.read_csv('times_raw.csv', \n",
+    "                    names=['program', 'system', 'elapsed', 'memory'], \n",
+    "                    index_col='program')\n",
+    "times.elapsed = pd.to_numeric(times.elapsed.str.slice(start=2))\n",
+    "times"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 335,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "system     float64\n",
+       "elapsed    float64\n",
+       "memory       int64\n",
+       "dtype: object"
+      ]
+     },
+     "execution_count": 335,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "times.dtypes"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 336,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>system</th>\n",
+       "      <th>elapsed</th>\n",
+       "      <th>memory</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>count</th>\n",
+       "      <td>25.000000</td>\n",
+       "      <td>25.000000</td>\n",
+       "      <td>25.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>mean</th>\n",
+       "      <td>0.316800</td>\n",
+       "      <td>2.874800</td>\n",
+       "      <td>27993.280000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>std</th>\n",
+       "      <td>0.890916</td>\n",
+       "      <td>7.520247</td>\n",
+       "      <td>43271.608039</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>min</th>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.010000</td>\n",
+       "      <td>6644.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>25%</th>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.010000</td>\n",
+       "      <td>10760.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>50%</th>\n",
+       "      <td>0.020000</td>\n",
+       "      <td>0.050000</td>\n",
+       "      <td>12128.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>75%</th>\n",
+       "      <td>0.160000</td>\n",
+       "      <td>1.150000</td>\n",
+       "      <td>14236.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>max</th>\n",
+       "      <td>4.000000</td>\n",
+       "      <td>27.920000</td>\n",
+       "      <td>207144.000000</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "          system    elapsed         memory\n",
+       "count  25.000000  25.000000      25.000000\n",
+       "mean    0.316800   2.874800   27993.280000\n",
+       "std     0.890916   7.520247   43271.608039\n",
+       "min     0.000000   0.010000    6644.000000\n",
+       "25%     0.000000   0.010000   10760.000000\n",
+       "50%     0.020000   0.050000   12128.000000\n",
+       "75%     0.160000   1.150000   14236.000000\n",
+       "max     4.000000  27.920000  207144.000000"
+      ]
+     },
+     "execution_count": 336,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "times.describe()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 337,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>total_time</th>\n",
+       "      <th>total_alloc</th>\n",
+       "      <th>total_ticks</th>\n",
+       "      <th>initial_capabilities</th>\n",
+       "      <th>system</th>\n",
+       "      <th>elapsed</th>\n",
+       "      <th>memory</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>program</th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>advent01</th>\n",
+       "      <td>0.06</td>\n",
+       "      <td>12058592</td>\n",
+       "      <td>192</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>10212</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent02</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>1818928</td>\n",
+       "      <td>72</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7876</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent03</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>8298128</td>\n",
+       "      <td>168</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>10760</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent04</th>\n",
+       "      <td>0.19</td>\n",
+       "      <td>54628920</td>\n",
+       "      <td>636</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>0.05</td>\n",
+       "      <td>14236</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent05</th>\n",
+       "      <td>2.26</td>\n",
+       "      <td>434487576</td>\n",
+       "      <td>7692</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.07</td>\n",
+       "      <td>0.47</td>\n",
+       "      <td>49372</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent06</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>2507624</td>\n",
+       "      <td>72</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7948</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent07</th>\n",
+       "      <td>0.04</td>\n",
+       "      <td>5589544</td>\n",
+       "      <td>132</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>10164</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent08</th>\n",
+       "      <td>6.57</td>\n",
+       "      <td>2499222744</td>\n",
+       "      <td>22404</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.21</td>\n",
+       "      <td>0.98</td>\n",
+       "      <td>12252</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent09</th>\n",
+       "      <td>0.01</td>\n",
+       "      <td>469984</td>\n",
+       "      <td>36</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>6644</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent10</th>\n",
+       "      <td>0.02</td>\n",
+       "      <td>2383248</td>\n",
+       "      <td>60</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>7456</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent11</th>\n",
+       "      <td>0.12</td>\n",
+       "      <td>39102056</td>\n",
+       "      <td>396</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.04</td>\n",
+       "      <td>11272</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent12</th>\n",
+       "      <td>6.69</td>\n",
+       "      <td>722598152</td>\n",
+       "      <td>22800</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.11</td>\n",
+       "      <td>1.15</td>\n",
+       "      <td>61132</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent13</th>\n",
+       "      <td>0.03</td>\n",
+       "      <td>4493632</td>\n",
+       "      <td>96</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>11504</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent14</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>15471000</td>\n",
+       "      <td>180</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>11020</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent15</th>\n",
+       "      <td>13.51</td>\n",
+       "      <td>2458599000</td>\n",
+       "      <td>46080</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.18</td>\n",
+       "      <td>1.39</td>\n",
+       "      <td>53240</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent16</th>\n",
+       "      <td>0.05</td>\n",
+       "      <td>8613496</td>\n",
+       "      <td>180</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>0.01</td>\n",
+       "      <td>12128</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent17</th>\n",
+       "      <td>0.20</td>\n",
+       "      <td>88071992</td>\n",
+       "      <td>672</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.00</td>\n",
+       "      <td>0.02</td>\n",
+       "      <td>11604</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent18</th>\n",
+       "      <td>1.73</td>\n",
+       "      <td>588717288</td>\n",
+       "      <td>5916</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.03</td>\n",
+       "      <td>0.17</td>\n",
+       "      <td>11812</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent19</th>\n",
+       "      <td>21.74</td>\n",
+       "      <td>2623652352</td>\n",
+       "      <td>74148</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.15</td>\n",
+       "      <td>3.88</td>\n",
+       "      <td>12524</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent20</th>\n",
+       "      <td>35.11</td>\n",
+       "      <td>3090735840</td>\n",
+       "      <td>119712</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.34</td>\n",
+       "      <td>2.49</td>\n",
+       "      <td>207144</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent21</th>\n",
+       "      <td>9.43</td>\n",
+       "      <td>2400838008</td>\n",
+       "      <td>32160</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.16</td>\n",
+       "      <td>1.03</td>\n",
+       "      <td>22020</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent22</th>\n",
+       "      <td>5.54</td>\n",
+       "      <td>1384180736</td>\n",
+       "      <td>18876</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.14</td>\n",
+       "      <td>0.76</td>\n",
+       "      <td>12508</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent23</th>\n",
+       "      <td>172.99</td>\n",
+       "      <td>38150694448</td>\n",
+       "      <td>589896</td>\n",
+       "      <td>12</td>\n",
+       "      <td>2.29</td>\n",
+       "      <td>27.19</td>\n",
+       "      <td>98824</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent24</th>\n",
+       "      <td>340.53</td>\n",
+       "      <td>66538931736</td>\n",
+       "      <td>1161240</td>\n",
+       "      <td>12</td>\n",
+       "      <td>4.00</td>\n",
+       "      <td>27.92</td>\n",
+       "      <td>12432</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>advent25</th>\n",
+       "      <td>25.72</td>\n",
+       "      <td>1910248008</td>\n",
+       "      <td>87696</td>\n",
+       "      <td>12</td>\n",
+       "      <td>0.19</td>\n",
+       "      <td>4.21</td>\n",
+       "      <td>13748</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "          total_time  total_alloc  total_ticks  initial_capabilities  system  \\\n",
+       "program                                                                        \n",
+       "advent01        0.06     12058592          192                    12    0.01   \n",
+       "advent02        0.02      1818928           72                    12    0.00   \n",
+       "advent03        0.05      8298128          168                    12    0.00   \n",
+       "advent04        0.19     54628920          636                    12    0.02   \n",
+       "advent05        2.26    434487576         7692                    12    0.07   \n",
+       "advent06        0.02      2507624           72                    12    0.00   \n",
+       "advent07        0.04      5589544          132                    12    0.00   \n",
+       "advent08        6.57   2499222744        22404                    12    0.21   \n",
+       "advent09        0.01       469984           36                    12    0.00   \n",
+       "advent10        0.02      2383248           60                    12    0.00   \n",
+       "advent11        0.12     39102056          396                    12    0.01   \n",
+       "advent12        6.69    722598152        22800                    12    0.11   \n",
+       "advent13        0.03      4493632           96                    12    0.00   \n",
+       "advent14        0.05     15471000          180                    12    0.00   \n",
+       "advent15       13.51   2458599000        46080                    12    0.18   \n",
+       "advent16        0.05      8613496          180                    12    0.01   \n",
+       "advent17        0.20     88071992          672                    12    0.00   \n",
+       "advent18        1.73    588717288         5916                    12    0.03   \n",
+       "advent19       21.74   2623652352        74148                    12    0.15   \n",
+       "advent20       35.11   3090735840       119712                    12    0.34   \n",
+       "advent21        9.43   2400838008        32160                    12    0.16   \n",
+       "advent22        5.54   1384180736        18876                    12    0.14   \n",
+       "advent23      172.99  38150694448       589896                    12    2.29   \n",
+       "advent24      340.53  66538931736      1161240                    12    4.00   \n",
+       "advent25       25.72   1910248008        87696                    12    0.19   \n",
+       "\n",
+       "          elapsed  memory  \n",
+       "program                    \n",
+       "advent01     0.02   10212  \n",
+       "advent02     0.01    7876  \n",
+       "advent03     0.01   10760  \n",
+       "advent04     0.05   14236  \n",
+       "advent05     0.47   49372  \n",
+       "advent06     0.01    7948  \n",
+       "advent07     0.01   10164  \n",
+       "advent08     0.98   12252  \n",
+       "advent09     0.01    6644  \n",
+       "advent10     0.01    7456  \n",
+       "advent11     0.04   11272  \n",
+       "advent12     1.15   61132  \n",
+       "advent13     0.01   11504  \n",
+       "advent14     0.02   11020  \n",
+       "advent15     1.39   53240  \n",
+       "advent16     0.01   12128  \n",
+       "advent17     0.02   11604  \n",
+       "advent18     0.17   11812  \n",
+       "advent19     3.88   12524  \n",
+       "advent20     2.49  207144  \n",
+       "advent21     1.03   22020  \n",
+       "advent22     0.76   12508  \n",
+       "advent23    27.19   98824  \n",
+       "advent24    27.92   12432  \n",
+       "advent25     4.21   13748  "
+      ]
+     },
+     "execution_count": 337,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "performance = performance.merge(times, left_index=True, right_index=True)\n",
+    "# performance.drop(index='advent15loop', inplace=True)\n",
+    "performance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 338,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Index(['total_time', 'total_alloc', 'total_ticks', 'initial_capabilities',\n",
+       "       'system', 'elapsed', 'memory'],\n",
+       "      dtype='object')"
+      ]
+     },
+     "execution_count": 338,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "performance.columns"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 339,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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VCn1XgmdnZ3piIEkabSIiKcys3PX9xw5Tj6UJEmFUv6UsDPPPfcc3d3dPPPMM80uRQM0ceJEpkyZwrhx45pdiiSpHy3XGHR3d7PHHnswdepUqud7VwvITDZu3Eh3dzfTpk1rdjmSpH603E8JzzzzDHvttZdNQYuJCPbaay9HeiSp5FquMQBsClqU202Syq8lG4Mymjp1Kr///e8b/rwzZ87k1ltvbfjzSpLaU8vNMehr6vzlw5q3fsGbhzVPkqRW4ojBIHz961/niCOO4OCDD+af/umf6Onp2e72OXPmcNhhh/GqV72KRYv+8xTtu+++Ox/+8Ic59NBDmTVrFo8++igAF198MQcccABdXV2cfPLJADz55JO8613v4vDDD+eQQw7huuuuA+Dpp5/m5JNPpquri5NOOomnn276QbIkSW2klI1BRMyOiEV9P3DLYO3atSxZsoSbbrqJ1atX09HRwTe+8Y3t7nPZZZdx2223ceutt3LxxRezceNGoPJhf+ihh3L77bdz9NFH88lPfhKABQsWcMcdd7BmzRoWLlwIwGc+8xn+9m//llWrVnHDDTdw9tln8+STT/LlL3+ZSZMmsWbNGj72sY9x2223NfYPIElqa6X8KSEzlwHLOjs7z2x2LX396Ec/4rbbbuPwww8HKt/gX/ziF293n4svvpjvfOc7AGzYsIH77ruPvfbaizFjxnDSSScBcOqpp3LiiScC0NXVxSmnnMKcOXOYM2cOAD/84Q9ZunQpF154IVDZG+PBBx9k5cqVvP/97y8e19XVNeKvWZI0epSyMSizzOQd73gHF1xwwXbrFy9eDMBPfvITrr/+em6++WYmTZrEzJkz+91Fr3eW/vLly1m5ciVLly7lU5/6FHfffTeZybe+9S1mzJjR7+MkSRpupfwpocxmzZrFtddeyyOPPALAY489xgMPPFDcvnnzZvbcc08mTZrEPffcw89//vPitm3btnHttdcCcOWVV/La176Wbdu2sWHDBl7/+tfzuc99jk2bNvHEE09w7LHH8sUvfpHec1nccccdALzuda8rfrq46667WLNmTUNet6Q2d97k7S+j2NT5y7e7jDaOGAzQAQccwKc//WmOOeYYtm3bxrhx47j00kuL24877jgWLlxIV1cXM2bM4Mgjjyxu6+zs5O677+awww5j8uTJLFmyhJ6eHk499VQ2b95M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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['elapsed', 'memory']].plot.bar(\n",
+    "    logy=True, secondary_y=['memory'], \n",
+    "    figsize=(8, 6), title=\"External time and memory\")\n",
+    "plt.savefig('external_time_and_memory_log.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 340,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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LNhQKIwePZoHH3xwU//MZmZbotaI2C+3zGy7g6S+ZAXDryLiN6n5+XTKgfTzhdTeAuya6z4cWJ7ah1dp36iPpCZgMLCqg1jtctEAjBw5kve///1stdVW7L333kycOBFJvP/972fp0qVAdmvrGTNmMGbMmA13unz22WcB+OhHP8q2227LjjvuyODBgznssMMANvRfs2YNL730EgcddBAA06ZN46677trw/JXbawN84Qtf4Be/+AUAv/jFLzjuuOPelu+KFSvYcccdN2rLx6h46aWXWLt2Lf/4j/8IwKc//emNtk+cOJHBgwfTv39/9tprr41u1JXXp08f+vXrx9q1a9v/I5qZWZeluQWXAosj4vzcprlA5WqGacANufYp6YqIkWQTHh9IpzLWShqfYh7bpk8l1pHA7Wnew++BgyUNSRMgD05t7SrfnIY62HrrrTesb7XVVhseb7XVVhsmALZ3a+v777+/UP+ODBz4968lP+CAA1i6dCl33nkn69ev3+h0QsWAAQPednvufIyKzu4rks+7T58+Heb6xhtv0L9//w7jmZlZlx0AfBZYJGlBajsdmAFcI+l44FngKICIeEzSNcDjZFdenBgR61O/E4DZwADg5rRAVpRcIWkJ2QjDlBRrlaSzgcpQ8ncjYlVHyXqkoaD2bm1dxODBgxkyZAj//d//DcAVV1yxYdShmmOPPZapU6dWHWUA2HPPPVmyZEmnzztkyBC23XbbDbfzvvrqqwvl27dv343mUaxcuZIdd9zxbadJzMxs00TE3RGhiGiOiDFpuSkiVkbExIgYlX6uyvU5JyLeExF7RMTNufb5ETE6bTspjSYQEesi4qiI2D0ixkXEX3J9ZqX23SPiF53l66KhoDPOOIM333yT5uZmRo8ezRlnnNGl/pdddhmnnnoqzc3NLFiwgG9/+9vt7nvMMcewevVqpk6dWnX7xz/+8Y1Ob3Tk0ksvZfr06ey///5EBIMHd351yvTp02lubt4wEfKOO+7g0EMPLfR8ZmbWe/nW2CV07bXXcsMNN3DFFVe0u88RRxzBD37wA0aNGtVhrFdeeYVBgwYBMGPGDFasWMFPfvKTLuXziU98gu9///tvOzUDPn5mpdULbo3dU7e09q2xe47nNJTMV77yFW6++WZuuummDverFACdFQ033ngj3//+92ltbWW33XZj9uzZXcrnb3/7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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['elapsed', 'memory']].plot.bar(\n",
+    "    logy=False, secondary_y=['memory'], \n",
+    "    figsize=(8, 6), title=\"External time and memory\")\n",
+    "plt.savefig('external_time_and_memory_linear.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 341,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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HgNJklSqxBiDvrz00kt0dXWxYsWKgV+sShgzZgzjxo1j3XXXbXUpkqQ1VNnGoKuri4022oitttqK2sXfVGWZyZNPPklXVxdbb711q8uRJK2hyh5KWLFiBZtuuqlNQZuICDbddFP38EhSm6tsYwDYFLQZPy9Jan+VbgwkSVJzVXaMQW9bTbuyoXmLpx+82uefeeYZLrzwQo4//vj+MxYv5je/+Q1HH3306re1eDEf/OAHueeee/p8fsGCBSxdupQPfOADAMyePZt7772XadOmrVGeJElryj0G/XjmmWf4wQ9+sNrXLF68mAsvvHDI21qwYAFz584tH3/oQx/qtymQJGk42Rj0Y9q0afz3f/83EydO5KSTTuKkk05ixx13ZKeddmLWrFnla2644QYmTpzIt7/9bRYvXsx73/tedt11V3bddVd+85vfDLidF198kVNOOYVZs2YxceJEZs2axcyZMznhhBMAePTRRzn88MPZeeed2XnnnV+V+eCDD7LLLrswf/58Fi5cyKRJk5g4cSITJkzggQceaPwbI0lqhMrOfNg2hxKabfr06dxzzz0sWLCAyy67jHPOOYc777yTJ554gt133533ve99TJ8+nW9961tcccUVADz//PNcffXVjBkzhgceeIApU6Zw6623rnY7o0eP5h//8R+59dZbOeusswCYOXNm+fyJJ57I5MmT+fnPf053dzfLly/n6aefBuD+++/nqKOO4kc/+hETJ07kc5/7HJ///Of5+Mc/zosvvkh3d/fwvDmSpKHqzsyprS6iLzYGdbjxxhuZMmUKHR0dvOENb2Dy5MnMnz+fjTfe+BWve+mllzjhhBNYsGABHR0d/OEPfxjytq+99lrOP/98ADo6Ohg7dixPP/00jz/+OIceeiiXXXYZO+ywAwDvete7OP300+nq6uKII45g2223HfL2JUlrl4Y3BhGxDnAasDFwa2b+R6O30Wz1Xk/i29/+Nm94wxu48847efnllxkzZsyw1TR27Fi23HJLbrrpprIxOProo9ljjz248sorOeCAA/jhD3/I+9///mGrQZLaWV+D2heP6TWY/NRlTaqmOuoaYxAR50XEYxFxT6/lB0bE/RGxKCJWjZY7FNgCeAnoamy5zbPRRhvx7LPPAvC+972PWbNm0d3dzeOPP868efOYNGnSK14DsGzZMt74xjeyzjrr8OMf/7juXfm9c3raZ599OPvsswHo7u7mz3/+M1A7BHH55Zdz/vnnlwMgH3zwQbbZZhtOPPFEPvShD3HXXXet8c8vSW3l1LGvvGmN1bvHYCZwFnD+qgUR0QF8H9iPWgMwPyJmA9sBN2fmv0XEpcCvGlHoQKcXNtqmm27Ke97zHnbccUcOOuggJkyYwM4770xEcMYZZ7D55puz6aabMmrUKHbeeWeOOeYYjj/+eI488kguueQS9t57bzo767tw1t5778306dOZOHEiX/7yl1/x3He/+12mTp3KueeeS0dHB2effTZvfOMbAejs7OSKK65gv/32o7Ozk3vvvZcLLriAddddl80335xTTjml4e+LJGlkq/uyyxGxFXBFZu5YPH4XcGpmHlA8XvUbbQnwYmb+NCJmZebHBsru67LL9913H9tvv33dP4iqwc9NUkv03ktQxyGAVh5KGKmXXd6CWhOwSlex7GfAARHxPWBefytHxNSIuDUibl25cuUQypAkSY0ylMGHfU2Mn5n5PHDsQCtn5gxgBtT2GAyhjrZx1VVX8aUvfekVy7beemt+/vOft6giSZJeaSiNQRewZY/H44ClQytnZDvggAM44IADWl2GJEn9GsqhhPnAthGxdUSMBo4CZg8mICIOiYgZTsQjSVI11Hu64kXAzcB2EdEVEcdm5krgBOAq4D7gp5m5cDAbz8w5mTm1o6NjsHVLkqRhUNehhMyc0s/yucDcvp6TJEntx4sorYGtttqKJ554ounb3Wuvvfq99sKHP/xhHnzwwT6f+/SnP82999672uxjjjmGSy+99FXLe19B8u677+aYY46pv2hJUltp6bUSiqtKHbLeeusN/OJGz2Q1gqa5XLhwId3d3WyzzTaveq67u5sf/vCHa5y9qjE4+ujaub077bQTXV1dPPTQQ7z5zW9e41xJUjW1dI9B1ccYXHDBBeVljP/u7/6uzymODzvsMHbbbTd22GEHZsyYUS7fcMMN+eIXv8iuu+7KPvvsw+OPPw7AmWeeyfjx45kwYQJHHXUUAM899xyf+tSn2H333dlll134xS9+AcALL7zAUUcdxYQJE/jYxz7GCy+80GedP/nJTzj00ENfse1TTjmFPfbYg5tvvvkVexrOPfdc3va2t7HXXntx3HHHlZd3Bpg3bx7vfve72Wabbcq9B70vLQ1wyCGHcPHFF6/x+ypJqu5llz2U0I/77ruPWbNmcdNNN5VXS/zJT37yqtedd9553Hbbbdx6662ceeaZPPnkk0Dtl/2uu+7K7bffzuTJk/n6178O1C7nfMcdd3DXXXdxzjnnAHD66afz/ve/n/nz53Pddddx0kkn8dxzz3H22WezwQYbcNddd/HVr36V2267rc9ab7rpJnbbbbfy8XPPPceOO+7Ib3/7W/bcc89y+dKlSznttNO45ZZbuPrqq/n973//ipxHHnmEG2+8kSuuuIJp06aV9b73ve9lwYIFfOELXwDgHe94BzfccMOavrWSpOKyy5k5p9WF9NY+hxKa7Fe/+hW33XYbu+++O1D7632zzTZ71evOPPPMcoKiJUuW8MADD7Dpppuyzjrr8LGP1WaD/sQnPsERRxwBwIQJE/j4xz/OYYcdxmGHHQbAL3/5S2bPns23vvUtAFasWMFDDz3EvHnzOPHEE8v1JkyY0GetjzzyCK9//evLxx0dHRx55JGvet3vfvc7Jk+ezGtf+1oAPvKRj7zi0tCHHXYY66yzDuPHj+fRRx/t973ZbLPNWLrUKSskaSRqaWNQdEpzOjs7j2tlHX3JTP72b/+Wb37zm/2+5vrrr+eaa67h5ptvZoMNNmCvvfZixYoVfb42ojZR5JVXXsm8efOYPXs2p512GgsXLiQzueyyy9huu+36XW911l9//Vdsd8yYMfR1eGag62L0bNBW99oVK1aw/vrrD1iXJKn9eCihH/vssw+XXnopjz32GABPPfUUf/rTn17xmmXLlvGa17yGDTbYgN///vfccsst5XMvv/xyeZz+wgsvZM899+Tll19myZIl7L333pxxxhk888wzLF++nAMOOIDvfe975S/jO+64A6hd7nnV4Yt77rmn38sob7/99ixatGjAn2nSpEn8+te/5umnn2blypVcdtllA67T1yWh//CHP7DjjjsOuK4kqf3YGPRj/PjxfOMb32D//fdnwoQJ7LfffjzyyCOveM2BBx7IypUrmTBhAieffDLvfOc7y+c6OztZuHAhu+22G9deey2nnHIK3d3dfOITn2CnnXZil1124Qtf+AKbbLIJJ598Mi+99BITJkxgxx135OSTTwbgs5/9LMuXL2fChAmcccYZTJo0qc9aDz74YK6//voBf6YtttiCr3zlK+yxxx7su+++jB8/nrFjV3+2x4QJE8pLS68a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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['total_ticks', 'elapsed']].plot.bar(\n",
+    "    logy=True, secondary_y=['elapsed'], \n",
+    "    figsize=(8, 6), title=\"Internal vs external time\")\n",
+    "plt.savefig('internal_external_time.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 357,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfcAAAGpCAYAAACQ8X+gAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvcElEQVR4nO3deZwcBZn/8c9DDhMSznBKQIIbkBAn4fYAA3IEUBcQDwIqKBiVRdSXy4LuDxYXWbN4oIiAWcHoApJFBGNkBeQwckqAEAhnFiIJyXKEQxIIkPD8/uhKthlmMj2TmZ6a4vN+vfqVrutbz3Q1PF3V1VWRmUiSpOpYq7cLkCRJ3cvmLklSxdjcJUmqGJu7JEkVY3OXJKlibO6SJFWMzV3qJRFxY0Qc29t1lFFEzIuIfTsx/5yI2KvnKpL6Fpu7KqUzTcHm2r7ONtdmiogpEfHt+nGZuUNm3thLJUmlY3OXuigi+vV2DWUUNf6/RepF/geoyoqIoyPipoj4XkQ8FxGPRcSBxbQzgD2BcyJiSUScU4x/V0RcGxHPRsRDEfGJurwpEXFeRFwVEUuBvYs93H+MiNkR8UJETI2IQcX8G0TE9Ih4ulj/9IgY3kDdb4+IlyNiw7pxO0bEMxExICL+LiL+VKzvmYiYupqs90TELRHxfETcs/LQdUS8r1h2y2J4TDHPuyLiP4GtgN8Vr80/rS6rmHZjRJwRETcDLwHbRERGxBcj4pHi7/9JREQx/zsj4vqIWFzUcXFErN/AazMROBL4p6K23xXjVx1piIjTIuKyiLgoIl6MiHsjYtuI+EZEPBUR8yNi/7rM9SLigohYFBFPRMS3/eCmPi8zffiozAOYB+xbPD8aeA34PNAP+BKwEIhi+o3AsXXLDgHmA58F+gM7Ac8AOxTTpwAvAO+n9sF4ULG+vwBvBzYEHgC+WMw/DDgMWBtYB7gMuLJufW9Yf6u/43rg83XD3wXOL57/Cvjnuhr2aCdjC2AxcFAx737F8MbF9DOK9QwGZgPHt/U6Nph1I/A4sEPx2g0AEpgOrE/tw8LTwAHF/H9XZLwN2BiYAfywvfW3+rumAN9ezXY/DVgGjC9q+SXwWPGaDSjeD4/VLXsl8NNi+29SbM8v9PZ72YePNXn06p57RFxYfJK+r8H5PxER9xcnz1zS0/WpEv6amf+RmSuAXwCbA5u2M++HgXmZ+fPMXJ6ZdwGXAx+rm+e3mXlzZr6emcuKcWdn5sLMfBb4HTAWIDMXZ+blmflSZr5IrZmOa7DuS4AJUDvMDRxejIPaB5Z3AG/PzGWZeVM7GZ8CrsrMq4p6rwVmUmvQUGuC61FrZguBn6ymno6yAKZk5pzitXutGDcpM5/PzMeBG/i/12ZuZl6bma9k5tPAD2j8tWnEnzPz6sxcTu1D1cZFLa8BlwJbR8T6EbEpcCDw1cxcmplPAWdRe72lPqu3D8tPAQ5oZMaIGAl8A3h/Zu4AfLXnylKF/O/KJ5n5UvF0aDvzvgPYvTjs/HxEPE/tEPBmdfPMX906qB2SHgoQEWtHxE8j4q8R8Tdqe6frN3jI99fAeyPi7cAHqO0F/7mY9k9AAH8pPuh+bjV/z8db/T17UPuAQ9HopgCjge9n5uruIrXarEJnXptNIuLS4jD434CLgI1Ws/7OerLu+cvAM8UHvJXDFLW8g9re/KK6v+un1PbgpT6rf2+uPDNnRMTW9eMi4p3U9iA2pvY/g89n5oPUDqX9JDOfK5Z9qsnlqnpaN7P5wJ8yc79OLLM6Xwe2A3bPzP+NiLHA3dQa8+oLy3w+Iq4BPgFsD/xqZfPNzP+l9t8DEbEH8MeImJGZc9v4e/4zMz/f1joiYgvgX4CfA9+PiF0z85V2/s7VZrWzzOp8p5i/JTMXR8QhwDkNLtudt7KcD7wCbFTs5UuV0Nt77m2ZDHw5M3cG/hE4txi/LbBtRNwcEbdFREN7/NJqPAlsUzc8ndp77NPFiWsDImLXiNi+i/nrUNtLfL44Oe5fOrn8JcBnqH1vv+prqIj4eN2Jec9Ra3Yr3rw4FwEfiYjxEdEvIgZFxF4RMbw41D8FuAA4BlgEnF63bOvXpt2sTv5NK60DLKH22mwBnNiJZVvX1mWZuQi4htqHm3UjYq3iZL/u/IpAarpSNfeIGAq8D7gsImZROzy28rBff2AksBe17yJ/1sjZtdJq/Aj4WHEm99nF9+L7U/u+dSG1Q8r/Tu2kr674IbWT1Z4BbgP+0Mnlp1F7zz+ZmffUjd8VuD0ilhTzfCUzH2u9cGbOBw4GvkntZLb51JroWsAJ1M49OKU4IvBZ4LMRsWex+HeA/1ccqv7HDrK64lvUTlh8Afg98JtOLHsBMKqo7courr/eZ4CBwP3UPiz9mjd+3SD1ObH6r9maUEDtsPz0zBwdEesCD2Xmm/7Diojzgdsyc0oxfB1wcmbe0cx6JUkqu1LtuWfm34DHIuLjsOpiGGOKyVcCexfjN6J2mP7R3qhTkqQy6+2fwv0KuBXYLiIWRMQx1M5OPiYi7gHmUDsUCHA1sDgi7qf2k5oTM3Nxb9QtSVKZ9fpheUmS1L1KdVhekiStOZu7JEkV02sXsVlrrbVy8ODBvbV6SZKa7qWXXsrM7PEd6w6be0RcSO2a209l5ug2ph8JnFQMLgG+1Oo3uW0aPHgwS5cu7WS5kiT1XRHxcsdzrblGPj1MYfXXf38MGJeZLdSucDW5G+qSJEld1OGee1vXf281/Za6wduArl6OUpIkdYPuPu5/DPDf3ZwpSZI6odtOqIuIvak19z1WM89EYCLAwIED3zT9tddeY8GCBSxbtuxN01ROgwYNYvjw4QwYMKC3S5EkFRq6iE399d/bmd4CXAEcmJkPN7LiIUOGZOsT6h577DHWWWcdhg0bRu2mVSqzzGTx4sW8+OKLjBgxorfLkaTSi4iXMnNIT69njQ/LR8RW1O7o9OlGG3t7li1bZmPvQyKCYcOGeaRFkkqmkZ/C/YrabVY3iogF1O5JPQAgM88HTgWGAecWTXl5Zu7S1YJs7H2L20uSyqeRs+UndDD9WODYbqtIkiStkV67Ql0jtj75992aN2/Sh1Y7/fnnn+eSSy7huOOOaz9j3jxuueUWjjjiiNWva948PvzhD3Pfffe1OX3WrFksXLiQgw46CIBp06Zx//33c/LJJ3cpT5Kklby2fJ3nn3+ec889d7XzzJs3j0suuWSN1zVr1iyuuuqqVcN///d/325jlySpM2zudU4++WT+53/+h7Fjx3LiiSdy4oknMnr0aN797nczderUVfP8+c9/ZuzYsZx11lnMmzePPffck5122omddtqJW265pYO1wKuvvsqpp57K1KlTGTt2LFOnTmXKlCkcf/zxADz55JMceuihjBkzhjFjxrwp89FHH2XHHXfkjjvuYM6cOey2226MHTuWlpYWHnnkke5/YSRJfUqpD8s326RJk7jvvvuYNWsWl19+Oeeffz733HMPzzzzDLvuuisf+MAHmDRpEt/73veYPn06AC+99BLXXnstgwYN4pFHHmHChAnMnDlztesZOHAg//qv/8rMmTM555xzAJgyZcqq6SeccALjxo3jiiuuYMWKFSxZsoTnnnsOgIceeojDDz+cn//854wdO5Yvf/nLfOUrX+HII4/k1VdfZcWKFT3z4kiS+gybeztuuukmJkyYQL9+/dh0000ZN24cd9xxB+uuu+4b5nvttdc4/vjjmTVrFv369ePhh9fo14AAXH/99fzyl78EoF+/fqy33no899xzPP300xx88MFcfvnl7LDDDgC8973v5YwzzmDBggV89KMfZeTIkWu8fklS3+Zh+XY0cnEfgLPOOotNN92Ue+65h5kzZ/Lqq6/2WE3rrbceW265JTfffPOqcUcccQTTpk1j8ODBjB8/nuuvv77H1i9J6hvcc6+zzjrr8OKLLwLwgQ98gJ/+9KccddRRPPvss8yYMYPvfve7PPHEE6vmAXjhhRcYPnw4a621Fr/4xS8aPixev67W9tlnH8477zy++tWvsmLFilW3xh04cCBXXnkl48ePZ+jQoRxxxBE8+uijbLPNNpxwwgk8+uijzJ49mw9+8INr+EpIUjW19SuseYNa/frptBeaVE3PKXVz7+ina91t2LBhvP/972f06NEceOCBtLS0MGbMGCKCM888k80224xhw4bRv39/xowZw9FHH81xxx3HYYcdxmWXXcbee+/NkCGNXVVw7733ZtKkSYwdO5ZvfOMbb5j2ox/9iIkTJ3LBBRfQr18/zjvvPDbffHMAhgwZwvTp09lvv/0YMmQI999/PxdddBEDBgxgs80249RTT+3210WS1Lc0dG35ntDWteUfeOABtt9++16pR13ndpPUV/T2nnufuba8JEkql1Iflq+Cq6++mpNOOukN40aMGMEVV1zRSxVJkqrO5t7Dxo8fz/jx43u7DEnSW4iH5SVJqhibuyRJFeNheUlS33Taeq2G+/7v07uLe+4N2nrrrXnmmWeavt699tqr3WvVf+xjH+PRRx9tc9qxxx7L/fffv9rso48+ml//+tdvGt/6znf33nsvRx99dONFS5J6Vbn33Ft/KlvjvOp8qpszZw4rVqxgm222edO0FStW8LOf/azL2Sub+8p71r/73e9mwYIFPP7442y11VZdzpUkNYd77q1cdNFFq26h+oUvfKHNy8kecsgh7Lzzzuywww5Mnjx51fihQ4fy9a9/nZ122ol99tmHp59+GoCzzz6bUaNG0dLSwuGHHw7A0qVL+dznPseuu+7KjjvuyG9/+1sAXn75ZQ4//HBaWlr45Cc/ycsvv9xmnRdffDEHH3zwG9Z96qmnsvvuu3Prrbe+YY//ggsuYNttt2Wvvfbi85///KpbywLMmDGD973vfWyzzTar9uJb39YW4CMf+QiXXnppl19XSVLz2NzrPPDAA0ydOpWbb7551V3eLr744jfNd+GFF3LnnXcyc+ZMzj77bBYvXgzUGvZOO+3EXXfdxbhx4/jWt74F1G4le/fddzN79mzOP/98AM444ww++MEPcscdd3DDDTdw4oknsnTpUs477zzWXnttZs+ezT//8z9z5513tlnrzTffzM4777xqeOnSpYwePZrbb7+dPfbYY9X4hQsXcvrpp3Pbbbdx7bXX8uCDD74hZ9GiRdx0001Mnz6dk08+eVW9e+65J7NmzeJrX/saALvssgt//vOfu/rSSpKaqNyH5Zvsuuuu484772TXXXcFanvRm2yyyZvmO/vss1ddhGb+/Pk88sgjDBs2jLXWWotPfvKTAHzqU5/iox/9KAAtLS0ceeSRHHLIIRxyyCEAXHPNNUybNo3vfe97ACxbtozHH3+cGTNmcMIJJ6xarqWlpc1aFy1axMYbb7xquF+/fhx22GFvmu8vf/kL48aNY8MNNwTg4x//+BtuS3vIIYew1lprMWrUKJ588sl2X5tNNtmEhQsXtjtdklQeNvc6mclRRx3Fd77znXbnufHGG/njH//Irbfeytprr81ee+3FsmXL2pw3IgD4/e9/z4wZM5g2bRqnn346c+bMITO5/PLL2W677dpdbnUGDx78hvUOGjSIfv36tfk3rc7b3va2huZdtmwZgwcP7rAuSVLv87B8nX322Ydf//rXPPXUUwA8++yz/PWvf33DPC+88AIbbLABa6+9Ng8++CC33Xbbqmmvv/76qu+tL7nkEvbYYw9ef/115s+fz957782ZZ57J888/z5IlSxg/fjw//vGPVzXUu+++G6jdanblVwH33Xcfs2fPbrPW7bffnrlz53b4N+2222786U9/4rnnnmP58uVcfvnlHS7T1u1oH374YUaPHt3hspKk3mdzrzNq1Ci+/e1vs//++9PS0sJ+++3HokWL3jDPAQccwPLly2lpaeGUU07hPe95z6ppQ4YMYc6cOey8885cf/31nHrqqaxYsYJPfepTvPvd72bHHXfka1/7Guuvvz6nnHIKr732Gi0tLYwePZpTTjkFgC99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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['total_ticks', 'elapsed']].plot.bar(\n",
+    "    logy=False, secondary_y=['elapsed'], \n",
+    "    figsize=(8, 6), title=\"Internal vs external time\")\n",
+    "plt.savefig('internal_external_time_linear.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 342,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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ec1rGlrvpJNOYrfdduOnP/0p1157LUceeSSLFy/mq1/9KhMmTODee+8F4Omnn27OmyFJGlYq1RA0Moeg1W6++WZmzpxJR0cHr33ta9lvv/1YtGgRW2yxxXqvW716NccffzyLFy+mo6OD3/72t3XlN7rezTffvO6v//e85z0sX76clStXcs0113DRRRete92WW27Z4E8qSRoJKtUQZOYCYEFnZ+exra5lQzJfce6kPn3rW9/ita99LXfffTcvv/wy48aN2yjr9VVPRJCZHvYnaWAnT+j1eGVr6qiA3hPW65lwPlw4h6ABm2++Oc8++ywA++67L/Pnz2ft2rU88cQT3Hjjjey5557rvQZg5cqVvP71r2fUqFGcf/759HXSpb40ut6+++7LD3/4QwCuv/56tt56a7bYYgve//73c+aZZ657nbsMJEl9qdQIQSNa0bVttdVW7LPPPkydOpWDDjqIadOmscsuuxARfOMb3+B1r3sdW221FZtssgm77LILn/jEJzjuuOM49NBDueSSS3j3u99NZ2dnXdtqdL2TTz6Zo446imnTprHpppty7rnnAvDFL36Rf/zHf2Tq1Kl0dHRw0kkn8ZGPfGTI74UkaXiJeoe+y9BjDsGxvU91e//997PTTju1pjANmZ+fVGHuMlinlbsMIuJPwHnAgmIXeqkqtcug6uchkCRpI1qbmbNa0QxAG+8yGC6uuuoqTjzxxPWWTZo0iZ/85CctqkiSNBLZELTYgQceyIEHHtjqMiRJI1ylGoJ2Og+BJEnDiXMIJElStRoCSZLUGjYEw9zpp5/Oeeed1+dzZ599dr/PdZs3bx7HH398n8997WtfW3f/pZdeYt9992XNmjWDL1aS1DKVmkPQkN7HzQ45r32Ou12zZg2bbLLhj27NmjWcc8453HnnnX0+96lPfWpIdXzta1/j85//PABjxozhgAMOYP78+RxxxBFDypUklc8RgjotW7aMt7zlLRxzzDFMnTqVI444gmuuuYZ99tmHyZMnc/vttwPw/PPP88lPfpI99tiD3Xbbjcsuuwyo/aV9yCGHMGPGDCZNmsSZZ57JN7/5TXbbbTf22msvnnrqKQAWL17MXnvtxbRp0/jwhz+87lTD+++/P5///OfZb7/9OOWUU5g0aRKrV68G4JlnnmGHHXZY97jbtddey+67776ueeiZ8e1vf5uTTz6Z0047DYBFixYxbdo09t5773WXde722GOPMX36dCZPnsznPvc5oHaZ5xdffJFdd911XQNwyCGHrDt9siSpvVSqIYiIGRExt97z/Zdt6dKlfOYzn+Gee+7hN7/5DRdccAE333wzp5122rrh81NOOYX3vOc9LFq0iOuuu44TTjiB559/HoAlS5ZwwQUXcPvtt/OFL3yBTTfdlLvuuou999573dD9kUceyde//nXuuecedt55Z77yla+s2/6KFSu44YYbOOmkk9h///258sraGbUuuugiDj30UEaPHr1evbfccgtve9vb1lvWnfHZz352veVHHXUUZ599Nrfddhu9J3UuXryY+fPnc++99zJ//nweeeQR5syZw/jx41m8ePG6JmDq1KksWrRoqG+zJKkFKtUQVP0og0mTJrHzzjszatQo3vrWt3LAAQcQEey8884sW7YMgJ///OfMmTOHXXfdlf33359Vq1bx+9//HoB3v/vdbL755myzzTZMmDCBGTNmAKxbf+XKlaxYsYL99tsPgL//+7/nxhtvXLf9j3/84+vuH3PMMXz/+98H4Pvf/z5HHXXUK+r9wx/+wDbbbLPesp4Z3VasWMGzzz7LO97xDgAOP/zw9Z4/4IADmDBhAuPGjWPKlCn87ne/6/P96ejoYMyYMetd3EmSyrDD7CvXu6lx7TuHoAV6nh9h1KhR6x6PGjVq3WS6zOTSSy9lxx13XG/dX/7yl3WtP5CeFzjaZ599WLZsGTfccANr165db4i/2/jx4+l9TYi+LpK0oetZ9Ky7o6NjwFr/9Kc/1X2JZ0lSdVRqhGA4OPDAAznjjDPW/ZK966676l53woQJbLnlltx0000AnH/++etGC/py5JFHMnPmzD5HBwB22mknli5dusHtbrnllmy++eb84he/AGq7IOoxevTo9eYtLF++nG222eYVuy4kSdVnQ9BkX/rSl1i9ejXTpk1j6tSpfOlLX2po/XPPPZcTTjiBadOmsXjxYr785S/3+9ojjjiCp59+mpkzZ/b5/EEHHbTeLoeBfO9732PWrFnsvffeZCYTJmz4KI5Zs2Yxbdq0dZMKr7vuOj7wgQ/UtT1JUrVU6vLH3To7O7N7Il43L5/7Sj/60Y+47LLLOP/88/t9zYc//GG+8Y1vMHny5AGznnvuOTbbbDMA5syZwx/+8Ae+/e1vN1TPRz7yEU49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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['total_alloc', 'memory']].plot.bar(\n",
+    "    logy=True, secondary_y=['memory'], \n",
+    "    figsize=(8, 6), title=\"Internal vs external memory\")\n",
+    "plt.savefig('internal_external_memory_log.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 343,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 576x432 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "# performance[['total_ticks', 'elapsed']].plot.bar(logy=True)\n",
+    "performance[['total_alloc', 'memory']].plot.bar(\n",
+    "    logy=False, secondary_y=['memory'], \n",
+    "    figsize=(8, 6), title=\"Internal vs external memory\")\n",
+    "plt.savefig('internal_external_memory_linear.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 344,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [],
+   "source": [
+    "# performance['elapsed_adj'] = performance['elapsed'] - 0.28\n",
+    "# performance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 345,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [],
+   "source": [
+    "# performance[['total_time', 'elapsed_adj']].plot.bar(logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 356,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 1440x360 with 3 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, ax = plt.subplots(ncols=3, figsize=(20,5))\n",
+    "\n",
+    "performance['elapsed'].plot.bar(ax=ax[2],\n",
+    "    logy=True, \n",
+    "    title=\"Run times (wall clock), log scale\",\n",
+    "#     figsize=(10,8)\n",
+    "    )\n",
+    "ax[2].set_xlabel('Program')\n",
+    "\n",
+    "performance['elapsed'].plot.bar(ax=ax[0],\n",
+    "    logy=False, \n",
+    "    title=\"Run times (wall clock), linear scale\",\n",
+    "#     figsize=(10,8)\n",
+    "    )\n",
+    "ax[0].set_xlabel('Program')\n",
+    "\n",
+    "performance['elapsed'].plot.bar(ax=ax[1],\n",
+    "    logy=False, \n",
+    "    ylim=(0, 5.2),\n",
+    "    title=\"Run times (wall clock), truncated linear scale\",\n",
+    "#     figsize=(10,8)\n",
+    "    )\n",
+    "ax[1].set_xlabel('Program')\n",
+    "\n",
+    "plt.savefig('run_times_combined.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 347,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 936x360 with 2 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, ax = plt.subplots(ncols=2, figsize=(13,5))\n",
+    "\n",
+    "performance['memory'].plot.bar(ax=ax[0],\n",
+    "    logy=True, \n",
+    "    title=\"Memory used, log scale\",\n",
+    "#     figsize=(10,8)\n",
+    "    )\n",
+    "ax[0].set_xlabel('Program')\n",
+    "\n",
+    "performance['memory'].plot.bar(ax=ax[1],\n",
+    "    logy=False, \n",
+    "    title=\"Memory used, linear scale\",\n",
+    "#     figsize=(10,8)\n",
+    "    )\n",
+    "ax[1].set_xlabel('Program')\n",
+    "\n",
+    "plt.savefig('memory_combined.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 348,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [],
+   "source": [
+    "# ax = performance['elapsed_adj'].plot.bar(logy=False, \n",
+    "#     title=\"Run times (wall clock), linear scale\",\n",
+    "#     figsize=(10,8))\n",
+    "# ax.set_xlabel('Program')\n",
+    "# plt.savefig('run_times_linear.png')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 349,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Index(['total_time', 'total_alloc', 'total_ticks', 'initial_capabilities',\n",
+       "       'system', 'elapsed', 'memory'],\n",
+       "      dtype='object')"
+      ]
+     },
+     "execution_count": 349,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "performance.columns"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 350,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='program'>"
+      ]
+     },
+     "execution_count": 350,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance['memory'].plot.bar()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 351,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='elapsed', ylabel='total_alloc'>"
+      ]
+     },
+     "execution_count": 351,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.plot.scatter('elapsed', 'total_alloc', logx=True, logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 352,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='memory', ylabel='total_alloc'>"
+      ]
+     },
+     "execution_count": 352,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.plot.scatter('memory', 'total_alloc', logx=True, logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 353,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "<AxesSubplot:xlabel='elapsed', ylabel='total_ticks'>"
+      ]
+     },
+     "execution_count": 353,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAYm0lEQVR4nO3df5DU933f8efrTseBQQZyJ6fxHQTc0yhBCcLxWrZDxyNPXRm1BjlGcoScxk5VMXIrq63bAWXqNuN2PIlJPUkla+zgWCEZN1Ko8EiiI1eZ2HFJGsUGFHQWUjVhSFQWOkE+A9ZJcDq4d/+4Zdk73d599+773e9+d1+PmRuxn/3+eN9nVvu+z/fzSxGBmZkZQFfeAZiZWetwUjAzsyonBTMzq3JSMDOzKicFMzOrclIwM7Oqq/IOYKH6+/tjzZo1eYdhZlYohw8f/kFEXDO9vPBJYc2aNRw6dCjvMMzMCkXSyzOV+/GRmZlVOSmYmVmVk4KZmVU5KZiZWZWTgplZAY2MjvHcibOMjI6let3Cjz4yM+s0Txw5yc59w/R0dTE+McGurevZsmEglWu7pWBmViAjo2Ps3DfMhfEJXh27yIXxCXbsG06txdBSSUFSl6TPS3pQ0ifyjsfMrNWUz5ynp2vqV3dPVxflM+dTuX7mSUHSw5JOS3p+WvkmSS9JOibp/krxrcAAMA6Us47NzKxoBlcuYXxiYkrZ+MQEgyuXpHL9ZrQU9gCbagskdQMPAbcA64BtktYB1wHPRMRngE81ITYzs0LpW9bLrq3rWdzTxdW9V7G4p4tdW9fTt6w3letn3tEcEQckrZlWfCNwLCKOA0h6lMlWwgngjcoxl+pdU9J2YDvA6tWr0w7ZzKylbdkwwMahfspnzjO4cklqCQHy61MYYDIBXFaulH0D+JCkB4ED9U6OiN0RUYqI0jXXvGk9JzOztte3rJcbVq1INSFAfkNSNUNZRMTrwF2JLiBtBjYPDQ2lGpiZWSfLq6VQBlbVvB4ETjVygYjYHxHbly9fnmpgZmadLK+kcBC4VtJaSYuAO4Anc4rFzMwqmjEk9RHgGeA6SWVJd0XEReBe4GngRWBvRBxt8LqbJe0+d+5c+kGbmXUoRUTeMSxIqVQKb7JjZtYYSYcjojS9vKVmNDfCLQUz61RZLYYHBV4QLyL2A/tLpdLdecdiZtYsWS6GBwVuKZiZdZqsF8ODAicFPz4ys06T9WJ4UOCk4HkKZtZpsl4MDwqcFMzMOk3Wi+FBgTuavcyFmXWiLBfDgwK3FPz4yMw6VVaL4UGBk4KZmaXPScHMzKqcFMzMrKqwScHzFMzM0lfYpOCOZjOz9BU2KZiZWfqcFMzMrMpJwczMqgqbFNzRbGaWvsImBXc0m5mlr7BJwczM0uekYGZmVU4KZmZW5aRgZmZVTgpmZlblpGBmZlWFTQqep2Bmlr7CJgXPUzAzS19hk4KZmaXPScHMzKqcFMzMrMpJwczMqpwUzMysyknBzBZsZHSM506cZWR0LO9QbIGuyjsAMyu2J46cZOe+YXq6uhifmGDX1vVs2TCQd1g2T24pmNm8jYyOsXPfMBfGJ3h17CIXxifYsW/YLYYCa6mkIOkmSX8m6SuSbso7HjObXfnMeXq6pn6N9HR1UT5zPqeIbKEyTwqSHpZ0WtLz08o3SXpJ0jFJ91eKAxgFFgPlrGMzs4UZXLmE8YmJKWXjExMMrlySU0S2UM1oKewBNtUWSOoGHgJuAdYB2yStA/4sIm4BdgKfa0JsZrYAfct62bV1PYt7uri69yoW93Sxa+t6+pb15h2azVPmHc0RcUDSmmnFNwLHIuI4gKRHgVsj4oXK+2eAup8qSduB7QCrV69OPWYzS27LhgE2DvVTPnOewZVLUkkII6NjqV7Pkstr9NEAcKLmdRl4j6SPAh8CVgBfqndyROwGdgOUSqXILkwzS6JvWW9qX94ezZSvvJKCZiiLiPgG8I1EF5A2A5uHhoZSDczM8lM7mukCk30VO/YNs3Go3y2GJslr9FEZWFXzehA41cgFvHS2WXsZGR3jT//Paa7qmvo3o0czNVdeLYWDwLWS1gIngTuAOxu5gFsKZu3j8iOjbonX3rg05T2PZmquZgxJfQR4BrhOUlnSXRFxEbgXeBp4EdgbEUcbua5bCmbtofaRUW1CWNrb7dFMOWjG6KNtdcqfAp7K+v5m1touT4C73IcAsHRRN5/bfD0f+Km3OSE0WUvNaG6E92g2aw8zTYC7FOGEkJPCJgU/PjJrD54A11q8SqqZ5S6LCXA2P4VNCh59ZNZe0pwAZ/Pnx0dmZlZV2KRgZo3x7miWhB8fmXUArydkSRW2peDHR2bJeHc0a0Rhk4KZJePd0awRTgpmbc67o1kjnBTM2pwnh1kj3NFs1gE8OcySKmxLwR3NZo0NM+1b1ssNq1Y4IdisCttSMOt0HmZqWShsS8Gsk3mYqWXFScGsgDzM1LJS2KTg/RSsk3mYqWWlsEnBHc3WyTzM1LLijmazgpppmOnI6JiHndqCOCmYFVDtl/8Nq1YAHo1k6XBSMCuYmb78Nw71V0cjXWCyr2HHvmE2DvW7xWANKWyfglknqjcU9eipcx6NZKlIlBQk/X1JvZV/3yTpPkkrMo3MrAPNNUO53lBUkEcjWSqSthT2AZckDQFfA9YCf5hZVGYd6IkjJ9n4hW/zS7/7XTZ+4ds8eeTkm46pNxT1+re/1aORLBVJ+xQmIuKipF8AfjsiHpT0V1kGNhcviGftpPax0Gx9ApeHou6Y1qfQt6zXi95ZKpImhXFJ24BPAJsrZT3ZhJRMROwH9pdKpbvzjMMsDZcfC11OCHClT2D6l/tsX/59y3qdDGxBkiaFXwHuAT4fEX8jaS3w9ezCMussjc5Q9pe/ZSVpn8KSiLgvIh4BiIi/AY5mF5ZZZ/EMZWsVSVsKX5X0iYj4PkDlUdK/BvZnFZhZp3GfgLWCpEnhNuAxSR8H/gHwy8DNmUVl1qH8WMjyligpRMRxSXcAjwMngJsjwrNizMzazKxJQdL3gagp+jGgG/iuJCJifZbBmZlZc83VUvhwU6IwM7OWMOvoo4h4OSJeBn4C+GHN6x8Cf68ZAZqZWfMkHZL6ZWC05vVrlbLUSVoq6bAkt1LMzJosaVJQRFT7FiJigoSd1JIelnRa0vPTyjdJeknSMUn317y1E9ibMC4zM0tR0qRwvLIyak/l518BxxOeuwfYVFsgqRt4CLgFWAdsk7RO0geBF4C/S3htMzNLUdKkcA/w88BJoAy8B9ie5MSIOMBkH0StG4FjEXE8It4AHgVuBT4AvBe4E7hb0ozxSdou6ZCkQ6+88krCX8HMzOaSdJ7CaeCOFO87wOR8h8vKwHsi4l4ASZ8EflB5TDVTPLuB3QClUilmOsbMzBo31zyFHRGxS9KDTJ2vAEBE3DfP+2qGsto+iz1zXsBLZ1sLqd0z2TOSrcjmaim8WPnvoZTvWwZW1bweBE41cgEvnW2tYqY9k7dsGMg7LLN5mTUpVL54AV6PiP9e+56k2xdw34PAtZUluE8y+WjqzkYu4JaCtYKkm+OYFUXSjuZfTVj2JpIeAZ4BrpNUlnRXRFwE7gWeZrI1sjciGlqKOyL2R8T25cuXN3KaWarq7ZlcPuOlwayY5upTuAX4x8CApAdq3norcDHJDSJiW53yp4CnEsZp1pIa3RzHrNXN1VI4xWR/wgXgcM3Pk8CHsg1tdpI2S9p97ty5PMOwJhoZHeO5E2cZGR3LO5Qqb45j7UY1E5XrHyT1RMT4LO/vi4itqUaWUKlUikOH0u4Ht1bT6p25Hn1kRSPpcESUppcnnadQNyFUvGNeUZklUITOXG+OY+0iaUfzXJo+gcyPjzqHO3PNmietpNB0Hn3UOdyZa9Y8aSWFmWYom6XCnblmzZOoTyGBnSldJzFPXussWzYMsHGo3525ZhmbdfTRDHs0V98CohX2aPboIzOzxs139JF3PzMz6yBzrX30crMCMTOz/CXqaJb0XkkHJY1KekPSJUk/yjq4OWLykFQzs5QlHX30JWAb8NfAEuCfAw9mFVQSHpJqZpa+xKOPIuKYpO6IuAT8nqS/yDAuMzPLQdKk8LqkRcARSbuA/wcszS4sMzPLQ9LHR/+0cuy9wGtM7pr20ayCMjOzfCRNCh+JiAsR8aOI+FxEfAYPVzUzaztJk8InZij7ZIpxNMyjj8zM0jfXzmvbmNw7ea2kJ2veeiswkmVgc6nsH72/VCrdnWccZmbtZK6O5r9gslO5H/hiTfmrwHBWQZmZWT6SzGh+GXifpB8H3l1568WISLRHs5mZFUfSGc23A98Dbgc+BnxX0m1ZBmZmZs2XdJ7CZ4F3R8RpAEnXAH8CPJZVYGZm1nxJRx91XU4IFSMNnGtmZgWRtKXwTUlPA49UXv8i8FQ2IZmZWV6S/rUfwO8A64EbgN2ZRZSQ5ymYmaVv1p3XqgdJz0bEz00rG/bOa2ZmxTSvndckfQr4F8A7JNXOS7ga+N/phmhmZnmbq0/hD4FvAr8O3F9T/mpE/DCzqMzMLBdzTV47B5xjcoMdMzNrcx5WamZmVU4KZmZW5aRgZmZVTgpmZlbVUklB0k9L+oqkxyrDYc3MrIkyTwqSHpZ0WtLz08o3SXpJ0jFJ9wNExIsRcQ+TK7G+aVKFmZllqxkthT3AptoCSd3AQ8AtwDpgm6R1lfe2AH8OfKsJsZmZWY3Mk0JEHACmT3S7ETgWEccj4g3gUeDWyvFPRsTPAx/POjYzM5sq6SqpaRsATtS8LgPvkXQT8FGgl1lWYZW0HdgOsHr16syCNDPrNHklBc1QFhHxHeA7c50cEbuprNRaKpXmXtHPzMwSyWv0URlYVfN6EDjVyAW8dLaZWfrySgoHgWslrZW0CLgDeLKRC0TE/ojYvnz58kwCNDPrRM0YkvoI8AxwnaSypLsi4iJwL/A08CKwNyKONnjdwrQURkbHeO7EWUZGx/IOxcxsVok22Wllrb7JzhNHTrJz3zA9XV2MT0ywa+t6tmwYyC2ekdExymfOM7hyCX3LenOLw8zyNa9NdmxhRkbH2LlvmAvjE1xgAoAd+4bZONSfyxdyqyUoM2s9LbXMRSOK8PiofOY8PV1Tq7inq4vymfNNj6U2Qb06dpEL4xPs2DfsR1pmNkVhk0IROpoHVy5hfGJiStn4xASDK5c0PZZWSlBm1roKmxSKoG9ZL7u2rmdxTxdX917F4p4udm1dn8ujo1ZKUGbWugrbpyBpM7B5aGgo71BmtWXDABuH+nPv3L2coHZM61NwZ7OZ1fLoow7j0UdmBh59ZBV9y3qdDMysrsL2KRRh9JGZWdEUNikUYfRRs3nmtJktlB8ftQlPTDOzNBS2pWBXeGKamaWlsEnBfQpXeGKamaWlsEnBfQpXeGKamaWlsEnBrmilmdNmVmzuaG4TrTJz2syKzUmhjXhimpktlB8fmZlZVWGTgkcfmZmlr7BJwaOPzMzSV9ikYGZm6XNSMDOzKicFMzOrclJoAq9eamZF0bHzFJq1A9kTR06y47Hn6FYXl2KC37ztBq9eamYtq7BJYSF7NDdrmemR0TH+7d4jXJwAuATAZ/YeYeNQvyeZmVlLKuzjo/kOSW3mMtNHT/2okhCuuDgxWW5m1ooKmxTmq95y0tksMx0NlpuZ5avjksLSRd1cGJ/65/uF8QmWLupO/V7Xv305Pd2aUtbTLa5/uyfcmVlr6rik8Nobl+id9kXd2y1ee+NS6vfqW9bLF2+/gd6runjLom56r+rii7ff4P4EM2tZhe1onq/BlUtQl+DSlUc46lJmG9J4SWszK5KOayn0LevlY+8anFL2sdJgpl/Wfct6uWHVCicEM2t5HZcURkbH2Hu4PKVs76GyJ5aZmdGBScGb3JuZ1ddxScGb3JuZ1ddSSUHSRyR9VdITkm7O4h7e5N7MrL7MRx9Jehj4MHA6In6mpnwT8F+BbuB3I+I3IuJx4HFJK4H/AvxxFjFt2TDAup94K0dOnGXDqhUM/fjVWdzGzKxwmjEkdQ/wJeAPLhdI6gYeAv4RUAYOSnoyIl6oHPLZyvuZaNbaR2ZmRZP546OIOAD8cFrxjcCxiDgeEW8AjwK3atIXgG9GxLNZxNPMtY/MzIomrz6FAeBEzetypezTwAeB2yTdU+9kSdslHZJ06JVXXmnoxh59ZGZWX14zmjVDWUTEA8ADc50cEbuB3QClUqmh1eU8+sjMrL68WgplYFXN60HgVCMXkLRZ0u5z5841dGOPPjIzqy+vlsJB4FpJa4GTwB3AnY1cICL2A/tLpdLdjd58y4YB3r58MQf++ge8/9p+Smv7Gr2EmVlbasaQ1EeAm4B+SWXg1yLia5LuBZ5mckjqwxFxtMHrznvntf/4+Pf5g7/8vwA88O1j/PL7VvOfbv3Zhq9jZtZuFFHsDV9KpVIcOnQo8fHH/u5VPvhbB95U/if/5v2er2BmHUPS4YgoTS9vqRnNjZhvn8KRE2cbKjcz6ySFTQrz3aN5w6oVDZWbmXWSwiaF+Vq5dBHdXVNHxHZ3iZVLF+UUkZlZ6yhsUpjv46PymfO8pWfqfsxv6en25DUzMwqcFOb7+MiT18zM6itsUpgvT14zM6svr8lrudqyYYCNQ/2Uz5xncOUSJwQzs4rCJoWFTF6DyRaDk4GZ2VSFfXw03z4FMzOrr7BJwczM0texSWFkdIznTpz15jpmZjU6sk/B23Gamc2ssC2F+fYpeDtOM7P6CpsU5svbcZqZ1ddxScEzms3M6uu4pOAZzWZm9RW2o3khPKPZzGxmhU0KntFsZpa+wj4+8oxmM7P0FTYpmJlZ+pwUzMysyknBzMyqnBTMzKxKEZF3DAsi6RXgLDDTZs3Lp5VPf90P/CCz4GaPJatzkxw72zH13pupvF3qt9Hz5zo2q/qdqaxZddxK9TvXMUnrcqbyon6G51O/PxkR17zp3Ygo/A+wO0n5DK8P5R1j2ucmOXa2Y5LWZTvVb9p1nFX95lnHrVS/86ljf0ckP7ZdHh/tT1he77hmWMi9Gzk3ybGzHZO0LmcqK2r9Nnr+XMdmVb9J7p2VVqrfuY5ppN7a5TOcWv0W/vHRQkg6FBGlvONoV67f7LmOs9WJ9dsuLYX52p13AG3O9Zs913G2Oq5+O7qlYGZmU3V6S8HMzGo4KZiZWZWTgpmZVTkp1CHpI5K+KukJSTfnHU+7kfQOSV+T9FjesbQLSUsl/X7lc/vxvONpR53wuW3LpCDpYUmnJT0/rXyTpJckHZN0/2zXiIjHI+Ju4JPAL2YYbuGkVL/HI+KubCMtvgbr+qPAY5XP7ZamB1tQjdRxJ3xu2zIpAHuATbUFkrqBh4BbgHXANknrJP2spP8x7edtNad+tnKeXbGH9OrXZreHhHUNDAInKoddamKMRbeH5HXc9gq789psIuKApDXTim8EjkXEcQBJjwK3RsSvAx+efg1JAn4D+GZEPJtxyIWSRv1aMo3UNVBmMjEcoX3/4Etdg3X8QpPDa7pO+uAMcOWvKJj8H2hgluM/DXwQuE3SPVkG1iYaql9JfZK+ArxT0q9mHVybqVfX3wC2Svoy+S7X0A5mrONO+Ny2ZUuhDs1QVnfmXkQ8ADyQXThtp9H6HQGcbOdnxrqOiNeAX2l2MG2qXh23/ee2k1oKZWBVzetB4FROsbQj12/zuK6z17F13ElJ4SBwraS1khYBdwBP5hxTO3H9No/rOnsdW8dtmRQkPQI8A1wnqSzproi4CNwLPA28COyNiKN5xllUrt/mcV1nz3U8lRfEMzOzqrZsKZiZ2fw4KZiZWZWTgpmZVTkpmJlZlZOCmZlVOSmYmVmVk4JZApL+VlJ/Dvf9jqRSs+9rnctJwczMqpwUzKaR9EuSvifpiKTfqaytX/v+45IOSzoqaXtN+aikL0p6VtK3JF1TKb9P0guShitLMF/eJe1hSQcl/ZWkWyvlSyQ9Wjn2j4AlTfzVzZwUzGpJ+mkmd9rbGBEbmNysZvrWlv8sIt4FlID7JPVVypcCz0bEzwH/C/i1Svn9wDsjYj1XVtj898C3I+LdwAeA35S0FPgU8Hrl2M8D78rg1zSrq5OWzjZL4h8y+UV8cHKfJZYAp6cdc5+kX6j8exVwLTACTAB/VCn/OpP7GwAMA/9N0uPA45Wym4Etkv5d5fViYDXwfipLtkfEsKThtH4xsyScFMymEvD7ETFlAxVJn6z89yYmN196X0S8Luk7TH6hz+TywmL/hMkv+y3Af5B0feU+WyPipWn3qT3PrOn8+Mhsqm8xudve2wAk/Zikn6x5fzlwppIQfgp4b817XcBtlX/fCfy5pC5gVUT8KbADWAEsY3L1zU9Xtn1F0jsr5x2g8rhK0s8A69P/Fc3qc0vBrEZEvCDps8AfV77Qx4F/WXPI/wTuqTzWeQn4y5r3XgOul3QYOMdk30Q38HVJy5lsHfxWRJyV9J+B3waGK4nhb5ncy/rLwO9Vrn8E+F5Wv6vZTLx0tllKJI1GxLK84zBbCD8+MjOzKrcUzMysyi0FMzOrclIwM7MqJwUzM6tyUjAzsyonBTMzq3JSMDOzqv8PYW8ZXILdca8AAAAASUVORK5CYII=\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "performance.plot.scatter('elapsed', 'total_ticks', logx=True, logy=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 354,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [],
+   "source": [
+    "performance[['total_alloc', 'memory', 'elapsed']].to_csv('performance.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 355,
+   "metadata": {
+    "Collapsed": "false"
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "| program   |   total_alloc |   elapsed |   memory |\n",
+      "|:----------|--------------:|----------:|---------:|\n",
+      "| advent01  |      12058592 |      0.02 |    10212 |\n",
+      "| advent02  |       1818928 |      0.01 |     7876 |\n",
+      "| advent03  |       8298128 |      0.01 |    10760 |\n",
+      "| advent04  |      54628920 |      0.05 |    14236 |\n",
+      "| advent05  |     434487576 |      0.47 |    49372 |\n",
+      "| advent06  |       2507624 |      0.01 |     7948 |\n",
+      "| advent07  |       5589544 |      0.01 |    10164 |\n",
+      "| advent08  |    2499222744 |      0.98 |    12252 |\n",
+      "| advent09  |        469984 |      0.01 |     6644 |\n",
+      "| advent10  |       2383248 |      0.01 |     7456 |\n",
+      "| advent11  |      39102056 |      0.04 |    11272 |\n",
+      "| advent12  |     722598152 |      1.15 |    61132 |\n",
+      "| advent13  |       4493632 |      0.01 |    11504 |\n",
+      "| advent14  |      15471000 |      0.02 |    11020 |\n",
+      "| advent15  |    2458599000 |      1.39 |    53240 |\n",
+      "| advent16  |       8613496 |      0.01 |    12128 |\n",
+      "| advent17  |      88071992 |      0.02 |    11604 |\n",
+      "| advent18  |     588717288 |      0.17 |    11812 |\n",
+      "| advent19  |    2623652352 |      3.88 |    12524 |\n",
+      "| advent20  |    3090735840 |      2.49 |   207144 |\n",
+      "| advent21  |    2400838008 |      1.03 |    22020 |\n",
+      "| advent22  |    1384180736 |      0.76 |    12508 |\n",
+      "| advent23  |   38150694448 |     27.19 |    98824 |\n",
+      "| advent24  |   66538931736 |     27.92 |    12432 |\n",
+      "| advent25  |    1910248008 |      4.21 |    13748 |\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(performance[['total_alloc', 'elapsed', 'memory']].to_markdown(floatfmt=['0.0f', '0.0f', '.2f', '0.0f']))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "jupytext": {
+   "formats": "ipynb,md"
+  },
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.8"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}